From 7b5ca5b529da58adbf591b0c4b9474b3e9c552c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Hochd=C3=B6rfer?= Date: Sat, 12 Nov 2022 21:10:21 +0100 Subject: [PATCH] Update Composer dependencies --- magento/composer.json | 3 +- magento/setup/.htaccess | 5 + magento/setup/config/.htaccess | 8 + magento/setup/config/application.config.php | 34 + magento/setup/config/autoload/global.php | 22 + magento/setup/config/di.config.php | 43 + magento/setup/config/module.config.php | 16 + magento/setup/config/modules.config.php | 15 + magento/setup/index.php | 52 + magento/setup/performance-toolkit/.htaccess | 8 + magento/setup/performance-toolkit/README.md | 354 + .../setup/performance-toolkit/benchmark.jmx | 118516 +++++++++++++++ .../performance-toolkit/benchmark_2015.jmx | 6905 + .../config/attributeSets.xml | 132 + .../config/customerConfig.xml | 10 + .../config/description.xml | 27 + .../setup/performance-toolkit/config/di.xml | 11 + .../config/searchConfig.xml | 13 + .../config/searchTerms.xml | 17 + .../config/searchTermsLarge.xml | 669 + .../config/shortDescription.xml | 23 + .../files/downloadable_original.txt | 1 + .../files/downloadable_sample.txt | 1 + .../files/search_terms.csv | 10 + .../profiles/ce/extra_large.xml | 122 + .../performance-toolkit/profiles/ce/large.xml | 122 + .../profiles/ce/medium.xml | 122 + .../profiles/ce/medium_msite.xml | 128 + .../performance-toolkit/profiles/ce/small.xml | 124 + magento/setup/pub/.htaccess | 5 + .../setup/pub/fonts/opensans/LICENSE-2.0.txt | 202 + .../fonts/opensans/regular/opensans-400.eot | Bin 0 -> 19836 bytes .../fonts/opensans/regular/opensans-400.svg | 1 + .../fonts/opensans/regular/opensans-400.ttf | Bin 0 -> 38232 bytes .../fonts/opensans/regular/opensans-400.woff | Bin 0 -> 22660 bytes .../fonts/opensans/regular/opensans-400.woff2 | Bin 0 -> 17848 bytes .../fonts/opensans/semibold/opensans-600.eot | Bin 0 -> 20028 bytes .../fonts/opensans/semibold/opensans-600.svg | 1 + .../fonts/opensans/semibold/opensans-600.ttf | Bin 0 -> 39476 bytes .../fonts/opensans/semibold/opensans-600.woff | Bin 0 -> 22908 bytes .../opensans/semibold/opensans-600.woff2 | Bin 0 -> 17980 bytes .../pub/images/favicon/favicon-16x16.png | Bin 0 -> 281 bytes .../pub/images/favicon/favicon-32x32.png | Bin 0 -> 392 bytes .../pub/images/favicon/favicon-96x96.png | Bin 0 -> 739 bytes magento/setup/pub/images/favicon/favicon.ico | Bin 0 -> 15086 bytes magento/setup/pub/images/magento-logo.svg | 1 + magento/setup/pub/scripts/main.js | 10 + magento/setup/pub/styles/setup.css | 6 + magento/setup/src/.htaccess | 8 + .../setup/src/Magento/Setup/Application.php | 86 + .../Command/AbstractDependenciesCommand.php | 112 + .../Console/Command/AbstractModuleCommand.php | 102 + .../Command/AbstractModuleManageCommand.php | 206 + .../Console/Command/AbstractSetupCommand.php | 34 + .../Command/AdminUserCreateCommand.php | 246 + .../Setup/Console/Command/BackupCommand.php | 177 + .../Console/Command/ConfigSetCommand.php | 154 + .../Console/Command/DbDataUpgradeCommand.php | 72 + .../Command/DbSchemaUpgradeCommand.php | 86 + .../Setup/Console/Command/DbStatusCommand.php | 112 + .../DependenciesShowFrameworkCommand.php | 80 + ...DependenciesShowModulesCircularCommand.php | 55 + .../DependenciesShowModulesCommand.php | 54 + .../Command/DeployStaticContentCommand.php | 196 + .../Console/Command/DiCompileCommand.php | 413 + .../Command/GenerateFixturesCommand.php | 191 + .../Command/I18nCollectPhrasesCommand.php | 82 + .../Setup/Console/Command/I18nPackCommand.php | 96 + .../Console/Command/InfoAdminUriCommand.php | 58 + .../Command/InfoBackupsListCommand.php | 117 + .../Command/InfoCurrencyListCommand.php | 70 + .../Command/InfoLanguageListCommand.php | 70 + .../Command/InfoTimezoneListCommand.php | 70 + .../Setup/Console/Command/InstallCommand.php | 451 + .../InstallStoreConfigurationCommand.php | 354 + .../Command/ModuleConfigStatusCommand.php | 109 + .../Console/Command/ModuleDisableCommand.php | 32 + .../Console/Command/ModuleEnableCommand.php | 32 + .../Console/Command/ModuleStatusCommand.php | 187 + .../Command/ModuleUninstallCommand.php | 429 + .../Setup/Console/Command/RollbackCommand.php | 214 + .../Console/Command/UninstallCommand.php | 55 + .../Setup/Console/Command/UpgradeCommand.php | 180 + .../src/Magento/Setup/Console/CommandList.php | 97 + .../Setup/Console/CompilerPreparation.php | 157 + .../Console/InputValidationException.php | 17 + .../Setup/Console/Style/MagentoStyle.php | 622 + .../Console/Style/MagentoStyleInterface.php | 17 + .../Controller/ResponseTypeInterface.php | 21 + .../src/Magento/Setup/Di/MagentoDiFactory.php | 26 + magento/setup/src/Magento/Setup/Exception.php | 16 + .../Setup/Fixtures/AdminUsersFixture.php | 152 + .../AttributeSet/AttributeSetFixture.php | 171 + .../Setup/Fixtures/AttributeSet/Pattern.php | 99 + .../AttributeSet/SwatchesGenerator.php | 145 + .../Setup/Fixtures/AttributeSetsFixture.php | 111 + .../Setup/Fixtures/BundleProductsFixture.php | 265 + .../Setup/Fixtures/CartPriceRulesFixture.php | 463 + .../Fixtures/CatalogPriceRulesFixture.php | 161 + .../Setup/Fixtures/CategoriesFixture.php | 258 + .../Setup/Fixtures/CategoryResolver.php | 104 + .../Setup/Fixtures/ConfigsApplyFixture.php | 68 + .../Fixtures/ConfigurableProductsFixture.php | 937 + .../Setup/Fixtures/CouponCodesFixture.php | 150 + .../Setup/Fixtures/CustomerGroupsFixture.php | 92 + .../Setup/Fixtures/CustomersFixture.php | 146 + .../Setup/Fixtures/EavVariationsFixture.php | 207 + .../src/Magento/Setup/Fixtures/Fixture.php | 84 + .../Magento/Setup/Fixtures/FixtureConfig.php | 75 + .../Magento/Setup/Fixtures/FixtureModel.php | 302 + .../Setup/Fixtures/FixtureRegistry.php | 41 + .../Magento/Setup/Fixtures/ImagesFixture.php | 555 + .../ImagesGenerator/ImagesGenerator.php | 88 + .../Fixtures/IndexersStatesApplyFixture.php | 59 + .../Magento/Setup/Fixtures/OrdersFixture.php | 777 + .../Magento/Setup/Fixtures/PriceProvider.php | 36 + .../Setup/Fixtures/ProductsAmountProvider.php | 46 + .../Fixtures/Quote/QuoteConfiguration.php | 138 + .../Setup/Fixtures/Quote/QuoteGenerator.php | 805 + .../Fixtures/Quote/QuoteGeneratorFactory.php | 50 + .../Setup/Fixtures/SimpleProductsFixture.php | 446 + .../Magento/Setup/Fixtures/StoresFixture.php | 391 + .../Setup/Fixtures/TaxRatesFixture.php | 79 + .../Setup/Fixtures/TaxRulesFixture.php | 226 + .../Fixtures/WebsiteCategoryProvider.php | 171 + .../Setup/Fixtures/_files/dictionary.csv | 7373 + .../Fixtures/_files/orders_fixture_data.json | 568 + .../Setup/Fixtures/_files/tax_rates.csv | 39714 +++++ .../Setup/Fixtures/_files/tax_rates_small.csv | 133 + .../Mail/Template/TransportBuilderMock.php | 28 + .../Framework/Mail/TransportInterfaceMock.php | 45 + .../Model/Address/AddressDataGenerator.php | 26 + .../src/Magento/Setup/Model/AdminAccount.php | 283 + .../Setup/Model/AdminAccountFactory.php | 45 + .../Magento/Setup/Model/BasePackageInfo.php | 71 + .../src/Magento/Setup/Model/BatchInsert.php | 124 + .../src/Magento/Setup/Model/Bootstrap.php | 27 + .../Magento/Setup/Model/Complex/Generator.php | 124 + .../Magento/Setup/Model/Complex/Pattern.php | 127 + .../Magento/Setup/Model/ConfigGenerator.php | 281 + .../src/Magento/Setup/Model/ConfigModel.php | 174 + .../Magento/Setup/Model/ConfigOptionsList.php | 399 + .../Setup/Model/ConfigOptionsList/Cache.php | 299 + .../Model/ConfigOptionsList/Directory.php | 91 + .../Model/ConfigOptionsList/DriverOptions.php | 52 + .../Setup/Model/ConfigOptionsList/Lock.php | 340 + .../Model/ConfigOptionsList/PageCache.php | 292 + .../Setup/Model/ConfigOptionsList/Session.php | 394 + .../Model/ConfigOptionsListCollector.php | 112 + .../Magento/Setup/Model/CryptKeyGenerator.php | 56 + .../Model/CryptKeyGeneratorInterface.php | 22 + .../Model/Customer/CustomerDataGenerator.php | 99 + .../Customer/CustomerDataGeneratorFactory.php | 44 + .../src/Magento/Setup/Model/DataGenerator.php | 91 + .../Setup/Model/DateTime/DateTimeProvider.php | 63 + .../Setup/Model/DateTime/TimeZoneProvider.php | 55 + .../Setup/Model/DeclarationInstaller.php | 62 + .../Model/DefaultDescriptionGenerator.php | 34 + .../Description/DescriptionGenerator.php | 84 + .../DescriptionParagraphGenerator.php | 60 + .../DescriptionSentenceGenerator.php | 58 + .../Model/Description/Mixin/BoldMixin.php | 57 + .../Model/Description/Mixin/BrakeMixin.php | 26 + .../Mixin/DescriptionMixinInterface.php | 20 + .../Model/Description/Mixin/HeaderMixin.php | 36 + .../Mixin/Helper/RandomWordSelector.php | 38 + .../Description/Mixin/Helper/WordWrapper.php | 27 + .../Model/Description/Mixin/ItalicMixin.php | 57 + .../Model/Description/Mixin/MixinFactory.php | 76 + .../Description/Mixin/ParagraphMixin.php | 28 + .../Model/Description/Mixin/SpanMixin.php | 57 + .../Setup/Model/Description/MixinManager.php | 41 + .../Model/DescriptionGeneratorInterface.php | 20 + .../src/Magento/Setup/Model/Dictionary.php | 79 + .../Model/FixtureGenerator/AutoIncrement.php | 45 + .../BundleProductGenerator.php | 252 + .../BundleProductTemplateGenerator.php | 163 + .../ConfigurableProductGenerator.php | 129 + .../ConfigurableProductTemplateGenerator.php | 162 + .../FixtureGenerator/CustomerGenerator.php | 165 + .../CustomerTemplateGenerator.php | 160 + .../FixtureGenerator/EntityGenerator.php | 498 + .../FixtureGenerator/ProductGenerator.php | 360 + .../ProductTemplateGeneratorFactory.php | 58 + .../SimpleProductTemplateGenerator.php | 97 + .../Model/FixtureGenerator/SqlCollector.php | 154 + .../TemplateEntityGeneratorInterface.php | 18 + .../src/Magento/Setup/Model/Generator.php | 83 + .../src/Magento/Setup/Model/Installer.php | 1816 + .../Setup/Model/Installer/Progress.php | 109 + .../Magento/Setup/Model/InstallerFactory.php | 96 + .../setup/src/Magento/Setup/Model/License.php | 65 + .../src/Magento/Setup/Model/ModuleContext.php | 41 + .../Setup/Model/ModuleRegistryUninstaller.php | 105 + .../Magento/Setup/Model/ModuleUninstaller.php | 116 + .../Setup/Model/ObjectManagerProvider.php | 119 + .../src/Magento/Setup/Model/PackagesAuth.php | 32 + .../Magento/Setup/Model/PhpInformation.php | 52 + .../Magento/Setup/Model/PhpReadinessCheck.php | 362 + .../src/Magento/Setup/Model/SearchConfig.php | 121 + .../Setup/Model/SearchConfigFactory.php | 38 + .../Setup/Model/SearchConfigOptionsList.php | 104 + .../Model/SearchTermDescriptionGenerator.php | 71 + .../SearchTermDescriptionGeneratorFactory.php | 188 + .../Magento/Setup/Model/SearchTermManager.php | 82 + .../Model/StoreConfigurationDataMapper.php | 89 + .../Model/ThemeDependencyCheckerFactory.php | 40 + .../Setup/Model/UninstallCollector.php | 74 + magento/setup/src/Magento/Setup/Module.php | 83 + .../Setup/Module/ConnectionFactory.php | 104 + .../src/Magento/Setup/Module/DataSetup.php | 206 + .../Magento/Setup/Module/DataSetupFactory.php | 41 + .../Setup/Module/Dependency/Circular.php | 142 + .../Setup/Module/Dependency/Parser/Code.php | 110 + .../Dependency/Parser/Composer/Json.php | 117 + .../Module/Dependency/Parser/Config/Xml.php | 83 + .../Module/Dependency/ParserInterface.php | 20 + .../Report/Builder/AbstractBuilder.php | 87 + .../Dependency/Report/BuilderInterface.php | 20 + .../Dependency/Report/Circular/Builder.php | 77 + .../Dependency/Report/Circular/Data/Chain.php | 37 + .../Report/Circular/Data/Config.php | 28 + .../Report/Circular/Data/Module.php | 68 + .../Dependency/Report/Circular/Writer.php | 46 + .../Report/Data/Config/AbstractConfig.php | 44 + .../Report/Data/ConfigInterface.php | 26 + .../Dependency/Report/Dependency/Builder.php | 33 + .../Report/Dependency/Data/Config.php | 52 + .../Report/Dependency/Data/Dependency.php | 84 + .../Report/Dependency/Data/Module.php | 100 + .../Dependency/Report/Dependency/Writer.php | 58 + .../Dependency/Report/Framework/Builder.php | 89 + .../Report/Framework/Data/Config.php | 28 + .../Report/Framework/Data/Dependency.php | 58 + .../Report/Framework/Data/Module.php | 68 + .../Dependency/Report/Framework/Writer.php | 41 + .../Report/Writer/Csv/AbstractWriter.php | 78 + .../Dependency/Report/WriterInterface.php | 23 + .../Module/Dependency/ServiceLocator.php | 172 + .../Setup/Module/Di/App/Task/Manager.php | 64 + .../Task/Operation/AppActionListGenerator.php | 59 + .../Operation/ApplicationCodeGenerator.php | 111 + .../Module/Di/App/Task/Operation/Area.php | 145 + .../Di/App/Task/Operation/Interception.php | 112 + .../App/Task/Operation/InterceptionCache.php | 79 + .../Task/Operation/PluginListGenerator.php | 63 + .../Di/App/Task/Operation/ProxyGenerator.php | 67 + .../Task/Operation/RepositoryGenerator.php | 80 + .../ServiceDataAttributesGenerator.php | 72 + .../Module/Di/App/Task/OperationException.php | 14 + .../Module/Di/App/Task/OperationFactory.php | 111 + .../Module/Di/App/Task/OperationInterface.php | 27 + .../Setup/Module/Di/Code/Generator.php | 93 + .../InterceptionConfigurationBuilder.php | 212 + .../Module/Di/Code/Generator/Interceptor.php | 44 + .../Module/Di/Code/Generator/PluginList.php | 74 + .../Setup/Module/Di/Code/GeneratorFactory.php | 35 + .../Di/Code/Reader/ClassReaderDecorator.php | 64 + .../Module/Di/Code/Reader/ClassesScanner.php | 161 + .../Code/Reader/ClassesScannerInterface.php | 23 + .../Module/Di/Code/Reader/Decorator/Area.php | 58 + .../Di/Code/Reader/Decorator/Directory.php | 121 + .../Code/Reader/Decorator/Interceptions.php | 89 + .../Di/Code/Reader/FileClassScanner.php | 206 + .../Module/Di/Code/Reader/FileScanner.php | 467 + .../Di/Code/Reader/InvalidFileException.php | 12 + .../Setup/Module/Di/Code/Reader/Type.php | 27 + .../Module/Di/Code/Scanner/ArrayScanner.php | 27 + .../Di/Code/Scanner/CompositeScanner.php | 44 + .../Di/Code/Scanner/ConfigurationScanner.php | 58 + .../Di/Code/Scanner/DirectoryScanner.php | 47 + .../Scanner/InheritanceInterceptorScanner.php | 69 + .../Scanner/InterceptedInstancesScanner.php | 43 + .../Module/Di/Code/Scanner/PhpScanner.php | 300 + .../Module/Di/Code/Scanner/PluginScanner.php | 33 + .../Di/Code/Scanner/RepositoryScanner.php | 68 + .../Di/Code/Scanner/ScannerInterface.php | 21 + .../Scanner/ServiceDataAttributesScanner.php | 35 + .../Di/Code/Scanner/XmlInterceptorScanner.php | 106 + .../Module/Di/Code/Scanner/XmlScanner.php | 119 + .../Module/Di/Compiler/ArgumentsResolver.php | 289 + .../Di/Compiler/ArgumentsResolverFactory.php | 40 + .../Config/Chain/ArgumentsSerialization.php | 59 + .../Compiler/Config/Chain/BackslashTrim.php | 80 + .../Config/Chain/InterceptorSubstitution.php | 83 + .../Config/Chain/PreferencesResolving.php | 79 + .../Di/Compiler/Config/ModificationChain.php | 46 + .../Compiler/Config/ModificationInterface.php | 22 + .../Module/Di/Compiler/Config/Reader.php | 159 + .../Di/Compiler/Config/Writer/Filesystem.php | 64 + .../Di/Compiler/Config/WriterInterface.php | 25 + .../Di/Compiler/ConstructorArgument.php | 82 + .../Setup/Module/Di/Compiler/Log/Log.php | 110 + .../Module/Di/Compiler/Log/Writer/Console.php | 105 + .../Setup/Module/Di/Definition/Collection.php | 96 + .../src/Magento/Setup/Module/I18n/Context.php | 115 + .../Magento/Setup/Module/I18n/Dictionary.php | 67 + .../Module/I18n/Dictionary/Generator.php | 117 + .../Dictionary/Loader/File/AbstractFile.php | 135 + .../I18n/Dictionary/Loader/File/Csv.php | 22 + .../I18n/Dictionary/Loader/FileInterface.php | 21 + .../I18n/Dictionary/Options/Resolver.php | 141 + .../Dictionary/Options/ResolverFactory.php | 47 + .../Dictionary/Options/ResolverInterface.php | 17 + .../Setup/Module/I18n/Dictionary/Phrase.php | 281 + .../Module/I18n/Dictionary/Writer/Csv.php | 64 + .../I18n/Dictionary/Writer/Csv/Stdo.php | 33 + .../I18n/Dictionary/WriterInterface.php | 20 + .../src/Magento/Setup/Module/I18n/Factory.php | 72 + .../Setup/Module/I18n/FilesCollector.php | 56 + .../src/Magento/Setup/Module/I18n/Locale.php | 48 + .../Setup/Module/I18n/Pack/Generator.php | 109 + .../I18n/Pack/Writer/File/AbstractFile.php | 160 + .../Module/I18n/Pack/Writer/File/Csv.php | 69 + .../Module/I18n/Pack/WriterInterface.php | 47 + .../Module/I18n/Parser/AbstractParser.php | 132 + .../I18n/Parser/Adapter/AbstractAdapter.php | 140 + .../Setup/Module/I18n/Parser/Adapter/Html.php | 88 + .../Setup/Module/I18n/Parser/Adapter/Js.php | 58 + .../Setup/Module/I18n/Parser/Adapter/Php.php | 44 + .../I18n/Parser/Adapter/Php/Tokenizer.php | 221 + .../Adapter/Php/Tokenizer/PhraseCollector.php | 188 + .../Parser/Adapter/Php/Tokenizer/Token.php | 209 + .../Tokenizer/Translate/MethodCollector.php | 44 + .../Setup/Module/I18n/Parser/Adapter/Xml.php | 81 + .../Module/I18n/Parser/AdapterInterface.php | 27 + .../Setup/Module/I18n/Parser/Contextual.php | 84 + .../Setup/Module/I18n/Parser/Parser.php | 54 + .../Setup/Module/I18n/ParserInterface.php | 27 + .../Setup/Module/I18n/ServiceLocator.php | 120 + .../Magento/Setup/Module/ResourceFactory.php | 51 + .../setup/src/Magento/Setup/Module/Setup.php | 58 + .../Setup/Module/Setup/ResourceConfig.php | 20 + .../Magento/Setup/Module/Setup/SetupCache.php | 72 + .../src/Magento/Setup/Module/SetupFactory.php | 47 + .../Setup/Mvc/Bootstrap/InitParamListener.php | 199 + .../Mvc/View/Http/InjectTemplateListener.php | 70 + .../Command/AdminUserCreateCommandTest.php | 226 + .../Console/Command/BackupCommandTest.php | 151 + .../Console/Command/ConfigSetCommandTest.php | 134 + .../Command/DbDataUpgradeCommandTest.php | 63 + .../Command/DbSchemaUpgradeCommandTest.php | 90 + .../Console/Command/DbStatusCommandTest.php | 125 + .../DeployStaticContentCommandTest.php | 191 + .../Console/Command/DiCompileCommandTest.php | 215 + .../Console/Command/FunctionExistMock.php | 17 + .../Command/GenerateFixturesCommandTest.php | 59 + .../Command/InfoAdminUriCommandTest.php | 45 + .../Command/InfoBackupsListCommandTest.php | 44 + .../Command/InfoCurrencyListCommandTest.php | 40 + .../Command/InfoLanguageListCommandTest.php | 40 + .../Command/InfoTimezoneListCommandTest.php | 40 + .../Console/Command/InstallCommandTest.php | 379 + .../InstallStoreConfigurationCommandTest.php | 213 + .../Command/ModuleConfigStatusCommandTest.php | 97 + .../ModuleEnableDisableCommandTest.php | 341 + .../Command/ModuleStatusCommandTest.php | 49 + .../Command/ModuleUninstallCommandTest.php | 589 + .../Console/Command/RollbackCommandTest.php | 199 + .../Console/Command/UninstallCommandTest.php | 82 + .../Console/Command/UpgradeCommandTest.php | 192 + .../Test/Unit/Console/CommandListTest.php | 40 + .../Unit/Console/CompilerPreparationTest.php | 230 + .../Unit/Console/Style/MagentoStyleTest.php | 318 + .../Test/Unit/Console/Style/TestOutput.php | 32 + .../AttributeSet/AttributeSetFixtureTest.php | 173 + .../Fixtures/AttributeSet/PatternTest.php | 66 + .../AttributeSet/SwatchesGeneratorTest.php | 110 + .../Fixtures/AttributeSetsFixtureTest.php | 117 + .../Fixtures/CartPriceRulesFixtureTest.php | 283 + .../Fixtures/CatalogPriceRulesFixtureTest.php | 164 + .../Unit/Fixtures/CategoriesFixtureTest.php | 180 + .../Unit/Fixtures/ConfigsApplyFixtureTest.php | 103 + .../ConfigurableProductsFixtureTest.php | 248 + .../Unit/Fixtures/CouponCodesFixtureTest.php | 166 + .../Fixtures/CustomerGroupsFixtureTest.php | 128 + .../Unit/Fixtures/CustomersFixtureTest.php | 140 + .../Fixtures/EavVariationsFixtureTest.php | 227 + .../Test/Unit/Fixtures/FixtureConfigTest.php | 83 + .../Test/Unit/Fixtures/FixtureModelTest.php | 33 + .../IndexersStatesApplyFixtureTest.php | 108 + .../Test/Unit/Fixtures/OrdersFixtureTest.php | 112 + .../Fixtures/Quote/QuoteConfigurationTest.php | 82 + .../Quote/QuoteGeneratorFactoryTest.php | 68 + .../Fixtures/Quote/QuoteGeneratorTest.php | 321 + .../Test/Unit/Fixtures/StoresFixtureTest.php | 296 + .../Unit/Fixtures/TaxRatesFixtureTest.php | 107 + .../Unit/Fixtures/TaxRulesFixtureTest.php | 132 + .../Address/AddressDataGeneratorTest.php | 53 + .../Unit/Model/AdminAccountFactoryTest.php | 38 + .../Test/Unit/Model/AdminAccountTest.php | 481 + .../Test/Unit/Model/BasePackageInfoTest.php | 117 + .../Model/Complex/ComplexGeneratorTest.php | 90 + .../Test/Unit/Model/Complex/PatternTest.php | 98 + .../Test/Unit/Model/ConfigGeneratorTest.php | 164 + .../Setup/Test/Unit/Model/ConfigModelTest.php | 210 + .../Model/ConfigOptionsList/CacheTest.php | 272 + .../Unit/Model/ConfigOptionsList/LockTest.php | 255 + .../Model/ConfigOptionsList/PageCacheTest.php | 260 + .../Model/ConfigOptionsList/SessionTest.php | 315 + .../Test/Unit/Model/ConfigOptionsListTest.php | 236 + .../Test/Unit/Model/CryptKeyGeneratorTest.php | 61 + .../Customer/CustomerDataGeneratorTest.php | 109 + .../Test/Unit/Model/DataGeneratorTest.php | 51 + .../Model/DateTime/DateTimeProviderTest.php | 53 + .../Model/DateTime/TimeZoneProviderTest.php | 46 + .../Description/DescriptionGeneratorTest.php | 105 + .../DescriptionParagraphGeneratorTest.php | 73 + .../DescriptionSentenceGeneratorTest.php | 66 + .../Model/Description/Mixin/BoldMixinTest.php | 70 + .../Description/Mixin/BrakeMixinTest.php | 53 + .../Description/Mixin/HeaderMixinTest.php | 54 + .../Mixin/Helper/RandomWordSelectorTest.php | 68 + .../Mixin/Helper/WordWrapperTest.php | 72 + .../Description/Mixin/ItalicMixinTest.php | 70 + .../Description/Mixin/ParagraphMixinTest.php | 51 + .../Model/Description/Mixin/SpanMixinTest.php | 70 + .../Model/Description/MixinManagerTest.php | 84 + .../Setup/Test/Unit/Model/DictionaryTest.php | 60 + .../FixtureGenerator/SqlCollectorTest.php | 129 + .../Setup/Test/Unit/Model/GeneratorTest.php | 42 + .../Unit/Model/Installer/ProgressTest.php | 100 + .../Test/Unit/Model/InstallerFactoryTest.php | 184 + .../Setup/Test/Unit/Model/InstallerTest.php | 1426 + .../Setup/Test/Unit/Model/LicenseTest.php | 63 + .../Test/Unit/Model/ModuleContextTest.php | 21 + .../Model/ModuleRegistryUninstallerTest.php | 96 + .../Test/Unit/Model/ModuleUninstallerTest.php | 142 + .../Unit/Model/ObjectManagerProviderTest.php | 105 + .../Test/Unit/Model/PhpInformationTest.php | 34 + .../Test/Unit/Model/PhpReadinessCheckTest.php | 482 + .../Model/SearchConfigOptionsListTest.php | 70 + .../Test/Unit/Model/SearchConfigTest.php | 163 + .../SearchTermDescriptionGeneratorTest.php | 67 + .../Test/Unit/Model/SearchTermManagerTest.php | 81 + .../StoreConfigurationDataMapperTest.php | 145 + .../ThemeDependencyCheckerFactoryTest.php | 54 + .../Unit/Model/UninstallCollectorTest.php | 123 + .../Test/Unit/Model/_files/dictionary.csv | 5 + .../Test/Unit/Module/ConfigGeneratorTest.php | 142 + .../Unit/Module/ConnectionFactoryTest.php | 75 + .../Test/Unit/Module/DataSetupFactoryTest.php | 46 + .../Module/Dependency/Parser/CodeTest.php | 72 + .../Dependency/Parser/Composer/JsonTest.php | 50 + .../Dependency/Parser/Config/XmlTest.php | 49 + .../Report/Builder/AbstractBuilderTest.php | 115 + .../Report/Circular/Data/ChainTest.php | 29 + .../Report/Circular/Data/ConfigTest.php | 52 + .../Report/Circular/Data/ModuleTest.php | 52 + .../Report/Data/Config/AbstractConfigTest.php | 27 + .../Report/Dependency/Data/ConfigTest.php | 77 + .../Report/Dependency/Data/DependencyTest.php | 62 + .../Report/Dependency/Data/ModuleTest.php | 83 + .../Report/Framework/BuilderTest.php | 55 + .../Report/Framework/Data/ConfigTest.php | 52 + .../Report/Framework/Data/DependencyTest.php | 47 + .../Report/Framework/Data/ModuleTest.php | 52 + .../Report/Writer/Csv/AbstractWriterTest.php | 81 + .../App/Task/ApplicationCodeGeneratorTest.php | 117 + .../Test/Unit/Module/Di/App/Task/AreaTest.php | 129 + .../Di/App/Task/InterceptionCacheTest.php | 87 + .../Di/App/Task/OperationFactoryTest.php | 88 + .../Module/Di/App/Task/ProxyGeneratorTest.php | 70 + .../Di/App/Task/RepositoryGeneratorTest.php | 86 + .../ServiceDataAttributesGeneratorTest.php | 68 + .../InterceptionConfigurationBuilderTest.php | 125 + .../Code/Reader/ClassReaderDecoratorTest.php | 79 + .../Di/Code/Reader/ClassesScannerTest.php | 48 + .../Di/Code/Reader/FileClassScannerTest.php | 341 + .../Module/Di/Code/Reader/FileScannerTest.php | 86 + .../Reader/InstancesNamesList/AreaTest.php | 82 + .../InstancesNamesList/DirectoryTest.php | 219 + .../InstancesNamesList/InterceptionsTest.php | 176 + .../Di/Code/Reader/_files/TestClass.php | 15 + .../Di/Code/Scanner/ArrayScannerTest.php | 37 + .../Di/Code/Scanner/CompositeScannerTest.php | 65 + .../Code/Scanner/ConfigurationScannerTest.php | 74 + .../Di/Code/Scanner/DirectoryScannerTest.php | 63 + .../Module/Di/Code/Scanner/PhpScannerTest.php | 84 + .../Di/Code/Scanner/PluginScannerTest.php | 49 + .../ServiceDataAttributesScannerTest.php | 42 + .../Scanner/XmlInterceptorScannerTest.php | 49 + .../Module/Di/Code/Scanner/XmlScannerTest.php | 77 + .../Di/Compiler/ArgumentsResolverTest.php | 208 + .../Chain/ArgumentsSerializationTest.php | 68 + .../Config/Chain/BackslashTrimTest.php | 79 + .../Chain/InterceptorSubstitutionTest.php | 143 + .../Config/Chain/PreferencesResolvingTest.php | 194 + .../Compiler/Config/ModificationChainTest.php | 80 + .../Module/Di/Compiler/Config/ReaderTest.php | 242 + .../Di/Compiler/ConstructorArgumentTest.php | 24 + .../Module/Di/Definition/CollectionTest.php | 104 + .../Test/Unit/Module/Di/_files/additional.php | 8 + .../Unit/Module/Di/_files/app/bootstrap.php | 10 + .../SomeModule/Api/Data/SomeInterface.php | 19 + .../app/code/Magento/SomeModule/Element.php | 12 + .../Magento/SomeModule/ElementFactory.php | 38 + .../code/Magento/SomeModule/Helper/Test.php | 56 + .../Magento/SomeModule/Model/DoubleColon.php | 20 + .../Model/StubWithAnonymousClass.php | 36 + .../code/Magento/SomeModule/Model/Test.php | 28 + .../SomeModule/etc/adminhtml/system.xml | 20 + .../app/code/Magento/SomeModule/etc/di.xml | 22 + .../SomeModule/etc/source/PhpExt.php/content | 21 + .../SomeModule/view/frontend/default.xml | 12 + .../adminhtml/default/backend/layout.xml | 8 + .../Module/Di/_files/app/etc/additional.xml | 8 + .../Unit/Module/Di/_files/app/etc/config.xml | 10 + .../Module/Di/_files/app/etc/di/config.xml | 22 + .../Module/Di/_files/extension_attributes.xml | 15 + .../Module/Di/_files/var/generation/.keep | 0 .../Test/Unit/Module/I18n/ContextTest.php | 153 + .../Module/I18n/Dictionary/GeneratorTest.php | 220 + .../Loader/File/AbstractFileTest.php | 149 + .../Options/ResolverFactoryTest.php | 42 + .../I18n/Dictionary/Options/ResolverTest.php | 157 + .../_files/source/app/code/module1/.gitignore | 1 + .../_files/source/app/code/module2/.gitignore | 1 + .../_files/source/app/design/.gitignore | 1 + .../_files/source/lib/web/mage/.gitignore | 1 + .../_files/source/lib/web/varien/.gitignore | 1 + .../Module/I18n/Dictionary/PhraseTest.php | 164 + .../I18n/Dictionary/Writer/Csv/StdoTest.php | 21 + .../Module/I18n/Dictionary/Writer/CsvTest.php | 172 + .../I18n/Dictionary/Writer/_files/.gitignore | 1 + .../Test/Unit/Module/I18n/DictionaryTest.php | 54 + .../Test/Unit/Module/I18n/FactoryTest.php | 66 + .../Unit/Module/I18n/FilesCollectorTest.php | 46 + .../Test/Unit/Module/I18n/LocaleTest.php | 28 + .../Unit/Module/I18n/Pack/GeneratorTest.php | 148 + .../Module/I18n/Pack/Writer/File/CsvTest.php | 213 + .../I18n/Pack/Writer/File/_files/ioMock.php | 41 + .../Module/I18n/Parser/AbstractParserTest.php | 70 + .../Parser/Adapter/AbstractAdapterTest.php | 76 + .../Module/I18n/Parser/Adapter/HtmlTest.php | 151 + .../Module/I18n/Parser/Adapter/JsTest.php | 79 + .../Php/Tokenizer/PhraseCollectorTest.php | 230 + .../Adapter/Php/Tokenizer/TokenTest.php | 136 + .../I18n/Parser/Adapter/Php/TokenizerTest.php | 119 + .../Adapter/Php/_files/objectsCode.php.txt | 5 + .../Module/I18n/Parser/Adapter/PhpTest.php | 56 + .../Module/I18n/Parser/Adapter/XmlTest.php | 73 + .../I18n/Parser/Adapter/_files/default.xml | 23 + .../I18n/Parser/Adapter/_files/default_di.xml | 13 + .../I18n/Parser/Adapter/_files/email.html | 43 + .../Module/I18n/Parser/Adapter/_files/file.js | 12 + .../Unit/Module/I18n/Parser/ParserTest.php | 219 + .../I18n/_files/files_collector/default.xml | 18 + .../I18n/_files/files_collector/file.js | 10 + .../Test/Unit/Module/ResourceFactoryTest.php | 45 + .../Unit/Module/Setup/ResourceConfigTest.php | 38 + .../Test/Unit/Module/Setup/SetupCacheTest.php | 107 + .../Test/Unit/Module/SetupFactoryTest.php | 52 + .../Setup/Test/Unit/Module/SetupTest.php | 89 + .../Mvc/Bootstrap/InitParamListenerTest.php | 272 + .../Test/Unit/Validator/DbValidatorTest.php | 182 + .../Magento/Setup/Validator/DbValidator.php | 222 + .../ElasticsearchConnectionValidator.php | 67 + .../Validator/RedisConnectionValidator.php | 50 + .../setup/src/Magento/Setup/registration.php | 9 + magento/setup/view/.htaccess | 8 + magento/setup/view/magento/setup/index.phtml | 71 + .../view/styles/lib/variables/_buttons.less | 15 + .../view/styles/lib/variables/_colors.less | 42 + .../styles/lib/variables/_typography.less | 8 + 565 files changed, 235367 insertions(+), 2 deletions(-) create mode 100644 magento/setup/.htaccess create mode 100644 magento/setup/config/.htaccess create mode 100644 magento/setup/config/application.config.php create mode 100644 magento/setup/config/autoload/global.php create mode 100644 magento/setup/config/di.config.php create mode 100644 magento/setup/config/module.config.php create mode 100644 magento/setup/config/modules.config.php create mode 100644 magento/setup/index.php create mode 100644 magento/setup/performance-toolkit/.htaccess create mode 100644 magento/setup/performance-toolkit/README.md create mode 100644 magento/setup/performance-toolkit/benchmark.jmx create mode 100644 magento/setup/performance-toolkit/benchmark_2015.jmx create mode 100644 magento/setup/performance-toolkit/config/attributeSets.xml create mode 100644 magento/setup/performance-toolkit/config/customerConfig.xml create mode 100644 magento/setup/performance-toolkit/config/description.xml create mode 100644 magento/setup/performance-toolkit/config/di.xml create mode 100644 magento/setup/performance-toolkit/config/searchConfig.xml create mode 100644 magento/setup/performance-toolkit/config/searchTerms.xml create mode 100644 magento/setup/performance-toolkit/config/searchTermsLarge.xml create mode 100644 magento/setup/performance-toolkit/config/shortDescription.xml create mode 100644 magento/setup/performance-toolkit/files/downloadable_original.txt create mode 100644 magento/setup/performance-toolkit/files/downloadable_sample.txt create mode 100644 magento/setup/performance-toolkit/files/search_terms.csv create mode 100644 magento/setup/performance-toolkit/profiles/ce/extra_large.xml create mode 100644 magento/setup/performance-toolkit/profiles/ce/large.xml create mode 100644 magento/setup/performance-toolkit/profiles/ce/medium.xml create mode 100644 magento/setup/performance-toolkit/profiles/ce/medium_msite.xml create mode 100644 magento/setup/performance-toolkit/profiles/ce/small.xml create mode 100644 magento/setup/pub/.htaccess create mode 100644 magento/setup/pub/fonts/opensans/LICENSE-2.0.txt create mode 100644 magento/setup/pub/fonts/opensans/regular/opensans-400.eot create mode 100644 magento/setup/pub/fonts/opensans/regular/opensans-400.svg create mode 100644 magento/setup/pub/fonts/opensans/regular/opensans-400.ttf create mode 100644 magento/setup/pub/fonts/opensans/regular/opensans-400.woff create mode 100644 magento/setup/pub/fonts/opensans/regular/opensans-400.woff2 create mode 100644 magento/setup/pub/fonts/opensans/semibold/opensans-600.eot create mode 100644 magento/setup/pub/fonts/opensans/semibold/opensans-600.svg create mode 100644 magento/setup/pub/fonts/opensans/semibold/opensans-600.ttf create mode 100644 magento/setup/pub/fonts/opensans/semibold/opensans-600.woff create mode 100644 magento/setup/pub/fonts/opensans/semibold/opensans-600.woff2 create mode 100644 magento/setup/pub/images/favicon/favicon-16x16.png create mode 100644 magento/setup/pub/images/favicon/favicon-32x32.png create mode 100644 magento/setup/pub/images/favicon/favicon-96x96.png create mode 100644 magento/setup/pub/images/favicon/favicon.ico create mode 100644 magento/setup/pub/images/magento-logo.svg create mode 100644 magento/setup/pub/scripts/main.js create mode 100644 magento/setup/pub/styles/setup.css create mode 100644 magento/setup/src/.htaccess create mode 100644 magento/setup/src/Magento/Setup/Application.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/AbstractDependenciesCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/AbstractModuleCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/AbstractModuleManageCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/AbstractSetupCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/AdminUserCreateCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/BackupCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/ConfigSetCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/DbDataUpgradeCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/DbSchemaUpgradeCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/DbStatusCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/DependenciesShowFrameworkCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/DependenciesShowModulesCircularCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/DependenciesShowModulesCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/DiCompileCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/GenerateFixturesCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/I18nCollectPhrasesCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/I18nPackCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/InfoAdminUriCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/InfoBackupsListCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/InfoCurrencyListCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/InfoLanguageListCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/InfoTimezoneListCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/InstallCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/InstallStoreConfigurationCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/ModuleConfigStatusCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/ModuleDisableCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/ModuleEnableCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/ModuleStatusCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/RollbackCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/UninstallCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php create mode 100644 magento/setup/src/Magento/Setup/Console/CommandList.php create mode 100644 magento/setup/src/Magento/Setup/Console/CompilerPreparation.php create mode 100644 magento/setup/src/Magento/Setup/Console/InputValidationException.php create mode 100644 magento/setup/src/Magento/Setup/Console/Style/MagentoStyle.php create mode 100644 magento/setup/src/Magento/Setup/Console/Style/MagentoStyleInterface.php create mode 100644 magento/setup/src/Magento/Setup/Controller/ResponseTypeInterface.php create mode 100644 magento/setup/src/Magento/Setup/Di/MagentoDiFactory.php create mode 100644 magento/setup/src/Magento/Setup/Exception.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/AdminUsersFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/AttributeSet/AttributeSetFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/AttributeSet/Pattern.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/AttributeSet/SwatchesGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/AttributeSetsFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/BundleProductsFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/CartPriceRulesFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/CatalogPriceRulesFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/CategoriesFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/CategoryResolver.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/ConfigsApplyFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/CouponCodesFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/CustomerGroupsFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/CustomersFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/EavVariationsFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/Fixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/FixtureConfig.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/FixtureModel.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/FixtureRegistry.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/ImagesFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/ImagesGenerator/ImagesGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/IndexersStatesApplyFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/OrdersFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/PriceProvider.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/ProductsAmountProvider.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteConfiguration.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteGeneratorFactory.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/SimpleProductsFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/StoresFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/TaxRatesFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/TaxRulesFixture.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/WebsiteCategoryProvider.php create mode 100644 magento/setup/src/Magento/Setup/Fixtures/_files/dictionary.csv create mode 100644 magento/setup/src/Magento/Setup/Fixtures/_files/orders_fixture_data.json create mode 100644 magento/setup/src/Magento/Setup/Fixtures/_files/tax_rates.csv create mode 100644 magento/setup/src/Magento/Setup/Fixtures/_files/tax_rates_small.csv create mode 100644 magento/setup/src/Magento/Setup/Framework/Mail/Template/TransportBuilderMock.php create mode 100644 magento/setup/src/Magento/Setup/Framework/Mail/TransportInterfaceMock.php create mode 100644 magento/setup/src/Magento/Setup/Model/Address/AddressDataGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/AdminAccount.php create mode 100644 magento/setup/src/Magento/Setup/Model/AdminAccountFactory.php create mode 100644 magento/setup/src/Magento/Setup/Model/BasePackageInfo.php create mode 100644 magento/setup/src/Magento/Setup/Model/BatchInsert.php create mode 100644 magento/setup/src/Magento/Setup/Model/Bootstrap.php create mode 100644 magento/setup/src/Magento/Setup/Model/Complex/Generator.php create mode 100644 magento/setup/src/Magento/Setup/Model/Complex/Pattern.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigModel.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigOptionsList.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Cache.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Directory.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigOptionsList/DriverOptions.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Lock.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigOptionsList/PageCache.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Session.php create mode 100644 magento/setup/src/Magento/Setup/Model/ConfigOptionsListCollector.php create mode 100644 magento/setup/src/Magento/Setup/Model/CryptKeyGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/CryptKeyGeneratorInterface.php create mode 100644 magento/setup/src/Magento/Setup/Model/Customer/CustomerDataGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/Customer/CustomerDataGeneratorFactory.php create mode 100644 magento/setup/src/Magento/Setup/Model/DataGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/DateTime/DateTimeProvider.php create mode 100644 magento/setup/src/Magento/Setup/Model/DateTime/TimeZoneProvider.php create mode 100644 magento/setup/src/Magento/Setup/Model/DeclarationInstaller.php create mode 100644 magento/setup/src/Magento/Setup/Model/DefaultDescriptionGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/DescriptionGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/DescriptionParagraphGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/DescriptionSentenceGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/BoldMixin.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/BrakeMixin.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/DescriptionMixinInterface.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/HeaderMixin.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/Helper/RandomWordSelector.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/Helper/WordWrapper.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/ItalicMixin.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/MixinFactory.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/ParagraphMixin.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/Mixin/SpanMixin.php create mode 100644 magento/setup/src/Magento/Setup/Model/Description/MixinManager.php create mode 100644 magento/setup/src/Magento/Setup/Model/DescriptionGeneratorInterface.php create mode 100644 magento/setup/src/Magento/Setup/Model/Dictionary.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/AutoIncrement.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/BundleProductGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/BundleProductTemplateGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/ConfigurableProductGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/ConfigurableProductTemplateGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/CustomerGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/CustomerTemplateGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/EntityGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/ProductGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/ProductTemplateGeneratorFactory.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/SimpleProductTemplateGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/SqlCollector.php create mode 100644 magento/setup/src/Magento/Setup/Model/FixtureGenerator/TemplateEntityGeneratorInterface.php create mode 100644 magento/setup/src/Magento/Setup/Model/Generator.php create mode 100644 magento/setup/src/Magento/Setup/Model/Installer.php create mode 100644 magento/setup/src/Magento/Setup/Model/Installer/Progress.php create mode 100644 magento/setup/src/Magento/Setup/Model/InstallerFactory.php create mode 100644 magento/setup/src/Magento/Setup/Model/License.php create mode 100644 magento/setup/src/Magento/Setup/Model/ModuleContext.php create mode 100644 magento/setup/src/Magento/Setup/Model/ModuleRegistryUninstaller.php create mode 100644 magento/setup/src/Magento/Setup/Model/ModuleUninstaller.php create mode 100644 magento/setup/src/Magento/Setup/Model/ObjectManagerProvider.php create mode 100644 magento/setup/src/Magento/Setup/Model/PackagesAuth.php create mode 100644 magento/setup/src/Magento/Setup/Model/PhpInformation.php create mode 100644 magento/setup/src/Magento/Setup/Model/PhpReadinessCheck.php create mode 100644 magento/setup/src/Magento/Setup/Model/SearchConfig.php create mode 100644 magento/setup/src/Magento/Setup/Model/SearchConfigFactory.php create mode 100644 magento/setup/src/Magento/Setup/Model/SearchConfigOptionsList.php create mode 100644 magento/setup/src/Magento/Setup/Model/SearchTermDescriptionGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Model/SearchTermDescriptionGeneratorFactory.php create mode 100644 magento/setup/src/Magento/Setup/Model/SearchTermManager.php create mode 100644 magento/setup/src/Magento/Setup/Model/StoreConfigurationDataMapper.php create mode 100644 magento/setup/src/Magento/Setup/Model/ThemeDependencyCheckerFactory.php create mode 100644 magento/setup/src/Magento/Setup/Model/UninstallCollector.php create mode 100644 magento/setup/src/Magento/Setup/Module.php create mode 100644 magento/setup/src/Magento/Setup/Module/ConnectionFactory.php create mode 100644 magento/setup/src/Magento/Setup/Module/DataSetup.php create mode 100644 magento/setup/src/Magento/Setup/Module/DataSetupFactory.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Circular.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Parser/Code.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Parser/Composer/Json.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Parser/Config/Xml.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/ParserInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Builder/AbstractBuilder.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/BuilderInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Builder.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Chain.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Config.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Module.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Writer.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Data/Config/AbstractConfig.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Data/ConfigInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Builder.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Config.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Dependency.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Module.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Writer.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Builder.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Config.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Dependency.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Module.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Writer.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/Writer/Csv/AbstractWriter.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/Report/WriterInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Dependency/ServiceLocator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Manager.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/AppActionListGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/Area.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/Interception.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/InterceptionCache.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/PluginListGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ProxyGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/RepositoryGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ServiceDataAttributesGenerator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationException.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationFactory.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Generator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Generator/Interceptor.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/GeneratorFactory.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassReaderDecorator.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScannerInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Area.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Directory.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Interceptions.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/FileScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/InvalidFileException.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Type.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ArrayScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/CompositeScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ConfigurationScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/DirectoryScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/InheritanceInterceptorScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/InterceptedInstancesScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/PluginScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/RepositoryScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ScannerInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ServiceDataAttributesScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/XmlInterceptorScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/XmlScanner.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/ArgumentsResolver.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/ArgumentsResolverFactory.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/ArgumentsSerialization.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/BackslashTrim.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/InterceptorSubstitution.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/PreferencesResolving.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/ModificationChain.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/ModificationInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Reader.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/WriterInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/ConstructorArgument.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Log/Log.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Compiler/Log/Writer/Console.php create mode 100644 magento/setup/src/Magento/Setup/Module/Di/Definition/Collection.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Context.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Generator.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/File/AbstractFile.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/File/Csv.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/FileInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/Resolver.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/ResolverFactory.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/ResolverInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Phrase.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Writer/Csv.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Writer/Csv/Stdo.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Dictionary/WriterInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Factory.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/FilesCollector.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Locale.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Pack/Generator.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Pack/Writer/File/AbstractFile.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Pack/Writer/File/Csv.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Pack/WriterInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/AbstractParser.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/AbstractAdapter.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Html.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Js.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollector.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Token.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Translate/MethodCollector.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Xml.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/AdapterInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Contextual.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/Parser/Parser.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/ParserInterface.php create mode 100644 magento/setup/src/Magento/Setup/Module/I18n/ServiceLocator.php create mode 100644 magento/setup/src/Magento/Setup/Module/ResourceFactory.php create mode 100644 magento/setup/src/Magento/Setup/Module/Setup.php create mode 100644 magento/setup/src/Magento/Setup/Module/Setup/ResourceConfig.php create mode 100644 magento/setup/src/Magento/Setup/Module/Setup/SetupCache.php create mode 100644 magento/setup/src/Magento/Setup/Module/SetupFactory.php create mode 100644 magento/setup/src/Magento/Setup/Mvc/Bootstrap/InitParamListener.php create mode 100644 magento/setup/src/Magento/Setup/Mvc/View/Http/InjectTemplateListener.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/AdminUserCreateCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ConfigSetCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbDataUpgradeCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbSchemaUpgradeCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbStatusCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/FunctionExistMock.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/GenerateFixturesCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoAdminUriCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoBackupsListCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoCurrencyListCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoLanguageListCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoTimezoneListCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InstallCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InstallStoreConfigurationCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleConfigStatusCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleEnableDisableCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleStatusCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/UninstallCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Command/UpgradeCommandTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/CommandListTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/CompilerPreparationTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Style/MagentoStyleTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Console/Style/TestOutput.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/AttributeSetFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/PatternTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/SwatchesGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSetsFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CartPriceRulesFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CategoriesFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/ConfigsApplyFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/ConfigurableProductsFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CouponCodesFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CustomerGroupsFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CustomersFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/EavVariationsFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/FixtureConfigTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/FixtureModelTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/IndexersStatesApplyFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/OrdersFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteConfigurationTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteGeneratorFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/StoresFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/TaxRatesFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Fixtures/TaxRulesFixtureTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Address/AddressDataGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/AdminAccountFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/AdminAccountTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/BasePackageInfoTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Complex/ComplexGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Complex/PatternTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigModelTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/CacheTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/LockTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/PageCacheTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/SessionTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/CryptKeyGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Customer/CustomerDataGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/DataGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/DateTime/DateTimeProviderTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/DateTime/TimeZoneProviderTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionParagraphGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionSentenceGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/BoldMixinTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/BrakeMixinTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/HeaderMixinTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/Helper/RandomWordSelectorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/Helper/WordWrapperTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/ItalicMixinTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/ParagraphMixinTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/SpanMixinTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Description/MixinManagerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/DictionaryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/FixtureGenerator/SqlCollectorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/GeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/Installer/ProgressTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/LicenseTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleContextTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleRegistryUninstallerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleUninstallerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ObjectManagerProviderTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/PhpInformationTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/PhpReadinessCheckTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/SearchConfigOptionsListTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/SearchConfigTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/SearchTermDescriptionGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/SearchTermManagerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/StoreConfigurationDataMapperTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/ThemeDependencyCheckerFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/UninstallCollectorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Model/_files/dictionary.csv create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/ConnectionFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/DataSetupFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/CodeTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/Composer/JsonTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/Config/XmlTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Builder/AbstractBuilderTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ChainTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ConfigTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ModuleTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Data/Config/AbstractConfigTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/ConfigTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/DependencyTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/ModuleTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/BuilderTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/ConfigTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/DependencyTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/ModuleTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Writer/Csv/AbstractWriterTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ApplicationCodeGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/AreaTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/InterceptionCacheTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/OperationFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ProxyGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/RepositoryGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ServiceDataAttributesGeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Generator/InterceptionConfigurationBuilderTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/ClassReaderDecoratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/ClassesScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/FileClassScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/FileScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/AreaTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/DirectoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/InterceptionsTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/_files/TestClass.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ArrayScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/CompositeScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ConfigurationScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/DirectoryScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PhpScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PluginScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/XmlInterceptorScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/XmlScannerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/ArgumentsResolverTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/ArgumentsSerializationTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/BackslashTrimTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/InterceptorSubstitutionTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/PreferencesResolvingTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ModificationChainTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ReaderTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/ConstructorArgumentTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Definition/CollectionTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/additional.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/bootstrap.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Api/Data/SomeInterface.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Element.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/ElementFactory.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Helper/Test.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/DoubleColon.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/StubWithAnonymousClass.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/Test.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/adminhtml/system.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/di.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/source/PhpExt.php/content create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/view/frontend/default.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/design/adminhtml/default/backend/layout.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/additional.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/config.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/di/config.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/var/generation/.keep create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/ContextTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/GeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Loader/File/AbstractFileTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/code/module1/.gitignore create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/code/module2/.gitignore create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/design/.gitignore create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/lib/web/mage/.gitignore create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/lib/web/varien/.gitignore create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/PhraseTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/Csv/StdoTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/CsvTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/_files/.gitignore create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/DictionaryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/FactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/FilesCollectorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/LocaleTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/GeneratorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/Writer/File/CsvTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/Writer/File/_files/ioMock.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/AbstractParserTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/AbstractAdapterTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/HtmlTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/JsTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollectorTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/TokenTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/TokenizerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/_files/objectsCode.php.txt create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/PhpTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/XmlTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/default.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/default_di.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/email.html create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/file.js create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/ParserTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/_files/files_collector/default.xml create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/_files/files_collector/file.js create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/ResourceFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Setup/ResourceConfigTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/Setup/SetupCacheTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/SetupFactoryTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Module/SetupTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Mvc/Bootstrap/InitParamListenerTest.php create mode 100644 magento/setup/src/Magento/Setup/Test/Unit/Validator/DbValidatorTest.php create mode 100644 magento/setup/src/Magento/Setup/Validator/DbValidator.php create mode 100644 magento/setup/src/Magento/Setup/Validator/ElasticsearchConnectionValidator.php create mode 100644 magento/setup/src/Magento/Setup/Validator/RedisConnectionValidator.php create mode 100644 magento/setup/src/Magento/Setup/registration.php create mode 100644 magento/setup/view/.htaccess create mode 100644 magento/setup/view/magento/setup/index.phtml create mode 100644 magento/setup/view/styles/lib/variables/_buttons.less create mode 100644 magento/setup/view/styles/lib/variables/_colors.less create mode 100644 magento/setup/view/styles/lib/variables/_typography.less diff --git a/magento/composer.json b/magento/composer.json index 2638752..aa96ff0 100644 --- a/magento/composer.json +++ b/magento/composer.json @@ -24,8 +24,7 @@ "magento/module-catalog": "^104.0", "magento/module-inventory-api": "^1.2", "magento/product-community-edition": "2.4.5", - "swissup/module-search-mysql-legacy": "^1.1", - "yireo/magento2-replace-all": "^4.2" + "swissup/module-search-mysql-legacy": "^1.1" }, "autoload": { "exclude-from-classmap": [ diff --git a/magento/setup/.htaccess b/magento/setup/.htaccess new file mode 100644 index 0000000..3e6764b --- /dev/null +++ b/magento/setup/.htaccess @@ -0,0 +1,5 @@ +Options -Indexes + + + RewriteEngine Off + diff --git a/magento/setup/config/.htaccess b/magento/setup/config/.htaccess new file mode 100644 index 0000000..707c26b --- /dev/null +++ b/magento/setup/config/.htaccess @@ -0,0 +1,8 @@ + + order allow,deny + deny from all + += 2.4> + Require all denied + + diff --git a/magento/setup/config/application.config.php b/magento/setup/config/application.config.php new file mode 100644 index 0000000..7a55e71 --- /dev/null +++ b/magento/setup/config/application.config.php @@ -0,0 +1,34 @@ + require __DIR__ . '/modules.config.php', + 'module_listener_options' => [ + 'module_paths' => [ + __DIR__ . '/../src', + ], + 'config_glob_paths' => [ + __DIR__ . '/autoload/{,*.}{global,local}.php', + ], + ], + 'listeners' => [ + InitParamListener::class + ], + 'service_manager' => [ + 'factories' => [ + InitParamListener::BOOTSTRAP_PARAM => InitParamListener::class, + \Magento\Framework\App\MaintenanceMode::class => MagentoDiFactory::class, + \Magento\Setup\Model\ConfigGenerator::class => MagentoDiFactory::class, + \Magento\Indexer\Console\Command\IndexerReindexCommand::class => MagentoDiFactory::class, + \Symfony\Component\Console\Helper\TableFactory::class => MagentoDiFactory::class, + \Magento\Deploy\Console\InputValidator::class => MagentoDiFactory::class, + \Magento\Framework\App\State::class => MagentoDiFactory::class, + ], + ] +]; diff --git a/magento/setup/config/autoload/global.php b/magento/setup/config/autoload/global.php new file mode 100644 index 0000000..6e4af2e --- /dev/null +++ b/magento/setup/config/autoload/global.php @@ -0,0 +1,22 @@ + array_merge( + $_SERVER, + [ + Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS => [ + DirectoryList::ROOT => [ + DirectoryList::PATH => BP + ] + ] + ] + ) +]; diff --git a/magento/setup/config/di.config.php b/magento/setup/config/di.config.php new file mode 100644 index 0000000..c3abe43 --- /dev/null +++ b/magento/setup/config/di.config.php @@ -0,0 +1,43 @@ + [ + 'auto' => [ + 'preferences' => [ + EventManagerInterface::class => 'EventManager', + ServiceLocatorInterface::class => ServiceManager::class, + LoggerInterface::class => Quiet::class, + ConfigInterface::class => Config::class, + DriverInterface::class => \Magento\Framework\Filesystem\Driver\File::class, + ComponentRegistrarInterface::class => ComponentRegistrar::class, + ], + 'types' => [ + SchemaConfig::class => [ + 'parameters' => [ + 'connectionScopes' => [ + 'default', + 'checkout', + 'sales' + ] + ] + ], + ], + ], + ], +]; diff --git a/magento/setup/config/module.config.php b/magento/setup/config/module.config.php new file mode 100644 index 0000000..9803343 --- /dev/null +++ b/magento/setup/config/module.config.php @@ -0,0 +1,16 @@ + [ + 'display_not_found_reason' => false, + 'display_exceptions' => false, + 'doctype' => 'HTML5', + 'template_path_stack' => [ + 'setup' => __DIR__ . '/../view', + ], + ] +]; diff --git a/magento/setup/config/modules.config.php b/magento/setup/config/modules.config.php new file mode 100644 index 0000000..9396d15 --- /dev/null +++ b/magento/setup/config/modules.config.php @@ -0,0 +1,15 @@ + +
+

+ Autoload error

+
+

{$e->getMessage()}

+ +HTML; + exit(1); +} + +// For Setup Wizard we are using our customized error handler +$handler = new \Magento\Framework\App\ErrorHandler(); +set_error_handler([$handler, 'handler']); + +// Render Setup Wizard landing page +$objectManager = Bootstrap::create(BP, $_SERVER)->getObjectManager(); + +$licenseClass = $objectManager->create(License::class); +$metaClass = $objectManager->create(ProductMetadata::class); +/** @var License $license */ +$license = $licenseClass->getContents(); +/** @var ProductMetadata $version */ +$version = $metaClass->getVersion(); + +$request = new Request(); +$basePath = $request->getBasePath(); + +ob_start(); +require_once __DIR__ . '/view/magento/setup/index.phtml'; +$html = ob_get_clean(); +echo $html; diff --git a/magento/setup/performance-toolkit/.htaccess b/magento/setup/performance-toolkit/.htaccess new file mode 100644 index 0000000..707c26b --- /dev/null +++ b/magento/setup/performance-toolkit/.htaccess @@ -0,0 +1,8 @@ + + order allow,deny + deny from all + += 2.4> + Require all denied + + diff --git a/magento/setup/performance-toolkit/README.md b/magento/setup/performance-toolkit/README.md new file mode 100644 index 0000000..1088725 --- /dev/null +++ b/magento/setup/performance-toolkit/README.md @@ -0,0 +1,354 @@ +# Performance Toolkit + +The Performance Toolkit enables you to test the performance of your Magento installations and the impact of your customizations. It allows you to generate sample data for testing performance and to run Apache JMeter scenarios, which imitate users activity. As a result, you get a set of metrics, that you can use to judge how changes affect performance, and the overall load capacity of your server(s). + +## Installation + +### Apache JMeter + +- Go to the [Download Apache JMeter](http://jmeter.apache.org/download_jmeter.cgi) page and download JMeter in the *Binaries* section. Note that Java 8 or later is required. +- Unzip the archive. + +### JSON Plugins + +- Go to the [JMeter Installing Plugins](https://jmeter-plugins.org/install/Install/) page. +- Download `plugins-manager.jar` and put it into the `{JMeter path}/lib/ext` directory. Then restart JMeter. +- Follow the instructions provided on the [JMeter Plugins Manager](https://jmeter-plugins.org/wiki/PluginsManager/) page to open Plugins Manager. +- Select *Json Plugins* from the plugins listed on the *Available Plugins* tab, then click the *Apply changes and restart JMeter* button. + +## Quick Start + +Before running the JMeter tests for the first time, you will need to first use the `php bin/magento setup:performance:generate-fixtures {profile path}` command to generate the test data. +You can find the configuration files of available B2C profiles in the folders `setup/performance-toolkit/profiles/ce` and `setup/performance-toolkit/profiles/ee`. + +It can take a significant amount of time to generate a profile. For example, generating the large profile can take up to 4 hours. So we recommend using the `-s` option to skip indexation. Then you can start indexation manually. + +Splitting generation and indexation processes doesn't reduce total processing time, but it requires fewer resources. For example, to generate a small profile, use commands: + + php bin/magento setup:performance:generate-fixtures -s setup/performance-toolkit/profiles/ce/small.xml + php bin/magento indexer:reindex + +For more information about the available profiles and generating fixtures generation, read [Generate data for performance testing](https://devdocs.magento.com/guides/v2.4/config-guide/cli/config-cli-subcommands-perf-data.html). + +For run Admin Pool in multithreading mode, please be sure, that: + +- "Admin Account Sharing" is enabled + + `Follow Stores > Configuration > Advanced > Admin > Security. + Set Admin Account Sharing to Yes.` + +- Indexers setup in "Update by schedule" mode: + + `Follow System > Tool > Index Management + Set "Update by schedule" for all idexers` + +**Note:** Before generating medium or large profiles, it may be necessary to increase the value of `tmp_table_size` and `max_heap_table_size` parameters for MySQL to 512Mb or more. The value of `memory_limit` for PHP should be 1Gb or more. + +There are two JMeter scenarios located in `setup/performance-toolkit` folder: `benchmark.jmx` and `benchmark_2015.jmx` (legacy version). + +**Note:** To be sure that all quotes are empty, run the following MySQL query before each run of a scenario: + + UPDATE quote SET is_active = 0 WHERE is_active = 1; + +### Run JMeter scenario via console + +The following parameters can be passed to the `benchmark.jmx` scenario: + +Main parameters: + +| Parameter Name | Default Value | Description | +| --------------------------------------------- | ------------------- | ---------------------------------------------------------------------------------------- | +| host | localhost | URL component 'host' of application being tested (URL or IP). | +| base_path | / | Base path for tested site. | +| files_folder | ./files/ | Path to various files that are used in scenario (`setup/performance-toolkit/files`). | +| request_protocol | http | Hypertext Transfer Protocol (http or https). | +| graphql_port_number | | Port number for GraphQL. | +| admin_password | 123123q | Admin backend password. | +| admin_path | admin | Admin backend path. | +| admin_user | admin | Admin backend user. | +| cache_hits_percentage | 100 | Cache hits percentage. | +| seedForRandom | 1 | System option for setting random number method | +| loops | 1 | Number of loops to run. | +| frontendPoolUsers | 0 | Total number of Frontend threads. | +| adminPoolUsers | 0 | Total number of Admin threads. | +| csrPoolUsers | 0 | Total number of CSR threads. | +| apiPoolUsers | 0 | Total number of API threads. | +| oneThreadScenariosPoolUsers | 0 | Total number of One Thread Scenarios threads. | +| graphQLPoolUsers | 0 | Total number of GraphQL threads. | +| combinedBenchmarkPoolUsers | 0 | Total number of Combined Benchmark threads. | + +Parameters for Frontend pool: + +| Parameter Name | Default Value | Description | +| --------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------- | +| browseCatalogByCustomerPercentage | 0 | Percentage of threads in Frontend Pool that emulate customer catalog browsing activities. | +| browseCatalogByGuestPercentage | 0 | Percentage of threads in Frontend Pool that emulate guest catalog browsing activities. | +| siteSearchPercentage | 0 | Percentage of threads in Frontend Pool that emulate catalog search activities. | +| addToCartByGuestPercentage | 0 | Percentage of threads in Frontend Pool that emulate abandoned cart activities by guest. | +| addToWishlistPercentage | 0 | Percentage of threads in Frontend Pool that emulate adding products to Wishlist. | +| compareProductsPercentage | 0 | Percentage of threads in Frontend Pool that emulate products comparison. | +| checkoutByGuestPercentage | 0 | Percentage of threads in Frontend Pool that emulate checkout by guest. | +| checkoutByCustomerPercentage | 0 | Percentage of threads in Frontend Pool that emulate checkout by customer. | +| reviewByCustomerPercentage | 0 | Percentage of threads in Frontend Pool that emulate reviewing products. | +| addToCartByCustomerPercentage | 0 | Percentage of threads in Frontend Pool that emulate abandoned cart activities by customer.| +| accountManagementPercentage | 0 | Percentage of threads in Frontend Pool that emulate account management. | + +Parameters for Admin pool: + +| Parameter Name | Default Value | Description | +| --------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------- | +| adminCMSManagementPercentage | 0 | Percentage of threads in Admin Pool that emulate CMS management activities. | +| browseProductGridPercentage | 0 | Percentage of threads in Admin Pool that emulate products grid browsing activities. | +| browseOrderGridPercentage | 0 | Percentage of threads in Admin Pool that emulate orders grid browsing activities. | +| adminProductCreationPercentage | 0 | Percentage of threads in Admin Pool that emulate product creation activities. | +| adminProductEditingPercentage | 0 | Percentage of threads in Admin Pool that emulate product editing activities. | + +Parameters for CSR pool: + +| Parameter Name | Default Value | Description | +| --------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------- | +| adminReturnsManagementPercentage | 0 | Percentage of threads in CSR Pool that emulate admin returns management activities. | +| browseCustomerGridPercentage | 0 | Percentage of threads in CSR Pool that emulate customers grid browsing activities. | +| adminCreateOrderPercentage | 0 | Percentage of threads in CSR Pool that emulate creating orders activities. | + +Parameters for API pool: + +| Parameter Name | Default Value | Description | +| --------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------- | +| apiBasePercentage | 0 | Percentage of threads in API Pool that emulate API requests activities. | + +Parameters for One Thread Scenarios pool: + +| Parameter Name | Default Value | Description | +| --------------------------------------------- | ------------------- | ----------------------------------------------------------------------------- | +| productGridMassActionPercentage | 0 | Percentage of threads that emulate product mass action activities. | +| importProductsPercentage | 0 | Percentage of threads that emulate products import activities. | +| importCustomersPercentage | 0 | Percentage of threads that emulate customers import activities. | +| exportProductsPercentage | 0 | Percentage of threads that emulate products export activities. | +| exportCustomersPercentage | 0 | Percentage of threads that emulate customers export activities. | +| apiSinglePercentage | 0 | Percentage of threads that emulate API nonparallel requests activities. | +| adminCategoryManagementPercentage | 0 | Percentage of threads that emulate category management activities. | +| adminPromotionRulesPercentage | 0 | Percentage of threads that emulate promotion rules activities. | +| adminCustomerManagementPercentage | 0 | Percentage of threads that emulate customer management activities. | +| adminEditOrderPercentage | 0 | Percentage of threads that emulate edit order activities. | +| catalogGraphQLPercentage | 0 | Percentage of threads that emulate nonparallel catalogGraphQL activities. | + +Parameters for GraphQL pool: + +| Parameter Name | Default Value | Description | +| ----------------------------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------- | +| graphqlGetListOfProductsByCategoryIdPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetSimpleProductDetailsByProductUrlKeyPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetSimpleProductDetailsByNamePercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetConfigurableProductDetailsByProductUrlKeyPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetConfigurableProductDetailsByNamePercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetProductSearchByTextAndCategoryIdPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetCategoryListByCategoryIdPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlUrlInfoByUrlKeyPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetCmsPageByIdPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetNavigationMenuByCategoryIdPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlCreateEmptyCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlGetEmptyCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlSetShippingAddressOnCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlSetBillingAddressOnCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlAddSimpleProductToCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlAddConfigurableProductToCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlUpdateSimpleProductQtyInCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlUpdateConfigurableProductQtyInCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlRemoveSimpleProductFromCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlRemoveConfigurableProductFromCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlApplyCouponToCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlRemoveCouponFromCartPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlCatalogBrowsingByGuestPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | +| graphqlCheckoutByGuestPercentage | 0 | Percentage of threads in GraphQL Pool that emulate GraphQL requests activities. | + +Parameters for Combined Benchmark pool: + +| Parameter Name | Default Value | Description | +| ----------------------------------------------------------------- | ------------------- | ---------------------------------------------------------------------------------------------------- | +| cBrowseCatalogByGuestPercentage | 29 | Percentage of threads in Combined Benchmark Pool that emulate customer catalog browsing activities. | +| cSiteSearchPercentage | 29 | Percentage of threads in Combined Benchmark Pool that emulate catalog search activities. | +| cAddToCartByGuestPercentage | 26 | Percentage of threads in Combined Benchmark Pool that emulate abandoned cart activities. | +| cAddToWishlistPercentage | 1.5 | Percentage of threads in Combined Benchmark Pool that emulate adding products to Wishlist. | +| cCompareProductsPercentage | 1.5 | Percentage of threads in Combined Benchmark Pool that emulate products comparison. | +| cCheckoutByGuestPercentage | 3.5 | Percentage of threads in Combined Benchmark Pool that emulate checkout by guest. | +| cCheckoutByCustomerPercentage | 3.5 | Percentage of threads in Combined Benchmark Pool that emulate checkout by customer. | +| cAccountManagementPercentage | 1 | Percentage of threads in Combined Benchmark Pool that emulate account management. | +| cAdminCMSManagementPercentage | 0.35 | Percentage of threads in Combined Benchmark Pool that emulate CMS management activities. | +| cAdminBrowseProductGridPercentage | 0.2 | Percentage of threads in Combined Benchmark Pool that emulate products grid browsing activities. | +| cAdminBrowseOrderGridPercentage | 0.2 | Percentage of threads in Combined Benchmark Pool that emulate orders grid browsing activities. | +| cAdminProductCreationPercentage | 0.5 | Percentage of threads in Combined Benchmark Pool that emulate product creation activities. | +| cAdminProductEditingPercentage | 0.65 | Percentage of threads in Combined Benchmark Pool that emulate product editing activities. | +| cAdminReturnsManagementPercentage | 0.75 | Percentage of threads in Combined Benchmark Pool that emulate admin returns management activities. | +| cAdminBrowseCustomerGridPercentage | 0.1 | Percentage of threads in Combined Benchmark Pool that emulate customers grid browsing activities. | +| cAdminCreateOrderPercentage | 0.5 | Percentage of threads in Combined Benchmark Pool that emulate creating orders activities. | +| cAdminCategoryManagementPercentage | 0.15 | Percentage of threads in Combined Benchmark Pool that emulate admin category management activities. | +| cAdminPromotionRulesPercentage | 0.2 | Percentage of threads in Combined Benchmark Pool that emulate admin promotion rules activities. | +| cAdminCustomerManagementPercentage | 0.4 | Percentage of threads in Combined Benchmark Pool that emulate admin customers management activities. | +| cAdminEditOrderPercentage | 1 | Percentage of threads in Combined Benchmark Pool that emulate admin edit order activities. | + +Parameters must be passed to the command line with the `J` prefix: + +`-J{parameter_name}={parameter_value}` + +The required parameters are `{host}` and `{base_path}`. All other parameters are optional. If you do not pass any custom value, a default value will be used. + +There are some options that you should pass to JMeter in the console mode: + +`-n` Run scenario in Non-GUI mode +`-t` Path to the JMX file to be run +`-l` Path to the JTL file to log sample results to +`-j` Path to JMeter run log file + +To get more details about available JMeter options, read [Non-GUI Mode](http://jmeter.apache.org/usermanual/get-started.html#non_gui). + +For example, you can run the B2C scenario via console with: +90 threads for the Frontend Pool where: + +- 80% - guest catalog browsing activities. +- 20% - checkout by customer. + +10 threads for the Admin Pool where: + +- 10% - admin products grid browsing activities. +- 90% - admin product creation activities. + + cd {JMeter path}/bin/ + jmeter -n -t {path to performance toolkit}/benchmark.jmx -j ./jmeter.log -l ./jmeter-results.jtl -Jhost=magento2.dev -Jbase_path=/ -Jadmin_path=admin -JfrontendPoolUsers=90 -JadminPoolUsers=10 -JbrowseCatalogByGuestPercentage=80 -JcheckoutByCustomerPercentage=20 -JbrowseProductGridPercentage=10 -JadminProductCreationPercentage=90 + +As a result, you will get `jmeter.log` and `jmeter-results.jtl`. The`jmeter.log` contains information about the test run and can be helpful in determining the cause of an error. The JTL file is a text file containing the results of a test run. It can be opened in the GUI mode to perform analysis of the results (see the *Output* section below). + +The following parameters can be passed to the `benchmark_2015.jmx` scenario: + +| Parameter Name | Default Value | Description | +| -------------------------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| host | localhost | URL component 'host' of application being tested (URL or IP). | +| base_path | / | Base path for tested site. | +| report_save_path | ./ | Path where reports will be saved. Reports will be saved in current working directory by default. | +| ramp_period | 300 | Ramp period (seconds). Period the request will be distributed within. | +| orders | 0 | Number of orders in the period specified in the current allocation. If `orders` is specified, the `users` parameter will be recalculated. | +| users | 100 | Number of concurrent users. Recommended amount is 100. Minimal amount is 10. | +| view_product_add_to_cart_percent | 62 | Percentage of users that will only reach the add to cart stage. | +| view_catalog_percent | 30 | Percentage of users that will only reach the view catalog stage. | +| guest_checkout_percent | 4 | Percentage of users that will reach the guest checkout stage. | +| customer_checkout_percent | 4 | Percentage of users that will reach the (logged-in) customer checkout stage. | +| loops | 1 | Number of loops to run. | +| admin_path | admin | Admin backend path. | +| admin_user | admin | Admin backend user. | +| admin_password | 123123q | Admin backend password. | +| think_time_deviation | 1000 | Deviation (ms) for "think time" emulation. | +| think_time_delay_offset | 2000 | Constant delay offset (ms) for "think time" emulation. | + +### Run JMeter scenario via GUI + +**Note:** Use the GUI mode only for scenario debugging and viewing reports. Use console mode for real-life load testing, because it requires significantly fewer resources. + +- Change directories to `{JMeter path}/bin/` and run `jmeter.bat`. +- Click *File -> Open (Ctrl+O)* and select `benchmark.jmx` file or drag and drop the `benchmark.jmx` file in the opened GUI. + +In the root node (*Performance Test Plan*) in the left panel, you can change *User Defined Variables* listed in the previous section. +To run a script, click the *Start* button (green arrow in the top menu). + +## Output + +The results of running a JMeter scenario are available in the *View Results Tree* and *Aggregate Report* nodes in the left panel of the JMeter GUI. + +When the script is run via GUI, the results are available in the left panel. Choose the corresponding report. When the script is run via console, a JTL report is generated. You can run JMeter GUI later and open it in the corresponding report node. + +The legacy scenario (Benchmark_2015) contains *View Results Tree*, *Detailed URLs Report* and *Summary Report* nodes. + +### View Results Tree + +This report shows the tree of all requests and responses made during the scenario run. It provides information about the response time, headers and response codes. This report is useful for scenario debugging, but should be disabled during load testing because it consumes a lot of resources. + +You can open a JTL file in this report to debug a scenario and view the requests that cause errors. By default, a JTL file doesn't contain bodies of requests/responses, so it is better to debug scenarios in the GUI mode. + +For more details, read [View Results Tree](http://jmeter.apache.org/usermanual/component_reference.html#View_Results_Tree). + +### Aggregate Report + +This report contains aggregated information about all requests. It provides request count, min, max, average, error rate, approximate throughput, etc. You can open a JTL file in this report to analyze the results of a scenario run. + +For more details, read [Aggregate Report](http://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report). + +### Detailed URLs Report (Legacy) + +This report contains information about URLs. Note that the URL is displayed only in a generated report file (URL is not displayed in the GUI). The report file name is `{report_save_path}/detailed-urls-report.log`. It can be opened as a CSV file. + +For more details, read [View Results in Table](http://jmeter.apache.org/usermanual/component_reference.html#View_Results_in_Table). + +### Summary Report (Legacy) + +The report contains aggregated information about threads. The report file name is `{report_save_path}/summary-report.log`. + +For more details, read [Summary Report](http://jmeter.apache.org/usermanual/component_reference.html#Summary_Report). + +## Additional Information + +### Scenarios + +`benchmark.jmx` scenario has the following pools: + +- **Frontend Pool** (frontendPoolUsers) + +- **Admin Pool** (adminPoolUsers) + +- **CSR Pool** (csrPoolUsers) + +- **API Pool** (apiPoolUsers) + +- **One Thread Scenarios Pool** (oneThreadScenariosPoolUsers) + +- **GraphQL Pool** (graphQLPoolUsers) + +- **Combined Benchmark Pool** (combinedBenchmarkPoolUsers) + +- **Legacy Threads** + +- **Legacy Scenario** + +#### Legacy Threads + +The `benchmark_2015.jmx` script consists of five thread groups: the setup thread and four user threads. +By default, the percentage ratio between the thread groups is as follows: + +- Browsing, adding items to the cart and abandon cart (BrowsAddToCart suffix in reports) - 62% +- Just browsing (CatProdBrows suffix in reports) - 30% +- Browsing, adding items to cart and checkout as guest (GuestChkt suffix in reports) - 4% +- Browsing, adding items to cart and checkout as registered customer (CustomerChkt suffix in reports) - 4% + +The `benchmark_2015.jmx` script consists of five thread groups: the setup thread and four user threads. +By default, the percentage ratio between the thread groups is as follows: + +- Browsing, adding items to the cart and abandon cart (BrowsAddToCart suffix in reports) - 62% +- Just browsing (CatProdBrows suffix in reports) - 30% +- Browsing, adding items to cart and checkout as guest (GuestChkt suffix in reports) - 4% +- Browsing, adding items to cart and checkout as registered customer (CustomerChkt suffix in reports) - 4% + +#### Legacy Scenario + +It is convenient to use *Summary Report* for the results analysis. To evaluate the number of each request per hour, use the value in the *Throughput* column. + +To get the summary value of throughput for some action: + +1. Find all rows that relate to the desired action +2. Convert values from *Throughput* column to a common denominator +3. Sum up the obtained values + +For example, to get summary throughput for the *Simple Product View* action when the following rows are present in the *Summary Report*: + +| Label | # Samples | ... | Throughput | +| ------------------------------------- | --------------- | --- | ---------- | +| ... | ... | ... | ... | +| Open Home Page(CatProdBrows) | 64 | ... | 2.2/sec | +| Simple Product 1 View(GuestChkt) | 4 | ... | 1.1/sec | +| Simple Product 2 View(BrowsAddToCart) | 30 | ... | 55.6/min | +| ... | ... | ... | ... | + +Find all rows with the label *Simple Product # View* and calculate the summary throughput: + + 1.1/sec + 55.6/min = 66/min + 55.6/min = 121.6/min = 2.02/sec + +If you need information about the summary throughput of the *Checkout* actions, find the rows with labels *Checkout success* and make the same calculation. + +For the total number of page views, you will want to sum up all actions minus the setup thread. diff --git a/magento/setup/performance-toolkit/benchmark.jmx b/magento/setup/performance-toolkit/benchmark.jmx new file mode 100644 index 0000000..a0301de --- /dev/null +++ b/magento/setup/performance-toolkit/benchmark.jmx @@ -0,0 +1,118516 @@ + + + + + + + false + false + + + + + host + ${__P(host,localhost)} + = + + + base_path + ${__P(base_path,/)} + = + + + files_folder + ${__P(files_folder,./files/)} + = + + + request_protocol + ${__P(request_protocol,http)} + = + + + graphql_port_number + ${__P(graphql_port_number,)} + = + + + admin_password + ${__P(admin_password,)} + = + + + admin_path + ${__P(admin_path,admin)} + = + + + admin_user + ${__P(admin_user,admin)} + = + + + cache_hits_percentage + ${__P(cache_hits_percentage,100)} + = + + + seedForRandom + ${__P(seedForRandom,1)} + = + + + loops + ${__P(loops,1)} + = + + + frontendPoolUsers + ${__P(frontendPoolUsers,0)} + = + + + adminPoolUsers + ${__P(adminPoolUsers,0)} + = + + + csrPoolUsers + ${__P(csrPoolUsers,0)} + = + + + apiPoolUsers + ${__P(apiPoolUsers,0)} + = + + + oneThreadScenariosPoolUsers + ${__P(oneThreadScenariosPoolUsers,0)} + = + + + graphQLPoolUsers + ${__P(graphQLPoolUsers,0)} + = + + + combinedBenchmarkPoolUsers + ${__P(combinedBenchmarkPoolUsers,0)} + = + + + restAPIcombinedBenchmarkPoolUsers + ${__P(restAPIcombinedBenchmarkPoolUsers,0)} + = + + + graphQLcombinedBenchmarkPoolUsers + ${__P(graphQLcombinedBenchmarkPoolUsers,0)} + = + + + accountManagementPercentage + ${__P(accountManagementPercentage,0)} + = + + + addToCartByCustomerPercentage + ${__P(addToCartByCustomerPercentage,0)} + = + + + addToCartByGuestPercentage + ${__P(addToCartByGuestPercentage,0)} + = + + + addToWishlistPercentage + ${__P(addToWishlistPercentage,0)} + = + + + adminCMSManagementDelay + ${__P(adminCMSManagementDelay,0)} + = + + + adminCMSManagementPercentage + ${__P(adminCMSManagementPercentage,0)} + = + + + adminCategoryCount + ${__P(adminCategoryCount,0)} + = + + + adminCategoryManagementDelay + ${__P(adminCategoryManagementDelay,0)} + = + + + adminCategoryManagementPercentage + ${__P(adminCategoryManagementPercentage,0)} + = + + + adminCreateOrderPercentage + ${__P(adminCreateOrderPercentage,0)} + = + + + adminCreateProcessReturns + ${__P(adminCreateProcessReturns,0)} + = + + + adminCreateProcessReturnsDelay + ${__P(adminCreateProcessReturnsDelay,0)} + = + + + adminCustomerManagementDelay + ${__P(adminCustomerManagementDelay,0)} + = + + + adminCustomerManagementPercentage + ${__P(adminCustomerManagementPercentage,0)} + = + + + adminEditOrderPercentage + ${__P(adminEditOrderPercentage,0)} + = + + + adminImportCustomerBehavior + ${__P(adminImportCustomerBehavior,append)} + = + + + adminImportCustomerFilePath + ${__P(adminImportCustomerFilePath,import_customers/customer_import_addupdate.csv)} + = + + + adminImportProductBehavior + ${__P(adminImportProductBehavior,append)} + = + + + adminImportProductFilePath + ${__P(adminImportProductFilePath,import_products/product_import_append_1.csv)} + = + + + adminProductCreationPercentage + ${__P(adminProductCreationPercentage,0)} + = + + + adminProductEditingPercentage + ${__P(adminProductEditingPercentage,0)} + = + + + adminPromotionRulesPercentage + ${__P(adminPromotionRulesPercentage,0)} + = + + + adminPromotionsManagement + ${__P(adminPromotionsManagement,0)} + = + + + adminPromotionsManagementDelay + ${__P(adminPromotionsManagementDelay,0)} + = + + + adminReturnsManagementPercentage + ${__P(adminReturnsManagementPercentage,0)} + = + + + admin_browse_customer_filter_text + ${__P(admin_browse_customer_filter_text,Firstname)} + = + + + admin_browse_orders_filter_text + ${__P(admin_browse_orders_filter_text,pending)} + = + + + admin_browse_product_filter_text + ${__P(admin_browse_product_filter_text,Product)} + = + + + admin_token + ${__P(admin_token,admin_token)} + = + + + admin_users_distribution_per_admin_pool + ${__P(admin_users_distribution_per_admin_pool,1)} + = + + + apiBasePercentage + ${__P(apiBasePercentage,0)} + = + + + apiOrderInvoiceShipmentSync + ${__P(apiOrderInvoiceShipmentSync,0)} + = + + + apiProcessOrders + ${__P(apiProcessOrders,1)} + = + + + apiSinglePercentage + ${__P(apiSinglePercentage,0)} + = + + + browseCatalogByCustomerPercentage + ${__P(browseCatalogByCustomerPercentage,0)} + = + + + browseCatalogByGuestPercentage + ${__P(browseCatalogByGuestPercentage,0)} + = + + + browseCustomerGridPercentage + ${__P(browseCustomerGridPercentage,0)} + = + + + browseOrderGridPercentage + ${__P(browseOrderGridPercentage,0)} + = + + + browseProductGridPercentage + ${__P(browseProductGridPercentage,0)} + = + + + cAccountManagementPercentage + ${__P(cAccountManagementPercentage,1)} + = + + + cAddToCartByGuestPercentage + ${__P(cAddToCartByGuestPercentage,26)} + = + + + cAddToWishlistPercentage + ${__P(cAddToWishlistPercentage,1.5)} + = + + + cAdminBrowseCustomerGridPercentage + ${__P(cAdminBrowseCustomerGridPercentage,0.1)} + = + + + cAdminBrowseOrderGridPercentage + ${__P(cAdminBrowseOrderGridPercentage,0.2)} + = + + + cAdminBrowseProductGridPercentage + ${__P(cAdminBrowseProductGridPercentage,0.2)} + = + + + cAdminCMSManagementPercentage + ${__P(cAdminCMSManagementPercentage,0.35)} + = + + + cAdminCategoryManagementPercentage + ${__P(cAdminCategoryManagementPercentage,0.15)} + = + + + cAdminCreateOrderPercentage + ${__P(cAdminCreateOrderPercentage,0.5)} + = + + + cAdminCustomerManagementPercentage + ${__P(cAdminCustomerManagementPercentage,0.4)} + = + + + cAdminEditOrderPercentage + ${__P(cAdminEditOrderPercentage,1)} + = + + + cAdminProductCreationPercentage + ${__P(cAdminProductCreationPercentage,0.5)} + = + + + cAdminProductEditingPercentage + ${__P(cAdminProductEditingPercentage,0.65)} + = + + + cAdminPromotionRulesPercentage + ${__P(cAdminPromotionRulesPercentage,0.2)} + = + + + cAdminReturnsManagementPercentage + ${__P(cAdminReturnsManagementPercentage,0.75)} + = + + + cBrowseCatalogByGuestPercentage + ${__P(cBrowseCatalogByGuestPercentage,29)} + = + + + cCheckoutByCustomerPercentage + ${__P(cCheckoutByCustomerPercentage,3.5)} + = + + + cCheckoutByGuestPercentage + ${__P(cCheckoutByGuestPercentage,3.5)} + = + + + cCompareProductsPercentage + ${__P(cCompareProductsPercentage,1.5)} + = + + + cSiteSearchPercentage + ${__P(cSiteSearchPercentage,29)} + = + + + catalogGraphQLPercentage + ${__P(catalogGraphQLPercentage,0)} + = + + + categories_count + ${__P(categories_count,100)} + = + + + checkoutALargeBulkOfProductsByGuestPercentage + ${__P(checkoutALargeBulkOfProductsByGuestPercentage,0)} + = + + + checkoutByCustomerPercentage + ${__P(checkoutByCustomerPercentage,0)} + = + + + checkoutByGuestPercentage + ${__P(checkoutByGuestPercentage,0)} + = + + + compareProductsPercentage + ${__P(compareProductsPercentage,0)} + = + + + configurable_products_count + ${__P(configurable_products_count,15)} + = + + + customer_checkout_percent + ${__P(customer_checkout_percent,100)} + = + + + customer_password + ${__P(customer_password,)} + = + + + customers_page_size + ${__P(customers_page_size,100)} + = + + + dashboard_enabled + ${__P(dashboard_enabled,0)} + = + + + exportCustomersPercentage + ${__P(exportCustomersPercentage,0)} + = + + + exportProductsPercentage + ${__P(exportProductsPercentage,0)} + = + + + form_key + ${__P(form_key,uVEW54r8kKday8Wk)} + = + + + graphqlAddConfigurableProductToCartPercentage + ${__P(graphqlAddConfigurableProductToCartPercentage,0)} + = + + + graphqlAddSimpleProductToCartPercentage + ${__P(graphqlAddSimpleProductToCartPercentage,0)} + = + + + graphqlApplyCouponToCartPercentage + ${__P(graphqlApplyCouponToCartPercentage,0)} + = + + + graphqlCatalogBrowsingByGuestPercentage + ${__P(graphqlCatalogBrowsingByGuestPercentage,0)} + = + + + graphqlCheckoutALargeBulkOfProductsByGuestPercentage + ${__P(graphqlCheckoutALargeBulkOfProductsByGuestPercentage,0)} + = + + + graphqlCheckoutByGuestPercentage + ${__P(graphqlCheckoutByGuestPercentage,0)} + = + + + graphqlCreateEmptyCartPercentage + ${__P(graphqlCreateEmptyCartPercentage,0)} + = + + + graphqlGetCategoryListByCategoryIdPercentage + ${__P(graphqlGetCategoryListByCategoryIdPercentage,0)} + = + + + graphqlGetCmsPageByIdPercentage + ${__P(graphqlGetCmsPageByIdPercentage,0)} + = + + + graphqlGetCmsPageWithPageBuilderProductListPercentage + ${__P(graphqlGetCmsPageWithPageBuilderProductListPercentage,0)} + = + + + graphqlGetConfigurableProductDetailsByNamePercentage + ${__P(graphqlGetConfigurableProductDetailsByNamePercentage,0)} + = + + + graphqlGetConfigurableProductDetailsByProductUrlKeyPercentage + ${__P(graphqlGetConfigurableProductDetailsByProductUrlKeyPercentage,0)} + = + + + graphqlGetEmptyCartPercentage + ${__P(graphqlGetEmptyCartPercentage,0)} + = + + + graphqlGetListOfProductsByCategoryIdPercentage + ${__P(graphqlGetListOfProductsByCategoryIdPercentage,0)} + = + + + graphqlGetNavigationMenuByCategoryIdPercentage + ${__P(graphqlGetNavigationMenuByCategoryIdPercentage,0)} + = + + + graphqlGetProductSearchByTextAndCategoryIdPercentage + ${__P(graphqlGetProductSearchByTextAndCategoryIdPercentage,0)} + = + + + graphqlGetSimpleProductDetailsByNamePercentage + ${__P(graphqlGetSimpleProductDetailsByNamePercentage,0)} + = + + + graphqlGetSimpleProductDetailsByProductUrlKeyPercentage + ${__P(graphqlGetSimpleProductDetailsByProductUrlKeyPercentage,0)} + = + + + graphqlRemoveConfigurableProductFromCartPercentage + ${__P(graphqlRemoveConfigurableProductFromCartPercentage,0)} + = + + + graphqlRemoveCouponFromCartPercentage + ${__P(graphqlRemoveCouponFromCartPercentage,0)} + = + + + graphqlRemoveSimpleProductFromCartPercentage + ${__P(graphqlRemoveSimpleProductFromCartPercentage,0)} + = + + + graphqlSetBillingAddressOnCartPercentage + ${__P(graphqlSetBillingAddressOnCartPercentage,0)} + = + + + graphqlSetShippingAddressOnCartPercentage + ${__P(graphqlSetShippingAddressOnCartPercentage,0)} + = + + + graphqlUpdateConfigurableProductQtyInCartPercentage + ${__P(graphqlUpdateConfigurableProductQtyInCartPercentage,0)} + = + + + graphqlUpdateConfigurableProductQtyInCartWithPricesPercentage + ${__P(graphqlUpdateConfigurableProductQtyInCartWithPricesPercentage,0)} + = + + + graphqlUpdateSimpleProductQtyInCartPercentage + ${__P(graphqlUpdateSimpleProductQtyInCartPercentage,0)} + = + + + graphqlUpdateSimpleProductQtyInCartWithPricesPercentage + ${__P(graphqlUpdateSimpleProductQtyInCartWithPricesPercentage,0)} + = + + + graphqlUrlInfoByUrlKeyPercentage + ${__P(graphqlUrlInfoByUrlKeyPercentage,0)} + = + + + guest_checkout_percent + ${__P(guest_checkout_percent,100)} + = + + + importCustomersPercentage + ${__P(importCustomersPercentage,0)} + = + + + importProductsPercentage + ${__P(importProductsPercentage,0)} + = + + + numberOfRelatedSimpleProductsInTheCart + ${__P(numberOfRelatedSimpleProductsInTheCart,100)} + = + + + orders_page_size + ${__P(orders_page_size,20)} + = + + + productCompareDelay + ${__P(productCompareDelay,0)} + = + + + productGridMassActionPercentage + ${__P(productGridMassActionPercentage,0)} + = + + + products_page_size + ${__P(products_page_size,20)} + = + + + ramp_period + ${__P(ramp_period,0)} + = + + + redis_host + ${__P(redis_host,)} + = + + + report_save_path + ${__P(report_save_path,./)} + = + + + response_time_file_name + ${__P(response_time_file_name,production.csv)} + = + + + reviewByCustomerPercentage + ${__P(reviewByCustomerPercentage,0)} + = + + + reviewDelay + ${__P(reviewDelay,0)} + = + + + scenario + ${__P(scenario,)} + = + + + searchAdvancedPercentage + ${__P(searchAdvancedPercentage,10)} + = + + + searchQuickFilterPercentage + ${__P(searchQuickFilterPercentage,30)} + = + + + searchQuickPercentage + ${__P(searchQuickPercentage,60)} + = + + + simple_products_count + ${__P(simple_products_count,125)} + = + + + siteSearchPercentage + ${__P(siteSearchPercentage,0)} + = + + + start_time + ${__P(start_time,${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)})} + = + + + starting_index + ${__P(starting_index,0)} + = + + + think_time_delay_offset + ${__P(think_time_delay_offset,2000)} + = + + + think_time_deviation + ${__P(think_time_deviation,1000)} + = + + + url_suffix + ${__P(url_suffix,.html)} + = + + + website_id + ${__P(website_id,1)} + = + + + wishlistDelay + ${__P(wishlistDelay,0)} + = + + + + + + + false + + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + true + false + false + 0 + true + true + true + true + + + + tool/fragments/ce/view_results_tree.jmx + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + + + /tmp/aggregate-jmeter-results.jtl + tool/fragments/ce/aggregate_report.jmx + + + + + + + ${host} + + 60000 + 200000 + ${request_protocol} + utf-8 + + Java + 4 + tool/fragments/ce/http_request_default.jmx + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + application/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + tool/fragments/ce/http_header_manager.jmx + + + + stoptest + + false + 1 + + 1 + 1 + 1384333221000 + 1384333221000 + false + + + tool/fragments/ce/setup/setup.jmx + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + +props.remove("category_url_key"); +props.remove("category_url_keys_list"); +props.remove("category_name"); +props.remove("category_names_list"); +props.remove("simple_products_list"); +props.remove("simple_products_list_for_edit"); +props.remove("configurable_products_list"); +props.remove("configurable_products_list_for_edit"); +props.remove("users"); +props.remove("customer_emails_list"); +props.remove("categories"); +props.remove("cms_pages"); +props.remove("cms_blocks"); +props.remove("coupon_codes"); + +/* This is only used when admin is enabled. */ +props.put("activeAdminThread", ""); + +/* Set the environment - at this time '01' or '02' */ +String path = "${host}"; +String environment = path.substring(4, 6); +props.put("environment", environment); + + + false + tool/fragments/ce/setup/initialize.jmx + + + + Boolean stopTestOnError (String error) { + log.error(error); + System.out.println(error); + SampleResult.setStopTest(true); + return false; +} + +if ("${host}" == "1") { + return stopTestOnError("\"host\" parameter is not defined. Please define host parameter as: \"-Jhost=example.com\""); +} + +String path = "${base_path}"; +String slash = "/"; +if (!slash.equals(path.substring(path.length() -1)) || !slash.equals(path.substring(0, 1))) { + return stopTestOnError("\"base_path\" parameter is invalid. It must start and end with \"/\""); +} + + + + false + tool/fragments/ce/setup/validate_user_defined_variables.jmx + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path} + GET + true + false + true + false + false + + + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/setup/login.jmx + + + + + <title>Dashboard / Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + + + tool/fragments/ce/setup/extract_admin_users.jmx + + + + + + + false + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/user/roleGrid/limit/200/?ajax=true&isAjax=true + POST + true + false + true + false + false + + + + + + + false + import java.util.regex.Pattern; + import java.util.regex.Matcher; + import java.util.LinkedList; + + LinkedList adminUserList = new LinkedList(); + String response = new String(data); + Pattern pattern = Pattern.compile("<td\\W*?data-column=.username[^>]*?>\\W*?(\\w+)\\W*?<"); + Matcher matcher = pattern.matcher(response); + + while (matcher.find()) { + adminUserList.add(matcher.group(1)); + } + + adminUserList.poll(); + props.put("adminUserList", adminUserList); + props.put("adminUserListIterator", adminUserList.descendingIterator()); + + + + + + + + tool/fragments/ce/setup/extract_customers.jmx + + + + + + + true + customer_listing + = + true + namespace + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + customer_since[locale]=en_US + = + true + filters[placeholder] + + + true + 1 + = + true + filters[group_id] + + + true + 1 + = + true + filters[website_id] + + + true + ${customers_page_size} + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + + 60000 + 200000 + + + + groovy + + + true + import groovy.json.JsonSlurper +import java.util.ArrayList; +import java.util.LinkedList; + +emailsList = new LinkedList(); +idsList = new ArrayList(); + + +def jsonSlurper = new JsonSlurper(); +def jsonResponse = jsonSlurper.parseText(prev.getResponseDataAsString()); + +jsonResponse.items.each { item -> + emailsList.add(item.email); + idsList.add(item.entity_id.toString()); +} + +props.put("customer_emails_list", emailsList); +props.put("customer_ids_list", idsList); +// +log.info("Cust IDs: " + idsList); +log.info("Emails: " + emailsList); + + + + + + + + tool/fragments/ce/setup/extract_region_ids.jmx + + + + + + + false + US + = + true + parent + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/directory/json/countryRegion/ + GET + true + false + true + false + false + + + + + groovy + + + + import groovy.json.JsonSlurper +def jsonSlurper = new JsonSlurper(); +def regionResponse = jsonSlurper.parseText(prev.getResponseDataAsString()); + +regionResponse.each { region -> + if (region.label.toString() == "Alabama") { + props.put("alabama_region_id", region.value.toString()); + } else if (region.label.toString() == 'California') { + props.put("california_region_id", region.value.toString()); + } +} + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + + + + + + true + 1 + = + true + searchCriteria[current_page] + + + false + 20 + = + true + searchCriteria[page_size] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/setup/get_cms_pages.jmx + + + + $.total_count + 0 + true + false + true + false + + + + javascript + + + + var data = JSON.parse(prev.getResponseDataAsString()); + +var cmsPages = []; + +for (var i in data.items) { + cmsPages.push({"id": data.items[i].id, "identifier": data.items[i].identifier}); + } + +props.put("cms_pages", cmsPages); + + + + + + + + tool/fragments/ce/setup/extract_configurable_products.jmx + + + + + + + true + type_id + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + configurable + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + ${configurable_products_count} + = + true + searchCriteria[pageSize] + + + + + + ${request_protocol} + + ${base_path}rest/V1/products + GET + true + false + true + false + + 60000 + 200000 + + + + groovy + + + true + import groovy.json.JsonSlurper +import java.util.ArrayList; +import java.util.LinkedList; +import org.apache.commons.codec.binary.Base64; + +def jsonSlurper = new JsonSlurper(); +def jsonResponse = jsonSlurper.parseText(prev.getResponseDataAsString()); + + +productList = new ArrayList(); +jsonResponse.items.each { item -> + + Map productMap = new HashMap(); + productMap.put("id", item.id.toString()); + productMap.put("title", item.name); + productMap.put("sku", item.sku); + url_key = item.custom_attributes.find({ it.attribute_code == "url_key" }).value + productMap.put("url_key", url_key); + + productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + url_key + vars.get("url_suffix"); + encodedUrl = new String(Base64.encodeBase64(productUrl.getBytes())); + productMap.put("uenc", encodedUrl); + + // Collect products map in products list + productList.add(productMap); +} + +props.put("configurable_products_list", productList); + +log.info("Products: " + productList); + + + + + + + + + + + + tool/fragments/ce/setup/extract_configurable_products_for_edit.jmx + + + + + + + true + type_id + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + configurable + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + ${configurable_products_count} + = + true + searchCriteria[pageSize] + + + true + 2 + = + true + searchCriteria[currentPage] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/products + GET + true + false + true + false + false + + + + + false + configurable_products_for_edit_url_keys + url_key\",\"value\":\"(.*?)\" + $1$ + + -1 + + + + false + configurable_product_for_edit_ids + \"id\":(\d+),\"sku\" + $1$ + + -1 + + + + false + configurable_product_for_edit_names + name\":\"(.*?)\" + $1$ + + -1 + + + + false + configurable_product_for_edit_skus + sku\":\"(.*?)\" + $1$ + + -1 + + + + + + configurable_product_for_edit_ids + configurable_product_for_edit_id + true + + + + 1 + + 1 + configurable_products_counter_for_edit + + false + + + + import java.util.ArrayList; +import java.util.HashMap; +import org.apache.commons.codec.binary.Base64; +ArrayList editProductList; + +if (1 == Integer.parseInt(vars.get("configurable_products_counter_for_edit"))) { + editProductList = new ArrayList(); + props.put("configurable_products_list_for_edit", editProductList); +} else { + editProductList = props.get("configurable_products_list_for_edit"); +} + +String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("configurable_products_for_edit_url_keys_" + vars.get("configurable_products_counter_for_edit"))+ vars.get("url_suffix"); +encodedUrl = Base64.encodeBase64(productUrl.getBytes()); +// Create product map +Map editProductMap = new HashMap(); +editProductMap.put("id", vars.get("configurable_product_for_edit_id")); +editProductMap.put("title", vars.get("configurable_product_for_edit_names_" + vars.get("configurable_products_counter_for_edit"))); +editProductMap.put("sku", vars.get("configurable_product_for_edit_skus_" + vars.get("configurable_products_counter_for_edit"))); +editProductMap.put("url_key", vars.get("configurable_products_for_edit_url_keys_" + vars.get("configurable_products_counter_for_edit"))); +editProductMap.put("uenc", new String(encodedUrl)); + +// Collect products map in products list +editProductList.add(editProductMap); + + + false + + + + + + tool/fragments/ce/setup/extract_simple_products.jmx + + + + + + + true + type_id + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + simple + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + ${simple_products_count} + = + true + searchCriteria[pageSize] + + + true + attribute_set_id + != + true + searchCriteria[filterGroups][0][filters][1][field] + + + true + 4 + = + true + searchCriteria[filterGroups][0][filters][1][value] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/products + GET + true + false + true + false + false + + + + + false + simple_products_url_keys + url_key\",\"value\":\"(.*?)\" + $1$ + + -1 + + + + false + simple_product_ids + \"id\":(\d+),\"sku\" + $1$ + + -1 + + + + false + simple_product_names + name\":\"(.*?)\" + $1$ + + -1 + + + + false + simple_product_skus + sku\":\"(.*?)\" + $1$ + + -1 + + + + + + simple_product_ids + simple_product_id + true + + + + 1 + + 1 + simple_products_counter + + false + + + + import java.util.ArrayList; +import java.util.HashMap; +import org.apache.commons.codec.binary.Base64; +ArrayList productList; + +// If it is first iteration of cycle then recreate productList +if (1 == Integer.parseInt(vars.get("simple_products_counter"))) { + productList = new ArrayList(); + props.put("simple_products_list", productList); +} else { + productList = props.get("simple_products_list"); +} +String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("simple_products_url_keys_" + vars.get("simple_products_counter"))+ vars.get("url_suffix"); +encodedUrl = Base64.encodeBase64(productUrl.getBytes()); +// Create product map +Map productMap = new HashMap(); +productMap.put("id", vars.get("simple_product_id")); +productMap.put("title", vars.get("simple_product_names_" + vars.get("simple_products_counter"))); +productMap.put("sku", vars.get("simple_product_skus_" + vars.get("simple_products_counter"))); +productMap.put("url_key", vars.get("simple_products_url_keys_" + vars.get("simple_products_counter"))); +productMap.put("uenc", new String(encodedUrl)); + +// Collect products map in products list +productList.add(productMap); + + + false + + + + + + tool/fragments/ce/setup/extract_simple_products_for_edit.jmx + + + + + + + true + type_id + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + simple + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + ${simple_products_count} + = + true + searchCriteria[pageSize] + + + true + 1 + = + true + searchCriteria[currentPage] + + + true + attribute_set_id + = + true + searchCriteria[filterGroups][1][filters][1][field] + + + true + 4 + = + true + searchCriteria[filterGroups][1][filters][1][value] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/products + GET + true + false + true + false + false + + + + + false + simple_products_for_edit_url_keys + url_key\",\"value\":\"(.*?)\" + $1$ + + -1 + + + + false + simple_product_for_edit_ids + \"id\":(\d+),\"sku\" + $1$ + + -1 + + + + false + simple_product_for_edit_names + name\":\"(.*?)\" + $1$ + + -1 + + + + false + simple_product_for_edit_skus + sku\":\"(.*?)\" + $1$ + + -1 + + + + + + simple_product_for_edit_ids + simple_product_for_edit_id + true + + + + 1 + + 1 + simple_products_counter_for_edit + + false + + + + import java.util.ArrayList; +import java.util.HashMap; +import org.apache.commons.codec.binary.Base64; +ArrayList editProductList; + +if (1 == Integer.parseInt(vars.get("simple_products_counter_for_edit"))) { + editProductList = new ArrayList(); + props.put("simple_products_list_for_edit", editProductList); +} else { + editProductList = props.get("simple_products_list_for_edit"); +} + +String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("simple_products_for_edit_url_keys_" + vars.get("simple_products_counter_for_edit"))+ vars.get("url_suffix"); +encodedUrl = Base64.encodeBase64(productUrl.getBytes()); +// Create product map +Map editProductMap = new HashMap(); +editProductMap.put("id", vars.get("simple_product_for_edit_id")); +editProductMap.put("title", vars.get("simple_product_for_edit_names_" + vars.get("simple_products_counter_for_edit"))); +editProductMap.put("sku", vars.get("simple_product_for_edit_skus_" + vars.get("simple_products_counter_for_edit"))); +editProductMap.put("url_key", vars.get("simple_products_for_edit_url_keys_" + vars.get("simple_products_counter_for_edit"))); +editProductMap.put("uenc", new String(encodedUrl)); + +// Collect products map in products list +editProductList.add(editProductMap); + + + false + + + + + + tool/fragments/ce/setup/extract_categories.jmx + + + + + + + true + path + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + 1/2/% + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + like + = + true + searchCriteria[filterGroups][0][filters][0][conditionType] + + + true + level + = + true + searchCriteria[filterGroups][1][filters][0][field] + + + true + 2 + = + true + searchCriteria[filterGroups][1][filters][0][value] + + + true + ${categories_count} + = + true + searchCriteria[pageSize] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/categories/list + GET + true + false + false + false + false + + + + + javascript + + + + var data = JSON.parse(prev.getResponseDataAsString()); + +var categoryData = [], categoryNames = [], categoryUrls = []; + +for (var i in data.items) { + var cat = data.items[i], urlKey = getUrlKey(cat); + categoryData.push({"id": cat.id, "name": cat.name, "url_key": urlKey, "children": cat.children.split(",")}); + categoryNames.push(cat.name); + categoryUrls.push(urlKey); + } + +function getUrlKey(cat) { + for (var i in cat.custom_attributes) { + if (cat.custom_attributes[i].attribute_code == "url_key") { + return cat.custom_attributes[i].value; + } + } + return ""; +} + +props.put("categories", categoryData); +props.put("category_url_keys_list", categoryUrls); +props.put("category_names_list",categoryNames); + + + + + + + tool/fragments/ce/setup/extract_categories_id_of_last_level.jmx + + + + props.remove("admin_category_ids_list"); + + + false + + + + + + + true + children_count + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + 0 + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + level + = + true + searchCriteria[filterGroups][1][filters][0][field] + + + true + 2 + = + true + searchCriteria[filterGroups][1][filters][0][value] + + + true + gt + = + true + searchCriteria[filterGroups][1][filters][0][conditionType] + + + true + ${adminCategoryCount} + = + true + searchCriteria[pageSize] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/categories/list + GET + true + false + true + false + false + + + + + false + category_list_id + \{\"id\":(\d+), + $1$ + + -1 + + + + + category_list_id + category_id + true + + + + import java.util.ArrayList; + +adminCategoryIdsList = props.get("admin_category_ids_list"); +// If it is first iteration of cycle then recreate categories ids list +if (adminCategoryIdsList == null) { + adminCategoryIdsList = new ArrayList(); + props.put("admin_category_ids_list", adminCategoryIdsList); +} +adminCategoryIdsList.add(vars.get("category_id")); + + + false + + + + + + + tool/fragments/ce/setup/extract_coupon_codes.jmx + + + + + + + false + 10 + = + true + searchCriteria[pageSize] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/coupons/search + GET + true + false + true + false + false + + + + + javascript + + + + var data = JSON.parse(prev.getResponseDataAsString()); + +var couponCodes = []; + +for (var i in data.items) { + var coupon = data.items[i]; + couponCodes.push({"coupon_id":coupon.coupon_id, "rule_id":coupon.rule_id, "code": coupon.code}); + } + +props.put("coupon_codes", couponCodes); + + + + + + + + + Boolean stopTestOnError (String error) { + log.error(error); + System.out.println(error); + SampleResult.setStopTest(true); + return false; +} + +if (props.get("simple_products_list") == null) { + return stopTestOnError("Cannot find simple products. Test stopped."); +} +if (props.get("simple_products_list_for_edit") == null) { + return stopTestOnError("Cannot find simple products for edit. Test stopped."); +} +if (props.get("configurable_products_list") == null) { + return stopTestOnError("Cannot find configurable products. Test stopped."); +} +if (props.get("configurable_products_list_for_edit") == null) { + return stopTestOnError("Cannot find configurable products for edit. Test stopped."); +} +if (props.get("customer_emails_list") == null) { + return stopTestOnError("Cannot find customer emails. Test stopped."); +} +if (props.get("category_url_keys_list") == null) { + return stopTestOnError("Cannot find category url keys. Test stopped."); +} +if (props.get("category_names_list") == null) { + return stopTestOnError("Cannot find category names. Test stopped."); +} +if (props.get("cms_pages") == null) { + return stopTestOnError("Cannot find cms pages. Test stopped."); +} + + + + false + tool/fragments/ce/setup/validate_properties.jmx + + + + + + + true + 1 + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add + POST + true + false + true + false + false + + tool/fragments/ce/setup/warmup_add_to_cart.jmx + + + + + continue + + false + ${loops} + + ${frontendPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + javascript + + + + var cacheHitPercent = vars.get("cache_hits_percentage"); + +if ( + cacheHitPercent < 100 && + sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' +) { + doCache(); +} + +function doCache(){ + var random = Math.random() * 100; + if (cacheHitPercent < random) { + sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); + } +} + + tool/fragments/ce/common/cache_hit_miss.jmx + + + + 1 + false + 1 + ${browseCatalogByCustomerPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Catalog Browsing By Customer"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${browseCatalogByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Catalog Browsing By Guest"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${siteSearchPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Site Search"); + + true + + + + + ${files_folder}search_terms.csv + UTF-8 + + , + false + true + false + shareMode.thread + tool/fragments/ce/search/search_terms.jmx + + + + javascript + + + + var cacheHitPercent = vars.get("cache_hits_percentage"); + +if ( + cacheHitPercent < 100 && + sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' +) { + doCache(); +} + +function doCache(){ + var random = Math.random() * 100; + if (cacheHitPercent < random) { + sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); + } +} + + tool/fragments/ce/common/cache_hit_miss.jmx + + + + 1 + false + 1 + ${searchQuickPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Quick Search"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + q + ${searchTerm} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalogsearch/result/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_quick.jmx + + + + Search results for: + <span class="toolbar-number">\d<\/span> Items|Items <span class="toolbar-number">1 + + Assertion.response_data + false + 2 + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="(?:http|https)://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + false + isPageCacheable + catalogsearch/searchTermsLog/save + $0$ + 0 + 1 + + + + + + "${isPageCacheable}" != "0" + false + tool/fragments/ce/search/if_page_cacheable_controller.jmx + + + + + + true + q + ${searchTerm} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalogsearch/searchTermsLog/save/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_terms_log_save.jmx + + + + + "success":true + + Assertion.response_data + false + 2 + + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${searchQuickFilterPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Quick Search With Filtration"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + q + ${searchTerm} + = + true + + + + + + 60000 + 200000 + + + ${base_path}catalogsearch/result/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_quick_filter.jmx + + + + Search results for: + Items <span class="toolbar-number">1 + + Assertion.response_data + false + 2 + + + + 0 + attribute_1_options_count + count((//div[@class="filter-options-content"])[1]//li[@class="item"]) + false + true + false + + + + 0 + attribute_2_options_count + count((//div[@class="filter-options-content"])[2]//li[@class="item"]) + false + true + false + + + + + attribute_1_filter_url + ((//div[@class="filter-options-content"])[1]//li[@class="item"]//a)[1]/@href + false + true + false + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + false + isPageCacheable + catalogsearch/searchTermsLog/save + $0$ + 0 + 1 + + + + + + "${isPageCacheable}" != "0" + false + tool/fragments/ce/search/if_page_cacheable_controller.jmx + + + + + + true + q + ${searchTerm} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalogsearch/searchTermsLog/save/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_terms_log_save.jmx + + + + + "success":true + + Assertion.response_data + false + 2 + + + + + + + ${attribute_1_options_count} > 0 + false + tool/fragments/ce/search/search_quick_filter-first-attribute.jmx + + + vars.put("search_url", vars.get("attribute_1_filter_url")); + + + false + + + + + + + + + 60000 + 200000 + + + ${attribute_1_filter_url} + GET + true + false + true + false + false + + + + + + Search results for: + <span class="toolbar-number">[1-9]+ + + Assertion.response_data + false + 2 + + + + 0 + attribute_2_options_count + count((//div[@class="filter-options-content"])[2]//li[@class="item"]) + false + true + false + + + + + attribute_2_filter_url + ((//div[@class="filter-options-content"])[2]//li[@class="item"]//a)[1]/@href + false + true + false + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + + + + ${attribute_2_options_count} > 0 + false + tool/fragments/ce/search/search_quick_filter-second-attribute.jmx + + + vars.put("search_url", vars.get("attribute_2_filter_url")); + + + false + + + + + + + + + 60000 + 200000 + + + ${attribute_2_filter_url} + GET + true + false + true + false + false + + + + + + Search results for: + <span class="toolbar-number">[1-9]+ + + Assertion.response_data + false + 2 + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${searchAdvancedPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Advanced Search"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + + + ${base_path}catalogsearch/advanced/ + GET + true + false + true + false + false + + tool/fragments/ce/search/open_advanced_search_page.jmx + + + + <title>Advanced Search</title> + + Assertion.response_data + false + 2 + + + + + attribute_name + (//select[@class="multiselect"])[last()]/@name + false + true + false + + + + 0 + attribute_options_count + count((//select[@class="multiselect"])[last()]/option) + false + true + false + + + + + attribute_value + ((//select[@class="multiselect"])[last()]/option)[1]/@value + false + true + false + + + + + + + + + + + true + name + + = + true + + + true + sku + + = + true + + + true + description + ${searchTerm} + = + true + + + true + short_description + + = + true + + + true + price%5Bfrom%5D + + = + true + + + true + price%5Bto%5D + ${priceTo} + = + true + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalogsearch/advanced/result/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_advanced.jmx + + + + items</strong> were found using the following search criteria + + Assertion.response_data + false + 2 + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="(?:http|https)://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + + + 1 + false + 1 + ${addToCartByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Add To Cart By Guest"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + true + 1 + tool/fragments/ce/common/get_configurable_product_options.jmx + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + 1 + false + 1 + ${addToWishlistPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Add to Wishlist"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + true + 5 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + false + + + true + ${product_uenc} + = + true + uenc + + + true + ${product_id} + = + true + product + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist/index/add/ + POST + true + false + true + false + false + + tool/fragments/ce/wishlist/add_to_wishlist.jmx + + + + <title>My Wish List</title> + + Assertion.response_data + false + 16 + + + + false + wishListItems + data-post-remove='\{"action":"(.+)\/wishlist\\/index\\/remove\\/","data":\{"item":"([^"]+)" + $2$ + + -1 + + + + + + + + + true + wishlist,messages + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/wishlist/load_wishlist_section.jmx + + + + {"wishlist":{"counter":" + + Assertion.response_data + false + 16 + + + + ${wishlistDelay}*1000 + + + + + + + wishListItems + wishListItem + true + tool/fragments/ce/wishlist/clear_wishlist.jmx + + + 1 + 5 + 1 + counter + + true + true + + + + + + + true + ${form_key} + = + true + form_key + true + + + true + ${wishListItem} + = + true + item + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist/index/remove/ + POST + true + false + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${compareProductsPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Compare Products"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_compare/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + random_product_compare_id + catalog\\/product_compare\\/add\\/\",\"data\":\{\"product\":\"([0-9]+)\" + $1$ + + 1 + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + random_product_compare_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + ${form_key} + = + true + form_key + + + true + ${product_uenc} + = + true + uenc + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalog/product_compare/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_compare/product_compare_add.jmx + + + + + + + true + compare-products,messages + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/product_compare/customer_section_load_product_compare_add.jmx + + + + \"compare-products\":{\"count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + ${form_key} + = + true + form_key + + + true + ${product_uenc} + = + true + uenc + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalog/product_compare/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_compare/product_compare_add.jmx + + + + + + + true + compare-products,messages + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/product_compare/customer_section_load_product_compare_add.jmx + + + + \"compare-products\":{\"count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalog/product_compare/index/ + GET + true + false + true + false + false + + tool/fragments/ce/product_compare/compare_products.jmx + + + + 1 + 0 + ${__javaScript(Math.round(${productCompareDelay}*1000))} + tool/fragments/ce/product_compare/compare_products_pause.jmx + + + + + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalog/product_compare/clear + POST + true + false + true + false + false + + tool/fragments/ce/product_compare/compare_products_clear.jmx + + + + + + 1 + false + 1 + ${checkoutByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Checkout By Guest"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + true + 1 + tool/fragments/ce/common/get_configurable_product_options.jmx + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/ + GET + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_start.jmx + + + + <title>Checkout</title> + + Assertion.response_data + false + 2 + + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 6 + + + + false + cart_id + "quoteData":{"entity_id":"([^'"]+)", + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + + true + + + + false + {"customerEmail":"test@example.com"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/customers/isEmailAvailable + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_email_available.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + true + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"address":{"country_id":"US","postcode":"95630"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_estimate_shipping_methods_with_postal_code.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/shipping-information + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_billing_shipping_information.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + {"payment_methods": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_payment_info_place_order.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + order_id + $ + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/onepage/success/ + GET + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_success.jmx + + + + Thank you for your purchase! + Your order # is + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${checkoutALargeBulkOfProductsByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Checkout A Large Bulk Of Products By Guest"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + tool/fragments/ce/common/init_total_simple_and_configurable_products_in_cart_setup.jmx + +vars.put("totalSimpleProductsAdded", "0"); +vars.put("totalConfigurableProductsAdded", "0"); + + + + true + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +simpleProductsAdded = Integer.parseInt(vars.get("totalSimpleProductsAdded")); +lastSimpleProduct = Integer.parseInt(vars.get("numberOfRelatedSimpleProductsInTheCart")) - 1; + +product = props.get("simple_products_list").get(lastSimpleProduct); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + +simpleProductsAdded = simpleProductsAdded + 1; +vars.put("totalSimpleProductsAdded", String.valueOf(simpleProductsAdded)); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup_large_bulk_of_products.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx + + + groovy + + + true + + numberOfSimpleProducts = Integer.parseInt(vars.get("numberOfRelatedSimpleProductsInTheCart")) - 1; + def relatedProductIds = props.get('simple_products_list').take(numberOfSimpleProducts).inject('') {acc, prod -> acc + prod.get("id") + ',' }; + sampler.addArgument('related_product', relatedProductIds); + + simpleProductsAdded = Integer.parseInt(vars.get("totalSimpleProductsAdded")); + simpleProductsAdded = simpleProductsAdded + numberOfSimpleProducts; + vars.put("totalSimpleProductsAdded", String.valueOf(simpleProductsAdded)); + + productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); + productsAdded = productsAdded + numberOfSimpleProducts; + vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + tool/fragments/ce/common/related_products_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section_with_total_count.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +configurableProductsAdded = Integer.parseInt(vars.get("totalConfigurableProductsAdded")); + +product = props.get("configurable_products_list").get(configurableProductsAdded); + +vars.put("product_number", configurableProductsAdded.toString()); +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + +configurableProductsAdded = configurableProductsAdded + 1; +vars.put("totalConfigurableProductsAdded", String.valueOf(configurableProductsAdded)); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup_large_number_of_products.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + true + 1 + tool/fragments/ce/common/get_configurable_product_options.jmx + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section_with_total_count.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + + + ${base_path}checkout/cart/ + GET + true + false + true + false + false + + tool/fragments/ce/open_cart.jmx + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 2 + + + + + \"items_count\":\"${totalProductsAdded}\" + + Assertion.response_data + false + 2 + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + + + ${base_path}checkout/cart/ + GET + true + false + true + false + false + + tool/fragments/ce/open_cart.jmx + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 2 + + + + + \"items_count\":\"${totalProductsAdded}\" + + Assertion.response_data + false + 2 + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/ + GET + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_start.jmx + + + + <title>Checkout</title> + + Assertion.response_data + false + 2 + + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 6 + + + + false + cart_id + "quoteData":{"entity_id":"([^'"]+)", + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + + true + + + + false + {"customerEmail":"test@example.com"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/customers/isEmailAvailable + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_email_available.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + true + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"address":{"country_id":"US","postcode":"95630"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_estimate_shipping_methods_with_postal_code.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/shipping-information + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_billing_shipping_information.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + {"payment_methods": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_payment_info_place_order.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + order_id + $ + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/onepage/success/ + GET + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_success.jmx + + + + Thank you for your purchase! + Your order # is + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${checkoutByCustomerPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Checkout By Customer"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + true + 1 + tool/fragments/ce/common/get_configurable_product_options.jmx + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/ + GET + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_start.jmx + + + + <title>Checkout</title> + + Assertion.response_data + false + 2 + + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 6 + + + + false + cart_id + "quoteData":{"entity_id":"([^'"]+)", + $1$ + + 1 + + + + false + address_id + "default_billing":"([^'"]+)", + $1$ + + 1 + + + + false + customer_id + "customer_id":([^'",]+), + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + [0-9]+$ + + Assertion.response_data + false + 1 + variable + address_id + + + + + [0-9]+$ + + Assertion.response_data + false + 1 + variable + customer_id + + + + + + true + + + + false + {"addressId":"${addressId}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/estimate-shipping-methods-by-address-id + POST + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_estimate_shipping_methods.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"customerAddressId":"${address_id}","countryId":"US","regionId":"${alabama_region_id}","regionCode":"AL","region":"Alabama","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/shipping-information + POST + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_billing_shipping_information.jmx + + + + + Referer + ${host}${base_path}checkout/onepage + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + {"payment_methods" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"cartId":"${cart_id}","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"customerAddressId":"${address_id}","countryId":"US","regionId":"${alabama_region_id}","regionCode":"AL","region":"Alabama","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/payment-information + POST + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_payment_info_place_order.jmx + + + + + Referer + ${host}${base_path}checkout/onepage + + + Content-Type + application/json; charset=UTF-8 + + + Accept + application/json + + + X-Requested-With + XMLHttpRequest + + + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/onepage/success/ + GET + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_success.jmx + + + + Thank you for your purchase! + Your order number is + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + curSampler = ctx.getCurrentSampler(); +if(curSampler.getName().contains("Checkout success")) { + manager = curSampler.getCookieManager(); + manager.clear(); +} + + tool/fragments/ce/customer_checkout/checkout_clear_cookie.jmx + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${reviewByCustomerPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Product Review By Customer"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + 3 + = + true + ratings[1] + + + true + + = + true + validate_rating + + + true + FirstName + = + true + nickname + + + true + Some Review Title + = + true + title + + + true + Some Review Text + = + true + detail + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}review/product/post/id/${product_id} + POST + true + false + true + false + false + + tool/fragments/ce/product_review/product_review.jmx + + + + HTTP/1.1 200 OK + + Assertion.response_headers + false + 16 + + + + + + + + + true + review,messages + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/product_review/load_review.jmx + + + + 1 + 0 + ${__javaScript(Math.round(${reviewDelay}*1000))} + tool/fragments/ce/product_review/product_review_pause.jmx + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${addToCartByCustomerPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Add To Cart By Customer"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + true + 1 + tool/fragments/ce/common/get_configurable_product_options.jmx + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + + + ${base_path}checkout/cart/ + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/open_cart.jmx + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 2 + + + + false + cart_items_qty_inputs + name="cart\[([^\[\]]+)\]\[qty\]" + $1$ + + -1 + + + + + + true + ${cart_items_qty_inputs_matchNr} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +id = vars.get("_counter"); +vars.put("uenc", vars.get("cart_items_uencs_" + id)); +vars.put("item_id", vars.get("cart_items_qty_inputs_" + id)); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/remove_item_from_cart_setup.jmx + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${uenc} + = + true + uenc + + + false + ${item_id} + = + true + id + + + + + + 60000 + 200000 + + + ${base_path}checkout/cart/delete/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/remove_item_from_cart.jmx + + + + + + + true + cart + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/check_cart_is_empty.jmx + + + + \"summary_count\":0 + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${accountManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Account management"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}sales/order/history/ + GET + true + false + true + false + false + + tool/fragments/ce/account_management/my_orders.jmx + + + + <title>My Orders</title> + + Assertion.response_data + false + 2 + + + + false + orderId + sales/order/view/order_id/(\d+)/ + $1$ + NOT_FOUND + 1 + + + + + + tool/fragments/ce/account_management/if_orders.jmx + "${orderId}" != "NOT_FOUND" + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}sales/order/view/order_id/${orderId} + GET + true + false + true + false + false + + + + + + <title>Order # + + Assertion.response_data + false + 2 + + + + false + shipment_tab + sales/order/shipment/order_id/(\d+)..Order Shipments + $1$ + NOT_FOUND + 1 + + + + + May not have shipped + "${shipment_tab}" != "NOT_FOUND" + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}sales/order/shipment/order_id/${orderId} + GET + true + false + true + false + false + + + + + + Track this shipment + + Assertion.response_data + false + 2 + + + + false + popupLink + popupWindow": {"windowURL":"([^'"]+)", + $1$ + + 1 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${popupLink} + GET + true + false + true + false + false + + + + + + <title>Tracking Information</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}downloadable/customer/products + GET + true + false + true + false + false + + tool/fragments/ce/account_management/my_downloadable_products.jmx + + + + <title>My Downloadable Products</title> + + Assertion.response_data + false + 2 + + + + false + orderId + sales/order/view/order_id/(\d+)/ + $1$ + NOT_FOUND + 1 + + + + false + linkId + downloadable/download/link/id/(\d+)/ + $1$ + + 1 + + + + + + tool/fragments/ce/account_management/if_downloadables.jmx + "${orderId}" != "NOT_FOUND" + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}sales/order/view/order_id/${orderId} + GET + true + false + true + false + false + + tool/fragments/ce/account_management/view_downloadable_products.jmx + + + + <title>Order # + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}downloadable/download/link/id/${linkId} + GET + true + false + true + false + false + + tool/fragments/ce/account_management/download_product.jmx + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist + GET + true + false + true + false + false + + + + + + <title>My Wish List</title> + + Assertion.response_data + false + 2 + + + + false + wishlistId + wishlist/index/update/wishlist_id/([^'"]+)/ + $1$ + + 1 + tool/fragments/ce/account_management/my_wish_list.jmx + + + + false + buttonTitle + Update Wish List + FOUND + NOT_FOUND + 1 + + + + + + tool/fragments/ce/account_management/if_wishlist.jmx + "${buttonTitle}" === "FOUND" + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist/index/share/wishlist_id/${wishlistId}/ + GET + true + false + true + false + false + + tool/fragments/ce/account_management/share_wish_list.jmx + + + + <title>Wish List Sharing</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + true + + + true + ${customer_email} + = + true + emails + + + true + [TEST] See my wishlist!!! + = + true + message + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist/index/send/wishlist_id/${wishlistId}/ + POST + true + false + true + false + false + + tool/fragments/ce/account_management/send_wish_list.jmx + + + + <title>My Wish List</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + + + continue + + false + ${loops} + + ${adminPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + 1 + false + 1 + ${adminCMSManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin CMS Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_cms_management/admin_cms_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/ + GET + true + false + true + false + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/new + GET + true + false + true + false + false + + + + + + + + true + <p>CMS Content ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + content + + + true + + = + true + content_heading + + + true + ${admin_form_key} + = + true + form_key + + + true + + = + true + identifier + + + true + 1 + = + true + is_active + + + true + + = + true + layout_update_xml + + + true + + = + true + meta_description + + + true + + = + true + meta_keywords + + + true + + = + true + meta_title + + + false + {} + = + true + nodes_data + + + true + + = + true + node_ids + + + true + + = + true + page_id + + + true + 1column + = + true + page_layout + + + true + 0 + = + true + store_id[0] + + + true + CMS Title ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + title + + + true + 0 + = + true + website_root + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/save/ + POST + true + false + true + false + false + + + + + + You saved the page. + + Assertion.response_data + false + 16 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCMSManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${browseProductGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Browse Product Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Product"); + + pagesCount = parseInt(vars.get("products_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "product_listing"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_product_filter_text")); + vars.put("grid_filter_field", "name"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "name"); + vars.put("grid_sort_field_2", "price"); + vars.put("grid_sort_field_3", "attribute_set_id"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_products_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${browseOrderGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Browse Order Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Order"); + + pagesCount = parseInt(vars.get("orders_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "sales_order_grid"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_orders_filter_text")); + vars.put("grid_filter_field", "status"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "increment_id"); + vars.put("grid_sort_field_2", "created_at"); + vars.put("grid_sort_field_3", "billing_name"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_orders_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${adminProductCreationPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin Create Product"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/once_only_controller.jmx + + + + tool/fragments/ce/admin_create_product/get_related_product_id.jmx + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +relatedIndex = random.nextInt(props.get("simple_products_list").size()); +vars.put("related_product_id", props.get("simple_products_list").get(relatedIndex).get("id")); + + + true + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + + + + false + mycolor + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + false + attribute_code + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + false + mysize + = + true + searchCriteria[filterGroups][0][filters][1][value] + + + false + attribute_code + = + true + searchCriteria[filterGroups][0][filters][1][field] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/attributes + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/get_product_attributes.jmx + + + product_attributes + $.items + + + BODY + + + + javascript + + + + +var attributesData = JSON.parse(vars.get("product_attributes")), +maxOptions = 2; + +attributes = []; +for (i in attributesData) { + if (i >= 2) { + break; + } + var data = attributesData[i], + attribute = { + "id": data.attribute_id, + "code": data.attribute_code, + "label": data.default_frontend_label, + "options": [] + }; + + var processedOptions = 0; + for (optionN in data.options) { + var option = data.options[optionN]; + if (parseInt(option.value) > 0 && processedOptions < maxOptions) { + processedOptions++; + attribute.options.push(option); + } + } + attributes.push(attribute); +} + +vars.putObject("product_attributes", attributes); + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product_set/index/filter/${attribute_set_filter} + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_setup_attribute_set.jmx + + + + false + attribute_set_id + catalog&#x2F;product_set&#x2F;edit&#x2F;id&#x2F;([\d]+)&#x2F;"[\D\d]*Attribute Set 1 + $1$ + + 1 + + + + false + + + import org.apache.commons.codec.binary.Base64; + +byte[] encodedBytes = Base64.encodeBase64("set_name=Attribute Set 1".getBytes()); +vars.put("attribute_set_filter", new String(encodedBytes)); + + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +int number1; + +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +number = random.nextInt(props.get("simple_products_list_for_edit").size()); + +simpleList = props.get("simple_products_list_for_edit").get(number); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_name", simpleList.get("title")); + +do { + number1 = random.nextInt(props.get("simple_products_list_for_edit").size()); +} while(number == number1); +simpleList = props.get("simple_products_list_for_edit").get(number1); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_name", simpleList.get("title")); + +number2 = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number2); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); + +//Additional category to be added +//int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); +//vars.put("category_additional", (categoryId+1).toString()); +//New price +vars.put("price_new", "9999"); +//New special price +vars.put("special_price_new", "8888"); +//New quantity +vars.put("quantity_new", "100600"); +vars.put("configurable_sku", "Configurable Product - ${__time(YMD)}-${__threadNum}-${__Random(1,1000000)}"); + + + + + true + tool/fragments/ce/admin_create_product/setup.jmx + + + + tool/fragments/ce/admin_create_product/create_bundle_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/bundle/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 42 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[configurable_variations] + + + true + 1 + = + true + affect_configurable_product_attributes + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + new-variations-attribute-set-id + + + true + 0 + = + true + product[shipment_type] + + + true + option title one + = + true + bundle_options[bundle_options][0][title] + + + true + + = + true + bundle_options[bundle_options][0][option_id] + + + true + + = + true + bundle_options[bundle_options][0][delete] + + + true + select + = + true + bundle_options[bundle_options][0][type] + + + true + 1 + = + true + bundle_options[bundle_options][0][required] + + + true + 0 + = + true + bundle_options[bundle_options][0][position] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][option_id] + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][0][bundle_selections][0][product_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][delete] + + + true + 25 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][0][position] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][option_id] + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][0][bundle_selections][1][product_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][delete] + + + true + 10.99 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][position] + + + true + option title two + = + true + bundle_options[bundle_options][1][title] + + + true + + = + true + bundle_options[bundle_options][1][option_id] + + + true + + = + true + bundle_options[bundle_options][1][delete] + + + true + select + = + true + bundle_options[bundle_options][1][type] + + + true + 1 + = + true + bundle_options[bundle_options][1][required] + + + true + 1 + = + true + bundle_options[bundle_options][1][position] + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][option_id] + true + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][1][bundle_selections][0][product_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][delete] + true + + + true + 5.00 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][position] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][option_id] + true + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][1][bundle_selections][1][product_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][delete] + true + + + true + 7.00 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][position] + true + + + true + 2 + = + true + affect_bundle_product_selections + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 42 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full bundle product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[configurable_variations] + + + true + 1 + = + true + affect_configurable_product_attributes + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + new-variations-attribute-set-id + + + true + 0 + = + true + product[shipment_type] + false + + + true + option title one + = + true + bundle_options[bundle_options][0][title] + false + + + true + + = + true + bundle_options[bundle_options][0][option_id] + false + + + true + + = + true + bundle_options[bundle_options][0][delete] + false + + + true + select + = + true + bundle_options[bundle_options][0][type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][required] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][position] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][option_id] + false + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][0][bundle_selections][0][product_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][delete] + false + + + true + 25 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][0][position] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][option_id] + false + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][0][bundle_selections][1][product_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][delete] + false + + + true + 10.99 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][position] + false + + + true + option title two + = + true + bundle_options[bundle_options][1][title] + false + + + true + + = + true + bundle_options[bundle_options][1][option_id] + false + + + true + + = + true + bundle_options[bundle_options][1][delete] + false + + + true + select + = + true + bundle_options[bundle_options][1][type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][required] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][position] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][option_id] + false + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][1][bundle_selections][0][product_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][delete] + false + + + true + 5.00 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][position] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][option_id] + false + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][1][bundle_selections][1][product_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][delete] + false + + + true + 7.00 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][position] + false + + + true + 2 + = + true + affect_bundle_product_selections + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/bundle/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + option title one + option title two + ${simple_product_2_name} + ${simple_product_1_name} + + + Assertion.response_data + false + 2 + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/open_catalog_grid.jmx + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/${attribute_set_id}/type/configurable/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/new_configurable.jmx + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + ${admin_form_key} + = + true + form_key + true + + + true + ${attribute_set_id} + = + true + new-variations-attribute-set-id + true + + + true + 1 + = + true + product[affect_product_custom_options] + true + + + true + ${attribute_set_id} + = + true + product[attribute_set_id] + true + + + true + 4 + = + true + product[category_ids][0] + true + + + true + + = + true + product[custom_layout_update] + true + + + true + + = + true + product[description] + true + + + true + 0 + = + true + product[gift_message_available] + true + + + true + 1 + = + true + product[gift_wrapping_available] + true + + + true + + = + true + product[gift_wrapping_price] + true + + + true + + = + true + product[image] + true + + + true + 2 + = + true + product[is_returnable] + true + + + true + ${configurable_sku} - Meta Description + = + true + product[meta_description] + true + + + true + ${configurable_sku} - Meta Keyword + = + true + product[meta_keyword] + true + + + true + ${configurable_sku} - Meta Title + = + true + product[meta_title] + true + + + true + ${configurable_sku} + = + true + product[name] + true + + + true + container2 + = + true + product[options_container] + true + + + true + ${price_new} + = + true + product[price] + true + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + true + + + true + 1000 + = + true + product[quantity_and_stock_status][qty] + true + + + true + + = + true + product[short_description] + true + + + true + ${configurable_sku} + = + true + product[sku] + true + + + true + + = + true + product[small_image] + true + + + true + ${special_price_new} + = + true + product[special_price] + true + + + true + 1 + = + true + product[status] + true + + + true + 0 + = + true + product[stock_data][backorders] + true + + + true + 1 + = + true + product[stock_data][deferred_stock_update] + true + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + true + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + true + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + true + + + true + 1 + = + true + product[stock_data][manage_stock] + true + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + true + + + true + 0 + = + true + product[stock_data][min_qty] + true + + + true + 1 + = + true + product[stock_data][min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_backorders] + true + + + true + 1 + = + true + product[stock_data][use_config_deferred_stock_update] + true + + + true + 1 + = + true + product[stock_data][use_config_enable_qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + true + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + true + + + true + 2 + = + true + product[tax_class_id] + true + + + true + + = + true + product[thumbnail] + true + + + true + + = + true + product[url_key] + true + + + true + 1 + = + true + product[use_config_gift_message_available] + true + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + true + + + true + 1 + = + true + product[use_config_is_returnable] + true + + + true + 4 + = + true + product[visibility] + true + + + true + 1 + = + true + product[website_ids][1] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/${attribute_set_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_validate.jmx + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + javascript + + + + +attributes = vars.getObject("product_attributes"); + +for (i in attributes) { + var attribute = attributes[i]; + sampler.addArgument("attribute_codes[" + i + "]", attribute.code); + sampler.addArgument("attributes[" + i + "]", attribute.id); + sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); + addConfigurableAttributeData(attribute); +} + +addConfigurableMatrix(attributes); + +function addConfigurableAttributeData(attribute) { + var attributeId = attribute.id; + + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); + attribute.options.forEach(function (option, index) { + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); + }); +} + +/** + * Build 4 simple products for Configurable + */ +function addConfigurableMatrix(attributes) { + + var attribute1 = attributes[0], + attribute2 = attributes[1], + productIndex = 1, + products = []; + var variationNames = []; + attribute1.options.forEach(function (option1) { + attribute2.options.forEach(function (option2) { + var productAttributes = {}, + namePart = option1.label + "+" + option2.label, + variationKey = option1.value + "-" + option2.value; + productAttributes[attribute1.code] = option1.value; + productAttributes[attribute2.code] = option2.value; + + variationNames.push(namePart + " - " + vars.get("configurable_sku")); + var product = { + "id": null, + "name": namePart + " - " + vars.get("configurable_sku"), + "sku": namePart + " - " + vars.get("configurable_sku"), + "status": 1, + "price": "100", + "price_currency": "$", + "price_string": "$100", + "weight": "6", + "qty": "50", + "variationKey": variationKey, + "configurable_attribute": JSON.stringify(productAttributes), + "thumbnail_image": "", + "media_gallery": {"images": {}}, + "image": [], + "was_changed": true, + "canEdit": 1, + "newProduct": 1, + "record_id": productIndex + }; + productIndex++; + products.push(product); + }); + }); + + sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); + vars.putObject("configurable_variations_assertion", variationNames); +} + + tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + ${admin_form_key} + = + true + form_key + true + + + true + ${attribute_set_id} + = + true + new-variations-attribute-set-id + true + + + true + 1 + = + true + product[affect_product_custom_options] + true + + + true + ${attribute_set_id} + = + true + product[attribute_set_id] + true + + + true + 2 + = + true + product[category_ids][0] + true + + + true + + = + true + product[custom_layout_update] + true + + + true + + = + true + product[description] + true + + + true + 0 + = + true + product[gift_message_available] + true + + + true + 1 + = + true + product[gift_wrapping_available] + true + + + true + + = + true + product[gift_wrapping_price] + true + + + true + + = + true + product[image] + true + + + true + 2 + = + true + product[is_returnable] + true + + + true + ${configurable_sku} - Meta Description + = + true + product[meta_description] + true + + + true + ${configurable_sku} - Meta Keyword + = + true + product[meta_keyword] + true + + + true + ${configurable_sku} - Meta Title + = + true + product[meta_title] + true + + + true + ${configurable_sku} + = + true + product[name] + true + + + true + container2 + = + true + product[options_container] + true + + + true + ${price_new} + = + true + product[price] + true + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + true + + + true + 1000 + = + true + product[quantity_and_stock_status][qty] + true + + + true + + = + true + product[short_description] + true + + + true + ${configurable_sku} + = + true + product[sku] + true + + + true + + = + true + product[small_image] + true + + + true + ${special_price_new} + = + true + product[special_price] + true + + + true + 1 + = + true + product[status] + true + + + true + 0 + = + true + product[stock_data][backorders] + true + + + true + 1 + = + true + product[stock_data][deferred_stock_update] + true + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + true + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + true + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + true + + + true + 1 + = + true + product[stock_data][manage_stock] + true + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + true + + + true + 0 + = + true + product[stock_data][min_qty] + true + + + true + 1 + = + true + product[stock_data][min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_backorders] + true + + + true + 1 + = + true + product[stock_data][use_config_deferred_stock_update] + true + + + true + 1 + = + true + product[stock_data][use_config_enable_qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + true + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + true + + + true + 2 + = + true + product[tax_class_id] + true + + + true + + = + true + product[thumbnail] + true + + + true + + = + true + product[url_key] + true + + + true + 1 + = + true + product[use_config_gift_message_available] + true + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + true + + + true + 1 + = + true + product[use_config_is_returnable] + true + + + true + 4 + = + true + product[visibility] + true + + + true + 1 + = + true + product[website_ids][1] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/${attribute_set_id}/type/configurable/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_save.jmx + + + + You saved the product + + Assertion.response_data + false + 2 + + + + javascript + + + + +var configurableVariations = vars.getObject("configurable_variations_assertion"), +response = SampleResult.getResponseDataAsString(); + +configurableVariations.forEach(function (variation) { + if (response.indexOf(variation) == -1) { + AssertionResult.setFailureMessage("Cannot find variation \"" + variation + "\""); + AssertionResult.setFailure(true); + } +}); + + + + + + javascript + + + + +attributes = vars.getObject("product_attributes"); + +for (i in attributes) { + var attribute = attributes[i]; + sampler.addArgument("attribute_codes[" + i + "]", attribute.code); + sampler.addArgument("attributes[" + i + "]", attribute.id); + sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); + addConfigurableAttributeData(attribute); +} + +addConfigurableMatrix(attributes); + +function addConfigurableAttributeData(attribute) { + var attributeId = attribute.id; + + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); + attribute.options.forEach(function (option, index) { + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); + }); +} + +/** + * Build 4 simple products for Configurable + */ +function addConfigurableMatrix(attributes) { + + var attribute1 = attributes[0], + attribute2 = attributes[1], + productIndex = 1, + products = []; + var variationNames = []; + attribute1.options.forEach(function (option1) { + attribute2.options.forEach(function (option2) { + var productAttributes = {}, + namePart = option1.label + "+" + option2.label, + variationKey = option1.value + "-" + option2.value; + productAttributes[attribute1.code] = option1.value; + productAttributes[attribute2.code] = option2.value; + + variationNames.push(namePart + " - " + vars.get("configurable_sku")); + var product = { + "id": null, + "name": namePart + " - " + vars.get("configurable_sku"), + "sku": namePart + " - " + vars.get("configurable_sku"), + "status": 1, + "price": "100", + "price_currency": "$", + "price_string": "$100", + "weight": "6", + "qty": "50", + "variationKey": variationKey, + "configurable_attribute": JSON.stringify(productAttributes), + "thumbnail_image": "", + "media_gallery": {"images": {}}, + "image": [], + "was_changed": true, + "canEdit": 1, + "newProduct": 1, + "record_id": productIndex + }; + productIndex++; + products.push(product); + }); + }); + + sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); + vars.putObject("configurable_variations_assertion", variationNames); +} + + tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx + + + + + + tool/fragments/ce/admin_create_product/create_downloadable_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/downloadable/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + ${files_folder}downloadable_original.txt + links + text/plain + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/downloadable_file/upload/type/links/?isAjax=true + POST + false + false + true + true + false + + + + + original_file + $.file + + + BODY + + + + + + + + ${files_folder}downloadable_sample.txt + samples + text/plain + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/downloadable_file/upload/type/samples/?isAjax=true + POST + false + false + true + true + false + + + + + sample_file + $.file + + + BODY + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + on + = + true + is_downloadable + + + true + Links + = + true + product[links_title] + + + true + 0 + = + true + product[links_purchased_separately] + + + true + ${original_file} + = + true + downloadable[link][0][file][0][file] + false + + + true + downloadable_original.txt + = + true + downloadable[link][0][file][0][name] + false + + + true + 13 + = + true + downloadable[link][0][file][0][size] + false + + + true + new + = + true + downloadable[link][0][file][0][status] + false + + + true + 1 + = + true + downloadable[link][0][is_shareable] + + + true + 0 + = + true + downloadable[link][0][is_unlimited] + + + true + + = + true + downloadable[link][0][link_url] + + + true + 0 + = + true + downloadable[link][0][number_of_downloads] + true + + + true + 120 + = + true + downloadable[link][0][price] + true + + + true + 0 + = + true + downloadable[link][0][record_id] + true + + + true + file + = + true + downloadable[link][0][sample][type] + + + true + + = + true + downloadable[link][0][sample][url] + + + true + 1 + = + true + downloadable[link][0][sort_order] + + + true + Original Link + = + true + downloadable[link][0][title] + + + true + file + = + true + downloadable[link][0][type] + + + true + ${sample_file} + = + true + downloadable[sample][0][file][0][file] + true + + + true + downloadable_sample.txt + = + true + downloadable[sample][0][file][0][name] + true + + + true + 14 + = + true + downloadable[sample][0][file][0][size] + true + + + true + new + = + true + downloadable[sample][0][file][0][status] + true + + + true + 0 + = + true + downloadable[sample][0][record_id] + true + + + true + + = + true + downloadable[sample][0][sample_url] + true + + + true + 1 + = + true + downloadable[sample][0][sort_order] + true + + + true + Sample Link + = + true + downloadable[sample][0][title] + true + + + true + file + = + true + downloadable[sample][0][type] + true + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + 4 + = + true + new-variations-attribute-set-id + false + + + true + + = + true + product[configurable_variation] + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/type/downloadable/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + false + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + ${original_file} + = + true + downloadable[link][0][file][0][file] + false + + + true + downloadable_original.txt + = + true + downloadable[link][0][file][0][name] + false + + + true + 13 + = + true + downloadable[link][0][file][0][size] + false + + + true + new + = + true + downloadable[link][0][file][0][status] + false + + + true + 1 + = + true + downloadable[link][0][is_shareable] + true + + + true + 0 + = + true + downloadable[link][0][is_unlimited] + true + + + true + + = + true + downloadable[link][0][link_url] + true + + + true + 0 + = + true + downloadable[link][0][number_of_downloads] + false + + + true + 120 + = + true + downloadable[link][0][price] + false + + + true + 0 + = + true + downloadable[link][0][record_id] + false + + + true + file + = + true + downloadable[link][0][sample][type] + true + + + true + + = + true + downloadable[link][0][sample][url] + true + + + true + 1 + = + true + downloadable[link][0][sort_order] + true + + + true + Original Link + = + true + downloadable[link][0][title] + true + + + true + file + = + true + downloadable[link][0][type] + true + + + true + ${sample_file} + = + true + downloadable[sample][0][file][0][file] + true + + + true + downloadable_sample.txt + = + true + downloadable[sample][0][file][0][name] + true + + + true + 14 + = + true + downloadable[sample][0][file][0][size] + true + + + true + new + = + true + downloadable[sample][0][file][0][status] + true + + + true + 0 + = + true + downloadable[sample][0][record_id] + true + + + true + + = + true + downloadable[sample][0][sample_url] + true + + + true + 1 + = + true + downloadable[sample][0][sort_order] + true + + + true + Sample Link + = + true + downloadable[sample][0][title] + true + + + true + file + = + true + downloadable[sample][0][type] + true + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + 4 + = + true + new-variations-attribute-set-id + false + + + true + + = + true + product[configurable_variation] + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/downloadable/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + violation + + Assertion.response_data + false + 6 + + + + + + + tool/fragments/ce/admin_create_product/create_simple_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/simple/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + product[options][1][is_delete] + false + + + true + 1 + = + true + product[options][1][is_require] + false + + + true + select + = + true + product[options][1][previous_group] + false + + + true + drop_down + = + true + product[options][1][previous_type] + false + + + true + 0 + = + true + product[options][1][sort_order] + false + + + true + Product Option Title One + = + true + product[options][1][title] + false + + + true + drop_down + = + true + product[options][1][type] + false + + + true + + = + true + product[options][1][values][1][is_delete] + false + + + true + 200 + = + true + product[options][1][values][1][price] + false + + + true + fixed + = + true + product[options][1][values][1][price_type] + false + + + true + sku-one + = + true + product[options][1][values][1][sku] + false + + + true + 0 + = + true + product[options][1][values][1][sort_order] + false + + + true + Row Title + = + true + product[options][1][values][1][title] + false + + + true + + = + true + product[options][2][is_delete] + false + + + true + 1 + = + true + product[options][2][is_require] + false + + + true + 250 + = + true + product[options][2][max_characters] + false + + + true + text + = + true + product[options][2][previous_group] + false + + + true + field + = + true + product[options][2][previous_type] + false + + + true + 500 + = + true + product[options][2][price] + false + + + true + fixed + = + true + product[options][2][price_type] + false + + + true + sku-two + = + true + product[options][2][sku] + false + + + true + 1 + = + true + product[options][2][sort_order] + false + + + true + Field Title + = + true + product[options][2][title] + false + + + true + field + = + true + product[options][2][type] + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + 4 + = + true + new-variations-attribute-set-id + true + + + true + + = + true + product[configurable_variation] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full simple product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + product[options][1][is_delete] + true + + + true + 1 + = + true + product[options][1][is_require] + + + true + select + = + true + product[options][1][previous_group] + false + + + true + drop_down + = + true + product[options][1][previous_type] + false + + + true + 0 + = + true + product[options][1][sort_order] + false + + + true + Product Option Title One + = + true + product[options][1][title] + + + true + drop_down + = + true + product[options][1][type] + + + true + + = + true + product[options][1][values][1][is_delete] + false + + + true + 200 + = + true + product[options][1][values][1][price] + + + true + fixed + = + true + product[options][1][values][1][price_type] + + + true + sku-one + = + true + product[options][1][values][1][sku] + + + true + 0 + = + true + product[options][1][values][1][sort_order] + + + true + Row Title + = + true + product[options][1][values][1][title] + + + true + + = + true + product[options][2][is_delete] + false + + + true + 1 + = + true + product[options][2][is_require] + + + true + 250 + = + true + product[options][2][max_characters] + + + true + text + = + true + product[options][2][previous_group] + + + true + field + = + true + product[options][2][previous_type] + + + true + 500 + = + true + product[options][2][price] + + + true + fixed + = + true + product[options][2][price_type] + + + true + sku-two + = + true + product[options][2][sku] + + + true + 1 + = + true + product[options][2][sort_order] + + + true + Field Title + = + true + product[options][2][title] + + + true + field + = + true + product[options][2][type] + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + 4 + = + true + new-variations-attribute-set-id + true + + + true + + = + true + product[configurable_variation] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/simple/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + violation + + Assertion.response_data + false + 6 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${adminProductEditingPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin Edit Product"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + tool/fragments/ce/admin_edit_product/admin_edit_product_updated.jmx + import java.util.ArrayList; + import java.util.HashMap; + import java.util.Random; + + int relatedIndex; + try { + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + simpleCount = props.get("simple_products_list_for_edit").size(); + configCount = props.get("configurable_products_list_for_edit").size(); + productCount = 0; + if (simpleCount > configCount) { + productCount = configCount; + } else { + productCount = simpleCount; + } + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + threadsNumber = 1; + } + //Current thread number starts from 0 + currentThreadNum = ctx.getThreadNum(); + + String siterator = vars.get("threadIterator_" + currentThreadNum.toString()); + iterator = 0; + if(siterator == null){ + vars.put("threadIterator_" + currentThreadNum.toString() , "0"); + } else { + iterator = Integer.parseInt(siterator); + iterator ++; + vars.put("threadIterator_" + currentThreadNum.toString() , iterator.toString()); + } + + //Number of products for one thread + productClusterLength = productCount / threadsNumber; + + if (iterator >= productClusterLength) { + vars.put("threadIterator_" + currentThreadNum.toString(), "0"); + iterator = 0; + } + + //Index of the current product from the cluster + i = productClusterLength * currentThreadNum + iterator; + + //ids of simple and configurable products to edit + vars.put("simple_product_id", props.get("simple_products_list_for_edit").get(i).get("id")); + vars.put("configurable_product_id", props.get("configurable_products_list_for_edit").get(i).get("id")); + + //id of related product + do { + relatedIndex = random.nextInt(props.get("simple_products_list_for_edit").size()); + } while(i == relatedIndex); + vars.put("related_product_id", props.get("simple_products_list_for_edit").get(relatedIndex).get("id")); + } catch (Exception ex) { + log.info("Script execution failed", ex); +} + + + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/edit/id/${simple_product_id}/ + GET + true + false + true + false + false + + + + + + Product + + Assertion.response_data + false + 16 + + + + false + simple_product_name + ,"name":"([^'"]+)", + $1$ + + 1 + + + + false + simple_product_sku + ,"sku":"([^'"]+)", + $1$ + + 1 + + + + false + simple_product_category_id + ,"category_ids":."(\d+)". + $1$ + + 1 + + + + + Passing arguments between threads + //Additional category to be added + import java.util.Random; + + Random randomGenerator = new Random(); + int newCategoryId; + if (${seedForRandom} > 0) { + randomGenerator.setSeed(${seedForRandom} + ${__threadNum}); + } + + int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); + categoryList = props.get("admin_category_ids_list"); + + if (categoryList.size() > 1) { + do { + int index = randomGenerator.nextInt(categoryList.size()); + newCategoryId = Integer.parseInt(categoryList.get(index)); + } while (categoryId == newCategoryId); + + vars.put("category_additional", newCategoryId.toString()); + } + + //New price + vars.put("price_new", "9999"); + //New special price + vars.put("special_price_new", "8888"); + //New quantity + vars.put("quantity_new", "100600"); + + + + false + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${simple_product_name} + = + true + product[name] + false + + + true + ${simple_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + ${quantity_new} + = + true + product[quantity_and_stock_status][qty] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 1.0000 + = + true + product[weight] + false + + + true + 1 + = + true + product[product_has_weight] + false + + + true + ${simple_product_category_id} + = + true + product[category_ids][] + false + + + true + <p>Full simple product Description ${simple_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + + = + true + product[configurable_variations] + false + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + + = + true + product[image] + false + + + true + + = + true + product[small_image] + false + + + true + + = + true + product[thumbnail] + false + + + true + ${simple_product_name} + = + true + product[url_key] + false + + + true + ${simple_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${simple_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${simple_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + ${quantity_new} + = + true + product[stock_data][original_inventory_qty] + false + + + true + ${quantity_new} + = + true + product[stock_data][qty] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + + = + true + new-variations-attribute-set-id + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/id/${simple_product_id}/?isAjax=true + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${simple_product_name} + = + true + product[name] + false + + + true + ${simple_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + ${quantity_new} + = + true + product[quantity_and_stock_status][qty] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 1.0000 + = + true + product[weight] + false + + + true + 1 + = + true + product[product_has_weight] + false + + + true + ${simple_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + + + true + <p>Full simple product Description ${simple_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + + = + true + product[configurable_variations] + false + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + + = + true + product[image] + false + + + true + + = + true + product[small_image] + false + + + true + + = + true + product[thumbnail] + false + + + true + ${simple_product_name} + = + true + product[url_key] + false + + + true + ${simple_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${simple_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${simple_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + ${quantity_new} + = + true + product[stock_data][original_inventory_qty] + false + + + true + ${quantity_new} + = + true + product[stock_data][qty] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + + = + true + new-variations-attribute-set-id + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/id/${simple_product_id}/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/edit/id/${configurable_product_id}/ + GET + true + false + true + false + false + + + + + + Product + + Assertion.response_data + false + 16 + + + + false + configurable_product_name + ,"name":"([^'"]+)", + $1$ + + 1 + + + + false + configurable_product_sku + ,"sku":"([^'"]+)", + $1$ + + 1 + + + + false + configurable_product_category_id + ,"category_ids":."(\d+)" + $1$ + + 1 + + + + false + configurable_attribute_id + ,"configurable_variation":"([^'"]+)", + $1$ + + 1 + true + + + + false + configurable_matrix + "configurable-matrix":(\[.*?\]) + $1$ + + 1 + true + + + + associated_products_ids + $.[*].id + + configurable_matrix + VAR + + + + false + configurable_product_data + (\{"product":.*?configurable_attributes_data.*?\})\s*< + $1$ + + 1 + + + + configurable_attributes_data + $.product.configurable_attributes_data + + configurable_product_data + VAR + + + + false + configurable_attribute_ids + "attribute_id":"(\d+)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_codes + "code":"(\w+)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_labels + "label":"(.*?)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_values + "values":(\{(?:\}|.*?\}\})) + $1$ + + -1 + variable + configurable_attributes_data + + + + + configurable_attribute_ids + configurable_attribute_id + true + + + + 1 + ${configurable_attribute_ids_matchNr} + 1 + attribute_counter + + true + true + + + + return vars.get("configurable_attribute_values_" + vars.get("attribute_counter")); + + + false + + + + false + attribute_${configurable_attribute_id}_values + "value_index":"(\d+)" + $1$ + + -1 + configurable_attribute_values_${attribute_counter} + + + + + + + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${configurable_product_name} + = + true + product[name] + false + + + true + ${configurable_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 3 + = + true + product[weight] + false + + + true + ${configurable_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + false + + + true + <p>Configurable product description ${configurable_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + ${configurable_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${configurable_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${configurable_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + ${configurable_attribute_id} + = + true + product[configurable_variation] + false + + + true + ${configurable_product_name} + = + true + product[url_key] + + + true + 1 + = + true + product[use_config_gift_message_available] + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + + + true + 4 + = + true + product[visibility] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 50 + = + true + product[stock_data][qty] + false + + + true + configurable + = + true + product[stock_data][type_id] + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/id/${configurable_product_id}/ + POST + true + false + true + false + false + + + + + false + + + try { + int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); + for (int i = 1; i <= attributesCount; i++) { + attributeId = vars.get("configurable_attribute_ids_" + i.toString()); + attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); + attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); + ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); + ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); + ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); + + int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); + for (int j = 1; j <= valuesCount; j++) { + attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", + "1" + ); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", + attributeValue + ); + } + } + ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); + } catch (Exception e) { + log.error("error???", e); + } + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${configurable_product_name} + = + true + product[name] + false + + + true + ${configurable_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id]admin + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 3 + = + true + product[weight] + false + + + true + ${configurable_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + false + + + true + <p>Configurable product description ${configurable_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + ${configurable_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${configurable_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${configurable_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + ${configurable_attribute_id} + = + true + product[configurable_variation] + false + + + true + ${configurable_product_name} + = + true + product[url_key] + + + true + 1 + = + true + product[use_config_gift_message_available] + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + + + true + 4 + = + true + product[visibility] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 50 + = + true + product[stock_data][qty] + false + + + true + configurable + = + true + product[stock_data][type_id] + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/id/${configurable_product_id}/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + false + + + try { + int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); + for (int i = 1; i <= attributesCount; i++) { + attributeId = vars.get("configurable_attribute_ids_" + i.toString()); + attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); + attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); + ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); + ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); + ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); + + int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); + for (int j = 1; j <= valuesCount; j++) { + attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", + "1" + ); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", + attributeValue + ); + } + } + ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); + } catch (Exception e) { + log.error("error???", e); + } + + + + + You saved the product + + Assertion.response_data + false + 2 + if have trouble see messages-message-error + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + + + continue + + false + ${loops} + + ${csrPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + 1 + false + 1 + ${adminReturnsManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin Returns Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/orders_page.jmx + + + + Create New Order + + Assertion.response_data + false + 2 + + + + + + + + + true + sales_order_grid + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 200 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + increment_id + = + true + sorting[field] + + + true + desc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + false + + + true + pending + = + true + filters[status] + true + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + sales_order_grid + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + 200 + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + increment_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + true + pending + = + true + filters[status] + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/search_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + false + order_numbers + \"increment_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + false + order_ids + \"entity_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + + + tool/fragments/ce/admin_create_process_returns/setup.jmx + + import java.util.ArrayList; + import java.util.HashMap; + import org.apache.jmeter.protocol.http.util.Base64Encoder; + import java.util.Random; + + // get count of "order_numbers" variable defined in "Search Pending Orders Limit" + int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); + + + int clusterLength; + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + //Number of orders for one thread + clusterLength = ordersCount; + } else { + clusterLength = Math.round(ordersCount / threadsNumber); + if (clusterLength == 0) { + clusterLength = 1; + } + } + + //Current thread number starts from 0 + int currentThreadNum = ctx.getThreadNum(); + + //Index of the current product from the cluster + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + int iterator = random.nextInt(clusterLength); + if (iterator == 0) { + iterator = 1; + } + + int i = clusterLength * currentThreadNum + iterator; + + orderNumber = vars.get("order_numbers_" + i.toString()); + orderId = vars.get("order_ids_" + i.toString()); + vars.put("order_number", orderNumber); + vars.put("order_id", orderId); + + + + + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_order.jmx + + + + #${order_number} + + Assertion.response_data + false + 2 + + + + false + order_status + <span id="order_status">([^<]+)</span> + $1$ + + 1 + simple_products + + + + + + "${order_status}" == "Pending" + false + tool/fragments/ce/admin_edit_order/if_controller.jmx + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_start.jmx + + + + Invoice Totals + + Assertion.response_data + false + 2 + + + + false + item_ids + <div id="order_item_(\d+)_title"\s*class="product-title"> + $1$ + + -1 + simple_products + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + invoice[items][${item_ids_1}] + + + true + 1 + = + true + invoice[items][${item_ids_2}] + + + true + Invoiced + = + true + invoice[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx + + + + The invoice has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_creditmemo/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/credit_memo_start.jmx + + + + New Memo + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + creditmemo[items][${item_ids_1}][qty] + + + true + 1 + = + true + creditmemo[items][${item_ids_2}][qty] + + + true + 1 + = + true + creditmemo[do_offline] + + + true + Credit Memo added + = + true + creditmemo[comment_text] + + + true + 10 + = + true + creditmemo[shipping_amount] + + + true + 0 + = + true + creditmemo[adjustment_positive] + + + true + 0 + = + true + creditmemo[adjustment_negative] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_creditmemo/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/credit_memo_full_refund.jmx + + + + You created the credit memo + + Assertion.response_data + false + 2 + + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCreateProcessReturnsDelay}*1000))} + tool/fragments/ce/admin_create_process_returns/pause.jmx + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${browseCustomerGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Browse Customer Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Customer"); + + pagesCount = parseInt(vars.get("customers_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "customer_listing"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_customer_filter_text")); + vars.put("grid_filter_field", "name"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "name"); + vars.put("grid_sort_field_2", "group_id"); + vars.put("grid_sort_field_3", "billing_country_id"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_customers_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${adminCreateOrderPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin Create Order"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + tool/fragments/ce/admin_create_order/admin_create_order.jmx + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); + +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} + +number = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_product_1_sku", configurableList.get("sku")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); + +number = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); + +number1 = random.nextInt(props.get("configurable_products_list").size()); +do { + number1 = random.nextInt(props.get("simple_products_list").size()); +} while(number == number1); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); + + +customers_index = 0; +if (!props.containsKey("customer_ids_index")) { + props.put("customer_ids_index", customers_index); +} + +try { + customers_index = props.get("customer_ids_index"); + customers_list = props.get("customer_ids_list"); + + if (customers_index == customers_list.size()) { + customers_index=0; + } + vars.put("customer_id", customers_list.get(customers_index)); + props.put("customer_ids_index", ++customers_index); +} +catch (java.lang.Exception e) { + log.error("Caught Exception in 'Admin Create Order' thread."); + SampleResult.setStopThread(true); +} + + + true + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/start/ + GET + true + false + true + false + false + + Detected the start of a redirect chain + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${configurable_product_1_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + true + item[${simple_product_1_id}][qty] + 1 + = + true + + + true + item[${simple_product_2_id}][qty] + 1 + = + true + + + true + item[${configurable_product_1_id}][qty] + 1 + = + true + + + true + customer_id + ${customer_id} + = + true + + + true + store_id + 1 + = + true + + + true + currency_id + + = + true + + + true + form_key + ${admin_form_key} + = + true + + + true + payment[method] + checkmo + = + true + + + true + reset_shipping + 1 + = + true + + + true + json + 1 + = + true + + + true + as_js_varname + iFrameResponse + = + true + + + true + form_key + ${admin_form_key} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/loadBlock/block/search,items,shipping_method,totals,giftmessage,billing_method?isAjax=true + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + false + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + + ctx.getCurrentSampler().addArgument("item[" + vars.get("configurable_product_1_id") + "][super_attribute][" + attribute_ids_array[i] + "]", option_values_array[i]); + } +} catch (Exception e) { + log.error("error???", e); +} + + + + + + + + true + collect_shipping_rates + 1 + = + true + + + true + customer_id + ${customer_id} + = + true + + + true + store_id + 1 + = + true + + + true + currency_id + false + = + true + + + true + form_key + ${admin_form_key} + = + true + + + true + payment[method] + checkmo + = + true + + + true + json + true + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/loadBlock/block/shipping_method,totals?isAjax=true + POST + true + false + true + false + false + + + + + + shipping_method + Flat Rate + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/index/ + GET + true + false + true + false + false + + Detected the start of a redirect chain + + + + + Select from existing customer addresses + Submit Order + Items Ordered + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + limit + 20 + = + true + + + true + entity_id + + = + true + + + true + name + + = + true + + + true + email + + = + true + + + true + Telephone + + = + true + + + true + billing_postcode + + = + true + + + true + billing_country_id + + = + true + + + true + billing_regione + + = + true + + + true + store_name + + = + true + + + true + page + 1 + = + true + + + true + order[currency] + USD + = + true + + + true + sku + + = + true + + + true + qty + + = + true + + + true + limit + 20 + = + true + + + true + entity_id + + = + true + + + true + name + + = + true + + + true + sku + + = + true + + + true + price[from] + + = + true + + + true + price[to] + + = + true + + + true + in_products + + = + true + + + true + page + 1 + = + true + + + true + coupon_code + + = + true + + + true + order[account][group_id] + 1 + = + true + + + true + order[account][email] + user_${customer_id}@example.com + = + true + + + true + order[billing_address][customer_address_id] + + = + true + + + true + order[billing_address][prefix] + + = + true + + + true + order[billing_address][firstname] + Anthony + = + true + + + true + order[billing_address][middlename] + + = + true + + + true + order[billing_address][lastname] + Nealy + = + true + + + true + order[billing_address][suffix] + + = + true + + + true + order[billing_address][company] + + = + true + + + true + order[billing_address][street][0] + 123 Freedom Blvd. #123 + = + true + + + true + order[billing_address][street][1] + + = + true + + + true + order[billing_address][city] + Fayetteville + = + true + + + true + order[billing_address][country_id] + US + = + true + + + true + order[billing_address][region] + + = + true + + + true + order[billing_address][region_id] + ${alabama_region_id} + = + true + + + true + order[billing_address][postcode] + 123123 + = + true + + + true + order[billing_address][telephone] + 022-333-4455 + = + true + + + true + order[billing_address][fax] + + = + true + + + true + order[billing_address][vat_id] + + = + true + + + true + shipping_same_as_billing + on + = + true + + + true + payment[method] + checkmo + = + true + + + true + order[shipping_method] + flatrate_flatrate + = + true + + + true + order[comment][customer_note] + + = + true + + + true + order[comment][customer_note_notify] + 1 + = + true + + + true + order[send_confirmation] + 1 + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/save/ + POST + true + false + true + true + false + + Detected the start of a redirect chain + + + + false + order_id + ${host}${base_path}${admin_path}/sales/order/index/order_id/(\d+)/ + $1$ + + 1 + + + + false + order_item_1 + order_item_(\d+)_title + $1$ + + 1 + + + + false + order_item_2 + order_item_(\d+)_title + $1$ + + 2 + + + + false + order_item_3 + order_item_(\d+)_title + $1$ + + 3 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_2 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_3 + + + + + You created the order. + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + invoice[items][${order_item_1}] + 1 + = + true + + + true + invoice[items][${order_item_2}] + 1 + = + true + + + true + invoice[items][${order_item_3}] + 1 + = + true + + + true + invoice[comment_text] + + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + + The invoice has been created. + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + shipment[items][${order_item_1}] + 1 + = + true + + + true + shipment[items][${order_item_2}] + 1 + = + true + + + true + shipment[items][${order_item_3}] + 1 + = + true + + + true + shipment[comment_text] + + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + + The shipment has been created. + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + + + continue + + false + ${loops} + + ${apiPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + 1 + false + 1 + ${apiBasePercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + 1 + false + 1 + 100 + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API Create Customer"); + + true + + + + + true + + + + false + { + "customer": { + + "email": "customer_${__time()}-${__threadNum}-${__Random(1,1000000)}@example.com", + "firstname": "test_${__time()}-${__threadNum}-${__Random(1,1000000)}", + "lastname": "Doe" + }, + "password": "test@123" +} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/customers + POST + true + false + true + false + false + + tool/fragments/ce/api/create_customer.jmx + + + customer_id + $.id + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + customer_id + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/customers/${customer_id} + GET + true + false + true + false + false + + tool/fragments/ce/api/check_customer.jmx + + + $.id + ${customer_id} + true + false + false + + + + + + + + 1 + false + 1 + 100 + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API Catalog Browsing"); + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/categories + GET + true + false + true + false + false + + tool/fragments/ce/api/get_categories.jmx + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + search_category_id + $.id + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + search_category_id + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/categories/${search_category_id} + GET + true + false + true + false + false + + tool/fragments/ce/api/get_category.jmx + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + 20 + = + true + searchCriteria[page_size] + true + + + true + 1 + = + true + searchCriteria[current_page] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_products.jmx + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + 1 + false + 1 + 100 + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API Search"); + + true + + + + + + + + true + quick_search_container + = + true + searchCriteria[request_name] + + + true + search_term + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + Simple + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + 20 + = + true + searchCriteria[page_size] + + + true + 1 + = + true + searchCriteria[current_page] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/search + GET + true + false + true + false + false + + tool/fragments/ce/api/search_for_product_frontend.jmx + + + $.total_count + 0 + true + false + true + + + + search_product_id + $.items[0].id + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + search_product_id + + + + + + + + 1 + false + 1 + 100 + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API Checkout"); + + true + + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts + POST + true + false + true + false + false + + tool/fragments/ce/api/create_quote.jmx + + + quote_id + $ + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + quote_id + + + + + + true + + + + false + { + "cartItem": { + "sku": "${product_sku}", + "qty":"1", + "quote_id":"${quote_id}" + } +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/${quote_id}/items + POST + true + false + true + false + false + + tool/fragments/ce/api/add_product_to_quote_hardwired_sku.jmx + + + + $.sku + ${product_sku} + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/${quote_id}/items + GET + true + false + true + false + false + + tool/fragments/ce/api/check_product_in_quote_hardwired_sku.jmx + + + $[0].sku + ${product_sku} + true + false + false + + + + + + true + + + + false + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/ + POST + true + false + true + false + false + + tool/fragments/ce/api/create_guest_cart.jmx + + + cart_id + $ + + + BODY + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + + true + + + + false + { + "cartItem": { + "sku": "${product_sku}", + "qty":"1", + "quote_id":"${cart_id}" + } +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/items + POST + true + false + true + false + false + + tool/fragments/ce/api/add_product_to_guest_cart_hardwired_sku.jmx + + + $.quote_id + ^[a-z0-9-]+$ + true + false + false + + + + + + true + + + + false + { + "sender": "John Doe", + "recipient": "Jane Roe", + "giftMessage": "Gift Message Text" +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/gift-message + POST + true + false + true + false + false + + tool/fragments/ce/api/add_gift_message_to_guest_cart.jmx + + + $ + true + true + false + false + + + + + + true + + + + false + {"address":{"country_id":"US","postcode":"95630"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_estimate_shipping_methods_with_postal_code.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/shipping-information + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_billing_shipping_information.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + {"payment_methods": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname","save_in_address_book":0}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information + POST + true + false + true + false + false + + tool/fragments/ce/api/checkout_payment_info_place_order.jmx + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + order_id + $ + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + + + + 1 + false + 1 + 100 + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API Product Management"); + + true + + + + + true + + + + false + { + "product": { + "sku": "psku-test-${__time()}-${__threadNum}-${__Random(1,1000000)}", + "name": "Product_${__time()}-${__threadNum}-${__Random(1,1000000)}", + "attributeSetId": 4 + } +} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products + POST + true + false + true + false + false + + tool/fragments/ce/api/create_product_no_custom_attributes.jmx + + + simple_product_id + $.id + + + BODY + + + + simple_product_sku + $.sku + + + BODY + + + + simple_stock_item_id + $.extension_attributes.stock_item.item_id + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + simple_product_id + + + + + ^[a-z0-9-]+$ + + Assertion.response_data + false + 1 + variable + simple_product_sku + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + simple_stock_item_id + + + + + + true + + + + false + { + "stock_item": { + "manage_stock": 1, + "is_in_stock": 1, + "qty": ${simple_product_id} + } + } + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/${simple_product_sku}/stockItems/${simple_stock_item_id} + PUT + true + false + true + false + false + + tool/fragments/ce/api/update_product_stock_info.jmx + + + $ + ${simple_stock_item_id} + true + false + false + + + + + + true + + + + true + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/${simple_product_sku} + GET + true + false + true + false + false + + tool/fragments/ce/api/check_product.jmx + + + $.sku + ${simple_product_sku} + true + false + false + + + + $.id + ${simple_product_id} + true + false + false + + + + $.extension_attributes.stock_item.item_id + ${simple_stock_item_id} + true + false + false + + + + $.extension_attributes.stock_item.qty + ${simple_product_id} + true + false + false + + + + + + true + + + + false + { + "product": { + "sku": "apsku-test-${__time()}-${__threadNum}-${__Random(1,1000000)}", + "name": "Extensible_Product_${__time()}-${__threadNum}-${__Random(1,1000000)}", + "visibility": "4", + "type_id": "simple", + "price": "3.62", + "status": "1", + "attribute_set_id": "4", + "custom_attributes": [ + { + "attribute_code": "cost", + "value": "" + }, + { + "attribute_code": "description", + "value": "Description" + } + ], + "extension_attributes":{ + "stock_item":{ + "manage_stock": 1, + "is_in_stock": 1, + "qty":"100" + } + } , + "media_gallery_entries": + [{ + "id": null, + "label":"test_label_${__time()}-${__threadNum}-${__Random(1,1000000)}", + "position":1, + "disabled":0, + "media_type":"image", + "types":["image"], + "content":{ + "base64_encoded_data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABgAGADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iioLy8t9Ps5bu7lWKCIZd26KKaTbshpX0RPRXN/8J/4V/6DVv8Ak3+FH/Cf+Ff+g1b/AJN/hXR9SxP/AD7l9zNPYVf5X9x0lFc3/wAJ/wCFf+g1b/k3+FH/AAn/AIV/6DVv+Tf4UfUsT/z7l9zD2FX+V/cdJRXN/wDCf+Ff+g1b/k3+FH/Cf+Ff+g1b/k3+FH1LE/8APuX3MPYVf5X9x0lFc3/wn/hX/oNW/wCTf4Uf8J/4V/6DVv8Ak3+FH1LE/wDPuX3MPYVf5X9x0lFVdP1G01WyS8sZ1nt3JCyL0ODg/qKtVzyi4u0lZmbTTswrm/H3/Iiav/1x/wDZhXSVzfj7/kRNX/64/wDswrowf+80/wDEvzNKH8WPqj5voorB1zS7OLT7m7SHE5YNu3HqWGeM471+kYutOhSdSEU7Jt3dtF20f6H1FacqcHJK9vO36M3qKzTa6foqPdxwlWxswrFi2T0AJ9aRdVmjkT7XYSW8TsFEm8MAT0yB0qfrcafu1tJeV2l2u7K3zsL2yjpPR+V3+NjTorPn1GVbt7a1s2uJIwDJ84ULnpyaik1SWTTrp47Z0uIQRJGzAFOPvZ70Sx1GLau9L9H03SdrNrsgdeCuu3k+hq0VR0ma4msImuIih2LtYvuLjA+b2zV6uijUVWmprqaQkpxUl1PoP4Xf8iBYf78v/oxq7GuO+F3/ACIFh/vy/wDoxq7GvzTMf98q/wCJ/mfLYn+NP1YVzfj7/kRNX/64/wDswrpK5vx9/wAiJq//AFx/9mFRg/8Aeaf+JfmTQ/ix9UfN9ZniD/kB3H/Af/QhWnTZI45kKSIroeqsMg1+l4mk61GdNfaTX3o+pqw54Sj3Rma/GXsI3BcLFMruU+8F5yR+dUZ4tOeNFOq3tx5jACNZg5J+mK6PrUMdrbxPvjgiR/7yoAa48TgPa1HNW1STvfp2s1+JjVw/PJy017mbe/YTqTB7iWzuQgPmhtocfjwajiupbjTtTieUXCxRsqTKMb8qePwrYlghnAE0UcgHQOoP86ckaRoERFVR/CowKbwU3UclJJO+19brqr203vvoHsJczd7J3/H8PmVNJnhm063WOVHZIkDhTkqcd/yNXajighg3eTFHHu67FAz+VSV2UIShTjGe67G9NOMUpbn0H8Lv+RAsP9+X/wBGNXY1x3wu/wCRAsP9+X/0Y1djX5tmP++Vf8T/ADPl8T/Gn6sK5vx9/wAiJq//AFx/9mFdJXN+Pv8AkRNX/wCuP/swqMH/ALzT/wAS/Mmh/Fj6o+b6KKK/Uj60KKKKACiiigAooooA+g/hd/yIFh/vy/8Aoxq7GuO+F3/IgWH+/L/6Mauxr8wzH/fKv+J/mfKYn+NP1YVzfj7/AJETV/8Arj/7MK6Sub8ff8iJq/8A1x/9mFRg/wDeaf8AiX5k0P4sfVHzfRRRX6kfWhRRRQAUUUUAFFFFAH0H8Lv+RAsP9+X/ANGNXY1x3wu/5ECw/wB+X/0Y1djX5hmP++Vf8T/M+UxP8afqwqC8s7fULOW0u4llglGHRujCp6K5E2ndGKdtUc3/AMIB4V/6Atv+bf40f8IB4V/6Atv+bf410lFdH13E/wDPyX3s09vV/mf3nN/8IB4V/wCgLb/m3+NH/CAeFf8AoC2/5t/jXSUUfXcT/wA/Jfew9vV/mf3nN/8ACAeFf+gLb/m3+NH/AAgHhX/oC2/5t/jXSUUfXcT/AM/Jfew9vV/mf3nN/wDCAeFf+gLb/m3+NH/CAeFf+gLb/m3+NdJRR9dxP/PyX3sPb1f5n95V0/TrTSrJLOxgWC3QkrGvQZOT+pq1RRXPKTk7yd2Zttu7P//Z", + "type": "image/jpeg", + "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" + } + } + ] + } +} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products + POST + true + false + true + false + false + + tool/fragments/ce/api/create_product_with_extensible_data_objects.jmx + + + simple_product_id + $.id + + + BODY + + + + simple_product_sku + $.sku + + + BODY + + + + simple_stock_item_id + $.extension_attributes.stock_item.item_id + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + simple_product_id + + + + + ^[a-z0-9-]+$ + + Assertion.response_data + false + 1 + variable + simple_product_sku + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + simple_stock_item_id + + + + + + true + + + + true + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/${simple_product_sku} + GET + true + false + true + false + false + + tool/fragments/ce/api/check_product_with_extensible_data_objects.jmx + + + $.sku + ${simple_product_sku} + true + false + false + + + + $.id + ${simple_product_id} + true + false + false + + + + $.extension_attributes.stock_item.item_id + ${simple_stock_item_id} + true + false + false + + + + $.extension_attributes.stock_item.qty + 100 + true + false + false + + + + + + + + + + + + continue + + false + ${loops} + + ${graphQLPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + 1 + false + 1 + ${graphqlGetListOfProductsByCategoryIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get List of Products by category_id"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + {"query":"query category($id: Int!, $currentPage: Int, $pageSize: Int) {\n category(id: $id) {\n product_count\n description\n url_key\n name\n id\n breadcrumbs {\n category_name\n category_url_key\n __typename\n }\n products(pageSize: $pageSize, currentPage: $currentPage, sort: {name: ASC}) {\n total_count\n items {\n id\n name\n # small_image\n # short_description\n url_key\n special_price\n special_from_date\n special_to_date\n price {\n regularPrice {\n amount {\n value\n currency\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n","variables":{"id":${category_id},"currentPage":1,"pageSize":12},"operationName":"category"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_products_by_category_id.jmx + + + + + "name":"${category_name}","id":${category_id}, + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlGetSimpleProductDetailsByProductUrlKeyPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Simple Product Details by product_url_key"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlGetSimpleProductDetailsByNamePercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Simple Product Details by name"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($product_sku: String, $onServer: Boolean!) {\n productDetail: products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlGetConfigurableProductDetailsByProductUrlKeyPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Configurable Product Detail by product_url_key"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlGetConfigurableProductDetailsByNamePercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Configurable Product Detail by name"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlGetProductSearchByTextAndCategoryIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Product Search by text and category_id"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + {"query":"query productSearch($inputText: String!, $categoryId: String) {\n products(\n pageSize:12\n search: $inputText, filter: { category_id: { eq: $categoryId } }, sort: {name: ASC}) {\n items {\n id\n name\n small_image {\n label\n url\n }\n url_key\n price {\n regularPrice {\n amount {\n value\n currency\n }\n }\n }\n }\n total_count\n filters {\n name\n filter_items_count\n request_var\n filter_items {\n label\n value_string\n }\n }\n }\n}","variables":{"inputText":"Product","categoryId":"${category_id}"},"operationName":"productSearch"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_product_search_by_text_and_category_id.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + + + + + 1 + false + 1 + ${graphqlGetCategoryListByCategoryIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Category List by category_id"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + + {"query":"query categoryList($id: Int!) {\n category(id: $id) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}","variables":{"id":${category_id}},"operationName":"categoryList"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_category_list_by_category_id.jmx + + + javascript + + + + var category = vars.getObject("category"); +var response = JSON.parse(prev.getResponseDataAsString()); + +assertCategoryId(category, response); +assertCategoryChildren(category, response); + +function assertCategoryId(category, response) { + if (response.data == undefined || response.data.category == undefined || response.data.category.id != category.id) { + AssertionResult.setFailureMessage("Cannot find category with id \"" + category.id + "\""); + AssertionResult.setFailure(true); + } +} + +function assertCategoryChildren(category, response) { + foundCategory = response.data && response.data.category ? response.data.category : null; + if (foundCategory) { + var childrenFound = foundCategory.children.map(function (c) {return parseInt(c.id)}); + var children = category.children.map(function (c) {return parseInt(c)}); + if (JSON.stringify(children.sort()) != JSON.stringify(childrenFound.sort())) { + AssertionResult.setFailureMessage("Cannot math children categories \"" + JSON.stringify(children) + "\" for to found one: \"" + JSON.stringify(childrenFound) + "\""); + AssertionResult.setFailure(true); + } + } + +} + + + + + + + + + + 1 + false + 1 + ${graphqlGetCategoryListByCategoryIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Category List by category_url_key"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + {"query" : "{\n categoryList(filters:{url_key: {in: [\"${category_url_key}\"]}}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_category_list_by_category_url_key.jmx + + + + javascript + + + + var category = vars.getObject("category"); +var response = JSON.parse(prev.getResponseDataAsString()); + +assertCategoryId(category, response); +assertCategoryChildren(category, response); + +function assertCategoryId(category, response) { + if (response.data == undefined || response.data.categoryList == undefined || response.data.categoryList[0].id != category.id) { + AssertionResult.setFailureMessage("Cannot find category with id \"" + category.id + "\""); + AssertionResult.setFailure(true); + } +} + +function assertCategoryChildren(category, response) { + foundCategory = response.data && response.data.categoryList ? response.data.categoryList[0] : null; + if (foundCategory) { + var childrenFound = foundCategory.children.map(function (c) {return parseInt(c.id)}); + var children = category.children.map(function (c) {return parseInt(c)}); + if (JSON.stringify(children.sort()) != JSON.stringify(childrenFound.sort())) { + AssertionResult.setFailureMessage("Cannot math children categories \"" + JSON.stringify(children) + "\" for to found one: \"" + JSON.stringify(childrenFound) + "\""); + AssertionResult.setFailure(true); + } + } + +} + + + + + + + + + + 1 + false + 1 + ${graphqlGetCategoryListByCategoryIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Multiple Categories"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); + +var numbers = []; + +var sanity = 0; +for(var i = 0; i < 4; i++){ + sanity++; + if(sanity > 100){ + break; + } + var number = random.nextInt(categories.length) + if(numbers.indexOf(number) >= 0){ + i--; + continue; + } + numbers.push(number); +} + +vars.put("category_id_1", categories[numbers[0]].id); +vars.put("category_id_2", categories[numbers[1]].id); +vars.put("category_id_3", categories[numbers[2]].id); +vars.put("category_id_4", categories[numbers[3]].id); + + tool/fragments/ce/common/extract_multiple_categories_setup.jmx + + + + + true + + + + false + {"query" : "{\n categoryList(filters:{ids: {in: [\"${category_id_1}\", \"${category_id_2}\", \"${category_id_3}\", \"${category_id_4}\"]}}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_multiple_categories_by_id.jmx + + + + javascript + + + + var response = JSON.parse(prev.getResponseDataAsString()); + +if(response.data == undefined || response.data.categoryList == undefined){ + AssertionResult.setFailureMessage("CategoryList results are empty."); + AssertionResult.setFailure(true); +} + +if(response.data.categoryList.length !== 4){ + AssertionResult.setFailureMessage("CategoryList query expected to find 4 categories. " + response.data.categoryList.length + " returned."); + AssertionResult.setFailure(true); +} + + + + + + + + + 1 + false + 1 + ${graphqlGetCategoryListByCategoryIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Categories Query: Get Multiple Categories By Id"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); + +var numbers = []; + +var sanity = 0; +for(var i = 0; i < 4; i++){ + sanity++; + if(sanity > 100){ + break; + } + var number = random.nextInt(categories.length) + if(numbers.indexOf(number) >= 0){ + i--; + continue; + } + numbers.push(number); +} + +vars.put("category_id_1", categories[numbers[0]].id); +vars.put("category_id_2", categories[numbers[1]].id); +vars.put("category_id_3", categories[numbers[2]].id); +vars.put("category_id_4", categories[numbers[3]].id); + + tool/fragments/ce/common/extract_multiple_categories_setup.jmx + + + + + true + + + + false + {"query" : "{\n categories(filters:{ids: {in: [\"${category_id_1}\", \"${category_id_2}\", \"${category_id_3}\", \"${category_id_4}\"]}}) {\n total_count\n page_info {\n total_pages\n current_page\n page_size\n }\n items{\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n }\n}"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/categories_query_get_multiple_categories_by_id.jmx + + + + javascript + + + + var response = JSON.parse(prev.getResponseDataAsString()); + +if(response.data == undefined || response.data.categories == undefined){ + AssertionResult.setFailureMessage("Categories result is empty."); + AssertionResult.setFailure(true); +} + +if(response.data.categories.items.length !== 4){ + AssertionResult.setFailureMessage("Categories query expected to find 4 categories. " + response.data.categories.items.length + " returned."); + AssertionResult.setFailure(true); +} + + + + + + + + + 1 + false + 1 + ${graphqlGetCategoryListByCategoryIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Categories Query: Get Many Categories with Pagination"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"query" : "{\n categories(filters:{name: {match: \"Category\"}}) {\n total_count\n page_info {\n total_pages\n current_page\n page_size\n }\n items{\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n }\n}"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/categories_query_get_many_categories_by_name_match.jmx + + + + javascript + + + + var response = JSON.parse(prev.getResponseDataAsString()); + +if(response.data == undefined || response.data.categories == undefined){ + AssertionResult.setFailureMessage("Categories result is empty."); + AssertionResult.setFailure(true); +} + +if(response.data.categories.items.length != 20){ + AssertionResult.setFailureMessage("Categories query expected to find 20 categories. " + response.data.categories.items.length + " returned."); + AssertionResult.setFailure(true); +} + + + + + + + + + 1 + false + 1 + ${graphqlUrlInfoByUrlKeyPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Url Info by url_key"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + + {"query":"query resolveUrl($urlKey: String!) {\n urlResolver(url: $urlKey) {\n type\n id\n }\n}","variables":{"urlKey":"${category_url_key}${url_suffix}"},"operationName":"resolveUrl"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_url_info_by_url_key.jmx + + + + {"type":"CATEGORY","id":${category_id}} + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlGetCmsPageByIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Cms Page by id"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var cmsPages = props.get("cms_pages"); +var number = random.nextInt(cmsPages.length); + +vars.put("cms_page_id", cmsPages[number].id); + + tool/fragments/ce/setup/prepare_cms_page.jmx + + + + true + + + + false + + {"query":"query getCmsPage($id: Int!, $onServer: Boolean!) {\n cmsPage(id: $id) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"id":${cms_page_id},"onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_get_cms_page_by_id.jmx + + + $.data.cmsPage.url_key + ${cms_page_id} + false + false + false + false + + + + + + + + 1 + false + 1 + ${graphqlGetNavigationMenuByCategoryIdPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Navigation Menu by category_id"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + {"query":"query navigationMenu($id: Int!) {\n category(id: $id) {\n id\n name\n product_count\n path\n children {\n id\n name\n position\n level\n url_key\n url_path\n product_count\n children_count\n path\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}","variables":{"id":${category_id}},"operationName":"navigationMenu"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_navigation_menu_by_category_id.jmx + + + + + "id":${category_id},"name":"${category_name}","product_count" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlCreateEmptyCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Create Empty Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlGetEmptyCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Get Empty Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_empty_cart.jmx + + + + + {"data":{"cart":{"items":[]}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlSetShippingAddressOnCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Set Shipping Address On Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_empty_cart.jmx + + + + + {"data":{"cart":{"items":[]}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n setShippingAddressesOnCart(\n input: {\n cart_id: \"${quote_id}\"\n shipping_addresses: [\n {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"AZ\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n ]\n }\n ) {\n cart {\n shipping_addresses {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_shipping_address_on_cart.jmx + + + + + {"data":{"setShippingAddressesOnCart":{"cart":{"shipping_addresses":[{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}]}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlSetBillingAddressOnCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Set Billing Address On Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_empty_cart.jmx + + + + + {"data":{"cart":{"items":[]}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n setBillingAddressOnCart(\n input: {\n cart_id: \"${quote_id}\"\n billing_address: {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"AZ\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n }\n ) {\n cart {\n billing_address {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_billing_address_on_cart.jmx + + + + + {"data":{"setBillingAddressOnCart":{"cart":{"billing_address":{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlAddSimpleProductToCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Add Simple Product To Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlAddConfigurableProductToCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Add Configurable Product To Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.products.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option.jmx + + + + + true + + + + false + {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx + + + + + addConfigurableProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlUpdateSimpleProductQtyInCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Update Simple Product Qty In Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_cart.jmx + + + + item_id + $.data.cart.items[0].id + + + BODY + + + + + {"data":{"cart":{"items": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/update_simple_product_qty_in_cart.jmx + + + + + {"data":{"updateCartItems":{"cart":{"items":[{"id":"${item_id}","quantity":5}]}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlUpdateConfigurableProductQtyInCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Update Configurable Product Qty In Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.products.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option.jmx + + + + + true + + + + false + {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx + + + + + addConfigurableProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_cart.jmx + + + + item_id + $.data.cart.items[0].id + + + BODY + + + + + {"data":{"cart":{"items": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/update_configurable_product_qty_in_cart.jmx + + + + + {"data":{"updateCartItems":{"cart":{"items":[{"id":"${item_id}","quantity":5}]}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlUpdateSimpleProductQtyInCartWithPricesPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Update Simple Product Qty In Cart with Prices"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n prices {\n row_total{\n value\n }\n total_item_discount {\n currency\n value\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n row_total_including_tax{\n value\n }\n }\n product {\n sku\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n }\n}\n","variables":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart_with_prices.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n row_total_including_tax{\n value\n }\n total_item_discount{value}\n discounts{\n amount{value}\n label\n }\n }\n product {\n sku\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n}\n","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_cart_with_prices.jmx + + + + item_id + $.data.cart.items[0].id + + + BODY + + + + + {"data":{"cart":{"items": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n total_item_discount {\n currency\n value\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n row_total_including_tax{\n value\n }\n }\n product {\n sku\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/update_simple_product_qty_in_cart_with_prices.jmx + + + + + "quantity":5 + "id":"${item_id}" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlUpdateConfigurableProductQtyInCartWithPricesPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Update Configurable Product Qty In Cart with Prices"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.products.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option.jmx + + + + + true + + + + false + {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n total_item_discount {\n currency\n value\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n row_total_including_tax{\n value\n }\n }\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n }\n}\n","variables":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_configurable_product_to_cart_with_prices.jmx + + + + + addConfigurableProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n row_total_including_tax{\n value\n }\n total_item_discount{value}\n discounts{\n amount{value}\n label\n }\n }\n product {\n sku\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n}\n","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_cart_with_prices.jmx + + + + item_id + $.data.cart.items[0].id + + + BODY + + + + + {"data":{"cart":{"items": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n total_item_discount {\n currency\n value\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n row_total_including_tax{\n value\n }\n }\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/update_configurable_product_qty_in_cart_with_prices.jmx + + + + + "quantity":5 + "id":"${item_id}" + + Assertion.response_data + false + 2 + + + + + + + + 1 + false + 1 + ${graphqlRemoveSimpleProductFromCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Remove Simple Product From Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_cart.jmx + + + + item_id + $.data.cart.items[0].id + + + BODY + + + + + {"data":{"cart":{"items": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation {\n removeItemFromCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_item_id: ${item_id}\n }\n ) {\n cart {\n items {\n quantity\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/remove_simple_product_from_cart.jmx + + + + + {"data":{"removeItemFromCart":{"cart":{"items":[]}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlRemoveConfigurableProductFromCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Remove Configurable Product From Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.products.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option.jmx + + + + + true + + + + false + {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx + + + + + addConfigurableProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_cart.jmx + + + + item_id + $.data.cart.items[0].id + + + BODY + + + + + {"data":{"cart":{"items": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation {\n removeItemFromCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_item_id: ${item_id}\n }\n ) {\n cart {\n items {\n quantity\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/remove_configurable_product_from_cart.jmx + + + + + {"data":{"removeItemFromCart":{"cart":{"items":[]}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlApplyCouponToCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Apply Coupon To Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var coupons = props.get("coupon_codes"); +number = random.nextInt(coupons.length); + +vars.put("coupon_code", coupons[number].code); + + tool/fragments/ce/common/extract_coupon_code_setup.jmx + + + + + true + + + + false + {"query":"mutation {\n applyCouponToCart(input: {cart_id: \"${quote_id}\", coupon_code: \"${coupon_code}\"}) {\n cart {\n applied_coupon {\n code\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/apply_coupon_to_cart.jmx + + + + + {"data":{"applyCouponToCart":{"cart":{"applied_coupon":{"code":"${coupon_code}"}}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlRemoveCouponFromCartPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Remove Coupon From Cart"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var coupons = props.get("coupon_codes"); +number = random.nextInt(coupons.length); + +vars.put("coupon_code", coupons[number].code); + + tool/fragments/ce/common/extract_coupon_code_setup.jmx + + + + + true + + + + false + {"query":"mutation {\n applyCouponToCart(input: {cart_id: \"${quote_id}\", coupon_code: \"${coupon_code}\"}) {\n cart {\n applied_coupon {\n code\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/apply_coupon_to_cart.jmx + + + + + {"data":{"applyCouponToCart":{"cart":{"applied_coupon":{"code":"${coupon_code}"}}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n removeCouponFromCart(input: {cart_id: \"${quote_id}\"}) {\n cart {\n applied_coupon {\n code\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/remove_coupon_from_cart.jmx + + + + + {"data":{"removeCouponFromCart":{"cart":{"applied_coupon":null}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlCatalogBrowsingByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Catalog Browsing By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + {"query":"query navigationMenu($id: Int!) {\n category(id: $id) {\n id\n name\n product_count\n path\n children {\n id\n name\n position\n level\n url_key\n url_path\n product_count\n children_count\n path\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}","variables":{"id":${category_id}},"operationName":"navigationMenu"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_navigation_menu_by_category_id.jmx + + + + + "id":${category_id},"name":"${category_name}","product_count" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"query productSearch($inputText: String!, $categoryId: String) {\n products(\n pageSize:12\n search: $inputText, filter: { category_id: { eq: $categoryId } }, sort: {name: ASC}) {\n items {\n id\n name\n small_image {\n label\n url\n }\n url_key\n price {\n regularPrice {\n amount {\n value\n currency\n }\n }\n }\n }\n total_count\n filters {\n name\n filter_items_count\n request_var\n filter_items {\n label\n value_string\n }\n }\n }\n}","variables":{"inputText":"Product","categoryId":"${category_id}"},"operationName":"productSearch"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_product_search_by_text_and_category_id.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + + + true + + + + false + + {"query":"query resolveUrl($urlKey: String!) {\n urlResolver(url: $urlKey) {\n type\n id\n }\n}","variables":{"urlKey":"${category_url_key}${url_suffix}"},"operationName":"resolveUrl"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_url_info_by_url_key.jmx + + + + {"type":"CATEGORY","id":${category_id}} + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"query category($id: Int!, $currentPage: Int, $pageSize: Int) {\n category(id: $id) {\n product_count\n description\n url_key\n name\n id\n breadcrumbs {\n category_name\n category_url_key\n __typename\n }\n products(pageSize: $pageSize, currentPage: $currentPage, sort: {name: ASC}) {\n total_count\n items {\n id\n name\n # small_image\n # short_description\n url_key\n special_price\n special_from_date\n special_to_date\n price {\n regularPrice {\n amount {\n value\n currency\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n","variables":{"id":${category_id},"currentPage":1,"pageSize":12},"operationName":"category"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_products_by_category_id.jmx + + + + + "name":"${category_name}","id":${category_id}, + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($product_sku: String, $onServer: Boolean!) {\n productDetail: products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var cmsPages = props.get("cms_pages"); +var number = random.nextInt(cmsPages.length); + +vars.put("cms_page_id", cmsPages[number].id); + + tool/fragments/ce/setup/prepare_cms_page.jmx + + + + true + + + + false + + {"query":"query getCmsPage($id: Int!, $onServer: Boolean!) {\n cmsPage(id: $id) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"id":${cms_page_id},"onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_get_cms_page_by_id.jmx + + + $.data.cmsPage.url_key + ${cms_page_id} + false + false + false + false + + + + + + + + 1 + false + 1 + ${graphqlCheckoutByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Checkout By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_empty_cart.jmx + + + + + {"data":{"cart":{"items":[]}}} + + Assertion.response_data + false + 8 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.products.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option.jmx + + + + + true + + + + false + {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx + + + + + addConfigurableProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation {\n setBillingAddressOnCart(\n input: {\n cart_id: \"${quote_id}\"\n billing_address: {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"AZ\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n }\n ) {\n cart {\n billing_address {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_billing_address_on_cart.jmx + + + + + {"data":{"setBillingAddressOnCart":{"cart":{"billing_address":{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n setShippingAddressesOnCart(\n input: {\n cart_id: \"${quote_id}\"\n shipping_addresses: [\n {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"AZ\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n ]\n }\n ) {\n cart {\n shipping_addresses {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_shipping_address_on_cart.jmx + + + + + {"data":{"setShippingAddressesOnCart":{"cart":{"shipping_addresses":[{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}]}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n setPaymentMethodOnCart(input: {\n cart_id: \"${quote_id}\", \n payment_method: {\n code: \"checkmo\"\n }\n }) {\n cart {\n selected_payment_method {\n code\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_payment_method_on_cart.jmx + + + + + {"data":{"setPaymentMethodOnCart":{"cart":{"selected_payment_method":{"code":"checkmo"}}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n shipping_addresses {\n postcode\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_current_shipping_address.jmx + + + + + true + + + + false + {"query":"mutation {\n setShippingMethodsOnCart(input: \n {\n cart_id: \"${quote_id}\", \n shipping_methods: [{\n carrier_code: \"flatrate\"\n method_code: \"flatrate\"\n }]\n }) {\n cart {\n shipping_addresses {\n selected_shipping_method {\n carrier_code\n method_code\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_shipping_method_on_cart.jmx + + + + + {"data":{"setShippingMethodsOnCart":{"cart":{"shipping_addresses":[{"selected_shipping_method":{"carrier_code":"flatrate","method_code":"flatrate"}}]}}}} + + Assertion.response_data + false + 8 + + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var coupons = props.get("coupon_codes"); +number = random.nextInt(coupons.length); + +vars.put("coupon_code", coupons[number].code); + + tool/fragments/ce/common/extract_coupon_code_setup.jmx + + + + + true + + + + false + {"query":"mutation {\n applyCouponToCart(input: {cart_id: \"${quote_id}\", coupon_code: \"${coupon_code}\"}) {\n cart {\n applied_coupon {\n code\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/apply_coupon_to_cart.jmx + + + + + {"data":{"applyCouponToCart":{"cart":{"applied_coupon":{"code":"${coupon_code}"}}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n removeCouponFromCart(input: {cart_id: \"${quote_id}\"}) {\n cart {\n applied_coupon {\n code\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/remove_coupon_from_cart.jmx + + + + + {"data":{"removeCouponFromCart":{"cart":{"applied_coupon":null}}}} + + Assertion.response_data + false + 8 + + + + + + + + 1 + false + 1 + ${graphqlCheckoutALargeBulkOfProductsByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "GraphQL Checkout A Large Bulk Of Products By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + tool/fragments/ce/common/init_total_simple_and_configurable_products_in_cart_setup.jmx + +vars.put("totalSimpleProductsAdded", "0"); +vars.put("totalConfigurableProductsAdded", "0"); + + + + true + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_empty_cart.jmx + + + + + {"data":{"cart":{"items":[]}}} + + Assertion.response_data + false + 8 + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +simpleProductsAdded = Integer.parseInt(vars.get("totalSimpleProductsAdded")); +lastSimpleProduct = Integer.parseInt(vars.get("numberOfRelatedSimpleProductsInTheCart")) - 1; + +product = props.get("simple_products_list").get(lastSimpleProduct); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + +simpleProductsAdded = simpleProductsAdded + 1; +vars.put("totalSimpleProductsAdded", String.valueOf(simpleProductsAdded)); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup_large_bulk_of_products.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + true + + + + false + {"query":"mutation{ addProductsToCart( cartId: \"${quote_id}\" cartItems: [{ sku: \"${product_sku}\" quantity: 1 }, ${related_product}] ){ cart{ id items{ product{ sku } quantity } } } }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 8000000 + 8000000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/add_simple_products_to_cart.jmx + + + + + addProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + groovy + + + true + + numberOfSimpleProducts = Integer.parseInt(vars.get("numberOfRelatedSimpleProductsInTheCart")) - 1; + def relatedProductSKUs = props.get('simple_products_list').take(numberOfSimpleProducts).inject('') {acc, prod -> acc + '{ sku: \\"' + prod.get("sku") + '\\" quantity: 1 },' }; + vars.put('related_product', relatedProductSKUs); + + simpleProductsAdded = Integer.parseInt(vars.get("totalSimpleProductsAdded")); + simpleProductsAdded = simpleProductsAdded + numberOfSimpleProducts; + vars.put("totalSimpleProductsAdded", String.valueOf(simpleProductsAdded)); + + productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); + productsAdded = productsAdded + numberOfSimpleProducts; + vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/related_products_add_to_cart_preprocessor.jmx + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +configurableProductsAdded = Integer.parseInt(vars.get("totalConfigurableProductsAdded")); + +product = props.get("configurable_products_list").get(configurableProductsAdded); + +vars.put("product_number", configurableProductsAdded.toString()); +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + +configurableProductsAdded = configurableProductsAdded + 1; +vars.put("totalConfigurableProductsAdded", String.valueOf(configurableProductsAdded)); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup_large_number_of_products.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + true + + + + false + {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.products.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option.jmx + + + + + true + + + + false + {"query":"mutation { addProductsToCart( cartId: \"${quote_id}\" cartItems: [ { quantity: 1 parent_sku: \"${product_sku}\" sku: \"${product_option}\" } ] ) { cart { items { id product { name sku } quantity } } } }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/add_configurable_product_to_cart.jmx + + + + + addProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + + + true + + + + false + {"query":"mutation{ setBillingAddressOnCart(input: { cart_id: \"${quote_id}\" billing_address: { address: { city: \"Los Angeles\" country_code: \"US\" firstname: \"Async\" lastname: \"Test\" region_id: 12 postcode: \"90004\" street: [ \"123 Homey Lane\" ] telephone: \"6666666666\" } use_for_shipping: true } }){ cart{ id billing_address{ firstname lastname telephone country{ code } region { label region_id } city postcode street } shipping_addresses{ firstname lastname telephone country{ code } region { label region_id } city postcode street } } } }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/set_billing_and_shipping_address_on_cart.jmx + + + + + "firstname":"Async","lastname":"Test","telephone":"6666666666" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation{ setPaymentMethodOnCart(input: { cart_id: \"${quote_id}\" payment_method: { code: \"checkmo\" } }){ cart{ id selected_payment_method{ code title } } } }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/set_payment_method_on_cart.jmx + + + + + Money order + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation { setGuestEmailOnCart( input: { cart_id: \"${quote_id}\" email: \"customer@example.com\" } ) { cart { email } } }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/set_guest_email_on_cart.jmx + + + + + {"data":{"setGuestEmailOnCart":{"cart":{"email":"customer@example.com"}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n setShippingMethodsOnCart(input: \n {\n cart_id: \"${quote_id}\", \n shipping_methods: [{\n carrier_code: \"flatrate\"\n method_code: \"flatrate\"\n }]\n }) {\n cart {\n shipping_addresses {\n selected_shipping_method {\n carrier_code\n method_code\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/set_shipping_method_on_cart.jmx + + + + + {"data":{"setShippingMethodsOnCart":{"cart":{"shipping_addresses":[{"selected_shipping_method":{"carrier_code":"flatrate","method_code":"flatrate"}}]}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"{ cart(cart_id: \"${quote_id}\") { total_quantity email billing_address { city country { code label } firstname lastname postcode region { code label } street telephone } shipping_addresses { firstname lastname street city region { code label } country { code label } telephone available_shipping_methods { amount { currency value } available carrier_code carrier_title error_message method_code method_title price_excl_tax { value currency } price_incl_tax { value currency } } selected_shipping_method { amount { value currency } carrier_code carrier_title method_code method_title } } items { id product { name sku } quantity } available_payment_methods { code title } selected_payment_method { code title } applied_coupons { code } prices { grand_total { value currency } } } }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/get_cart.jmx + + + + $.data.cart.total_quantity + ${totalProductsAdded} + true + false + false + false + + + + + + true + + + + false + {"query":"{ cart(cart_id: \"${quote_id}\") { total_quantity email billing_address { city country { code label } firstname lastname postcode region { code label } street telephone } shipping_addresses { firstname lastname street city region { code label } country { code label } telephone available_shipping_methods { amount { currency value } available carrier_code carrier_title error_message method_code method_title price_excl_tax { value currency } price_incl_tax { value currency } } selected_shipping_method { amount { value currency } carrier_code carrier_title method_code method_title } } items { id product { name sku } quantity } available_payment_methods { code title } selected_payment_method { code title } applied_coupons { code } prices { grand_total { value currency } } } }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/get_cart.jmx + + + + $.data.cart.total_quantity + ${totalProductsAdded} + true + false + false + false + + + + + + true + + + + false + {"query":"mutation{ placeOrder(input: { cart_id: \"${quote_id}\" }) { order{ order_number } } }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/large_number_of_products_in_the_card/place_the_order.jmx + + + + + {"data":{"placeOrder":{"order":{"order_number":" + + Assertion.response_data + false + 2 + + + + + + + + + + continue + + false + ${loops} + + ${combinedBenchmarkPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + javascript + + + + var cacheHitPercent = vars.get("cache_hits_percentage"); + +if ( + cacheHitPercent < 100 && + sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' +) { + doCache(); +} + +function doCache(){ + var random = Math.random() * 100; + if (cacheHitPercent < random) { + sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); + } +} + + tool/fragments/ce/common/cache_hit_miss.jmx + + + + 1 + false + 1 + ${cBrowseCatalogByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Catalog Browsing By Guest"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${cSiteSearchPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Site Search"); + + true + + + + + ${files_folder}search_terms.csv + UTF-8 + + , + false + true + false + shareMode.thread + tool/fragments/ce/search/search_terms.jmx + + + + javascript + + + + var cacheHitPercent = vars.get("cache_hits_percentage"); + +if ( + cacheHitPercent < 100 && + sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' +) { + doCache(); +} + +function doCache(){ + var random = Math.random() * 100; + if (cacheHitPercent < random) { + sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); + } +} + + tool/fragments/ce/common/cache_hit_miss.jmx + + + + 1 + false + 1 + ${searchQuickPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Quick Search"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + q + ${searchTerm} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalogsearch/result/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_quick.jmx + + + + Search results for: + <span class="toolbar-number">\d<\/span> Items|Items <span class="toolbar-number">1 + + Assertion.response_data + false + 2 + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="(?:http|https)://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + false + isPageCacheable + catalogsearch/searchTermsLog/save + $0$ + 0 + 1 + + + + + + "${isPageCacheable}" != "0" + false + tool/fragments/ce/search/if_page_cacheable_controller.jmx + + + + + + true + q + ${searchTerm} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalogsearch/searchTermsLog/save/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_terms_log_save.jmx + + + + + "success":true + + Assertion.response_data + false + 2 + + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${searchQuickFilterPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Quick Search With Filtration"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + q + ${searchTerm} + = + true + + + + + + 60000 + 200000 + + + ${base_path}catalogsearch/result/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_quick_filter.jmx + + + + Search results for: + Items <span class="toolbar-number">1 + + Assertion.response_data + false + 2 + + + + 0 + attribute_1_options_count + count((//div[@class="filter-options-content"])[1]//li[@class="item"]) + false + true + false + + + + 0 + attribute_2_options_count + count((//div[@class="filter-options-content"])[2]//li[@class="item"]) + false + true + false + + + + + attribute_1_filter_url + ((//div[@class="filter-options-content"])[1]//li[@class="item"]//a)[1]/@href + false + true + false + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + false + isPageCacheable + catalogsearch/searchTermsLog/save + $0$ + 0 + 1 + + + + + + "${isPageCacheable}" != "0" + false + tool/fragments/ce/search/if_page_cacheable_controller.jmx + + + + + + true + q + ${searchTerm} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalogsearch/searchTermsLog/save/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_terms_log_save.jmx + + + + + "success":true + + Assertion.response_data + false + 2 + + + + + + + ${attribute_1_options_count} > 0 + false + tool/fragments/ce/search/search_quick_filter-first-attribute.jmx + + + vars.put("search_url", vars.get("attribute_1_filter_url")); + + + false + + + + + + + + + 60000 + 200000 + + + ${attribute_1_filter_url} + GET + true + false + true + false + false + + + + + + Search results for: + <span class="toolbar-number">[1-9]+ + + Assertion.response_data + false + 2 + + + + 0 + attribute_2_options_count + count((//div[@class="filter-options-content"])[2]//li[@class="item"]) + false + true + false + + + + + attribute_2_filter_url + ((//div[@class="filter-options-content"])[2]//li[@class="item"]//a)[1]/@href + false + true + false + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + + + + ${attribute_2_options_count} > 0 + false + tool/fragments/ce/search/search_quick_filter-second-attribute.jmx + + + vars.put("search_url", vars.get("attribute_2_filter_url")); + + + false + + + + + + + + + 60000 + 200000 + + + ${attribute_2_filter_url} + GET + true + false + true + false + false + + + + + + Search results for: + <span class="toolbar-number">[1-9]+ + + Assertion.response_data + false + 2 + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${searchAdvancedPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Advanced Search"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + + + ${base_path}catalogsearch/advanced/ + GET + true + false + true + false + false + + tool/fragments/ce/search/open_advanced_search_page.jmx + + + + <title>Advanced Search</title> + + Assertion.response_data + false + 2 + + + + + attribute_name + (//select[@class="multiselect"])[last()]/@name + false + true + false + + + + 0 + attribute_options_count + count((//select[@class="multiselect"])[last()]/option) + false + true + false + + + + + attribute_value + ((//select[@class="multiselect"])[last()]/option)[1]/@value + false + true + false + + + + + + + + + + + true + name + + = + true + + + true + sku + + = + true + + + true + description + ${searchTerm} + = + true + + + true + short_description + + = + true + + + true + price%5Bfrom%5D + + = + true + + + true + price%5Bto%5D + ${priceTo} + = + true + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalogsearch/advanced/result/ + GET + true + false + true + false + false + + tool/fragments/ce/search/search_advanced.jmx + + + + items</strong> were found using the following search criteria + + Assertion.response_data + false + 2 + + + + false + product_url_keys + <a class="product-item-link"(?s).+?href="(?:http|https)://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). + $2$ + + -1 + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + + + 1 + false + 1 + ${cAddToCartByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Add To Cart By Guest"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + true + 1 + tool/fragments/ce/common/get_configurable_product_options.jmx + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + 1 + false + 1 + ${cAddToWishlistPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Add to Wishlist"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + true + 5 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + false + + + true + ${product_uenc} + = + true + uenc + + + true + ${product_id} + = + true + product + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist/index/add/ + POST + true + false + true + false + false + + tool/fragments/ce/wishlist/add_to_wishlist.jmx + + + + <title>My Wish List</title> + + Assertion.response_data + false + 16 + + + + false + wishListItems + data-post-remove='\{"action":"(.+)\/wishlist\\/index\\/remove\\/","data":\{"item":"([^"]+)" + $2$ + + -1 + + + + + + + + + true + wishlist,messages + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/wishlist/load_wishlist_section.jmx + + + + {"wishlist":{"counter":" + + Assertion.response_data + false + 16 + + + + ${wishlistDelay}*1000 + + + + + + + wishListItems + wishListItem + true + tool/fragments/ce/wishlist/clear_wishlist.jmx + + + 1 + 5 + 1 + counter + + true + true + + + + + + + true + ${form_key} + = + true + form_key + true + + + true + ${wishListItem} + = + true + item + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist/index/remove/ + POST + true + false + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cCompareProductsPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Compare Products"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_compare/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + random_product_compare_id + catalog\\/product_compare\\/add\\/\",\"data\":\{\"product\":\"([0-9]+)\" + $1$ + + 1 + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + random_product_compare_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + ${form_key} + = + true + form_key + + + true + ${product_uenc} + = + true + uenc + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalog/product_compare/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_compare/product_compare_add.jmx + + + + + + + true + compare-products,messages + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/product_compare/customer_section_load_product_compare_add.jmx + + + + \"compare-products\":{\"count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + ${form_key} + = + true + form_key + + + true + ${product_uenc} + = + true + uenc + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalog/product_compare/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_compare/product_compare_add.jmx + + + + + + + true + compare-products,messages + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/product_compare/customer_section_load_product_compare_add.jmx + + + + \"compare-products\":{\"count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalog/product_compare/index/ + GET + true + false + true + false + false + + tool/fragments/ce/product_compare/compare_products.jmx + + + + 1 + 0 + ${__javaScript(Math.round(${productCompareDelay}*1000))} + tool/fragments/ce/product_compare/compare_products_pause.jmx + + + + + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}catalog/product_compare/clear + POST + true + false + true + false + false + + tool/fragments/ce/product_compare/compare_products_clear.jmx + + + + + + 1 + false + 1 + ${cCheckoutByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Checkout By Guest"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + true + 1 + tool/fragments/ce/common/get_configurable_product_options.jmx + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/ + GET + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_start.jmx + + + + <title>Checkout</title> + + Assertion.response_data + false + 2 + + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 6 + + + + false + cart_id + "quoteData":{"entity_id":"([^'"]+)", + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + + true + + + + false + {"customerEmail":"test@example.com"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/customers/isEmailAvailable + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_email_available.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + true + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"address":{"country_id":"US","postcode":"95630"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_estimate_shipping_methods_with_postal_code.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/shipping-information + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_billing_shipping_information.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + {"payment_methods": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information + POST + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_payment_info_place_order.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + order_id + $ + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/onepage/success/ + GET + true + false + true + false + false + + tool/fragments/ce/guest_checkout/checkout_success.jmx + + + + Thank you for your purchase! + Your order # is + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${cCheckoutByCustomerPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Checkout By Customer"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + tool/fragments/ce/common/init_total_products_in_cart_setup.jmx + +vars.put("totalProductsAdded", "0"); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_category.jmx + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + tool/fragments/ce/loops/update_products_added_counter.jmx + +productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); +productsAdded = productsAdded + 1; + +vars.put("totalProductsAdded", String.valueOf(productsAdded)); + + + + true + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${product_url_key}${url_suffix} + GET + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx + + + + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + true + 1 + tool/fragments/ce/common/get_configurable_product_options.jmx + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + true + ${product_id} + = + true + product + + + true + + = + true + related_product + + + true + 1 + = + true + qty + + + true + ${form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + tool/fragments/ce/load_cart_section.jmx + + + + You added ${product_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":${totalProductsAdded} + + Assertion.response_data + false + 2 + + + + + + + X-Requested-With + XMLHttpRequest + + + tool/fragments/ce/common/http_header_manager_ajax.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/ + GET + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_start.jmx + + + + <title>Checkout</title> + + Assertion.response_data + false + 2 + + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 6 + + + + false + cart_id + "quoteData":{"entity_id":"([^'"]+)", + $1$ + + 1 + + + + false + address_id + "default_billing":"([^'"]+)", + $1$ + + 1 + + + + false + customer_id + "customer_id":([^'",]+), + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + [0-9]+$ + + Assertion.response_data + false + 1 + variable + address_id + + + + + [0-9]+$ + + Assertion.response_data + false + 1 + variable + customer_id + + + + + + true + + + + false + {"addressId":"${addressId}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/estimate-shipping-methods-by-address-id + POST + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_estimate_shipping_methods.jmx + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"customerAddressId":"${address_id}","countryId":"US","regionId":"${alabama_region_id}","regionCode":"AL","region":"Alabama","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/shipping-information + POST + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_billing_shipping_information.jmx + + + + + Referer + ${host}${base_path}checkout/onepage + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + {"payment_methods" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"cartId":"${cart_id}","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"customerAddressId":"${address_id}","countryId":"US","regionId":"${alabama_region_id}","regionCode":"AL","region":"Alabama","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/payment-information + POST + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_payment_info_place_order.jmx + + + + + Referer + ${host}${base_path}checkout/onepage + + + Content-Type + application/json; charset=UTF-8 + + + Accept + application/json + + + X-Requested-With + XMLHttpRequest + + + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}checkout/onepage/success/ + GET + true + false + true + false + false + + tool/fragments/ce/customer_checkout/checkout_success.jmx + + + + Thank you for your purchase! + Your order number is + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + curSampler = ctx.getCurrentSampler(); +if(curSampler.getName().contains("Checkout success")) { + manager = curSampler.getCookieManager(); + manager.clear(); +} + + tool/fragments/ce/customer_checkout/checkout_clear_cookie.jmx + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAccountManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Account management"); + + true + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + ${form_key} + ${host} + ${base_path} + false + 0 + true + true + + + true + tool/fragments/ce/http_cookie_manager.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + tool/fragments/ce/common/open_home_page.jmx + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + tool/fragments/ce/common/open_login_page.jmx + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + tool/fragments/ce/common/login.jmx + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + + + true + + = + true + sections + + + true + false + = + true + force_new_section_timestamp + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}sales/order/history/ + GET + true + false + true + false + false + + tool/fragments/ce/account_management/my_orders.jmx + + + + <title>My Orders</title> + + Assertion.response_data + false + 2 + + + + false + orderId + sales/order/view/order_id/(\d+)/ + $1$ + NOT_FOUND + 1 + + + + + + tool/fragments/ce/account_management/if_orders.jmx + "${orderId}" != "NOT_FOUND" + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}sales/order/view/order_id/${orderId} + GET + true + false + true + false + false + + + + + + <title>Order # + + Assertion.response_data + false + 2 + + + + false + shipment_tab + sales/order/shipment/order_id/(\d+)..Order Shipments + $1$ + NOT_FOUND + 1 + + + + + May not have shipped + "${shipment_tab}" != "NOT_FOUND" + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}sales/order/shipment/order_id/${orderId} + GET + true + false + true + false + false + + + + + + Track this shipment + + Assertion.response_data + false + 2 + + + + false + popupLink + popupWindow": {"windowURL":"([^'"]+)", + $1$ + + 1 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${popupLink} + GET + true + false + true + false + false + + + + + + <title>Tracking Information</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}downloadable/customer/products + GET + true + false + true + false + false + + tool/fragments/ce/account_management/my_downloadable_products.jmx + + + + <title>My Downloadable Products</title> + + Assertion.response_data + false + 2 + + + + false + orderId + sales/order/view/order_id/(\d+)/ + $1$ + NOT_FOUND + 1 + + + + false + linkId + downloadable/download/link/id/(\d+)/ + $1$ + + 1 + + + + + + tool/fragments/ce/account_management/if_downloadables.jmx + "${orderId}" != "NOT_FOUND" + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}sales/order/view/order_id/${orderId} + GET + true + false + true + false + false + + tool/fragments/ce/account_management/view_downloadable_products.jmx + + + + <title>Order # + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}downloadable/download/link/id/${linkId} + GET + true + false + true + false + false + + tool/fragments/ce/account_management/download_product.jmx + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist + GET + true + false + true + false + false + + + + + + <title>My Wish List</title> + + Assertion.response_data + false + 2 + + + + false + wishlistId + wishlist/index/update/wishlist_id/([^'"]+)/ + $1$ + + 1 + tool/fragments/ce/account_management/my_wish_list.jmx + + + + false + buttonTitle + Update Wish List + FOUND + NOT_FOUND + 1 + + + + + + tool/fragments/ce/account_management/if_wishlist.jmx + "${buttonTitle}" === "FOUND" + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist/index/share/wishlist_id/${wishlistId}/ + GET + true + false + true + false + false + + tool/fragments/ce/account_management/share_wish_list.jmx + + + + <title>Wish List Sharing</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ${form_key} + = + true + form_key + true + + + true + ${customer_email} + = + true + emails + + + true + [TEST] See my wishlist!!! + = + true + message + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}wishlist/index/send/wishlist_id/${wishlistId}/ + POST + true + false + true + false + false + + tool/fragments/ce/account_management/send_wish_list.jmx + + + + <title>My Wish List</title> + + Assertion.response_data + false + 2 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}customer/account/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/common/logout.jmx + + + + You are signed out. + + Assertion.response_data + false + 2 + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCMSManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin CMS Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_cms_management/admin_cms_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/ + GET + true + false + true + false + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/new + GET + true + false + true + false + false + + + + + + + + true + <p>CMS Content ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + content + + + true + + = + true + content_heading + + + true + ${admin_form_key} + = + true + form_key + + + true + + = + true + identifier + + + true + 1 + = + true + is_active + + + true + + = + true + layout_update_xml + + + true + + = + true + meta_description + + + true + + = + true + meta_keywords + + + true + + = + true + meta_title + + + false + {} + = + true + nodes_data + + + true + + = + true + node_ids + + + true + + = + true + page_id + + + true + 1column + = + true + page_layout + + + true + 0 + = + true + store_id[0] + + + true + CMS Title ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + title + + + true + 0 + = + true + website_root + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/save/ + POST + true + false + true + false + false + + + + + + You saved the page. + + Assertion.response_data + false + 16 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCMSManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseProductGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Browse Product Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Product"); + + pagesCount = parseInt(vars.get("products_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "product_listing"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_product_filter_text")); + vars.put("grid_filter_field", "name"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "name"); + vars.put("grid_sort_field_2", "price"); + vars.put("grid_sort_field_3", "attribute_set_id"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_products_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseOrderGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Browse Order Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Order"); + + pagesCount = parseInt(vars.get("orders_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "sales_order_grid"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_orders_filter_text")); + vars.put("grid_filter_field", "status"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "increment_id"); + vars.put("grid_sort_field_2", "created_at"); + vars.put("grid_sort_field_3", "billing_name"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_orders_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminProductCreationPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Create Product"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/once_only_controller.jmx + + + + tool/fragments/ce/admin_create_product/get_related_product_id.jmx + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +relatedIndex = random.nextInt(props.get("simple_products_list").size()); +vars.put("related_product_id", props.get("simple_products_list").get(relatedIndex).get("id")); + + + true + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + + + + false + mycolor + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + false + attribute_code + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + false + mysize + = + true + searchCriteria[filterGroups][0][filters][1][value] + + + false + attribute_code + = + true + searchCriteria[filterGroups][0][filters][1][field] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/attributes + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/get_product_attributes.jmx + + + product_attributes + $.items + + + BODY + + + + javascript + + + + +var attributesData = JSON.parse(vars.get("product_attributes")), +maxOptions = 2; + +attributes = []; +for (i in attributesData) { + if (i >= 2) { + break; + } + var data = attributesData[i], + attribute = { + "id": data.attribute_id, + "code": data.attribute_code, + "label": data.default_frontend_label, + "options": [] + }; + + var processedOptions = 0; + for (optionN in data.options) { + var option = data.options[optionN]; + if (parseInt(option.value) > 0 && processedOptions < maxOptions) { + processedOptions++; + attribute.options.push(option); + } + } + attributes.push(attribute); +} + +vars.putObject("product_attributes", attributes); + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product_set/index/filter/${attribute_set_filter} + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_setup_attribute_set.jmx + + + + false + attribute_set_id + catalog&#x2F;product_set&#x2F;edit&#x2F;id&#x2F;([\d]+)&#x2F;"[\D\d]*Attribute Set 1 + $1$ + + 1 + + + + false + + + import org.apache.commons.codec.binary.Base64; + +byte[] encodedBytes = Base64.encodeBase64("set_name=Attribute Set 1".getBytes()); +vars.put("attribute_set_filter", new String(encodedBytes)); + + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +int number1; + +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +number = random.nextInt(props.get("simple_products_list_for_edit").size()); + +simpleList = props.get("simple_products_list_for_edit").get(number); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_name", simpleList.get("title")); + +do { + number1 = random.nextInt(props.get("simple_products_list_for_edit").size()); +} while(number == number1); +simpleList = props.get("simple_products_list_for_edit").get(number1); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_name", simpleList.get("title")); + +number2 = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number2); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); + +//Additional category to be added +//int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); +//vars.put("category_additional", (categoryId+1).toString()); +//New price +vars.put("price_new", "9999"); +//New special price +vars.put("special_price_new", "8888"); +//New quantity +vars.put("quantity_new", "100600"); +vars.put("configurable_sku", "Configurable Product - ${__time(YMD)}-${__threadNum}-${__Random(1,1000000)}"); + + + + + true + tool/fragments/ce/admin_create_product/setup.jmx + + + + tool/fragments/ce/admin_create_product/create_bundle_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/bundle/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 42 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[configurable_variations] + + + true + 1 + = + true + affect_configurable_product_attributes + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + new-variations-attribute-set-id + + + true + 0 + = + true + product[shipment_type] + + + true + option title one + = + true + bundle_options[bundle_options][0][title] + + + true + + = + true + bundle_options[bundle_options][0][option_id] + + + true + + = + true + bundle_options[bundle_options][0][delete] + + + true + select + = + true + bundle_options[bundle_options][0][type] + + + true + 1 + = + true + bundle_options[bundle_options][0][required] + + + true + 0 + = + true + bundle_options[bundle_options][0][position] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][option_id] + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][0][bundle_selections][0][product_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][delete] + + + true + 25 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][0][position] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][option_id] + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][0][bundle_selections][1][product_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][delete] + + + true + 10.99 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][position] + + + true + option title two + = + true + bundle_options[bundle_options][1][title] + + + true + + = + true + bundle_options[bundle_options][1][option_id] + + + true + + = + true + bundle_options[bundle_options][1][delete] + + + true + select + = + true + bundle_options[bundle_options][1][type] + + + true + 1 + = + true + bundle_options[bundle_options][1][required] + + + true + 1 + = + true + bundle_options[bundle_options][1][position] + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][option_id] + true + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][1][bundle_selections][0][product_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][delete] + true + + + true + 5.00 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][position] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][option_id] + true + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][1][bundle_selections][1][product_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][delete] + true + + + true + 7.00 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][position] + true + + + true + 2 + = + true + affect_bundle_product_selections + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 42 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full bundle product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[configurable_variations] + + + true + 1 + = + true + affect_configurable_product_attributes + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + new-variations-attribute-set-id + + + true + 0 + = + true + product[shipment_type] + false + + + true + option title one + = + true + bundle_options[bundle_options][0][title] + false + + + true + + = + true + bundle_options[bundle_options][0][option_id] + false + + + true + + = + true + bundle_options[bundle_options][0][delete] + false + + + true + select + = + true + bundle_options[bundle_options][0][type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][required] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][position] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][option_id] + false + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][0][bundle_selections][0][product_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][delete] + false + + + true + 25 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][0][position] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][option_id] + false + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][0][bundle_selections][1][product_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][delete] + false + + + true + 10.99 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][position] + false + + + true + option title two + = + true + bundle_options[bundle_options][1][title] + false + + + true + + = + true + bundle_options[bundle_options][1][option_id] + false + + + true + + = + true + bundle_options[bundle_options][1][delete] + false + + + true + select + = + true + bundle_options[bundle_options][1][type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][required] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][position] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][option_id] + false + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][1][bundle_selections][0][product_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][delete] + false + + + true + 5.00 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][position] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][option_id] + false + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][1][bundle_selections][1][product_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][delete] + false + + + true + 7.00 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][position] + false + + + true + 2 + = + true + affect_bundle_product_selections + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/bundle/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + option title one + option title two + ${simple_product_2_name} + ${simple_product_1_name} + + + Assertion.response_data + false + 2 + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/open_catalog_grid.jmx + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/${attribute_set_id}/type/configurable/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/new_configurable.jmx + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + ${admin_form_key} + = + true + form_key + true + + + true + ${attribute_set_id} + = + true + new-variations-attribute-set-id + true + + + true + 1 + = + true + product[affect_product_custom_options] + true + + + true + ${attribute_set_id} + = + true + product[attribute_set_id] + true + + + true + 4 + = + true + product[category_ids][0] + true + + + true + + = + true + product[custom_layout_update] + true + + + true + + = + true + product[description] + true + + + true + 0 + = + true + product[gift_message_available] + true + + + true + 1 + = + true + product[gift_wrapping_available] + true + + + true + + = + true + product[gift_wrapping_price] + true + + + true + + = + true + product[image] + true + + + true + 2 + = + true + product[is_returnable] + true + + + true + ${configurable_sku} - Meta Description + = + true + product[meta_description] + true + + + true + ${configurable_sku} - Meta Keyword + = + true + product[meta_keyword] + true + + + true + ${configurable_sku} - Meta Title + = + true + product[meta_title] + true + + + true + ${configurable_sku} + = + true + product[name] + true + + + true + container2 + = + true + product[options_container] + true + + + true + ${price_new} + = + true + product[price] + true + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + true + + + true + 1000 + = + true + product[quantity_and_stock_status][qty] + true + + + true + + = + true + product[short_description] + true + + + true + ${configurable_sku} + = + true + product[sku] + true + + + true + + = + true + product[small_image] + true + + + true + ${special_price_new} + = + true + product[special_price] + true + + + true + 1 + = + true + product[status] + true + + + true + 0 + = + true + product[stock_data][backorders] + true + + + true + 1 + = + true + product[stock_data][deferred_stock_update] + true + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + true + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + true + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + true + + + true + 1 + = + true + product[stock_data][manage_stock] + true + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + true + + + true + 0 + = + true + product[stock_data][min_qty] + true + + + true + 1 + = + true + product[stock_data][min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_backorders] + true + + + true + 1 + = + true + product[stock_data][use_config_deferred_stock_update] + true + + + true + 1 + = + true + product[stock_data][use_config_enable_qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + true + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + true + + + true + 2 + = + true + product[tax_class_id] + true + + + true + + = + true + product[thumbnail] + true + + + true + + = + true + product[url_key] + true + + + true + 1 + = + true + product[use_config_gift_message_available] + true + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + true + + + true + 1 + = + true + product[use_config_is_returnable] + true + + + true + 4 + = + true + product[visibility] + true + + + true + 1 + = + true + product[website_ids][1] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/${attribute_set_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_validate.jmx + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + javascript + + + + +attributes = vars.getObject("product_attributes"); + +for (i in attributes) { + var attribute = attributes[i]; + sampler.addArgument("attribute_codes[" + i + "]", attribute.code); + sampler.addArgument("attributes[" + i + "]", attribute.id); + sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); + addConfigurableAttributeData(attribute); +} + +addConfigurableMatrix(attributes); + +function addConfigurableAttributeData(attribute) { + var attributeId = attribute.id; + + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); + attribute.options.forEach(function (option, index) { + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); + }); +} + +/** + * Build 4 simple products for Configurable + */ +function addConfigurableMatrix(attributes) { + + var attribute1 = attributes[0], + attribute2 = attributes[1], + productIndex = 1, + products = []; + var variationNames = []; + attribute1.options.forEach(function (option1) { + attribute2.options.forEach(function (option2) { + var productAttributes = {}, + namePart = option1.label + "+" + option2.label, + variationKey = option1.value + "-" + option2.value; + productAttributes[attribute1.code] = option1.value; + productAttributes[attribute2.code] = option2.value; + + variationNames.push(namePart + " - " + vars.get("configurable_sku")); + var product = { + "id": null, + "name": namePart + " - " + vars.get("configurable_sku"), + "sku": namePart + " - " + vars.get("configurable_sku"), + "status": 1, + "price": "100", + "price_currency": "$", + "price_string": "$100", + "weight": "6", + "qty": "50", + "variationKey": variationKey, + "configurable_attribute": JSON.stringify(productAttributes), + "thumbnail_image": "", + "media_gallery": {"images": {}}, + "image": [], + "was_changed": true, + "canEdit": 1, + "newProduct": 1, + "record_id": productIndex + }; + productIndex++; + products.push(product); + }); + }); + + sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); + vars.putObject("configurable_variations_assertion", variationNames); +} + + tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + ${admin_form_key} + = + true + form_key + true + + + true + ${attribute_set_id} + = + true + new-variations-attribute-set-id + true + + + true + 1 + = + true + product[affect_product_custom_options] + true + + + true + ${attribute_set_id} + = + true + product[attribute_set_id] + true + + + true + 2 + = + true + product[category_ids][0] + true + + + true + + = + true + product[custom_layout_update] + true + + + true + + = + true + product[description] + true + + + true + 0 + = + true + product[gift_message_available] + true + + + true + 1 + = + true + product[gift_wrapping_available] + true + + + true + + = + true + product[gift_wrapping_price] + true + + + true + + = + true + product[image] + true + + + true + 2 + = + true + product[is_returnable] + true + + + true + ${configurable_sku} - Meta Description + = + true + product[meta_description] + true + + + true + ${configurable_sku} - Meta Keyword + = + true + product[meta_keyword] + true + + + true + ${configurable_sku} - Meta Title + = + true + product[meta_title] + true + + + true + ${configurable_sku} + = + true + product[name] + true + + + true + container2 + = + true + product[options_container] + true + + + true + ${price_new} + = + true + product[price] + true + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + true + + + true + 1000 + = + true + product[quantity_and_stock_status][qty] + true + + + true + + = + true + product[short_description] + true + + + true + ${configurable_sku} + = + true + product[sku] + true + + + true + + = + true + product[small_image] + true + + + true + ${special_price_new} + = + true + product[special_price] + true + + + true + 1 + = + true + product[status] + true + + + true + 0 + = + true + product[stock_data][backorders] + true + + + true + 1 + = + true + product[stock_data][deferred_stock_update] + true + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + true + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + true + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + true + + + true + 1 + = + true + product[stock_data][manage_stock] + true + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + true + + + true + 0 + = + true + product[stock_data][min_qty] + true + + + true + 1 + = + true + product[stock_data][min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_backorders] + true + + + true + 1 + = + true + product[stock_data][use_config_deferred_stock_update] + true + + + true + 1 + = + true + product[stock_data][use_config_enable_qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + true + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + true + + + true + 2 + = + true + product[tax_class_id] + true + + + true + + = + true + product[thumbnail] + true + + + true + + = + true + product[url_key] + true + + + true + 1 + = + true + product[use_config_gift_message_available] + true + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + true + + + true + 1 + = + true + product[use_config_is_returnable] + true + + + true + 4 + = + true + product[visibility] + true + + + true + 1 + = + true + product[website_ids][1] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/${attribute_set_id}/type/configurable/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_save.jmx + + + + You saved the product + + Assertion.response_data + false + 2 + + + + javascript + + + + +var configurableVariations = vars.getObject("configurable_variations_assertion"), +response = SampleResult.getResponseDataAsString(); + +configurableVariations.forEach(function (variation) { + if (response.indexOf(variation) == -1) { + AssertionResult.setFailureMessage("Cannot find variation \"" + variation + "\""); + AssertionResult.setFailure(true); + } +}); + + + + + + javascript + + + + +attributes = vars.getObject("product_attributes"); + +for (i in attributes) { + var attribute = attributes[i]; + sampler.addArgument("attribute_codes[" + i + "]", attribute.code); + sampler.addArgument("attributes[" + i + "]", attribute.id); + sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); + addConfigurableAttributeData(attribute); +} + +addConfigurableMatrix(attributes); + +function addConfigurableAttributeData(attribute) { + var attributeId = attribute.id; + + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); + attribute.options.forEach(function (option, index) { + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); + }); +} + +/** + * Build 4 simple products for Configurable + */ +function addConfigurableMatrix(attributes) { + + var attribute1 = attributes[0], + attribute2 = attributes[1], + productIndex = 1, + products = []; + var variationNames = []; + attribute1.options.forEach(function (option1) { + attribute2.options.forEach(function (option2) { + var productAttributes = {}, + namePart = option1.label + "+" + option2.label, + variationKey = option1.value + "-" + option2.value; + productAttributes[attribute1.code] = option1.value; + productAttributes[attribute2.code] = option2.value; + + variationNames.push(namePart + " - " + vars.get("configurable_sku")); + var product = { + "id": null, + "name": namePart + " - " + vars.get("configurable_sku"), + "sku": namePart + " - " + vars.get("configurable_sku"), + "status": 1, + "price": "100", + "price_currency": "$", + "price_string": "$100", + "weight": "6", + "qty": "50", + "variationKey": variationKey, + "configurable_attribute": JSON.stringify(productAttributes), + "thumbnail_image": "", + "media_gallery": {"images": {}}, + "image": [], + "was_changed": true, + "canEdit": 1, + "newProduct": 1, + "record_id": productIndex + }; + productIndex++; + products.push(product); + }); + }); + + sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); + vars.putObject("configurable_variations_assertion", variationNames); +} + + tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx + + + + + + tool/fragments/ce/admin_create_product/create_downloadable_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/downloadable/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + ${files_folder}downloadable_original.txt + links + text/plain + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/downloadable_file/upload/type/links/?isAjax=true + POST + false + false + true + true + false + + + + + original_file + $.file + + + BODY + + + + + + + + ${files_folder}downloadable_sample.txt + samples + text/plain + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/downloadable_file/upload/type/samples/?isAjax=true + POST + false + false + true + true + false + + + + + sample_file + $.file + + + BODY + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + on + = + true + is_downloadable + + + true + Links + = + true + product[links_title] + + + true + 0 + = + true + product[links_purchased_separately] + + + true + ${original_file} + = + true + downloadable[link][0][file][0][file] + false + + + true + downloadable_original.txt + = + true + downloadable[link][0][file][0][name] + false + + + true + 13 + = + true + downloadable[link][0][file][0][size] + false + + + true + new + = + true + downloadable[link][0][file][0][status] + false + + + true + 1 + = + true + downloadable[link][0][is_shareable] + + + true + 0 + = + true + downloadable[link][0][is_unlimited] + + + true + + = + true + downloadable[link][0][link_url] + + + true + 0 + = + true + downloadable[link][0][number_of_downloads] + true + + + true + 120 + = + true + downloadable[link][0][price] + true + + + true + 0 + = + true + downloadable[link][0][record_id] + true + + + true + file + = + true + downloadable[link][0][sample][type] + + + true + + = + true + downloadable[link][0][sample][url] + + + true + 1 + = + true + downloadable[link][0][sort_order] + + + true + Original Link + = + true + downloadable[link][0][title] + + + true + file + = + true + downloadable[link][0][type] + + + true + ${sample_file} + = + true + downloadable[sample][0][file][0][file] + true + + + true + downloadable_sample.txt + = + true + downloadable[sample][0][file][0][name] + true + + + true + 14 + = + true + downloadable[sample][0][file][0][size] + true + + + true + new + = + true + downloadable[sample][0][file][0][status] + true + + + true + 0 + = + true + downloadable[sample][0][record_id] + true + + + true + + = + true + downloadable[sample][0][sample_url] + true + + + true + 1 + = + true + downloadable[sample][0][sort_order] + true + + + true + Sample Link + = + true + downloadable[sample][0][title] + true + + + true + file + = + true + downloadable[sample][0][type] + true + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + 4 + = + true + new-variations-attribute-set-id + false + + + true + + = + true + product[configurable_variation] + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/type/downloadable/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + false + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + ${original_file} + = + true + downloadable[link][0][file][0][file] + false + + + true + downloadable_original.txt + = + true + downloadable[link][0][file][0][name] + false + + + true + 13 + = + true + downloadable[link][0][file][0][size] + false + + + true + new + = + true + downloadable[link][0][file][0][status] + false + + + true + 1 + = + true + downloadable[link][0][is_shareable] + true + + + true + 0 + = + true + downloadable[link][0][is_unlimited] + true + + + true + + = + true + downloadable[link][0][link_url] + true + + + true + 0 + = + true + downloadable[link][0][number_of_downloads] + false + + + true + 120 + = + true + downloadable[link][0][price] + false + + + true + 0 + = + true + downloadable[link][0][record_id] + false + + + true + file + = + true + downloadable[link][0][sample][type] + true + + + true + + = + true + downloadable[link][0][sample][url] + true + + + true + 1 + = + true + downloadable[link][0][sort_order] + true + + + true + Original Link + = + true + downloadable[link][0][title] + true + + + true + file + = + true + downloadable[link][0][type] + true + + + true + ${sample_file} + = + true + downloadable[sample][0][file][0][file] + true + + + true + downloadable_sample.txt + = + true + downloadable[sample][0][file][0][name] + true + + + true + 14 + = + true + downloadable[sample][0][file][0][size] + true + + + true + new + = + true + downloadable[sample][0][file][0][status] + true + + + true + 0 + = + true + downloadable[sample][0][record_id] + true + + + true + + = + true + downloadable[sample][0][sample_url] + true + + + true + 1 + = + true + downloadable[sample][0][sort_order] + true + + + true + Sample Link + = + true + downloadable[sample][0][title] + true + + + true + file + = + true + downloadable[sample][0][type] + true + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + 4 + = + true + new-variations-attribute-set-id + false + + + true + + = + true + product[configurable_variation] + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/downloadable/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + violation + + Assertion.response_data + false + 6 + + + + + + + tool/fragments/ce/admin_create_product/create_simple_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/simple/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + product[options][1][is_delete] + false + + + true + 1 + = + true + product[options][1][is_require] + false + + + true + select + = + true + product[options][1][previous_group] + false + + + true + drop_down + = + true + product[options][1][previous_type] + false + + + true + 0 + = + true + product[options][1][sort_order] + false + + + true + Product Option Title One + = + true + product[options][1][title] + false + + + true + drop_down + = + true + product[options][1][type] + false + + + true + + = + true + product[options][1][values][1][is_delete] + false + + + true + 200 + = + true + product[options][1][values][1][price] + false + + + true + fixed + = + true + product[options][1][values][1][price_type] + false + + + true + sku-one + = + true + product[options][1][values][1][sku] + false + + + true + 0 + = + true + product[options][1][values][1][sort_order] + false + + + true + Row Title + = + true + product[options][1][values][1][title] + false + + + true + + = + true + product[options][2][is_delete] + false + + + true + 1 + = + true + product[options][2][is_require] + false + + + true + 250 + = + true + product[options][2][max_characters] + false + + + true + text + = + true + product[options][2][previous_group] + false + + + true + field + = + true + product[options][2][previous_type] + false + + + true + 500 + = + true + product[options][2][price] + false + + + true + fixed + = + true + product[options][2][price_type] + false + + + true + sku-two + = + true + product[options][2][sku] + false + + + true + 1 + = + true + product[options][2][sort_order] + false + + + true + Field Title + = + true + product[options][2][title] + false + + + true + field + = + true + product[options][2][type] + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + 4 + = + true + new-variations-attribute-set-id + true + + + true + + = + true + product[configurable_variation] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full simple product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + product[options][1][is_delete] + true + + + true + 1 + = + true + product[options][1][is_require] + + + true + select + = + true + product[options][1][previous_group] + false + + + true + drop_down + = + true + product[options][1][previous_type] + false + + + true + 0 + = + true + product[options][1][sort_order] + false + + + true + Product Option Title One + = + true + product[options][1][title] + + + true + drop_down + = + true + product[options][1][type] + + + true + + = + true + product[options][1][values][1][is_delete] + false + + + true + 200 + = + true + product[options][1][values][1][price] + + + true + fixed + = + true + product[options][1][values][1][price_type] + + + true + sku-one + = + true + product[options][1][values][1][sku] + + + true + 0 + = + true + product[options][1][values][1][sort_order] + + + true + Row Title + = + true + product[options][1][values][1][title] + + + true + + = + true + product[options][2][is_delete] + false + + + true + 1 + = + true + product[options][2][is_require] + + + true + 250 + = + true + product[options][2][max_characters] + + + true + text + = + true + product[options][2][previous_group] + + + true + field + = + true + product[options][2][previous_type] + + + true + 500 + = + true + product[options][2][price] + + + true + fixed + = + true + product[options][2][price_type] + + + true + sku-two + = + true + product[options][2][sku] + + + true + 1 + = + true + product[options][2][sort_order] + + + true + Field Title + = + true + product[options][2][title] + + + true + field + = + true + product[options][2][type] + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + 4 + = + true + new-variations-attribute-set-id + true + + + true + + = + true + product[configurable_variation] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/simple/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + violation + + Assertion.response_data + false + 6 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminProductEditingPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Edit Product"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + tool/fragments/ce/admin_edit_product/admin_edit_product_updated.jmx + import java.util.ArrayList; + import java.util.HashMap; + import java.util.Random; + + int relatedIndex; + try { + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + simpleCount = props.get("simple_products_list_for_edit").size(); + configCount = props.get("configurable_products_list_for_edit").size(); + productCount = 0; + if (simpleCount > configCount) { + productCount = configCount; + } else { + productCount = simpleCount; + } + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + threadsNumber = 1; + } + //Current thread number starts from 0 + currentThreadNum = ctx.getThreadNum(); + + String siterator = vars.get("threadIterator_" + currentThreadNum.toString()); + iterator = 0; + if(siterator == null){ + vars.put("threadIterator_" + currentThreadNum.toString() , "0"); + } else { + iterator = Integer.parseInt(siterator); + iterator ++; + vars.put("threadIterator_" + currentThreadNum.toString() , iterator.toString()); + } + + //Number of products for one thread + productClusterLength = productCount / threadsNumber; + + if (iterator >= productClusterLength) { + vars.put("threadIterator_" + currentThreadNum.toString(), "0"); + iterator = 0; + } + + //Index of the current product from the cluster + i = productClusterLength * currentThreadNum + iterator; + + //ids of simple and configurable products to edit + vars.put("simple_product_id", props.get("simple_products_list_for_edit").get(i).get("id")); + vars.put("configurable_product_id", props.get("configurable_products_list_for_edit").get(i).get("id")); + + //id of related product + do { + relatedIndex = random.nextInt(props.get("simple_products_list_for_edit").size()); + } while(i == relatedIndex); + vars.put("related_product_id", props.get("simple_products_list_for_edit").get(relatedIndex).get("id")); + } catch (Exception ex) { + log.info("Script execution failed", ex); +} + + + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/edit/id/${simple_product_id}/ + GET + true + false + true + false + false + + + + + + Product + + Assertion.response_data + false + 16 + + + + false + simple_product_name + ,"name":"([^'"]+)", + $1$ + + 1 + + + + false + simple_product_sku + ,"sku":"([^'"]+)", + $1$ + + 1 + + + + false + simple_product_category_id + ,"category_ids":."(\d+)". + $1$ + + 1 + + + + + Passing arguments between threads + //Additional category to be added + import java.util.Random; + + Random randomGenerator = new Random(); + int newCategoryId; + if (${seedForRandom} > 0) { + randomGenerator.setSeed(${seedForRandom} + ${__threadNum}); + } + + int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); + categoryList = props.get("admin_category_ids_list"); + + if (categoryList.size() > 1) { + do { + int index = randomGenerator.nextInt(categoryList.size()); + newCategoryId = Integer.parseInt(categoryList.get(index)); + } while (categoryId == newCategoryId); + + vars.put("category_additional", newCategoryId.toString()); + } + + //New price + vars.put("price_new", "9999"); + //New special price + vars.put("special_price_new", "8888"); + //New quantity + vars.put("quantity_new", "100600"); + + + + false + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${simple_product_name} + = + true + product[name] + false + + + true + ${simple_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + ${quantity_new} + = + true + product[quantity_and_stock_status][qty] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 1.0000 + = + true + product[weight] + false + + + true + 1 + = + true + product[product_has_weight] + false + + + true + ${simple_product_category_id} + = + true + product[category_ids][] + false + + + true + <p>Full simple product Description ${simple_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + + = + true + product[configurable_variations] + false + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + + = + true + product[image] + false + + + true + + = + true + product[small_image] + false + + + true + + = + true + product[thumbnail] + false + + + true + ${simple_product_name} + = + true + product[url_key] + false + + + true + ${simple_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${simple_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${simple_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + ${quantity_new} + = + true + product[stock_data][original_inventory_qty] + false + + + true + ${quantity_new} + = + true + product[stock_data][qty] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + + = + true + new-variations-attribute-set-id + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/id/${simple_product_id}/?isAjax=true + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${simple_product_name} + = + true + product[name] + false + + + true + ${simple_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + ${quantity_new} + = + true + product[quantity_and_stock_status][qty] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 1.0000 + = + true + product[weight] + false + + + true + 1 + = + true + product[product_has_weight] + false + + + true + ${simple_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + + + true + <p>Full simple product Description ${simple_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + + = + true + product[configurable_variations] + false + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + + = + true + product[image] + false + + + true + + = + true + product[small_image] + false + + + true + + = + true + product[thumbnail] + false + + + true + ${simple_product_name} + = + true + product[url_key] + false + + + true + ${simple_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${simple_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${simple_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + ${quantity_new} + = + true + product[stock_data][original_inventory_qty] + false + + + true + ${quantity_new} + = + true + product[stock_data][qty] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + + = + true + new-variations-attribute-set-id + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/id/${simple_product_id}/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/edit/id/${configurable_product_id}/ + GET + true + false + true + false + false + + + + + + Product + + Assertion.response_data + false + 16 + + + + false + configurable_product_name + ,"name":"([^'"]+)", + $1$ + + 1 + + + + false + configurable_product_sku + ,"sku":"([^'"]+)", + $1$ + + 1 + + + + false + configurable_product_category_id + ,"category_ids":."(\d+)" + $1$ + + 1 + + + + false + configurable_attribute_id + ,"configurable_variation":"([^'"]+)", + $1$ + + 1 + true + + + + false + configurable_matrix + "configurable-matrix":(\[.*?\]) + $1$ + + 1 + true + + + + associated_products_ids + $.[*].id + + configurable_matrix + VAR + + + + false + configurable_product_data + (\{"product":.*?configurable_attributes_data.*?\})\s*< + $1$ + + 1 + + + + configurable_attributes_data + $.product.configurable_attributes_data + + configurable_product_data + VAR + + + + false + configurable_attribute_ids + "attribute_id":"(\d+)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_codes + "code":"(\w+)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_labels + "label":"(.*?)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_values + "values":(\{(?:\}|.*?\}\})) + $1$ + + -1 + variable + configurable_attributes_data + + + + + configurable_attribute_ids + configurable_attribute_id + true + + + + 1 + ${configurable_attribute_ids_matchNr} + 1 + attribute_counter + + true + true + + + + return vars.get("configurable_attribute_values_" + vars.get("attribute_counter")); + + + false + + + + false + attribute_${configurable_attribute_id}_values + "value_index":"(\d+)" + $1$ + + -1 + configurable_attribute_values_${attribute_counter} + + + + + + + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${configurable_product_name} + = + true + product[name] + false + + + true + ${configurable_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 3 + = + true + product[weight] + false + + + true + ${configurable_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + false + + + true + <p>Configurable product description ${configurable_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + ${configurable_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${configurable_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${configurable_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + ${configurable_attribute_id} + = + true + product[configurable_variation] + false + + + true + ${configurable_product_name} + = + true + product[url_key] + + + true + 1 + = + true + product[use_config_gift_message_available] + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + + + true + 4 + = + true + product[visibility] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 50 + = + true + product[stock_data][qty] + false + + + true + configurable + = + true + product[stock_data][type_id] + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/id/${configurable_product_id}/ + POST + true + false + true + false + false + + + + + false + + + try { + int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); + for (int i = 1; i <= attributesCount; i++) { + attributeId = vars.get("configurable_attribute_ids_" + i.toString()); + attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); + attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); + ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); + ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); + ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); + + int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); + for (int j = 1; j <= valuesCount; j++) { + attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", + "1" + ); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", + attributeValue + ); + } + } + ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); + } catch (Exception e) { + log.error("error???", e); + } + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${configurable_product_name} + = + true + product[name] + false + + + true + ${configurable_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id]admin + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 3 + = + true + product[weight] + false + + + true + ${configurable_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + false + + + true + <p>Configurable product description ${configurable_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + ${configurable_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${configurable_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${configurable_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + ${configurable_attribute_id} + = + true + product[configurable_variation] + false + + + true + ${configurable_product_name} + = + true + product[url_key] + + + true + 1 + = + true + product[use_config_gift_message_available] + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + + + true + 4 + = + true + product[visibility] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 50 + = + true + product[stock_data][qty] + false + + + true + configurable + = + true + product[stock_data][type_id] + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/id/${configurable_product_id}/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + false + + + try { + int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); + for (int i = 1; i <= attributesCount; i++) { + attributeId = vars.get("configurable_attribute_ids_" + i.toString()); + attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); + attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); + ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); + ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); + ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); + + int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); + for (int j = 1; j <= valuesCount; j++) { + attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", + "1" + ); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", + attributeValue + ); + } + } + ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); + } catch (Exception e) { + log.error("error???", e); + } + + + + + You saved the product + + Assertion.response_data + false + 2 + if have trouble see messages-message-error + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminReturnsManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Returns Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/orders_page.jmx + + + + Create New Order + + Assertion.response_data + false + 2 + + + + + + + + + true + sales_order_grid + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 200 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + increment_id + = + true + sorting[field] + + + true + desc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + false + + + true + pending + = + true + filters[status] + true + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + sales_order_grid + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + 200 + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + increment_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + true + pending + = + true + filters[status] + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/search_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + false + order_numbers + \"increment_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + false + order_ids + \"entity_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + + + tool/fragments/ce/admin_create_process_returns/setup.jmx + + import java.util.ArrayList; + import java.util.HashMap; + import org.apache.jmeter.protocol.http.util.Base64Encoder; + import java.util.Random; + + // get count of "order_numbers" variable defined in "Search Pending Orders Limit" + int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); + + + int clusterLength; + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + //Number of orders for one thread + clusterLength = ordersCount; + } else { + clusterLength = Math.round(ordersCount / threadsNumber); + if (clusterLength == 0) { + clusterLength = 1; + } + } + + //Current thread number starts from 0 + int currentThreadNum = ctx.getThreadNum(); + + //Index of the current product from the cluster + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + int iterator = random.nextInt(clusterLength); + if (iterator == 0) { + iterator = 1; + } + + int i = clusterLength * currentThreadNum + iterator; + + orderNumber = vars.get("order_numbers_" + i.toString()); + orderId = vars.get("order_ids_" + i.toString()); + vars.put("order_number", orderNumber); + vars.put("order_id", orderId); + + + + + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_order.jmx + + + + #${order_number} + + Assertion.response_data + false + 2 + + + + false + order_status + <span id="order_status">([^<]+)</span> + $1$ + + 1 + simple_products + + + + + + "${order_status}" == "Pending" + false + tool/fragments/ce/admin_edit_order/if_controller.jmx + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_start.jmx + + + + Invoice Totals + + Assertion.response_data + false + 2 + + + + false + item_ids + <div id="order_item_(\d+)_title"\s*class="product-title"> + $1$ + + -1 + simple_products + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + invoice[items][${item_ids_1}] + + + true + 1 + = + true + invoice[items][${item_ids_2}] + + + true + Invoiced + = + true + invoice[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx + + + + The invoice has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_creditmemo/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/credit_memo_start.jmx + + + + New Memo + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + creditmemo[items][${item_ids_1}][qty] + + + true + 1 + = + true + creditmemo[items][${item_ids_2}][qty] + + + true + 1 + = + true + creditmemo[do_offline] + + + true + Credit Memo added + = + true + creditmemo[comment_text] + + + true + 10 + = + true + creditmemo[shipping_amount] + + + true + 0 + = + true + creditmemo[adjustment_positive] + + + true + 0 + = + true + creditmemo[adjustment_negative] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_creditmemo/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/credit_memo_full_refund.jmx + + + + You created the credit memo + + Assertion.response_data + false + 2 + + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCreateProcessReturnsDelay}*1000))} + tool/fragments/ce/admin_create_process_returns/pause.jmx + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseCustomerGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Browse Customer Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Customer"); + + pagesCount = parseInt(vars.get("customers_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "customer_listing"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_customer_filter_text")); + vars.put("grid_filter_field", "name"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "name"); + vars.put("grid_sort_field_2", "group_id"); + vars.put("grid_sort_field_3", "billing_country_id"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_customers_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCreateOrderPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Create Order"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + tool/fragments/ce/admin_create_order/admin_create_order.jmx + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); + +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} + +number = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_product_1_sku", configurableList.get("sku")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); + +number = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); + +number1 = random.nextInt(props.get("configurable_products_list").size()); +do { + number1 = random.nextInt(props.get("simple_products_list").size()); +} while(number == number1); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); + + +customers_index = 0; +if (!props.containsKey("customer_ids_index")) { + props.put("customer_ids_index", customers_index); +} + +try { + customers_index = props.get("customer_ids_index"); + customers_list = props.get("customer_ids_list"); + + if (customers_index == customers_list.size()) { + customers_index=0; + } + vars.put("customer_id", customers_list.get(customers_index)); + props.put("customer_ids_index", ++customers_index); +} +catch (java.lang.Exception e) { + log.error("Caught Exception in 'Admin Create Order' thread."); + SampleResult.setStopThread(true); +} + + + true + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/start/ + GET + true + false + true + false + false + + Detected the start of a redirect chain + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${configurable_product_1_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + true + item[${simple_product_1_id}][qty] + 1 + = + true + + + true + item[${simple_product_2_id}][qty] + 1 + = + true + + + true + item[${configurable_product_1_id}][qty] + 1 + = + true + + + true + customer_id + ${customer_id} + = + true + + + true + store_id + 1 + = + true + + + true + currency_id + + = + true + + + true + form_key + ${admin_form_key} + = + true + + + true + payment[method] + checkmo + = + true + + + true + reset_shipping + 1 + = + true + + + true + json + 1 + = + true + + + true + as_js_varname + iFrameResponse + = + true + + + true + form_key + ${admin_form_key} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/loadBlock/block/search,items,shipping_method,totals,giftmessage,billing_method?isAjax=true + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + false + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + + ctx.getCurrentSampler().addArgument("item[" + vars.get("configurable_product_1_id") + "][super_attribute][" + attribute_ids_array[i] + "]", option_values_array[i]); + } +} catch (Exception e) { + log.error("error???", e); +} + + + + + + + + true + collect_shipping_rates + 1 + = + true + + + true + customer_id + ${customer_id} + = + true + + + true + store_id + 1 + = + true + + + true + currency_id + false + = + true + + + true + form_key + ${admin_form_key} + = + true + + + true + payment[method] + checkmo + = + true + + + true + json + true + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/loadBlock/block/shipping_method,totals?isAjax=true + POST + true + false + true + false + false + + + + + + shipping_method + Flat Rate + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/index/ + GET + true + false + true + false + false + + Detected the start of a redirect chain + + + + + Select from existing customer addresses + Submit Order + Items Ordered + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + limit + 20 + = + true + + + true + entity_id + + = + true + + + true + name + + = + true + + + true + email + + = + true + + + true + Telephone + + = + true + + + true + billing_postcode + + = + true + + + true + billing_country_id + + = + true + + + true + billing_regione + + = + true + + + true + store_name + + = + true + + + true + page + 1 + = + true + + + true + order[currency] + USD + = + true + + + true + sku + + = + true + + + true + qty + + = + true + + + true + limit + 20 + = + true + + + true + entity_id + + = + true + + + true + name + + = + true + + + true + sku + + = + true + + + true + price[from] + + = + true + + + true + price[to] + + = + true + + + true + in_products + + = + true + + + true + page + 1 + = + true + + + true + coupon_code + + = + true + + + true + order[account][group_id] + 1 + = + true + + + true + order[account][email] + user_${customer_id}@example.com + = + true + + + true + order[billing_address][customer_address_id] + + = + true + + + true + order[billing_address][prefix] + + = + true + + + true + order[billing_address][firstname] + Anthony + = + true + + + true + order[billing_address][middlename] + + = + true + + + true + order[billing_address][lastname] + Nealy + = + true + + + true + order[billing_address][suffix] + + = + true + + + true + order[billing_address][company] + + = + true + + + true + order[billing_address][street][0] + 123 Freedom Blvd. #123 + = + true + + + true + order[billing_address][street][1] + + = + true + + + true + order[billing_address][city] + Fayetteville + = + true + + + true + order[billing_address][country_id] + US + = + true + + + true + order[billing_address][region] + + = + true + + + true + order[billing_address][region_id] + ${alabama_region_id} + = + true + + + true + order[billing_address][postcode] + 123123 + = + true + + + true + order[billing_address][telephone] + 022-333-4455 + = + true + + + true + order[billing_address][fax] + + = + true + + + true + order[billing_address][vat_id] + + = + true + + + true + shipping_same_as_billing + on + = + true + + + true + payment[method] + checkmo + = + true + + + true + order[shipping_method] + flatrate_flatrate + = + true + + + true + order[comment][customer_note] + + = + true + + + true + order[comment][customer_note_notify] + 1 + = + true + + + true + order[send_confirmation] + 1 + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/save/ + POST + true + false + true + true + false + + Detected the start of a redirect chain + + + + false + order_id + ${host}${base_path}${admin_path}/sales/order/index/order_id/(\d+)/ + $1$ + + 1 + + + + false + order_item_1 + order_item_(\d+)_title + $1$ + + 1 + + + + false + order_item_2 + order_item_(\d+)_title + $1$ + + 2 + + + + false + order_item_3 + order_item_(\d+)_title + $1$ + + 3 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_2 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_3 + + + + + You created the order. + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + invoice[items][${order_item_1}] + 1 + = + true + + + true + invoice[items][${order_item_2}] + 1 + = + true + + + true + invoice[items][${order_item_3}] + 1 + = + true + + + true + invoice[comment_text] + + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + + The invoice has been created. + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + shipment[items][${order_item_1}] + 1 + = + true + + + true + shipment[items][${order_item_2}] + 1 + = + true + + + true + shipment[items][${order_item_3}] + 1 + = + true + + + true + shipment[comment_text] + + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + + The shipment has been created. + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCategoryManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Category Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_category_management/admin_category_management.jmx + + + + javascript + + + + random = new java.util.Random(); +if (${seedForRandom} > 0) { +random.setSeed(${seedForRandom} + ${__threadNum}); +} + +/** + * Get unique ids for fix concurrent category saving + */ +function getNextProductNumber(i) { + number = productsVariationsSize * ${__threadNum} - i; + if (number >= productsSize) { + log.info("${testLabel}: capacity of product list is not enough for support all ${adminPoolUsers} threads"); + return random.nextInt(productsSize); + } + return productsVariationsSize * ${__threadNum} - i; +} + +var productsVariationsSize = 5, + productsSize = props.get("simple_products_list_for_edit").size(); + + +for (i = 1; i<= productsVariationsSize; i++) { + var productVariablePrefix = "simple_product_" + i + "_"; + number = getNextProductNumber(i); + simpleList = props.get("simple_products_list_for_edit").get(number); + + vars.put(productVariablePrefix + "url_key", simpleList.get("url_key")); + vars.put(productVariablePrefix + "id", simpleList.get("id")); + vars.put(productVariablePrefix + "name", simpleList.get("title")); +} + +categoryIndex = random.nextInt(props.get("admin_category_ids_list").size()); +vars.put("parent_category_id", props.get("admin_category_ids_list").get(categoryIndex)); +do { +categoryIndexNew = random.nextInt(props.get("admin_category_ids_list").size()); +} while(categoryIndex == categoryIndexNew); +vars.put("new_parent_category_id", props.get("admin_category_ids_list").get(categoryIndexNew)); + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/edit/id/${parent_category_id}/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/add/store/0/parent/${parent_category_id} + GET + true + false + true + false + false + + + + + + <title>New Category + + Assertion.response_data + false + 2 + + + + + + + + true + + = + true + id + + + true + ${parent_category_id} + = + true + parent + + + true + + = + true + path + + + true + + = + true + store_id + + + true + 0 + = + true + is_active + + + true + 0 + = + true + include_in_menu + + + true + 1 + = + true + is_anchor + + + true + true + = + true + use_config[available_sort_by] + + + true + true + = + true + use_config[default_sort_by] + + + true + true + = + true + use_config[filter_price_range] + + + true + false + = + true + use_default[url_key] + + + true + 0 + = + true + url_key_create_redirect + + + true + 0 + = + true + custom_use_parent_settings + + + true + 0 + = + true + custom_apply_to_products + + + true + Admin Category Management ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + name + + + true + admin-category-management-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + url_key + + + true + + = + true + meta_title + + + true + + = + true + description + + + true + PRODUCTS + = + true + display_mode + + + true + position + = + true + default_sort_by + + + true + + = + true + meta_keywords + + + true + + = + true + meta_description + + + true + + = + true + custom_layout_update + + + false + {"${simple_product_1_id}":"","${simple_product_2_id}":"","${simple_product_3_id}":"","${simple_product_4_id}":"","${simple_product_5_id}":""} + = + true + category_products + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/save/ + POST + true + false + true + false + false + + + + + URL + admin_category_id + /catalog/category/edit/id/(\d+)/ + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_id + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/edit/id/${admin_category_id}/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + false + admin_category_entity_id + "entity_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_attribute_set_id + "attribute_set_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_parent_id + "parent_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_created_at + "created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_updated_at + "updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_path + "entity_id":(.+)"path":"([^\"]+)" + $2$ + + 1 + + + + false + admin_category_level + "level":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_name + "entity_id":(.+)"name":"([^"]+)" + $2$ + + 1 + + + + false + admin_category_url_key + "url_key":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_url_path + "url_path":"([^"]+)" + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_entity_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_attribute_set_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_parent_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_updated_at + + + + + ^[\d\\\/]+$ + + Assertion.response_data + false + 1 + variable + admin_category_path + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_level + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_name + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_url_key + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_url_path + + + + + ${simple_product_1_name} + ${simple_product_2_name} + ${simple_product_3_name} + ${simple_product_4_name} + ${simple_product_5_name} + + Assertion.response_data + false + 2 + + + + + + + + true + ${admin_category_id} + = + true + id + + + true + ${admin_form_key} + = + true + form_key + + + true + append + = + true + point + + + true + ${new_parent_category_id} + = + true + pid + + + true + ${parent_category_id} + = + true + paid + + + true + 0 + = + true + aid + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/move/ + POST + true + false + true + false + false + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/delete/id/${admin_category_id}/ + POST + true + false + true + false + false + + + + + + You deleted the category. + + Assertion.response_data + false + 2 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCategoryManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminPromotionRulesPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Promotion Rules"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_promotions_management/admin_promotions_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/ + GET + true + false + true + false + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/new + GET + true + false + true + false + false + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + true + + + true + 1--1 + = + true + id + + + true + Magento\SalesRule\Model\Rule\Condition\Address|base_subtotal + = + true + type + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/newConditionHtml/form/sales_rule_formrule_conditions_fieldset_/form_namespace/sales_rule_form + POST + true + false + true + false + false + + + + + + + + true + Rule Name ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + name + + + true + 0 + = + true + is_active + + + true + 0 + = + true + use_auto_generation + + + true + 1 + = + true + is_rss + + + true + 0 + = + true + apply_to_shipping + + + true + 0 + = + true + stop_rules_processing + + + true + + = + true + coupon_code + + + true + + = + true + uses_per_coupon + + + true + + = + true + uses_per_customer + + + true + + = + true + sort_order + + + true + 5 + = + true + discount_amount + + + true + 0 + = + true + discount_qty + + + true + + = + true + discount_step + + + true + + = + true + reward_points_delta + + + true + + = + true + store_labels[0] + + + true + Rule Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + description + + + true + 1 + = + true + coupon_type + + + true + cart_fixed + = + true + simple_action + + + true + 1 + = + true + website_ids[0] + + + true + 0 + = + true + customer_group_ids[0] + + + true + + = + true + from_date + + + true + + = + true + to_date + + + true + Magento\SalesRule\Model\Rule\Condition\Combine + = + true + rule[conditions][1][type] + + + true + all + = + true + rule[conditions][1][aggregator] + + + true + 1 + = + true + rule[conditions][1][value] + + + true + Magento\SalesRule\Model\Rule\Condition\Address + = + true + rule[conditions][1--1][type] + + + true + base_subtotal + = + true + rule[conditions][1--1][attribute] + + + true + >= + = + true + rule[conditions][1--1][operator] + + + true + 100 + = + true + rule[conditions][1--1][value] + + + true + + = + true + rule[conditions][1][new_chlid] + + + true + Magento\SalesRule\Model\Rule\Condition\Product\Combine + = + true + rule[actions][1][type] + + + true + all + = + true + rule[actions][1][aggregator] + + + true + 1 + = + true + rule[actions][1][value] + + + true + + = + true + rule[actions][1][new_child] + + + true + + = + true + store_labels[1] + + + true + + = + true + store_labels[2] + + + true + + = + true + related_banners + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/save/ + POST + true + false + true + false + false + + + + + + You saved the rule. + + Assertion.response_data + false + 16 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminPromotionsManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCustomerManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Customer Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_customer_management/admin_customer_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + true + customer_listing + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 20 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + true + customer_listing + = + true + namespace + + + true + Lastname + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 20 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + false + customer_edit_url_path + actions":\{"edit":\{"href":"(?:http|https):\\/\\/(.*?)\\/customer\\/index\\/edit\\/id\\/(\d+)\\/", + /customer/index/edit/id/$2$/ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + customer_edit_url_path + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}${customer_edit_url_path} + GET + true + false + true + false + false + + + + + + Customer Information + + Assertion.response_data + false + 2 + + + + false + admin_customer_entity_id + "entity_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_website_id + "website_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_firstname + "firstname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_lastname + "lastname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_email + "email":"([^\@]+@[^.]+.[^"]+)" + $1$ + + 1 + + + + false + admin_customer_group_id + "group_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_store_id + "store_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_created_at + "created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_updated_at + "updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_is_active + "is_active":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_disable_auto_group_change + "disable_auto_group_change":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_created_in + "created_in":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_dob + "dob":"(\d+)-(\d+)-(\d+)" + $2$/$3$/$1$ + + 1 + + + + false + admin_customer_default_billing + "default_billing":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_default_shipping + "default_shipping":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_gender + "gender":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_failures_num + "failures_num":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_address_entity_id + _address":\{"entity_id":"(\d+)".+?"parent_id":"${admin_customer_entity_id}" + $1$ + + 1 + + + + false + admin_customer_address_created_at + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_updated_at + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_is_active + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"is_active":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_address_city + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"city":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_country_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"country_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_firstname + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"firstname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_lastname + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"lastname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_postcode + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"postcode":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_region + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_region_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_street + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"street":\["([^"]+)"\] + $1$ + + 1 + + + + false + admin_customer_address_telephone + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"telephone":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_customer_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"customer_id":"([^"]+)" + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_entity_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_website_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_firstname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_lastname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_email + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_group_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_store_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_updated_at + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_is_active + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_disable_auto_group_change + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_created_in + + + + + ^\d+/\d+/\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_dob + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_default_billing + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_default_shipping + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_gender + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_failures_num + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_entity_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_updated_at + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_is_active + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_city + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_country_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_firstname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_lastname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_postcode + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_region + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_region_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_street + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_telephone + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_customer_id + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_customer_entity_id} + = + true + customer[entity_id] + + + true + ${admin_customer_website_id} + = + true + customer[website_id] + + + true + ${admin_customer_email} + = + true + customer[email] + + + true + ${admin_customer_group_id} + = + true + customer[group_id] + + + true + ${admin_customer_store_id} + = + true + customer[store_id] + + + true + ${admin_customer_created_at} + = + true + customer[created_at] + + + true + ${admin_customer_updated_at} + = + true + customer[updated_at] + + + true + ${admin_customer_is_active} + = + true + customer[is_active] + + + true + ${admin_customer_disable_auto_group_change} + = + true + customer[disable_auto_group_change] + + + true + ${admin_customer_created_in} + = + true + customer[created_in] + + + true + + = + true + customer[prefix] + + + true + ${admin_customer_firstname} 1 + = + true + customer[firstname] + + + true + + = + true + customer[middlename] + + + true + ${admin_customer_lastname} 1 + = + true + customer[lastname] + + + true + + = + true + customer[suffix] + + + true + ${admin_customer_dob} + = + true + customer[dob] + + + true + ${admin_customer_default_billing} + = + true + customer[default_billing] + + + true + ${admin_customer_default_shipping} + = + true + customer[default_shipping] + + + true + + = + true + customer[taxvat] + + + true + ${admin_customer_gender} + = + true + customer[gender] + + + true + ${admin_customer_failures_num} + = + true + customer[failures_num] + + + true + ${admin_customer_store_id} + = + true + customer[sendemail_store_id] + + + true + ${admin_customer_address_entity_id} + = + true + address[${admin_customer_address_entity_id}][entity_id] + + + true + ${admin_customer_address_created_at} + = + true + address[${admin_customer_address_entity_id}][created_at] + + + true + ${admin_customer_address_updated_at} + = + true + address[${admin_customer_address_entity_id}][updated_at] + + + true + ${admin_customer_address_is_active} + = + true + address[${admin_customer_address_entity_id}][is_active] + + + true + ${admin_customer_address_city} + = + true + address[${admin_customer_address_entity_id}][city] + + + true + + = + true + address[${admin_customer_address_entity_id}][company] + + + true + ${admin_customer_address_country_id} + = + true + address[${admin_customer_address_entity_id}][country_id] + + + true + ${admin_customer_address_firstname} + = + true + address[${admin_customer_address_entity_id}][firstname] + + + true + ${admin_customer_address_lastname} + = + true + address[${admin_customer_address_entity_id}][lastname] + + + true + + = + true + address[${admin_customer_address_entity_id}][middlename] + + + true + ${admin_customer_address_postcode} + = + true + address[${admin_customer_address_entity_id}][postcode] + + + true + + = + true + address[${admin_customer_address_entity_id}][prefix] + + + true + ${admin_customer_address_region} + = + true + address[${admin_customer_address_entity_id}][region] + + + true + ${admin_customer_address_region_id} + = + true + address[${admin_customer_address_entity_id}][region_id] + + + true + ${admin_customer_address_street} + = + true + address[${admin_customer_address_entity_id}][street][0] + + + true + + = + true + address[${admin_customer_address_entity_id}][street][1] + + + true + + = + true + address[${admin_customer_address_entity_id}][suffix] + + + true + ${admin_customer_address_telephone} + = + true + address[${admin_customer_address_entity_id}][telephone] + + + true + + = + true + address[${admin_customer_address_entity_id}][vat_id] + + + true + ${admin_customer_address_customer_id} + = + true + address[${admin_customer_address_entity_id}][customer_id] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_billing] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_shipping] + + + true + + = + true + address[new_0][prefix] + + + true + John + = + true + address[new_0][firstname] + + + true + + = + true + address[new_0][middlename] + + + true + Doe + = + true + address[new_0][lastname] + + + true + + = + true + address[new_0][suffix] + + + true + Test Company + = + true + address[new_0][company] + + + true + Folsom + = + true + address[new_0][city] + + + true + 95630 + = + true + address[new_0][postcode] + + + true + 1234567890 + = + true + address[new_0][telephone] + + + true + + = + true + address[new_0][vat_id] + + + true + false + = + true + address[new_0][default_billing] + + + true + false + = + true + address[new_0][default_shipping] + + + true + 123 Main + = + true + address[new_0][street][0] + + + true + + = + true + address[new_0][street][1] + + + true + + = + true + address[new_0][region] + + + true + US + = + true + address[new_0][country_id] + + + true + ${admin_customer_address_region_id} + = + true + address[new_0][region_id] + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index/validate/ + POST + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 16 + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_customer_entity_id} + = + true + customer[entity_id] + + + true + ${admin_customer_website_id} + = + true + customer[website_id] + + + true + ${admin_customer_email} + = + true + customer[email] + + + true + ${admin_customer_group_id} + = + true + customer[group_id] + + + true + ${admin_customer_store_id} + = + true + customer[store_id] + + + true + ${admin_customer_created_at} + = + true + customer[created_at] + + + true + ${admin_customer_updated_at} + = + true + customer[updated_at] + + + true + ${admin_customer_is_active} + = + true + customer[is_active] + + + true + ${admin_customer_disable_auto_group_change} + = + true + customer[disable_auto_group_change] + + + true + ${admin_customer_created_in} + = + true + customer[created_in] + + + true + + = + true + customer[prefix] + + + true + ${admin_customer_firstname} 1 + = + true + customer[firstname] + + + true + + = + true + customer[middlename] + + + true + ${admin_customer_lastname} 1 + = + true + customer[lastname] + + + true + + = + true + customer[suffix] + + + true + ${admin_customer_dob} + = + true + customer[dob] + + + true + ${admin_customer_default_billing} + = + true + customer[default_billing] + + + true + ${admin_customer_default_shipping} + = + true + customer[default_shipping] + + + true + + = + true + customer[taxvat] + + + true + ${admin_customer_gender} + = + true + customer[gender] + + + true + ${admin_customer_failures_num} + = + true + customer[failures_num] + + + true + ${admin_customer_store_id} + = + true + customer[sendemail_store_id] + + + true + ${admin_customer_address_entity_id} + = + true + address[${admin_customer_address_entity_id}][entity_id] + + + + true + ${admin_customer_address_created_at} + = + true + address[${admin_customer_address_entity_id}][created_at] + + + true + ${admin_customer_address_updated_at} + = + true + address[${admin_customer_address_entity_id}][updated_at] + + + true + ${admin_customer_address_is_active} + = + true + address[${admin_customer_address_entity_id}][is_active] + + + true + ${admin_customer_address_city} + = + true + address[${admin_customer_address_entity_id}][city] + + + true + + = + true + address[${admin_customer_address_entity_id}][company] + + + true + ${admin_customer_address_country_id} + = + true + address[${admin_customer_address_entity_id}][country_id] + + + true + ${admin_customer_address_firstname} + = + true + address[${admin_customer_address_entity_id}][firstname] + + + true + ${admin_customer_address_lastname} + = + true + address[${admin_customer_address_entity_id}][lastname] + + + true + + = + true + address[${admin_customer_address_entity_id}][middlename] + + + true + ${admin_customer_address_postcode} + = + true + address[${admin_customer_address_entity_id}][postcode] + + + true + + = + true + address[${admin_customer_address_entity_id}][prefix] + + + true + ${admin_customer_address_region} + = + true + address[${admin_customer_address_entity_id}][region] + + + true + ${admin_customer_address_region_id} + = + true + address[${admin_customer_address_entity_id}][region_id] + + + true + ${admin_customer_address_street} + = + true + address[${admin_customer_address_entity_id}][street][0] + + + true + + = + true + address[${admin_customer_address_entity_id}][street][1] + + + true + + = + true + address[${admin_customer_address_entity_id}][suffix] + + + true + ${admin_customer_address_telephone} + = + true + address[${admin_customer_address_entity_id}][telephone] + + + true + + = + true + address[${admin_customer_address_entity_id}][vat_id] + + + true + ${admin_customer_address_customer_id} + = + true + address[${admin_customer_address_entity_id}][customer_id] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_billing] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_shipping] + + + true + + = + true + address[new_0][prefix] + + + true + John + = + true + address[new_0][firstname] + + + true + + = + true + address[new_0][middlename] + + + true + Doe + = + true + address[new_0][lastname] + + + true + + = + true + address[new_0][suffix] + + + true + Test Company + = + true + address[new_0][company] + + + true + Folsom + = + true + address[new_0][city] + + + true + 95630 + = + true + address[new_0][postcode] + + + true + 1234567890 + = + true + address[new_0][telephone] + + + true + + = + true + address[new_0][vat_id] + + + true + false + = + true + address[new_0][default_billing] + + + true + false + = + true + address[new_0][default_shipping] + + + true + 123 Main + = + true + address[new_0][street][0] + + + true + + = + true + address[new_0][street][1] + + + true + + = + true + address[new_0][region] + + + true + US + = + true + address[new_0][country_id] + + + true + 12 + = + true + address[new_0][region_id] + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index/save/ + POST + true + false + true + true + false + + + + + + You saved the customer. + + Assertion.response_data + false + 2 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCustomerManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminEditOrderPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[C] Admin Edit Order"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/orders_page.jmx + + + + Create New Order + + Assertion.response_data + false + 2 + + + + + + + + + true + sales_order_grid + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 200 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + increment_id + = + true + sorting[field] + + + true + desc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + false + + + true + pending + = + true + filters[status] + true + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + sales_order_grid + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + 200 + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + increment_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + true + pending + = + true + filters[status] + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/search_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + false + order_numbers + \"increment_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + false + order_ids + \"entity_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + + + tool/fragments/ce/admin_create_process_returns/setup.jmx + + import java.util.ArrayList; + import java.util.HashMap; + import org.apache.jmeter.protocol.http.util.Base64Encoder; + import java.util.Random; + + // get count of "order_numbers" variable defined in "Search Pending Orders Limit" + int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); + + + int clusterLength; + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + //Number of orders for one thread + clusterLength = ordersCount; + } else { + clusterLength = Math.round(ordersCount / threadsNumber); + if (clusterLength == 0) { + clusterLength = 1; + } + } + + //Current thread number starts from 0 + int currentThreadNum = ctx.getThreadNum(); + + //Index of the current product from the cluster + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + int iterator = random.nextInt(clusterLength); + if (iterator == 0) { + iterator = 1; + } + + int i = clusterLength * currentThreadNum + iterator; + + orderNumber = vars.get("order_numbers_" + i.toString()); + orderId = vars.get("order_ids_" + i.toString()); + vars.put("order_number", orderNumber); + vars.put("order_id", orderId); + + + + + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_order.jmx + + + + #${order_number} + + Assertion.response_data + false + 2 + + + + false + order_status + <span id="order_status">([^<]+)</span> + $1$ + + 1 + simple_products + + + + + + "${order_status}" == "Pending" + false + tool/fragments/ce/admin_edit_order/if_controller.jmx + + + + + + true + pending + = + true + history[status] + false + + + true + Some text + = + true + history[comment] + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/addComment/order_id/${order_id}/?isAjax=true + POST + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/add_comment.jmx + + + + Not Notified + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_start.jmx + + + + Invoice Totals + + Assertion.response_data + false + 2 + + + + false + item_ids + <div id="order_item_(\d+)_title"\s*class="product-title"> + $1$ + + -1 + simple_products + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + invoice[items][${item_ids_1}] + + + true + 1 + = + true + invoice[items][${item_ids_2}] + + + true + Invoiced + = + true + invoice[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx + + + + The invoice has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/shipment_start.jmx + + + + New Shipment + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + shipment[items][${item_ids_1}] + + + true + 1 + = + true + shipment[items][${item_ids_2}] + + + true + Shipped + = + true + shipment[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/shipment_submit.jmx + + + + The shipment has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + + + continue + + false + ${loops} + + ${graphQLcombinedBenchmarkPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + javascript + + + + var cacheHitPercent = vars.get("cache_hits_percentage"); + +if ( + cacheHitPercent < 100 && + sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' +) { + doCache(); +} + +function doCache(){ + var random = Math.random() * 100; + if (cacheHitPercent < random) { + sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); + } +} + + tool/fragments/ce/common/cache_hit_miss.jmx + + + + 1 + false + 1 + ${cBrowseCatalogByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Catalog Browsing By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + + {"query":"query getCmsPage($identifier: String!, $onServer: Boolean!) {\n cmsPage(identifier: $identifier) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"identifier":"home","onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_home_page.jmx + + + + $.data.cmsPage.url_key + + false + false + false + false + + + + + + true + + + + false + + {"query" : "{\n categoryList(filters:{}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_categories.jmx + + + + $.data.categoryList + + false + false + false + false + + + + + + true + + + + false + {"query":"query category($id: Int!, $currentPage: Int, $pageSize: Int) {\n category(id: $id) {\n product_count\n description\n url_key\n name\n id\n breadcrumbs {\n category_name\n category_url_key\n __typename\n }\n products(pageSize: $pageSize, currentPage: $currentPage, sort: {name: ASC}) {\n total_count\n items {\n id\n name\n # small_image\n # short_description\n url_key\n special_price\n special_from_date\n special_to_date\n price {\n regularPrice {\n amount {\n value\n currency\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n","variables":{"id":${category_id},"currentPage":1,"pageSize":12},"operationName":"category"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_products_by_category_id.jmx + + + + + "name":"${category_name}","id":${category_id}, + + Assertion.response_data + false + 2 + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${cSiteSearchPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Site Search"); + + true + + + + + ${files_folder}search_terms.csv + UTF-8 + + , + false + true + false + shareMode.thread + tool/fragments/ce/search/search_terms.jmx + + + + javascript + + + + var cacheHitPercent = vars.get("cache_hits_percentage"); + +if ( + cacheHitPercent < 100 && + sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' +) { + doCache(); +} + +function doCache(){ + var random = Math.random() * 100; + if (cacheHitPercent < random) { + sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); + } +} + + tool/fragments/ce/common/cache_hit_miss.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + 1 + false + 1 + ${searchQuickPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Quick Search"); + + true + + + + + true + + + + false + + {"query":"query getCmsPage($identifier: String!, $onServer: Boolean!) {\n cmsPage(identifier: $identifier) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"identifier":"home","onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_home_page.jmx + + + + $.data.cmsPage.url_key + + false + false + false + false + + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n search: \"${searchTerm}\"\n sort: {name: ASC}) { \n total_count \n items \n { \n name \n sku \n url_key \n } \n page_info{ \n current_page \n page_size \n total_pages \n } \n filters{ \n name \n request_var \n filter_items_count \n filter_items{ \n label \n items_count \n value_string \n __typename \n } \n } \n aggregations{ \n attribute_code \n count \n label \n options{ \n label \n value \n count \n } \n } \n } \n }\n","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/search_quick.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + false + product_url_keys + "url_key":"([^'"]+) + $1$ + + -1 + + + + attribute_code_1 + $.data.products.filters[1].request_var + + + BODY + + + + attribute_value_1 + $.data.products.filters[1].filter_items[0].value_string + + + BODY + + + + attribute_code_2 + $.data.products.filters[2].request_var + + + BODY + + + + attribute_value_2 + $.data.products.filters[2].filter_items[0].value_string + + + BODY + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_product_details_by_product_url_key.jmx + + + + $.data.productDetail.items[0].sku + + false + false + false + false + + + + + + + + + 1 + false + 1 + ${searchQuickFilterPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Quick Search With Filtration"); + + true + + + + + true + + + + false + + {"query":"query getCmsPage($identifier: String!, $onServer: Boolean!) {\n cmsPage(identifier: $identifier) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"identifier":"home","onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_home_page.jmx + + + + $.data.cmsPage.url_key + + false + false + false + false + + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n search: \"${searchTerm}\"\n sort: {name: ASC}) { \n total_count \n items \n { \n name \n sku \n url_key \n } \n page_info{ \n current_page \n page_size \n total_pages \n } \n filters{ \n name \n request_var \n filter_items_count \n filter_items{ \n label \n items_count \n value_string \n __typename \n } \n } \n aggregations{ \n attribute_code \n count \n label \n options{ \n label \n value \n count \n } \n } \n } \n }\n","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/search_quick.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + false + product_url_keys + "url_key":"([^'"]+) + $1$ + + -1 + + + + attribute_code_1 + $.data.products.filters[1].request_var + + + BODY + + + + attribute_value_1 + $.data.products.filters[1].filter_items[0].value_string + + + BODY + + + + attribute_code_2 + $.data.products.filters[2].request_var + + + BODY + + + + attribute_value_2 + $.data.products.filters[2].filter_items[0].value_string + + + BODY + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/graphql/searched_attributes_setup.jmx + +number = vars.get("_counter"); +attribute_code = vars.get("attribute_code_"+number); + +vars.put("attribute_code", attribute_code); + +attribute_value = vars.get("attribute_value_"+number); + +vars.put("attribute_value", attribute_value); + + + + true + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n search: \"${searchTerm}\"\n filter:{ \n ${attribute_code}: {in:[\"${attribute_value}\"]} \n } \n sort: {name: ASC}) { \n total_count \n items \n { \n name \n sku \n url_key \n } \n page_info{ \n current_page \n page_size \n total_pages \n } \n filters{ \n name \n request_var \n filter_items_count \n filter_items{ \n label \n items_count \n value_string \n __typename \n } \n } \n aggregations{ \n attribute_code \n count \n label \n options{ \n label \n value \n count \n } \n } \n } \n }\n","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/search_quick_filter_attribute.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + false + product_url_keys + "url_key":"([^'"]+) + $1$ + + -1 + + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_product_details_by_product_url_key.jmx + + + + $.data.productDetail.items[0].sku + + false + false + false + false + + + + + + + + + 1 + false + 1 + ${searchAdvancedPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Advanced Search"); + + true + + + + + true + + + + false + + {"query":"query getCmsPage($identifier: String!, $onServer: Boolean!) {\n cmsPage(identifier: $identifier) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"identifier":"home","onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_home_page.jmx + + + + $.data.cmsPage.url_key + + false + false + false + false + + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n filter:{ \n price: {to:\"${priceTo}\"} \n description:{match:\"${searchTerm}\"} \n } \n sort: {name: ASC}) { \n total_count \n items \n { \n name \n sku \n url_key \n } \n page_info{ \n current_page \n page_size \n total_pages \n } \n filters{ \n name \n request_var \n filter_items_count \n filter_items{ \n label \n items_count \n value_string \n __typename \n } \n } \n aggregations{ \n attribute_code \n count \n label \n options{ \n label \n value \n count \n } \n } \n } \n }\n","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/search_advanced.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + false + product_url_keys + "url_key":"([^'"]+) + $1$ + + -1 + + + + + + +foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup.jmx + +number = vars.get("_counter"); +product = vars.get("product_url_keys_"+number); + +vars.put("product_url_key", product); + + + + true + + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_product_details_by_product_url_key.jmx + + + + $.data.productDetail.items[0].sku + + false + false + false + false + + + + + + + + + + + 1 + false + 1 + ${cAddToCartByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Add To Cart By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_empty_cart.jmx + + + + + {"data":{"cart":{"items":[]}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + + {"query":"query getCmsPage($identifier: String!, $onServer: Boolean!) {\n cmsPage(identifier: $identifier) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"identifier":"home","onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_home_page.jmx + + + + $.data.cmsPage.url_key + + false + false + false + false + + + + + + true + + + + false + + {"query" : "{\n categoryList(filters:{}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_categories.jmx + + + + $.data.categoryList + + false + false + false + false + + + + + + true + + + + false + {"query":"query category($id: Int!, $currentPage: Int, $pageSize: Int) {\n category(id: $id) {\n product_count\n description\n url_key\n name\n id\n breadcrumbs {\n category_name\n category_url_key\n __typename\n }\n products(pageSize: $pageSize, currentPage: $currentPage, sort: {name: ASC}) {\n total_count\n items {\n id\n name\n # small_image\n # short_description\n url_key\n special_price\n special_from_date\n special_to_date\n price {\n regularPrice {\n amount {\n value\n currency\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n","variables":{"id":${category_id},"currentPage":1,"pageSize":12},"operationName":"category"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_products_by_category_id.jmx + + + + + "name":"${category_name}","id":${category_id}, + + Assertion.response_data + false + 2 + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.productDetail.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option_from_product_detail.jmx + + + + + true + + + + false + {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx + + + + + addConfigurableProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + ${cAddToWishlistPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Add to Wishlist"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + true + + + + false + {"query":"mutation {\n generateCustomerToken(\n email: \"${customer_email}\" \n password: \"${customer_password}\" \n ) {\n token \n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/login.jmx + + + + customer_token + $.data.generateCustomerToken.token + + + BODY + + + + $.data.generateCustomerToken.token + + false + false + false + false + + + + + + true + + + + false + {"query":" { \n customer {\n wishlist \n { \n id \n } \n } \n }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_wishlist.jmx + + + + wishlist_id + $.data.customer.wishlist.id + + + BODY + + + + $.data.customer.wishlist.id + + false + false + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + 5 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query": "mutation{ \n addProductsToWishlist( \n wishlistId: ${wishlist_id} \n wishlistItems:[ \n { \n sku: \"${product_sku}\" \n quantity: 1 \n } \n ]) \n { \n wishlist{ \n id \n items_count \n items{ \n id \n product{name sku} description qty} \n } \n user_errors{code message} \n } \n }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_wishlist.jmx + + + + wishlist_product_id + $.data.addProductsToWishlist.wishlist.items[0].id + + + BODY + + + + $.data.addProductsToWishlist.wishlist + + false + false + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + + true + 5 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + true + + + + false + {"query": "mutation { \n removeProductsFromWishlist( \n wishlistId: \"${wishlist_id}\", \n wishlistItemsIds: [\"${wishlist_product_id}\"] \n ) { \n user_errors { \n code \n message \n } \n wishlist { \n id \n sharing_code \n items_count \n items_v2 { \n items {id description quantity product {name sku}} \n } \n } \n } \n }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/clear_wishlist.jmx + + + + wishlist_product_id + $.data.removeProductsFromWishlist.wishlist.items_v2.items[0].id + + + BODY + + + + $.data.removeProductsFromWishlist.wishlist + + false + false + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + + true + + + + false + {"query":" { \n customer {\n wishlist \n { \n id \n items_count \n } \n } \n }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/check_wishlist.jmx + + + + $.data.customer.wishlist.items_count + 0 + true + false + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"mutation {\n revokeCustomerToken {\n result \n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/logout.jmx + + + + $.data.revokeCustomerToken.result + true + true + false + false + false + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + + + 1 + false + 1 + ${cCompareProductsPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Compare Products"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + {"query":"mutation {\n createCompareList \n { \n uid \n } \n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_compare_list.jmx + + + + compare_list_id + $.data.createCompareList.uid + + + BODY + + + + $.data.createCompareList.uid + + false + false + false + false + + + + + + true + + + + false + + {"query" : "{\n categoryList(filters:{}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_categories.jmx + + + + $.data.categoryList + + false + false + false + false + + + + + + true + + + + false + {"query":"query category($id: Int!, $currentPage: Int, $pageSize: Int) {\n category(id: $id) {\n product_count\n description\n url_key\n name\n id\n breadcrumbs {\n category_name\n category_url_key\n __typename\n }\n products(pageSize: $pageSize, currentPage: $currentPage, sort: {name: ASC}) {\n total_count\n items {\n id\n name\n # small_image\n # short_description\n url_key\n special_price\n special_from_date\n special_to_date\n price {\n regularPrice {\n amount {\n value\n currency\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n","variables":{"id":${category_id},"currentPage":1,"pageSize":12},"operationName":"category"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_products_by_category_id.jmx + + + + + "name":"${category_name}","id":${category_id}, + + Assertion.response_data + false + 2 + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation{ \n addProductsToCompareList(input: { uid: \"${compare_list_id}\", products: [${product_id}]}) { \n uid \n item_count \n attributes{code label} \n items { \n product { \n sku \n } \n } \n } \n }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/product_compare_add.jmx + + + + $.data.addProductsToCompareList.item_count + + false + false + false + false + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation{ \n addProductsToCompareList(input: { uid: \"${compare_list_id}\", products: [${product_id}]}) { \n uid \n item_count \n attributes{code label} \n items { \n product { \n sku \n } \n } \n } \n }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/product_compare_add.jmx + + + + $.data.addProductsToCompareList.item_count + + false + false + false + false + + + + + + + true + + + + false + {"query" :"{\n compareList(uid: \"${compare_list_id}\") { \n uid \n items { \n product { \n sku \n } \n } \n } \n}"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/compare_products.jmx + + + + $.data.compareList.items + + false + false + false + false + + + + + + true + + + + false + {"query":"mutation {\n deleteCompareList(uid: \"${compare_list_id}\") \n { \n result \n } \n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/compare_products_clear.jmx + + + + $.data.deleteCompareList.result + true + true + false + false + false + + + + + + + + 1 + false + 1 + ${cCheckoutByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Checkout By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_empty_cart.jmx + + + + + {"data":{"cart":{"items":[]}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + + {"query":"query getCmsPage($identifier: String!, $onServer: Boolean!) {\n cmsPage(identifier: $identifier) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"identifier":"home","onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_home_page.jmx + + + + $.data.cmsPage.url_key + + false + false + false + false + + + + + + true + + + + false + + {"query" : "{\n categoryList(filters:{}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_categories.jmx + + + + $.data.categoryList + + false + false + false + false + + + + + + true + + + + false + {"query":"query category($id: Int!, $currentPage: Int, $pageSize: Int) {\n category(id: $id) {\n product_count\n description\n url_key\n name\n id\n breadcrumbs {\n category_name\n category_url_key\n __typename\n }\n products(pageSize: $pageSize, currentPage: $currentPage, sort: {name: ASC}) {\n total_count\n items {\n id\n name\n # small_image\n # short_description\n url_key\n special_price\n special_from_date\n special_to_date\n price {\n regularPrice {\n amount {\n value\n currency\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n","variables":{"id":${category_id},"currentPage":1,"pageSize":12},"operationName":"category"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_products_by_category_id.jmx + + + + + "name":"${category_name}","id":${category_id}, + + Assertion.response_data + false + 2 + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.productDetail.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option_from_product_detail.jmx + + + + + true + + + + false + {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx + + + + + addConfigurableProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + + + true + + + + false + {"query":"mutation {\n setGuestEmailOnCart(input: \n {\n cart_id: \"${quote_id}\" \n email: \"test@example.com\" \n }) {\n cart {\n email \n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/checkout_email_available.jmx + + + + $.data.setGuestEmailOnCart.cart.email + + false + false + false + false + + + + + + true + + + + false + {"query":"mutation {\n setBillingAddressOnCart(\n input: {\n cart_id: \"${quote_id}\"\n billing_address: {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"AZ\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n }\n ) {\n cart {\n billing_address {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_billing_address_on_cart.jmx + + + + + {"data":{"setBillingAddressOnCart":{"cart":{"billing_address":{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n setShippingAddressesOnCart(\n input: {\n cart_id: \"${quote_id}\"\n shipping_addresses: [\n {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"AZ\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n ]\n }\n ) {\n cart {\n shipping_addresses {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_shipping_address_on_cart.jmx + + + + + {"data":{"setShippingAddressesOnCart":{"cart":{"shipping_addresses":[{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}]}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n setPaymentMethodOnCart(input: {\n cart_id: \"${quote_id}\", \n payment_method: {\n code: \"checkmo\"\n }\n }) {\n cart {\n selected_payment_method {\n code\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_payment_method_on_cart.jmx + + + + + {"data":{"setPaymentMethodOnCart":{"cart":{"selected_payment_method":{"code":"checkmo"}}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n shipping_addresses {\n postcode\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_current_shipping_address.jmx + + + + + true + + + + false + {"query":"mutation {\n setShippingMethodsOnCart(input: \n {\n cart_id: \"${quote_id}\", \n shipping_methods: [{\n carrier_code: \"flatrate\"\n method_code: \"flatrate\"\n }]\n }) {\n cart {\n shipping_addresses {\n selected_shipping_method {\n carrier_code\n method_code\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_shipping_method_on_cart.jmx + + + + + {"data":{"setShippingMethodsOnCart":{"cart":{"shipping_addresses":[{"selected_shipping_method":{"carrier_code":"flatrate","method_code":"flatrate"}}]}}}} + + Assertion.response_data + false + 8 + + + + + + true + + + + false + {"query":"mutation {\n placeOrder(input: \n {\n cart_id: \"${quote_id}\" \n }) {\n order {\n order_number \n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/place_order.jmx + + + + $.data.placeOrder.order.order_number + + false + false + false + false + + + + + + + + 1 + false + 1 + ${cCheckoutByCustomerPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Checkout By Customer"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + true + + + + false + {"query":"mutation {\n generateCustomerToken(\n email: \"${customer_email}\" \n password: \"${customer_password}\" \n ) {\n token \n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/login.jmx + + + + customer_token + $.data.generateCustomerToken.token + + + BODY + + + + $.data.generateCustomerToken.token + + false + false + false + false + + + + + + true + + + + false + {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/create_empty_cart.jmx + + + + quote_id + $.data.createEmptyCart + + + BODY + + + + + {"data":{"createEmptyCart":" + + Assertion.response_data + false + 2 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_empty_cart.jmx + + + + + {"data":{"cart":{"items":[]}}} + + Assertion.response_data + false + 8 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + + {"query":"query getCmsPage($identifier: String!, $onServer: Boolean!) {\n cmsPage(identifier: $identifier) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"identifier":"home","onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_home_page.jmx + + + + $.data.cmsPage.url_key + + false + false + false + false + + + + + + true + + + + false + + {"query" : "{\n categoryList(filters:{}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_categories.jmx + + + + $.data.categoryList + + false + false + false + false + + + + + + true + + + + false + {"query":"query category($id: Int!, $currentPage: Int, $pageSize: Int) {\n category(id: $id) {\n product_count\n description\n url_key\n name\n id\n breadcrumbs {\n category_name\n category_url_key\n __typename\n }\n products(pageSize: $pageSize, currentPage: $currentPage, sort: {name: ASC}) {\n total_count\n items {\n id\n name\n # small_image\n # short_description\n url_key\n special_price\n special_from_date\n special_to_date\n price {\n regularPrice {\n amount {\n value\n currency\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n","variables":{"id":${category_id},"currentPage":1,"pageSize":12},"operationName":"category"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_list_of_products_by_category_id.jmx + + + + + "name":"${category_name}","id":${category_id}, + + Assertion.response_data + false + 2 + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_simple_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_simple_product_to_cart.jmx + + + + + addSimpleProductsToCart + "sku":"${product_sku}" + + Assertion.response_data + false + 2 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + true + + + + false + {"query":"query productDetail($urlKey: String, $onServer: Boolean!) {\n productDetail: products(filter: { url_key: { eq: $urlKey } }, sort: {name: ASC}) {\n items {\n sku\n name\n price {\n regularPrice {\n amount {\n currency\n value\n }\n }\n }\n description {html}\n media_gallery_entries {\n label\n position\n disabled\n file\n }\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n # Yes, Products have `meta_keyword` and\n # everything else has `meta_keywords`.\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"urlKey":"${product_url_key}","onServer":false},"operationName":"productDetail"} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_configurable_product_details_by_product_url_key.jmx + + + + + "sku":"${product_sku}","name":"${product_name}" + + Assertion.response_data + false + 2 + + + + + product_option + $.data.productDetail.items[0].variants[0].product.sku + + + BODY + tool/fragments/ce/graphql/extract_configurable_product_option_from_product_detail.jmx + + + + + true + + + + false + {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx + + + + + addConfigurableProductsToCart + "sku":"${product_option}" + + Assertion.response_data + false + 2 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + + true + + + + false + {"query":"mutation {\n setBillingAddressOnCart(\n input: {\n cart_id: \"${quote_id}\"\n billing_address: {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"AZ\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n }\n ) {\n cart {\n billing_address {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_billing_address_on_cart.jmx + + + + + {"data":{"setBillingAddressOnCart":{"cart":{"billing_address":{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}}}}} + + Assertion.response_data + false + 8 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"mutation {\n setShippingAddressesOnCart(\n input: {\n cart_id: \"${quote_id}\"\n shipping_addresses: [\n {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"AZ\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n ]\n }\n ) {\n cart {\n shipping_addresses {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_shipping_address_on_cart.jmx + + + + + {"data":{"setShippingAddressesOnCart":{"cart":{"shipping_addresses":[{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}]}}}} + + Assertion.response_data + false + 8 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"mutation {\n setPaymentMethodOnCart(input: {\n cart_id: \"${quote_id}\", \n payment_method: {\n code: \"checkmo\"\n }\n }) {\n cart {\n selected_payment_method {\n code\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_payment_method_on_cart.jmx + + + + + {"data":{"setPaymentMethodOnCart":{"cart":{"selected_payment_method":{"code":"checkmo"}}}}} + + Assertion.response_data + false + 8 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"{\n cart(cart_id: \"${quote_id}\") {\n shipping_addresses {\n postcode\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_current_shipping_address.jmx + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"mutation {\n setShippingMethodsOnCart(input: \n {\n cart_id: \"${quote_id}\", \n shipping_methods: [{\n carrier_code: \"flatrate\"\n method_code: \"flatrate\"\n }]\n }) {\n cart {\n shipping_addresses {\n selected_shipping_method {\n carrier_code\n method_code\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/set_shipping_method_on_cart.jmx + + + + + {"data":{"setShippingMethodsOnCart":{"cart":{"shipping_addresses":[{"selected_shipping_method":{"carrier_code":"flatrate","method_code":"flatrate"}}]}}}} + + Assertion.response_data + false + 8 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"mutation {\n placeOrder(input: \n {\n cart_id: \"${quote_id}\" \n }) {\n order {\n order_number \n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/place_order.jmx + + + + $.data.placeOrder.order.order_number + + false + false + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"mutation {\n revokeCustomerToken {\n result \n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/logout.jmx + + + + $.data.revokeCustomerToken.result + true + true + false + false + false + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + + + 1 + false + 1 + ${cAccountManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Account management"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + true + + + + false + + {"query":"query getCmsPage($identifier: String!, $onServer: Boolean!) {\n cmsPage(identifier: $identifier) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"identifier":"home","onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_home_page.jmx + + + + $.data.cmsPage.url_key + + false + false + false + false + + + + + + true + + + + false + {"query":"mutation {\n generateCustomerToken(\n email: \"${customer_email}\" \n password: \"${customer_password}\" \n ) {\n token \n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/login.jmx + + + + customer_token + $.data.generateCustomerToken.token + + + BODY + + + + $.data.generateCustomerToken.token + + false + false + false + false + + + + + + true + + + + false + {"query":" { \n customer \n { orders \n {\n items {\n id \n number \n order_date \n status \n } \n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/my_orders.jmx + + + + order_number + $.data.customer.orders.items[0].number + NOT_FOUND + + BODY + + + + $.data.customer.orders + + false + false + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + tool/fragments/ce/graphql/if_orders.jmx + "${order_number}" != "NOT_FOUND" + false + + + + true + + + + false + {"query":" { \n customer \n { orders(filter: {number: {eq: \"${order_number}\"}}) \n {\n items {\n id \n number \n order_date \n status \n items { \n product_name \n product_sku \n product_url_key \n product_sale_price { \n value \n } \n product_sale_price { \n value \n currency \n } \n quantity_ordered \n quantity_invoiced \n quantity_shipped \n } \n carrier \n shipments { \n id \n number \n items { \n product_name \n quantity_shipped \n } \n } \n total { \n base_grand_total { \n value \n currency \n } \n grand_total { \n value \n currency \n } \n total_tax { \n value \n } \n subtotal { \n value \n currency \n } \n taxes { \n amount { \n value \n currency \n } \n title \n rate \n } \n total_shipping { \n value \n } \n shipping_handling { \n amount_including_tax { \n value \n } \n amount_excluding_tax { \n value \n } \n total_amount { \n value \n } \n taxes { \n amount { \n value \n } \n title \n rate \n } \n } \n discounts { \n amount { \n value \n currency \n } \n label \n } \n } \n } \n }\n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/if_orders.jmx + + + + shipments_id + $.data.customer.orders.items[0].shipments.id + NOT_FOUND + + BODY + + + + $.data.customer.orders.items + + false + false + false + false + + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":" { \n customerDownloadableProducts {\n items \n { \n date \n download_url \n order_increment_id \n remaining_downloads \n status \n } \n } \n }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/my_downloadable_products.jmx + + + + $.data.customerDownloadableProducts.items + + false + false + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":" { \n customer {\n wishlist \n { \n id \n items_count \n sharing_code \n updated_at \n } \n } \n }","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/my_wish_list.jmx + + + + $.data.customer.wishlist.items_count + + false + false + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + true + + + + false + {"query":"mutation {\n revokeCustomerToken {\n result \n }\n}","variables":null,"operationName":null} + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/logout.jmx + + + + $.data.revokeCustomerToken.result + true + true + false + false + false + + + + + false + + + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + tool/fragments/ce/common/return_email_to_pool.jmx + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + + + 1 + false + 1 + ${cAdminCMSManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin CMS Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_cms_management/admin_cms_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/ + GET + true + false + true + false + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/new + GET + true + false + true + false + false + + + + + + + + true + <p>CMS Content ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + content + + + true + + = + true + content_heading + + + true + ${admin_form_key} + = + true + form_key + + + true + + = + true + identifier + + + true + 1 + = + true + is_active + + + true + + = + true + layout_update_xml + + + true + + = + true + meta_description + + + true + + = + true + meta_keywords + + + true + + = + true + meta_title + + + false + {} + = + true + nodes_data + + + true + + = + true + node_ids + + + true + + = + true + page_id + + + true + 1column + = + true + page_layout + + + true + 0 + = + true + store_id[0] + + + true + CMS Title ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + title + + + true + 0 + = + true + website_root + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/save/ + POST + true + false + true + false + false + + + + + + You saved the page. + + Assertion.response_data + false + 16 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCMSManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseProductGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Browse Product Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Product"); + + pagesCount = parseInt(vars.get("products_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "product_listing"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_product_filter_text")); + vars.put("grid_filter_field", "name"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "name"); + vars.put("grid_sort_field_2", "price"); + vars.put("grid_sort_field_3", "attribute_set_id"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_products_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseOrderGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Browse Order Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Order"); + + pagesCount = parseInt(vars.get("orders_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "sales_order_grid"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_orders_filter_text")); + vars.put("grid_filter_field", "status"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "increment_id"); + vars.put("grid_sort_field_2", "created_at"); + vars.put("grid_sort_field_3", "billing_name"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_orders_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminProductCreationPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Create Product"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/once_only_controller.jmx + + + + tool/fragments/ce/admin_create_product/get_related_product_id.jmx + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +relatedIndex = random.nextInt(props.get("simple_products_list").size()); +vars.put("related_product_id", props.get("simple_products_list").get(relatedIndex).get("id")); + + + true + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + + + + false + mycolor + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + false + attribute_code + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + false + mysize + = + true + searchCriteria[filterGroups][0][filters][1][value] + + + false + attribute_code + = + true + searchCriteria[filterGroups][0][filters][1][field] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/attributes + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/get_product_attributes.jmx + + + product_attributes + $.items + + + BODY + + + + javascript + + + + +var attributesData = JSON.parse(vars.get("product_attributes")), +maxOptions = 2; + +attributes = []; +for (i in attributesData) { + if (i >= 2) { + break; + } + var data = attributesData[i], + attribute = { + "id": data.attribute_id, + "code": data.attribute_code, + "label": data.default_frontend_label, + "options": [] + }; + + var processedOptions = 0; + for (optionN in data.options) { + var option = data.options[optionN]; + if (parseInt(option.value) > 0 && processedOptions < maxOptions) { + processedOptions++; + attribute.options.push(option); + } + } + attributes.push(attribute); +} + +vars.putObject("product_attributes", attributes); + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product_set/index/filter/${attribute_set_filter} + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_setup_attribute_set.jmx + + + + false + attribute_set_id + catalog&#x2F;product_set&#x2F;edit&#x2F;id&#x2F;([\d]+)&#x2F;"[\D\d]*Attribute Set 1 + $1$ + + 1 + + + + false + + + import org.apache.commons.codec.binary.Base64; + +byte[] encodedBytes = Base64.encodeBase64("set_name=Attribute Set 1".getBytes()); +vars.put("attribute_set_filter", new String(encodedBytes)); + + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +int number1; + +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +number = random.nextInt(props.get("simple_products_list_for_edit").size()); + +simpleList = props.get("simple_products_list_for_edit").get(number); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_name", simpleList.get("title")); + +do { + number1 = random.nextInt(props.get("simple_products_list_for_edit").size()); +} while(number == number1); +simpleList = props.get("simple_products_list_for_edit").get(number1); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_name", simpleList.get("title")); + +number2 = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number2); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); + +//Additional category to be added +//int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); +//vars.put("category_additional", (categoryId+1).toString()); +//New price +vars.put("price_new", "9999"); +//New special price +vars.put("special_price_new", "8888"); +//New quantity +vars.put("quantity_new", "100600"); +vars.put("configurable_sku", "Configurable Product - ${__time(YMD)}-${__threadNum}-${__Random(1,1000000)}"); + + + + + true + tool/fragments/ce/admin_create_product/setup.jmx + + + + tool/fragments/ce/admin_create_product/create_bundle_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/bundle/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 42 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[configurable_variations] + + + true + 1 + = + true + affect_configurable_product_attributes + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + new-variations-attribute-set-id + + + true + 0 + = + true + product[shipment_type] + + + true + option title one + = + true + bundle_options[bundle_options][0][title] + + + true + + = + true + bundle_options[bundle_options][0][option_id] + + + true + + = + true + bundle_options[bundle_options][0][delete] + + + true + select + = + true + bundle_options[bundle_options][0][type] + + + true + 1 + = + true + bundle_options[bundle_options][0][required] + + + true + 0 + = + true + bundle_options[bundle_options][0][position] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][option_id] + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][0][bundle_selections][0][product_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][delete] + + + true + 25 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][0][position] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][option_id] + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][0][bundle_selections][1][product_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][delete] + + + true + 10.99 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][position] + + + true + option title two + = + true + bundle_options[bundle_options][1][title] + + + true + + = + true + bundle_options[bundle_options][1][option_id] + + + true + + = + true + bundle_options[bundle_options][1][delete] + + + true + select + = + true + bundle_options[bundle_options][1][type] + + + true + 1 + = + true + bundle_options[bundle_options][1][required] + + + true + 1 + = + true + bundle_options[bundle_options][1][position] + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][option_id] + true + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][1][bundle_selections][0][product_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][delete] + true + + + true + 5.00 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][position] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][option_id] + true + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][1][bundle_selections][1][product_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][delete] + true + + + true + 7.00 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][position] + true + + + true + 2 + = + true + affect_bundle_product_selections + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 42 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full bundle product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[configurable_variations] + + + true + 1 + = + true + affect_configurable_product_attributes + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + new-variations-attribute-set-id + + + true + 0 + = + true + product[shipment_type] + false + + + true + option title one + = + true + bundle_options[bundle_options][0][title] + false + + + true + + = + true + bundle_options[bundle_options][0][option_id] + false + + + true + + = + true + bundle_options[bundle_options][0][delete] + false + + + true + select + = + true + bundle_options[bundle_options][0][type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][required] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][position] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][option_id] + false + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][0][bundle_selections][0][product_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][delete] + false + + + true + 25 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][0][position] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][option_id] + false + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][0][bundle_selections][1][product_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][delete] + false + + + true + 10.99 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][position] + false + + + true + option title two + = + true + bundle_options[bundle_options][1][title] + false + + + true + + = + true + bundle_options[bundle_options][1][option_id] + false + + + true + + = + true + bundle_options[bundle_options][1][delete] + false + + + true + select + = + true + bundle_options[bundle_options][1][type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][required] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][position] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][option_id] + false + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][1][bundle_selections][0][product_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][delete] + false + + + true + 5.00 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][position] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][option_id] + false + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][1][bundle_selections][1][product_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][delete] + false + + + true + 7.00 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][position] + false + + + true + 2 + = + true + affect_bundle_product_selections + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/bundle/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + option title one + option title two + ${simple_product_2_name} + ${simple_product_1_name} + + + Assertion.response_data + false + 2 + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/open_catalog_grid.jmx + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/${attribute_set_id}/type/configurable/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/new_configurable.jmx + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + ${admin_form_key} + = + true + form_key + true + + + true + ${attribute_set_id} + = + true + new-variations-attribute-set-id + true + + + true + 1 + = + true + product[affect_product_custom_options] + true + + + true + ${attribute_set_id} + = + true + product[attribute_set_id] + true + + + true + 4 + = + true + product[category_ids][0] + true + + + true + + = + true + product[custom_layout_update] + true + + + true + + = + true + product[description] + true + + + true + 0 + = + true + product[gift_message_available] + true + + + true + 1 + = + true + product[gift_wrapping_available] + true + + + true + + = + true + product[gift_wrapping_price] + true + + + true + + = + true + product[image] + true + + + true + 2 + = + true + product[is_returnable] + true + + + true + ${configurable_sku} - Meta Description + = + true + product[meta_description] + true + + + true + ${configurable_sku} - Meta Keyword + = + true + product[meta_keyword] + true + + + true + ${configurable_sku} - Meta Title + = + true + product[meta_title] + true + + + true + ${configurable_sku} + = + true + product[name] + true + + + true + container2 + = + true + product[options_container] + true + + + true + ${price_new} + = + true + product[price] + true + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + true + + + true + 1000 + = + true + product[quantity_and_stock_status][qty] + true + + + true + + = + true + product[short_description] + true + + + true + ${configurable_sku} + = + true + product[sku] + true + + + true + + = + true + product[small_image] + true + + + true + ${special_price_new} + = + true + product[special_price] + true + + + true + 1 + = + true + product[status] + true + + + true + 0 + = + true + product[stock_data][backorders] + true + + + true + 1 + = + true + product[stock_data][deferred_stock_update] + true + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + true + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + true + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + true + + + true + 1 + = + true + product[stock_data][manage_stock] + true + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + true + + + true + 0 + = + true + product[stock_data][min_qty] + true + + + true + 1 + = + true + product[stock_data][min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_backorders] + true + + + true + 1 + = + true + product[stock_data][use_config_deferred_stock_update] + true + + + true + 1 + = + true + product[stock_data][use_config_enable_qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + true + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + true + + + true + 2 + = + true + product[tax_class_id] + true + + + true + + = + true + product[thumbnail] + true + + + true + + = + true + product[url_key] + true + + + true + 1 + = + true + product[use_config_gift_message_available] + true + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + true + + + true + 1 + = + true + product[use_config_is_returnable] + true + + + true + 4 + = + true + product[visibility] + true + + + true + 1 + = + true + product[website_ids][1] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/${attribute_set_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_validate.jmx + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + javascript + + + + +attributes = vars.getObject("product_attributes"); + +for (i in attributes) { + var attribute = attributes[i]; + sampler.addArgument("attribute_codes[" + i + "]", attribute.code); + sampler.addArgument("attributes[" + i + "]", attribute.id); + sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); + addConfigurableAttributeData(attribute); +} + +addConfigurableMatrix(attributes); + +function addConfigurableAttributeData(attribute) { + var attributeId = attribute.id; + + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); + attribute.options.forEach(function (option, index) { + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); + }); +} + +/** + * Build 4 simple products for Configurable + */ +function addConfigurableMatrix(attributes) { + + var attribute1 = attributes[0], + attribute2 = attributes[1], + productIndex = 1, + products = []; + var variationNames = []; + attribute1.options.forEach(function (option1) { + attribute2.options.forEach(function (option2) { + var productAttributes = {}, + namePart = option1.label + "+" + option2.label, + variationKey = option1.value + "-" + option2.value; + productAttributes[attribute1.code] = option1.value; + productAttributes[attribute2.code] = option2.value; + + variationNames.push(namePart + " - " + vars.get("configurable_sku")); + var product = { + "id": null, + "name": namePart + " - " + vars.get("configurable_sku"), + "sku": namePart + " - " + vars.get("configurable_sku"), + "status": 1, + "price": "100", + "price_currency": "$", + "price_string": "$100", + "weight": "6", + "qty": "50", + "variationKey": variationKey, + "configurable_attribute": JSON.stringify(productAttributes), + "thumbnail_image": "", + "media_gallery": {"images": {}}, + "image": [], + "was_changed": true, + "canEdit": 1, + "newProduct": 1, + "record_id": productIndex + }; + productIndex++; + products.push(product); + }); + }); + + sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); + vars.putObject("configurable_variations_assertion", variationNames); +} + + tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + ${admin_form_key} + = + true + form_key + true + + + true + ${attribute_set_id} + = + true + new-variations-attribute-set-id + true + + + true + 1 + = + true + product[affect_product_custom_options] + true + + + true + ${attribute_set_id} + = + true + product[attribute_set_id] + true + + + true + 2 + = + true + product[category_ids][0] + true + + + true + + = + true + product[custom_layout_update] + true + + + true + + = + true + product[description] + true + + + true + 0 + = + true + product[gift_message_available] + true + + + true + 1 + = + true + product[gift_wrapping_available] + true + + + true + + = + true + product[gift_wrapping_price] + true + + + true + + = + true + product[image] + true + + + true + 2 + = + true + product[is_returnable] + true + + + true + ${configurable_sku} - Meta Description + = + true + product[meta_description] + true + + + true + ${configurable_sku} - Meta Keyword + = + true + product[meta_keyword] + true + + + true + ${configurable_sku} - Meta Title + = + true + product[meta_title] + true + + + true + ${configurable_sku} + = + true + product[name] + true + + + true + container2 + = + true + product[options_container] + true + + + true + ${price_new} + = + true + product[price] + true + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + true + + + true + 1000 + = + true + product[quantity_and_stock_status][qty] + true + + + true + + = + true + product[short_description] + true + + + true + ${configurable_sku} + = + true + product[sku] + true + + + true + + = + true + product[small_image] + true + + + true + ${special_price_new} + = + true + product[special_price] + true + + + true + 1 + = + true + product[status] + true + + + true + 0 + = + true + product[stock_data][backorders] + true + + + true + 1 + = + true + product[stock_data][deferred_stock_update] + true + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + true + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + true + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + true + + + true + 1 + = + true + product[stock_data][manage_stock] + true + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + true + + + true + 0 + = + true + product[stock_data][min_qty] + true + + + true + 1 + = + true + product[stock_data][min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_backorders] + true + + + true + 1 + = + true + product[stock_data][use_config_deferred_stock_update] + true + + + true + 1 + = + true + product[stock_data][use_config_enable_qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + true + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + true + + + true + 2 + = + true + product[tax_class_id] + true + + + true + + = + true + product[thumbnail] + true + + + true + + = + true + product[url_key] + true + + + true + 1 + = + true + product[use_config_gift_message_available] + true + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + true + + + true + 1 + = + true + product[use_config_is_returnable] + true + + + true + 4 + = + true + product[visibility] + true + + + true + 1 + = + true + product[website_ids][1] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/${attribute_set_id}/type/configurable/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_save.jmx + + + + You saved the product + + Assertion.response_data + false + 2 + + + + javascript + + + + +var configurableVariations = vars.getObject("configurable_variations_assertion"), +response = SampleResult.getResponseDataAsString(); + +configurableVariations.forEach(function (variation) { + if (response.indexOf(variation) == -1) { + AssertionResult.setFailureMessage("Cannot find variation \"" + variation + "\""); + AssertionResult.setFailure(true); + } +}); + + + + + + javascript + + + + +attributes = vars.getObject("product_attributes"); + +for (i in attributes) { + var attribute = attributes[i]; + sampler.addArgument("attribute_codes[" + i + "]", attribute.code); + sampler.addArgument("attributes[" + i + "]", attribute.id); + sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); + addConfigurableAttributeData(attribute); +} + +addConfigurableMatrix(attributes); + +function addConfigurableAttributeData(attribute) { + var attributeId = attribute.id; + + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); + attribute.options.forEach(function (option, index) { + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); + }); +} + +/** + * Build 4 simple products for Configurable + */ +function addConfigurableMatrix(attributes) { + + var attribute1 = attributes[0], + attribute2 = attributes[1], + productIndex = 1, + products = []; + var variationNames = []; + attribute1.options.forEach(function (option1) { + attribute2.options.forEach(function (option2) { + var productAttributes = {}, + namePart = option1.label + "+" + option2.label, + variationKey = option1.value + "-" + option2.value; + productAttributes[attribute1.code] = option1.value; + productAttributes[attribute2.code] = option2.value; + + variationNames.push(namePart + " - " + vars.get("configurable_sku")); + var product = { + "id": null, + "name": namePart + " - " + vars.get("configurable_sku"), + "sku": namePart + " - " + vars.get("configurable_sku"), + "status": 1, + "price": "100", + "price_currency": "$", + "price_string": "$100", + "weight": "6", + "qty": "50", + "variationKey": variationKey, + "configurable_attribute": JSON.stringify(productAttributes), + "thumbnail_image": "", + "media_gallery": {"images": {}}, + "image": [], + "was_changed": true, + "canEdit": 1, + "newProduct": 1, + "record_id": productIndex + }; + productIndex++; + products.push(product); + }); + }); + + sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); + vars.putObject("configurable_variations_assertion", variationNames); +} + + tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx + + + + + + tool/fragments/ce/admin_create_product/create_downloadable_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/downloadable/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + ${files_folder}downloadable_original.txt + links + text/plain + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/downloadable_file/upload/type/links/?isAjax=true + POST + false + false + true + true + false + + + + + original_file + $.file + + + BODY + + + + + + + + ${files_folder}downloadable_sample.txt + samples + text/plain + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/downloadable_file/upload/type/samples/?isAjax=true + POST + false + false + true + true + false + + + + + sample_file + $.file + + + BODY + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + on + = + true + is_downloadable + + + true + Links + = + true + product[links_title] + + + true + 0 + = + true + product[links_purchased_separately] + + + true + ${original_file} + = + true + downloadable[link][0][file][0][file] + false + + + true + downloadable_original.txt + = + true + downloadable[link][0][file][0][name] + false + + + true + 13 + = + true + downloadable[link][0][file][0][size] + false + + + true + new + = + true + downloadable[link][0][file][0][status] + false + + + true + 1 + = + true + downloadable[link][0][is_shareable] + + + true + 0 + = + true + downloadable[link][0][is_unlimited] + + + true + + = + true + downloadable[link][0][link_url] + + + true + 0 + = + true + downloadable[link][0][number_of_downloads] + true + + + true + 120 + = + true + downloadable[link][0][price] + true + + + true + 0 + = + true + downloadable[link][0][record_id] + true + + + true + file + = + true + downloadable[link][0][sample][type] + + + true + + = + true + downloadable[link][0][sample][url] + + + true + 1 + = + true + downloadable[link][0][sort_order] + + + true + Original Link + = + true + downloadable[link][0][title] + + + true + file + = + true + downloadable[link][0][type] + + + true + ${sample_file} + = + true + downloadable[sample][0][file][0][file] + true + + + true + downloadable_sample.txt + = + true + downloadable[sample][0][file][0][name] + true + + + true + 14 + = + true + downloadable[sample][0][file][0][size] + true + + + true + new + = + true + downloadable[sample][0][file][0][status] + true + + + true + 0 + = + true + downloadable[sample][0][record_id] + true + + + true + + = + true + downloadable[sample][0][sample_url] + true + + + true + 1 + = + true + downloadable[sample][0][sort_order] + true + + + true + Sample Link + = + true + downloadable[sample][0][title] + true + + + true + file + = + true + downloadable[sample][0][type] + true + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + 4 + = + true + new-variations-attribute-set-id + false + + + true + + = + true + product[configurable_variation] + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/type/downloadable/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + false + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + ${original_file} + = + true + downloadable[link][0][file][0][file] + false + + + true + downloadable_original.txt + = + true + downloadable[link][0][file][0][name] + false + + + true + 13 + = + true + downloadable[link][0][file][0][size] + false + + + true + new + = + true + downloadable[link][0][file][0][status] + false + + + true + 1 + = + true + downloadable[link][0][is_shareable] + true + + + true + 0 + = + true + downloadable[link][0][is_unlimited] + true + + + true + + = + true + downloadable[link][0][link_url] + true + + + true + 0 + = + true + downloadable[link][0][number_of_downloads] + false + + + true + 120 + = + true + downloadable[link][0][price] + false + + + true + 0 + = + true + downloadable[link][0][record_id] + false + + + true + file + = + true + downloadable[link][0][sample][type] + true + + + true + + = + true + downloadable[link][0][sample][url] + true + + + true + 1 + = + true + downloadable[link][0][sort_order] + true + + + true + Original Link + = + true + downloadable[link][0][title] + true + + + true + file + = + true + downloadable[link][0][type] + true + + + true + ${sample_file} + = + true + downloadable[sample][0][file][0][file] + true + + + true + downloadable_sample.txt + = + true + downloadable[sample][0][file][0][name] + true + + + true + 14 + = + true + downloadable[sample][0][file][0][size] + true + + + true + new + = + true + downloadable[sample][0][file][0][status] + true + + + true + 0 + = + true + downloadable[sample][0][record_id] + true + + + true + + = + true + downloadable[sample][0][sample_url] + true + + + true + 1 + = + true + downloadable[sample][0][sort_order] + true + + + true + Sample Link + = + true + downloadable[sample][0][title] + true + + + true + file + = + true + downloadable[sample][0][type] + true + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + 4 + = + true + new-variations-attribute-set-id + false + + + true + + = + true + product[configurable_variation] + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/downloadable/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + violation + + Assertion.response_data + false + 6 + + + + + + + tool/fragments/ce/admin_create_product/create_simple_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/simple/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + product[options][1][is_delete] + false + + + true + 1 + = + true + product[options][1][is_require] + false + + + true + select + = + true + product[options][1][previous_group] + false + + + true + drop_down + = + true + product[options][1][previous_type] + false + + + true + 0 + = + true + product[options][1][sort_order] + false + + + true + Product Option Title One + = + true + product[options][1][title] + false + + + true + drop_down + = + true + product[options][1][type] + false + + + true + + = + true + product[options][1][values][1][is_delete] + false + + + true + 200 + = + true + product[options][1][values][1][price] + false + + + true + fixed + = + true + product[options][1][values][1][price_type] + false + + + true + sku-one + = + true + product[options][1][values][1][sku] + false + + + true + 0 + = + true + product[options][1][values][1][sort_order] + false + + + true + Row Title + = + true + product[options][1][values][1][title] + false + + + true + + = + true + product[options][2][is_delete] + false + + + true + 1 + = + true + product[options][2][is_require] + false + + + true + 250 + = + true + product[options][2][max_characters] + false + + + true + text + = + true + product[options][2][previous_group] + false + + + true + field + = + true + product[options][2][previous_type] + false + + + true + 500 + = + true + product[options][2][price] + false + + + true + fixed + = + true + product[options][2][price_type] + false + + + true + sku-two + = + true + product[options][2][sku] + false + + + true + 1 + = + true + product[options][2][sort_order] + false + + + true + Field Title + = + true + product[options][2][title] + false + + + true + field + = + true + product[options][2][type] + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + 4 + = + true + new-variations-attribute-set-id + true + + + true + + = + true + product[configurable_variation] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full simple product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + product[options][1][is_delete] + true + + + true + 1 + = + true + product[options][1][is_require] + + + true + select + = + true + product[options][1][previous_group] + false + + + true + drop_down + = + true + product[options][1][previous_type] + false + + + true + 0 + = + true + product[options][1][sort_order] + false + + + true + Product Option Title One + = + true + product[options][1][title] + + + true + drop_down + = + true + product[options][1][type] + + + true + + = + true + product[options][1][values][1][is_delete] + false + + + true + 200 + = + true + product[options][1][values][1][price] + + + true + fixed + = + true + product[options][1][values][1][price_type] + + + true + sku-one + = + true + product[options][1][values][1][sku] + + + true + 0 + = + true + product[options][1][values][1][sort_order] + + + true + Row Title + = + true + product[options][1][values][1][title] + + + true + + = + true + product[options][2][is_delete] + false + + + true + 1 + = + true + product[options][2][is_require] + + + true + 250 + = + true + product[options][2][max_characters] + + + true + text + = + true + product[options][2][previous_group] + + + true + field + = + true + product[options][2][previous_type] + + + true + 500 + = + true + product[options][2][price] + + + true + fixed + = + true + product[options][2][price_type] + + + true + sku-two + = + true + product[options][2][sku] + + + true + 1 + = + true + product[options][2][sort_order] + + + true + Field Title + = + true + product[options][2][title] + + + true + field + = + true + product[options][2][type] + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + 4 + = + true + new-variations-attribute-set-id + true + + + true + + = + true + product[configurable_variation] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/simple/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + violation + + Assertion.response_data + false + 6 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminProductEditingPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Edit Product"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + tool/fragments/ce/admin_edit_product/admin_edit_product_updated.jmx + import java.util.ArrayList; + import java.util.HashMap; + import java.util.Random; + + int relatedIndex; + try { + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + simpleCount = props.get("simple_products_list_for_edit").size(); + configCount = props.get("configurable_products_list_for_edit").size(); + productCount = 0; + if (simpleCount > configCount) { + productCount = configCount; + } else { + productCount = simpleCount; + } + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + threadsNumber = 1; + } + //Current thread number starts from 0 + currentThreadNum = ctx.getThreadNum(); + + String siterator = vars.get("threadIterator_" + currentThreadNum.toString()); + iterator = 0; + if(siterator == null){ + vars.put("threadIterator_" + currentThreadNum.toString() , "0"); + } else { + iterator = Integer.parseInt(siterator); + iterator ++; + vars.put("threadIterator_" + currentThreadNum.toString() , iterator.toString()); + } + + //Number of products for one thread + productClusterLength = productCount / threadsNumber; + + if (iterator >= productClusterLength) { + vars.put("threadIterator_" + currentThreadNum.toString(), "0"); + iterator = 0; + } + + //Index of the current product from the cluster + i = productClusterLength * currentThreadNum + iterator; + + //ids of simple and configurable products to edit + vars.put("simple_product_id", props.get("simple_products_list_for_edit").get(i).get("id")); + vars.put("configurable_product_id", props.get("configurable_products_list_for_edit").get(i).get("id")); + + //id of related product + do { + relatedIndex = random.nextInt(props.get("simple_products_list_for_edit").size()); + } while(i == relatedIndex); + vars.put("related_product_id", props.get("simple_products_list_for_edit").get(relatedIndex).get("id")); + } catch (Exception ex) { + log.info("Script execution failed", ex); +} + + + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/edit/id/${simple_product_id}/ + GET + true + false + true + false + false + + + + + + Product + + Assertion.response_data + false + 16 + + + + false + simple_product_name + ,"name":"([^'"]+)", + $1$ + + 1 + + + + false + simple_product_sku + ,"sku":"([^'"]+)", + $1$ + + 1 + + + + false + simple_product_category_id + ,"category_ids":."(\d+)". + $1$ + + 1 + + + + + Passing arguments between threads + //Additional category to be added + import java.util.Random; + + Random randomGenerator = new Random(); + int newCategoryId; + if (${seedForRandom} > 0) { + randomGenerator.setSeed(${seedForRandom} + ${__threadNum}); + } + + int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); + categoryList = props.get("admin_category_ids_list"); + + if (categoryList.size() > 1) { + do { + int index = randomGenerator.nextInt(categoryList.size()); + newCategoryId = Integer.parseInt(categoryList.get(index)); + } while (categoryId == newCategoryId); + + vars.put("category_additional", newCategoryId.toString()); + } + + //New price + vars.put("price_new", "9999"); + //New special price + vars.put("special_price_new", "8888"); + //New quantity + vars.put("quantity_new", "100600"); + + + + false + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${simple_product_name} + = + true + product[name] + false + + + true + ${simple_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + ${quantity_new} + = + true + product[quantity_and_stock_status][qty] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 1.0000 + = + true + product[weight] + false + + + true + 1 + = + true + product[product_has_weight] + false + + + true + ${simple_product_category_id} + = + true + product[category_ids][] + false + + + true + <p>Full simple product Description ${simple_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + + = + true + product[configurable_variations] + false + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + + = + true + product[image] + false + + + true + + = + true + product[small_image] + false + + + true + + = + true + product[thumbnail] + false + + + true + ${simple_product_name} + = + true + product[url_key] + false + + + true + ${simple_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${simple_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${simple_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + ${quantity_new} + = + true + product[stock_data][original_inventory_qty] + false + + + true + ${quantity_new} + = + true + product[stock_data][qty] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + + = + true + new-variations-attribute-set-id + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/id/${simple_product_id}/?isAjax=true + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${simple_product_name} + = + true + product[name] + false + + + true + ${simple_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + ${quantity_new} + = + true + product[quantity_and_stock_status][qty] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 1.0000 + = + true + product[weight] + false + + + true + 1 + = + true + product[product_has_weight] + false + + + true + ${simple_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + + + true + <p>Full simple product Description ${simple_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + + = + true + product[configurable_variations] + false + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + + = + true + product[image] + false + + + true + + = + true + product[small_image] + false + + + true + + = + true + product[thumbnail] + false + + + true + ${simple_product_name} + = + true + product[url_key] + false + + + true + ${simple_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${simple_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${simple_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + ${quantity_new} + = + true + product[stock_data][original_inventory_qty] + false + + + true + ${quantity_new} + = + true + product[stock_data][qty] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + + = + true + new-variations-attribute-set-id + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/id/${simple_product_id}/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/edit/id/${configurable_product_id}/ + GET + true + false + true + false + false + + + + + + Product + + Assertion.response_data + false + 16 + + + + false + configurable_product_name + ,"name":"([^'"]+)", + $1$ + + 1 + + + + false + configurable_product_sku + ,"sku":"([^'"]+)", + $1$ + + 1 + + + + false + configurable_product_category_id + ,"category_ids":."(\d+)" + $1$ + + 1 + + + + false + configurable_attribute_id + ,"configurable_variation":"([^'"]+)", + $1$ + + 1 + true + + + + false + configurable_matrix + "configurable-matrix":(\[.*?\]) + $1$ + + 1 + true + + + + associated_products_ids + $.[*].id + + configurable_matrix + VAR + + + + false + configurable_product_data + (\{"product":.*?configurable_attributes_data.*?\})\s*< + $1$ + + 1 + + + + configurable_attributes_data + $.product.configurable_attributes_data + + configurable_product_data + VAR + + + + false + configurable_attribute_ids + "attribute_id":"(\d+)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_codes + "code":"(\w+)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_labels + "label":"(.*?)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_values + "values":(\{(?:\}|.*?\}\})) + $1$ + + -1 + variable + configurable_attributes_data + + + + + configurable_attribute_ids + configurable_attribute_id + true + + + + 1 + ${configurable_attribute_ids_matchNr} + 1 + attribute_counter + + true + true + + + + return vars.get("configurable_attribute_values_" + vars.get("attribute_counter")); + + + false + + + + false + attribute_${configurable_attribute_id}_values + "value_index":"(\d+)" + $1$ + + -1 + configurable_attribute_values_${attribute_counter} + + + + + + + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${configurable_product_name} + = + true + product[name] + false + + + true + ${configurable_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 3 + = + true + product[weight] + false + + + true + ${configurable_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + false + + + true + <p>Configurable product description ${configurable_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + ${configurable_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${configurable_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${configurable_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + ${configurable_attribute_id} + = + true + product[configurable_variation] + false + + + true + ${configurable_product_name} + = + true + product[url_key] + + + true + 1 + = + true + product[use_config_gift_message_available] + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + + + true + 4 + = + true + product[visibility] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 50 + = + true + product[stock_data][qty] + false + + + true + configurable + = + true + product[stock_data][type_id] + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/id/${configurable_product_id}/ + POST + true + false + true + false + false + + + + + false + + + try { + int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); + for (int i = 1; i <= attributesCount; i++) { + attributeId = vars.get("configurable_attribute_ids_" + i.toString()); + attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); + attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); + ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); + ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); + ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); + + int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); + for (int j = 1; j <= valuesCount; j++) { + attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", + "1" + ); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", + attributeValue + ); + } + } + ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); + } catch (Exception e) { + log.error("error???", e); + } + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${configurable_product_name} + = + true + product[name] + false + + + true + ${configurable_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id]admin + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 3 + = + true + product[weight] + false + + + true + ${configurable_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + false + + + true + <p>Configurable product description ${configurable_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + ${configurable_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${configurable_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${configurable_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + ${configurable_attribute_id} + = + true + product[configurable_variation] + false + + + true + ${configurable_product_name} + = + true + product[url_key] + + + true + 1 + = + true + product[use_config_gift_message_available] + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + + + true + 4 + = + true + product[visibility] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 50 + = + true + product[stock_data][qty] + false + + + true + configurable + = + true + product[stock_data][type_id] + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/id/${configurable_product_id}/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + false + + + try { + int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); + for (int i = 1; i <= attributesCount; i++) { + attributeId = vars.get("configurable_attribute_ids_" + i.toString()); + attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); + attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); + ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); + ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); + ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); + + int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); + for (int j = 1; j <= valuesCount; j++) { + attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", + "1" + ); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", + attributeValue + ); + } + } + ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); + } catch (Exception e) { + log.error("error???", e); + } + + + + + You saved the product + + Assertion.response_data + false + 2 + if have trouble see messages-message-error + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminReturnsManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Returns Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/orders_page.jmx + + + + Create New Order + + Assertion.response_data + false + 2 + + + + + + + + + true + sales_order_grid + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 200 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + increment_id + = + true + sorting[field] + + + true + desc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + false + + + true + pending + = + true + filters[status] + true + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + sales_order_grid + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + 200 + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + increment_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + true + pending + = + true + filters[status] + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/search_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + false + order_numbers + \"increment_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + false + order_ids + \"entity_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + + + tool/fragments/ce/admin_create_process_returns/setup.jmx + + import java.util.ArrayList; + import java.util.HashMap; + import org.apache.jmeter.protocol.http.util.Base64Encoder; + import java.util.Random; + + // get count of "order_numbers" variable defined in "Search Pending Orders Limit" + int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); + + + int clusterLength; + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + //Number of orders for one thread + clusterLength = ordersCount; + } else { + clusterLength = Math.round(ordersCount / threadsNumber); + if (clusterLength == 0) { + clusterLength = 1; + } + } + + //Current thread number starts from 0 + int currentThreadNum = ctx.getThreadNum(); + + //Index of the current product from the cluster + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + int iterator = random.nextInt(clusterLength); + if (iterator == 0) { + iterator = 1; + } + + int i = clusterLength * currentThreadNum + iterator; + + orderNumber = vars.get("order_numbers_" + i.toString()); + orderId = vars.get("order_ids_" + i.toString()); + vars.put("order_number", orderNumber); + vars.put("order_id", orderId); + + + + + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_order.jmx + + + + #${order_number} + + Assertion.response_data + false + 2 + + + + false + order_status + <span id="order_status">([^<]+)</span> + $1$ + + 1 + simple_products + + + + + + "${order_status}" == "Pending" + false + tool/fragments/ce/admin_edit_order/if_controller.jmx + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_start.jmx + + + + Invoice Totals + + Assertion.response_data + false + 2 + + + + false + item_ids + <div id="order_item_(\d+)_title"\s*class="product-title"> + $1$ + + -1 + simple_products + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + invoice[items][${item_ids_1}] + + + true + 1 + = + true + invoice[items][${item_ids_2}] + + + true + Invoiced + = + true + invoice[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx + + + + The invoice has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_creditmemo/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/credit_memo_start.jmx + + + + New Memo + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + creditmemo[items][${item_ids_1}][qty] + + + true + 1 + = + true + creditmemo[items][${item_ids_2}][qty] + + + true + 1 + = + true + creditmemo[do_offline] + + + true + Credit Memo added + = + true + creditmemo[comment_text] + + + true + 10 + = + true + creditmemo[shipping_amount] + + + true + 0 + = + true + creditmemo[adjustment_positive] + + + true + 0 + = + true + creditmemo[adjustment_negative] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_creditmemo/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/credit_memo_full_refund.jmx + + + + You created the credit memo + + Assertion.response_data + false + 2 + + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCreateProcessReturnsDelay}*1000))} + tool/fragments/ce/admin_create_process_returns/pause.jmx + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseCustomerGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Browse Customer Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Customer"); + + pagesCount = parseInt(vars.get("customers_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "customer_listing"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_customer_filter_text")); + vars.put("grid_filter_field", "name"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "name"); + vars.put("grid_sort_field_2", "group_id"); + vars.put("grid_sort_field_3", "billing_country_id"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_customers_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCreateOrderPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Create Order"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + tool/fragments/ce/admin_create_order/admin_create_order.jmx + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); + +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} + +number = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_product_1_sku", configurableList.get("sku")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); + +number = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); + +number1 = random.nextInt(props.get("configurable_products_list").size()); +do { + number1 = random.nextInt(props.get("simple_products_list").size()); +} while(number == number1); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); + + +customers_index = 0; +if (!props.containsKey("customer_ids_index")) { + props.put("customer_ids_index", customers_index); +} + +try { + customers_index = props.get("customer_ids_index"); + customers_list = props.get("customer_ids_list"); + + if (customers_index == customers_list.size()) { + customers_index=0; + } + vars.put("customer_id", customers_list.get(customers_index)); + props.put("customer_ids_index", ++customers_index); +} +catch (java.lang.Exception e) { + log.error("Caught Exception in 'Admin Create Order' thread."); + SampleResult.setStopThread(true); +} + + + true + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/start/ + GET + true + false + true + false + false + + Detected the start of a redirect chain + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${configurable_product_1_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + true + item[${simple_product_1_id}][qty] + 1 + = + true + + + true + item[${simple_product_2_id}][qty] + 1 + = + true + + + true + item[${configurable_product_1_id}][qty] + 1 + = + true + + + true + customer_id + ${customer_id} + = + true + + + true + store_id + 1 + = + true + + + true + currency_id + + = + true + + + true + form_key + ${admin_form_key} + = + true + + + true + payment[method] + checkmo + = + true + + + true + reset_shipping + 1 + = + true + + + true + json + 1 + = + true + + + true + as_js_varname + iFrameResponse + = + true + + + true + form_key + ${admin_form_key} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/loadBlock/block/search,items,shipping_method,totals,giftmessage,billing_method?isAjax=true + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + false + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + + ctx.getCurrentSampler().addArgument("item[" + vars.get("configurable_product_1_id") + "][super_attribute][" + attribute_ids_array[i] + "]", option_values_array[i]); + } +} catch (Exception e) { + log.error("error???", e); +} + + + + + + + + true + collect_shipping_rates + 1 + = + true + + + true + customer_id + ${customer_id} + = + true + + + true + store_id + 1 + = + true + + + true + currency_id + false + = + true + + + true + form_key + ${admin_form_key} + = + true + + + true + payment[method] + checkmo + = + true + + + true + json + true + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/loadBlock/block/shipping_method,totals?isAjax=true + POST + true + false + true + false + false + + + + + + shipping_method + Flat Rate + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/index/ + GET + true + false + true + false + false + + Detected the start of a redirect chain + + + + + Select from existing customer addresses + Submit Order + Items Ordered + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + limit + 20 + = + true + + + true + entity_id + + = + true + + + true + name + + = + true + + + true + email + + = + true + + + true + Telephone + + = + true + + + true + billing_postcode + + = + true + + + true + billing_country_id + + = + true + + + true + billing_regione + + = + true + + + true + store_name + + = + true + + + true + page + 1 + = + true + + + true + order[currency] + USD + = + true + + + true + sku + + = + true + + + true + qty + + = + true + + + true + limit + 20 + = + true + + + true + entity_id + + = + true + + + true + name + + = + true + + + true + sku + + = + true + + + true + price[from] + + = + true + + + true + price[to] + + = + true + + + true + in_products + + = + true + + + true + page + 1 + = + true + + + true + coupon_code + + = + true + + + true + order[account][group_id] + 1 + = + true + + + true + order[account][email] + user_${customer_id}@example.com + = + true + + + true + order[billing_address][customer_address_id] + + = + true + + + true + order[billing_address][prefix] + + = + true + + + true + order[billing_address][firstname] + Anthony + = + true + + + true + order[billing_address][middlename] + + = + true + + + true + order[billing_address][lastname] + Nealy + = + true + + + true + order[billing_address][suffix] + + = + true + + + true + order[billing_address][company] + + = + true + + + true + order[billing_address][street][0] + 123 Freedom Blvd. #123 + = + true + + + true + order[billing_address][street][1] + + = + true + + + true + order[billing_address][city] + Fayetteville + = + true + + + true + order[billing_address][country_id] + US + = + true + + + true + order[billing_address][region] + + = + true + + + true + order[billing_address][region_id] + ${alabama_region_id} + = + true + + + true + order[billing_address][postcode] + 123123 + = + true + + + true + order[billing_address][telephone] + 022-333-4455 + = + true + + + true + order[billing_address][fax] + + = + true + + + true + order[billing_address][vat_id] + + = + true + + + true + shipping_same_as_billing + on + = + true + + + true + payment[method] + checkmo + = + true + + + true + order[shipping_method] + flatrate_flatrate + = + true + + + true + order[comment][customer_note] + + = + true + + + true + order[comment][customer_note_notify] + 1 + = + true + + + true + order[send_confirmation] + 1 + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/save/ + POST + true + false + true + true + false + + Detected the start of a redirect chain + + + + false + order_id + ${host}${base_path}${admin_path}/sales/order/index/order_id/(\d+)/ + $1$ + + 1 + + + + false + order_item_1 + order_item_(\d+)_title + $1$ + + 1 + + + + false + order_item_2 + order_item_(\d+)_title + $1$ + + 2 + + + + false + order_item_3 + order_item_(\d+)_title + $1$ + + 3 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_2 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_3 + + + + + You created the order. + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + invoice[items][${order_item_1}] + 1 + = + true + + + true + invoice[items][${order_item_2}] + 1 + = + true + + + true + invoice[items][${order_item_3}] + 1 + = + true + + + true + invoice[comment_text] + + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + + The invoice has been created. + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + shipment[items][${order_item_1}] + 1 + = + true + + + true + shipment[items][${order_item_2}] + 1 + = + true + + + true + shipment[items][${order_item_3}] + 1 + = + true + + + true + shipment[comment_text] + + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + + The shipment has been created. + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCategoryManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Category Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_category_management/admin_category_management.jmx + + + + javascript + + + + random = new java.util.Random(); +if (${seedForRandom} > 0) { +random.setSeed(${seedForRandom} + ${__threadNum}); +} + +/** + * Get unique ids for fix concurrent category saving + */ +function getNextProductNumber(i) { + number = productsVariationsSize * ${__threadNum} - i; + if (number >= productsSize) { + log.info("${testLabel}: capacity of product list is not enough for support all ${adminPoolUsers} threads"); + return random.nextInt(productsSize); + } + return productsVariationsSize * ${__threadNum} - i; +} + +var productsVariationsSize = 5, + productsSize = props.get("simple_products_list_for_edit").size(); + + +for (i = 1; i<= productsVariationsSize; i++) { + var productVariablePrefix = "simple_product_" + i + "_"; + number = getNextProductNumber(i); + simpleList = props.get("simple_products_list_for_edit").get(number); + + vars.put(productVariablePrefix + "url_key", simpleList.get("url_key")); + vars.put(productVariablePrefix + "id", simpleList.get("id")); + vars.put(productVariablePrefix + "name", simpleList.get("title")); +} + +categoryIndex = random.nextInt(props.get("admin_category_ids_list").size()); +vars.put("parent_category_id", props.get("admin_category_ids_list").get(categoryIndex)); +do { +categoryIndexNew = random.nextInt(props.get("admin_category_ids_list").size()); +} while(categoryIndex == categoryIndexNew); +vars.put("new_parent_category_id", props.get("admin_category_ids_list").get(categoryIndexNew)); + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/edit/id/${parent_category_id}/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/add/store/0/parent/${parent_category_id} + GET + true + false + true + false + false + + + + + + <title>New Category + + Assertion.response_data + false + 2 + + + + + + + + true + + = + true + id + + + true + ${parent_category_id} + = + true + parent + + + true + + = + true + path + + + true + + = + true + store_id + + + true + 0 + = + true + is_active + + + true + 0 + = + true + include_in_menu + + + true + 1 + = + true + is_anchor + + + true + true + = + true + use_config[available_sort_by] + + + true + true + = + true + use_config[default_sort_by] + + + true + true + = + true + use_config[filter_price_range] + + + true + false + = + true + use_default[url_key] + + + true + 0 + = + true + url_key_create_redirect + + + true + 0 + = + true + custom_use_parent_settings + + + true + 0 + = + true + custom_apply_to_products + + + true + Admin Category Management ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + name + + + true + admin-category-management-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + url_key + + + true + + = + true + meta_title + + + true + + = + true + description + + + true + PRODUCTS + = + true + display_mode + + + true + position + = + true + default_sort_by + + + true + + = + true + meta_keywords + + + true + + = + true + meta_description + + + true + + = + true + custom_layout_update + + + false + {"${simple_product_1_id}":"","${simple_product_2_id}":"","${simple_product_3_id}":"","${simple_product_4_id}":"","${simple_product_5_id}":""} + = + true + category_products + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/save/ + POST + true + false + true + false + false + + + + + URL + admin_category_id + /catalog/category/edit/id/(\d+)/ + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_id + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/edit/id/${admin_category_id}/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + false + admin_category_entity_id + "entity_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_attribute_set_id + "attribute_set_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_parent_id + "parent_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_created_at + "created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_updated_at + "updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_path + "entity_id":(.+)"path":"([^\"]+)" + $2$ + + 1 + + + + false + admin_category_level + "level":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_name + "entity_id":(.+)"name":"([^"]+)" + $2$ + + 1 + + + + false + admin_category_url_key + "url_key":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_url_path + "url_path":"([^"]+)" + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_entity_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_attribute_set_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_parent_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_updated_at + + + + + ^[\d\\\/]+$ + + Assertion.response_data + false + 1 + variable + admin_category_path + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_level + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_name + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_url_key + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_url_path + + + + + ${simple_product_1_name} + ${simple_product_2_name} + ${simple_product_3_name} + ${simple_product_4_name} + ${simple_product_5_name} + + Assertion.response_data + false + 2 + + + + + + + + true + ${admin_category_id} + = + true + id + + + true + ${admin_form_key} + = + true + form_key + + + true + append + = + true + point + + + true + ${new_parent_category_id} + = + true + pid + + + true + ${parent_category_id} + = + true + paid + + + true + 0 + = + true + aid + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/move/ + POST + true + false + true + false + false + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/delete/id/${admin_category_id}/ + POST + true + false + true + false + false + + + + + + You deleted the category. + + Assertion.response_data + false + 2 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCategoryManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminPromotionRulesPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Promotion Rules"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_promotions_management/admin_promotions_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/ + GET + true + false + true + false + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/new + GET + true + false + true + false + false + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + true + + + true + 1--1 + = + true + id + + + true + Magento\SalesRule\Model\Rule\Condition\Address|base_subtotal + = + true + type + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/newConditionHtml/form/sales_rule_formrule_conditions_fieldset_/form_namespace/sales_rule_form + POST + true + false + true + false + false + + + + + + + + true + Rule Name ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + name + + + true + 0 + = + true + is_active + + + true + 0 + = + true + use_auto_generation + + + true + 1 + = + true + is_rss + + + true + 0 + = + true + apply_to_shipping + + + true + 0 + = + true + stop_rules_processing + + + true + + = + true + coupon_code + + + true + + = + true + uses_per_coupon + + + true + + = + true + uses_per_customer + + + true + + = + true + sort_order + + + true + 5 + = + true + discount_amount + + + true + 0 + = + true + discount_qty + + + true + + = + true + discount_step + + + true + + = + true + reward_points_delta + + + true + + = + true + store_labels[0] + + + true + Rule Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + description + + + true + 1 + = + true + coupon_type + + + true + cart_fixed + = + true + simple_action + + + true + 1 + = + true + website_ids[0] + + + true + 0 + = + true + customer_group_ids[0] + + + true + + = + true + from_date + + + true + + = + true + to_date + + + true + Magento\SalesRule\Model\Rule\Condition\Combine + = + true + rule[conditions][1][type] + + + true + all + = + true + rule[conditions][1][aggregator] + + + true + 1 + = + true + rule[conditions][1][value] + + + true + Magento\SalesRule\Model\Rule\Condition\Address + = + true + rule[conditions][1--1][type] + + + true + base_subtotal + = + true + rule[conditions][1--1][attribute] + + + true + >= + = + true + rule[conditions][1--1][operator] + + + true + 100 + = + true + rule[conditions][1--1][value] + + + true + + = + true + rule[conditions][1][new_chlid] + + + true + Magento\SalesRule\Model\Rule\Condition\Product\Combine + = + true + rule[actions][1][type] + + + true + all + = + true + rule[actions][1][aggregator] + + + true + 1 + = + true + rule[actions][1][value] + + + true + + = + true + rule[actions][1][new_child] + + + true + + = + true + store_labels[1] + + + true + + = + true + store_labels[2] + + + true + + = + true + related_banners + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/save/ + POST + true + false + true + false + false + + + + + + You saved the rule. + + Assertion.response_data + false + 16 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminPromotionsManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCustomerManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Customer Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_customer_management/admin_customer_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + true + customer_listing + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 20 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + true + customer_listing + = + true + namespace + + + true + Lastname + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 20 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + false + customer_edit_url_path + actions":\{"edit":\{"href":"(?:http|https):\\/\\/(.*?)\\/customer\\/index\\/edit\\/id\\/(\d+)\\/", + /customer/index/edit/id/$2$/ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + customer_edit_url_path + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}${customer_edit_url_path} + GET + true + false + true + false + false + + + + + + Customer Information + + Assertion.response_data + false + 2 + + + + false + admin_customer_entity_id + "entity_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_website_id + "website_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_firstname + "firstname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_lastname + "lastname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_email + "email":"([^\@]+@[^.]+.[^"]+)" + $1$ + + 1 + + + + false + admin_customer_group_id + "group_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_store_id + "store_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_created_at + "created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_updated_at + "updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_is_active + "is_active":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_disable_auto_group_change + "disable_auto_group_change":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_created_in + "created_in":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_dob + "dob":"(\d+)-(\d+)-(\d+)" + $2$/$3$/$1$ + + 1 + + + + false + admin_customer_default_billing + "default_billing":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_default_shipping + "default_shipping":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_gender + "gender":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_failures_num + "failures_num":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_address_entity_id + _address":\{"entity_id":"(\d+)".+?"parent_id":"${admin_customer_entity_id}" + $1$ + + 1 + + + + false + admin_customer_address_created_at + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_updated_at + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_is_active + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"is_active":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_address_city + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"city":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_country_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"country_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_firstname + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"firstname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_lastname + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"lastname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_postcode + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"postcode":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_region + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_region_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_street + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"street":\["([^"]+)"\] + $1$ + + 1 + + + + false + admin_customer_address_telephone + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"telephone":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_customer_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"customer_id":"([^"]+)" + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_entity_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_website_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_firstname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_lastname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_email + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_group_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_store_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_updated_at + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_is_active + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_disable_auto_group_change + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_created_in + + + + + ^\d+/\d+/\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_dob + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_default_billing + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_default_shipping + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_gender + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_failures_num + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_entity_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_updated_at + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_is_active + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_city + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_country_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_firstname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_lastname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_postcode + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_region + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_region_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_street + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_telephone + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_customer_id + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_customer_entity_id} + = + true + customer[entity_id] + + + true + ${admin_customer_website_id} + = + true + customer[website_id] + + + true + ${admin_customer_email} + = + true + customer[email] + + + true + ${admin_customer_group_id} + = + true + customer[group_id] + + + true + ${admin_customer_store_id} + = + true + customer[store_id] + + + true + ${admin_customer_created_at} + = + true + customer[created_at] + + + true + ${admin_customer_updated_at} + = + true + customer[updated_at] + + + true + ${admin_customer_is_active} + = + true + customer[is_active] + + + true + ${admin_customer_disable_auto_group_change} + = + true + customer[disable_auto_group_change] + + + true + ${admin_customer_created_in} + = + true + customer[created_in] + + + true + + = + true + customer[prefix] + + + true + ${admin_customer_firstname} 1 + = + true + customer[firstname] + + + true + + = + true + customer[middlename] + + + true + ${admin_customer_lastname} 1 + = + true + customer[lastname] + + + true + + = + true + customer[suffix] + + + true + ${admin_customer_dob} + = + true + customer[dob] + + + true + ${admin_customer_default_billing} + = + true + customer[default_billing] + + + true + ${admin_customer_default_shipping} + = + true + customer[default_shipping] + + + true + + = + true + customer[taxvat] + + + true + ${admin_customer_gender} + = + true + customer[gender] + + + true + ${admin_customer_failures_num} + = + true + customer[failures_num] + + + true + ${admin_customer_store_id} + = + true + customer[sendemail_store_id] + + + true + ${admin_customer_address_entity_id} + = + true + address[${admin_customer_address_entity_id}][entity_id] + + + true + ${admin_customer_address_created_at} + = + true + address[${admin_customer_address_entity_id}][created_at] + + + true + ${admin_customer_address_updated_at} + = + true + address[${admin_customer_address_entity_id}][updated_at] + + + true + ${admin_customer_address_is_active} + = + true + address[${admin_customer_address_entity_id}][is_active] + + + true + ${admin_customer_address_city} + = + true + address[${admin_customer_address_entity_id}][city] + + + true + + = + true + address[${admin_customer_address_entity_id}][company] + + + true + ${admin_customer_address_country_id} + = + true + address[${admin_customer_address_entity_id}][country_id] + + + true + ${admin_customer_address_firstname} + = + true + address[${admin_customer_address_entity_id}][firstname] + + + true + ${admin_customer_address_lastname} + = + true + address[${admin_customer_address_entity_id}][lastname] + + + true + + = + true + address[${admin_customer_address_entity_id}][middlename] + + + true + ${admin_customer_address_postcode} + = + true + address[${admin_customer_address_entity_id}][postcode] + + + true + + = + true + address[${admin_customer_address_entity_id}][prefix] + + + true + ${admin_customer_address_region} + = + true + address[${admin_customer_address_entity_id}][region] + + + true + ${admin_customer_address_region_id} + = + true + address[${admin_customer_address_entity_id}][region_id] + + + true + ${admin_customer_address_street} + = + true + address[${admin_customer_address_entity_id}][street][0] + + + true + + = + true + address[${admin_customer_address_entity_id}][street][1] + + + true + + = + true + address[${admin_customer_address_entity_id}][suffix] + + + true + ${admin_customer_address_telephone} + = + true + address[${admin_customer_address_entity_id}][telephone] + + + true + + = + true + address[${admin_customer_address_entity_id}][vat_id] + + + true + ${admin_customer_address_customer_id} + = + true + address[${admin_customer_address_entity_id}][customer_id] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_billing] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_shipping] + + + true + + = + true + address[new_0][prefix] + + + true + John + = + true + address[new_0][firstname] + + + true + + = + true + address[new_0][middlename] + + + true + Doe + = + true + address[new_0][lastname] + + + true + + = + true + address[new_0][suffix] + + + true + Test Company + = + true + address[new_0][company] + + + true + Folsom + = + true + address[new_0][city] + + + true + 95630 + = + true + address[new_0][postcode] + + + true + 1234567890 + = + true + address[new_0][telephone] + + + true + + = + true + address[new_0][vat_id] + + + true + false + = + true + address[new_0][default_billing] + + + true + false + = + true + address[new_0][default_shipping] + + + true + 123 Main + = + true + address[new_0][street][0] + + + true + + = + true + address[new_0][street][1] + + + true + + = + true + address[new_0][region] + + + true + US + = + true + address[new_0][country_id] + + + true + ${admin_customer_address_region_id} + = + true + address[new_0][region_id] + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index/validate/ + POST + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 16 + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_customer_entity_id} + = + true + customer[entity_id] + + + true + ${admin_customer_website_id} + = + true + customer[website_id] + + + true + ${admin_customer_email} + = + true + customer[email] + + + true + ${admin_customer_group_id} + = + true + customer[group_id] + + + true + ${admin_customer_store_id} + = + true + customer[store_id] + + + true + ${admin_customer_created_at} + = + true + customer[created_at] + + + true + ${admin_customer_updated_at} + = + true + customer[updated_at] + + + true + ${admin_customer_is_active} + = + true + customer[is_active] + + + true + ${admin_customer_disable_auto_group_change} + = + true + customer[disable_auto_group_change] + + + true + ${admin_customer_created_in} + = + true + customer[created_in] + + + true + + = + true + customer[prefix] + + + true + ${admin_customer_firstname} 1 + = + true + customer[firstname] + + + true + + = + true + customer[middlename] + + + true + ${admin_customer_lastname} 1 + = + true + customer[lastname] + + + true + + = + true + customer[suffix] + + + true + ${admin_customer_dob} + = + true + customer[dob] + + + true + ${admin_customer_default_billing} + = + true + customer[default_billing] + + + true + ${admin_customer_default_shipping} + = + true + customer[default_shipping] + + + true + + = + true + customer[taxvat] + + + true + ${admin_customer_gender} + = + true + customer[gender] + + + true + ${admin_customer_failures_num} + = + true + customer[failures_num] + + + true + ${admin_customer_store_id} + = + true + customer[sendemail_store_id] + + + true + ${admin_customer_address_entity_id} + = + true + address[${admin_customer_address_entity_id}][entity_id] + + + + true + ${admin_customer_address_created_at} + = + true + address[${admin_customer_address_entity_id}][created_at] + + + true + ${admin_customer_address_updated_at} + = + true + address[${admin_customer_address_entity_id}][updated_at] + + + true + ${admin_customer_address_is_active} + = + true + address[${admin_customer_address_entity_id}][is_active] + + + true + ${admin_customer_address_city} + = + true + address[${admin_customer_address_entity_id}][city] + + + true + + = + true + address[${admin_customer_address_entity_id}][company] + + + true + ${admin_customer_address_country_id} + = + true + address[${admin_customer_address_entity_id}][country_id] + + + true + ${admin_customer_address_firstname} + = + true + address[${admin_customer_address_entity_id}][firstname] + + + true + ${admin_customer_address_lastname} + = + true + address[${admin_customer_address_entity_id}][lastname] + + + true + + = + true + address[${admin_customer_address_entity_id}][middlename] + + + true + ${admin_customer_address_postcode} + = + true + address[${admin_customer_address_entity_id}][postcode] + + + true + + = + true + address[${admin_customer_address_entity_id}][prefix] + + + true + ${admin_customer_address_region} + = + true + address[${admin_customer_address_entity_id}][region] + + + true + ${admin_customer_address_region_id} + = + true + address[${admin_customer_address_entity_id}][region_id] + + + true + ${admin_customer_address_street} + = + true + address[${admin_customer_address_entity_id}][street][0] + + + true + + = + true + address[${admin_customer_address_entity_id}][street][1] + + + true + + = + true + address[${admin_customer_address_entity_id}][suffix] + + + true + ${admin_customer_address_telephone} + = + true + address[${admin_customer_address_entity_id}][telephone] + + + true + + = + true + address[${admin_customer_address_entity_id}][vat_id] + + + true + ${admin_customer_address_customer_id} + = + true + address[${admin_customer_address_entity_id}][customer_id] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_billing] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_shipping] + + + true + + = + true + address[new_0][prefix] + + + true + John + = + true + address[new_0][firstname] + + + true + + = + true + address[new_0][middlename] + + + true + Doe + = + true + address[new_0][lastname] + + + true + + = + true + address[new_0][suffix] + + + true + Test Company + = + true + address[new_0][company] + + + true + Folsom + = + true + address[new_0][city] + + + true + 95630 + = + true + address[new_0][postcode] + + + true + 1234567890 + = + true + address[new_0][telephone] + + + true + + = + true + address[new_0][vat_id] + + + true + false + = + true + address[new_0][default_billing] + + + true + false + = + true + address[new_0][default_shipping] + + + true + 123 Main + = + true + address[new_0][street][0] + + + true + + = + true + address[new_0][street][1] + + + true + + = + true + address[new_0][region] + + + true + US + = + true + address[new_0][country_id] + + + true + 12 + = + true + address[new_0][region_id] + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index/save/ + POST + true + false + true + true + false + + + + + + You saved the customer. + + Assertion.response_data + false + 2 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCustomerManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminEditOrderPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[GraphQL C] Admin Edit Order"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/orders_page.jmx + + + + Create New Order + + Assertion.response_data + false + 2 + + + + + + + + + true + sales_order_grid + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 200 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + increment_id + = + true + sorting[field] + + + true + desc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + false + + + true + pending + = + true + filters[status] + true + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + sales_order_grid + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + 200 + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + increment_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + true + pending + = + true + filters[status] + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/search_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + false + order_numbers + \"increment_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + false + order_ids + \"entity_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + + + tool/fragments/ce/admin_create_process_returns/setup.jmx + + import java.util.ArrayList; + import java.util.HashMap; + import org.apache.jmeter.protocol.http.util.Base64Encoder; + import java.util.Random; + + // get count of "order_numbers" variable defined in "Search Pending Orders Limit" + int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); + + + int clusterLength; + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + //Number of orders for one thread + clusterLength = ordersCount; + } else { + clusterLength = Math.round(ordersCount / threadsNumber); + if (clusterLength == 0) { + clusterLength = 1; + } + } + + //Current thread number starts from 0 + int currentThreadNum = ctx.getThreadNum(); + + //Index of the current product from the cluster + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + int iterator = random.nextInt(clusterLength); + if (iterator == 0) { + iterator = 1; + } + + int i = clusterLength * currentThreadNum + iterator; + + orderNumber = vars.get("order_numbers_" + i.toString()); + orderId = vars.get("order_ids_" + i.toString()); + vars.put("order_number", orderNumber); + vars.put("order_id", orderId); + + + + + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_order.jmx + + + + #${order_number} + + Assertion.response_data + false + 2 + + + + false + order_status + <span id="order_status">([^<]+)</span> + $1$ + + 1 + simple_products + + + + + + "${order_status}" == "Pending" + false + tool/fragments/ce/admin_edit_order/if_controller.jmx + + + + + + true + pending + = + true + history[status] + false + + + true + Some text + = + true + history[comment] + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/addComment/order_id/${order_id}/?isAjax=true + POST + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/add_comment.jmx + + + + Not Notified + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_start.jmx + + + + Invoice Totals + + Assertion.response_data + false + 2 + + + + false + item_ids + <div id="order_item_(\d+)_title"\s*class="product-title"> + $1$ + + -1 + simple_products + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + invoice[items][${item_ids_1}] + + + true + 1 + = + true + invoice[items][${item_ids_2}] + + + true + Invoiced + = + true + invoice[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx + + + + The invoice has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/shipment_start.jmx + + + + New Shipment + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + shipment[items][${item_ids_1}] + + + true + 1 + = + true + shipment[items][${item_ids_2}] + + + true + Shipped + = + true + shipment[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/shipment_submit.jmx + + + + The shipment has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + + + continue + + false + ${loops} + + ${restAPIcombinedBenchmarkPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + javascript + + + + var cacheHitPercent = vars.get("cache_hits_percentage"); + +if ( + cacheHitPercent < 100 && + sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' +) { + doCache(); +} + +function doCache(){ + var random = Math.random() * 100; + if (cacheHitPercent < random) { + sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); + } +} + + tool/fragments/ce/common/cache_hit_miss.jmx + + + + 1 + false + 1 + ${cBrowseCatalogByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Catalog Browsing By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + true + identifier + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + home + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/api/get_home_page.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + 1 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/categories + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_categories.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + category_id + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${category_id} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + true + 12 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_products_by_category_id.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_configurable_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + 1 + false + 1 + ${cSiteSearchPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Site Search"); + + true + + + + + ${files_folder}search_terms.csv + UTF-8 + + , + false + true + false + shareMode.thread + tool/fragments/ce/search/search_terms.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + 1 + false + 1 + ${searchQuickPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Quick Search"); + + true + + + + + + + + true + identifier + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + home + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/api/get_home_page.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + quick_search_container + = + true + searchCriteria[request_name] + + + true + search_term + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${searchTerm} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + 20 + = + true + searchCriteria[page_size] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/search + GET + true + false + true + false + false + + tool/fragments/ce/api/search_quick.jmx + + + + api_search_products_query_total_count + $.total_count + + + BODY + + + + String totalCount=vars.get("api_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + false + product_ids + "id":([^',]+) + $1$ + + -1 + + + + attribute_code_1 + $.aggregations.buckets[1].name + + + BODY + + + + attribute_value_1 + $.aggregations.buckets[1].values[0].value + + + BODY + + + + attribute_code_2 + $.aggregations.buckets[2].name + + + BODY + + + + attribute_value_2 + $.aggregations.buckets[2].values[0].value + + + BODY + + + + + + +foundProducts = Integer.parseInt(vars.get("product_ids_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items_by_id.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup_by_id.jmx + +number = vars.get("_counter"); +product = vars.get("product_ids_"+number); + +vars.put("product_id", product); + + + + true + + + + + + + + false + entity_id + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_id} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_id.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + 1 + false + 1 + ${searchQuickFilterPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Quick Search With Filtration"); + + true + + + + + + + + true + identifier + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + home + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/api/get_home_page.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + quick_search_container + = + true + searchCriteria[request_name] + + + true + search_term + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${searchTerm} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + 20 + = + true + searchCriteria[page_size] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/search + GET + true + false + true + false + false + + tool/fragments/ce/api/search_quick.jmx + + + + api_search_products_query_total_count + $.total_count + + + BODY + + + + String totalCount=vars.get("api_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + false + product_ids + "id":([^',]+) + $1$ + + -1 + + + + attribute_code_1 + $.aggregations.buckets[1].name + + + BODY + + + + attribute_value_1 + $.aggregations.buckets[1].values[0].value + + + BODY + + + + attribute_code_2 + $.aggregations.buckets[2].name + + + BODY + + + + attribute_value_2 + $.aggregations.buckets[2].values[0].value + + + BODY + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/api/searched_attributes_setup.jmx + +number = vars.get("_counter"); +attribute_code = vars.get("attribute_code_"+number); + +attribute_code = attribute_code.replace("_bucket", ""); + +vars.put("attribute_code", attribute_code); + +attribute_value = vars.get("attribute_value_"+number); + +vars.put("attribute_value", attribute_value); + + + + true + + + + + + + + true + quick_search_container + = + true + searchCriteria[request_name] + + + true + search_term + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${searchTerm} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + ${attribute_code} + = + true + searchCriteria[filter_groups][1][filters][0][field] + + + true + ${attribute_value} + = + true + searchCriteria[filter_groups][1][filters][0][value] + + + true + 20 + = + true + searchCriteria[page_size] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/search + GET + true + false + true + false + false + + tool/fragments/ce/api/search_quick_filter_attribute.jmx + + + + api_search_products_query_total_count + $.total_count + + + BODY + + + + String totalCount=vars.get("api_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + false + product_ids + "id":([^',]+) + $1$ + + -1 + + + + + + + +foundProducts = Integer.parseInt(vars.get("product_ids_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items_by_id.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup_by_id.jmx + +number = vars.get("_counter"); +product = vars.get("product_ids_"+number); + +vars.put("product_id", product); + + + + true + + + + + + + + false + entity_id + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_id} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_id.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + 1 + false + 1 + ${searchAdvancedPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Advanced Search"); + + true + + + + + + + + true + identifier + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + home + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/api/get_home_page.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + quick_search_container + = + true + searchCriteria[request_name] + + + true + search_term + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${searchTerm} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + price.to + = + true + searchCriteria[filter_groups][1][filters][0][field] + + + true + ${priceTo} + = + true + searchCriteria[filter_groups][1][filters][0][value] + + + true + 20 + = + true + searchCriteria[page_size] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/search + GET + true + false + true + false + false + + tool/fragments/ce/api/search_advanced.jmx + + + + api_search_products_query_total_count + $.total_count + + + BODY + + + + String totalCount=vars.get("api_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + false + product_ids + "id":([^',]+) + $1$ + + -1 + + + + + + +foundProducts = Integer.parseInt(vars.get("product_ids_matchNr")); + +if (foundProducts > 3) { + foundProducts = 3; +} + +vars.put("foundProducts", String.valueOf(foundProducts)); + + + + true + tool/fragments/ce/search/set_found_items_by_id.jmx + + + + true + ${foundProducts} + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + tool/fragments/ce/search/searched_products_setup_by_id.jmx + +number = vars.get("_counter"); +product = vars.get("product_ids_"+number); + +vars.put("product_id", product); + + + + true + + + + + + + + false + entity_id + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_id} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_id.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + + + 1 + false + 1 + ${cAddToCartByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Add To Cart By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/ + POST + true + false + true + false + false + + tool/fragments/ce/api/create_guest_cart.jmx + + + cart_id + $ + + + BODY + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + + + + + true + identifier + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + home + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/api/get_home_page.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + 1 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/categories + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_categories.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + category_id + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${category_id} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + true + 12 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_products_by_category_id.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + true + + + + false + { + "cartItem": { + "sku": "${product_sku}", + "qty":"1", + "quote_id":"${cart_id}" + } +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/items + POST + true + false + true + false + false + + tool/fragments/ce/api/guest_checkout/add_simple_product_to_cart.jmx + + + + $.quote_id + ^[a-z0-9-]+$ + true + false + false + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_configurable_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/configurable-products/${product_sku}/children + GET + true + false + true + false + false + + tool/fragments/ce/api/get_configurable_product_options_by_product_sku.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $[0].sku + + false + false + false + false + + + + + product_option + $[0].sku + + + BODY + tool/fragments/ce/api/extract_configurable_product_option_from_product_detail.jmx + + + + + true + + + + false + { + "cartItem": { + "sku": "${product_option}", + "qty":"1", + "quote_id":"${cart_id}" + } +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/items + POST + true + false + true + false + false + + tool/fragments/ce/api/guest_checkout/add_configurable_product_to_cart.jmx + + + + $.quote_id + ^[a-z0-9-]+$ + true + false + false + + + + + + + + + 1 + false + 1 + ${cAddToWishlistPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Add to Wishlist"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + 5 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + 1 + false + 1 + ${cCompareProductsPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Compare Products"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + + + + true + identifier + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + home + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/api/get_home_page.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + 1 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/categories + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_categories.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + category_id + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${category_id} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + true + 12 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_products_by_category_id.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_configurable_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + 1 + false + 1 + ${cCheckoutByGuestPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Checkout By Guest"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + true + + + + false + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/ + POST + true + false + true + false + false + + tool/fragments/ce/api/create_guest_cart.jmx + + + cart_id + $ + + + BODY + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + + + + + true + identifier + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + home + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/api/get_home_page.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + 1 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/categories + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_categories.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + category_id + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${category_id} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + true + 12 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_products_by_category_id.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + true + + + + false + { + "cartItem": { + "sku": "${product_sku}", + "qty":"1", + "quote_id":"${cart_id}" + } +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/items + POST + true + false + true + false + false + + tool/fragments/ce/api/guest_checkout/add_simple_product_to_cart.jmx + + + + $.quote_id + ^[a-z0-9-]+$ + true + false + false + + + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_configurable_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/configurable-products/${product_sku}/children + GET + true + false + true + false + false + + tool/fragments/ce/api/get_configurable_product_options_by_product_sku.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $[0].sku + + false + false + false + false + + + + + product_option + $[0].sku + + + BODY + tool/fragments/ce/api/extract_configurable_product_option_from_product_detail.jmx + + + + + true + + + + false + { + "cartItem": { + "sku": "${product_option}", + "qty":"1", + "quote_id":"${cart_id}" + } +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/items + POST + true + false + true + false + false + + tool/fragments/ce/api/guest_checkout/add_configurable_product_to_cart.jmx + + + + $.quote_id + ^[a-z0-9-]+$ + true + false + false + + + + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + true + + + + false + {"address":{"country_id":"US","postcode":"95630"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods + POST + true + false + true + false + false + + tool/fragments/ce/api/guest_checkout/checkout_estimate_shipping_methods_with_postal_code.jmx + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/shipping-information + POST + true + false + true + false + false + + tool/fragments/ce/api/guest_checkout/checkout_billing_shipping_information.jmx + + + + + {"payment_methods": + + Assertion.response_data + false + 2 + + + + + + true + + + + false + {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname","save_in_address_book":0}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information + POST + true + false + true + false + false + + tool/fragments/ce/api/guest_checkout/checkout_payment_info_place_order.jmx + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + order_id + $ + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + + + + 1 + false + 1 + ${cCheckoutByCustomerPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Checkout By Customer"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + javascript + + + + random = vars.getObject("randomIntGenerator"); + +var categories = props.get("categories"); +number = random.nextInt(categories.length); + +vars.put("category_url_key", categories[number].url_key); +vars.put("category_name", categories[number].name); +vars.put("category_id", categories[number].id); +vars.putObject("category", categories[number]); + + tool/fragments/ce/common/extract_category_setup.jmx + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + true + + + + false + { + "username": "${customer_email}", + "password": "${customer_password}" +} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/integration/customer/token + POST + true + false + true + false + false + + tool/fragments/ce/api/login.jmx + + + + customer_token + $ + + + BODY + + + + $ + + false + false + false + false + + + + + + true + + + + false + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine + POST + true + false + true + false + false + + tool/fragments/ce/api/create_customer_cart.jmx + + + + cart_id + $ + + + BODY + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/graphql/set_customer_token.jmx + + + + + + + + + true + identifier + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + home + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/cmsPage/search + GET + true + false + true + false + false + + tool/fragments/ce/api/get_home_page.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + 1 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/categories + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_categories.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + + + + true + category_id + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + true + ${category_id} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + true + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + true + 12 + = + true + searchCriteria[page_size] + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_list_of_products_by_category_id.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + + + true + 2 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_simple_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + true + + + + false + { + "cartItem": { + "sku": "${product_sku}", + "qty":"1", + "quote_id":"${cart_id}" + } +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/items + POST + true + false + true + false + false + + tool/fragments/ce/api/customer_checkout/add_simple_product_to_cart.jmx + + + + $.quote_id + ^[a-z0-9-]+$ + true + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/api/set_customer_token.jmx + + + + + true + 1 + tool/fragments/ce/loop_controller.jmx + + + 1 + + 1 + _counter + + true + true + + + + + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("configurable_products_list").get(number); + +vars.put("product_url_key", product.get("url_key")); +vars.put("product_id", product.get("id")); +vars.put("product_name", product.get("title")); +vars.put("product_uenc", product.get("uenc")); +vars.put("product_sku", product.get("sku")); + + + + true + tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx + + + + + + + false + url_key + = + true + searchCriteria[filter_groups][0][filters][0][field] + + + false + ${product_url_key} + = + true + searchCriteria[filter_groups][0][filters][0][value] + + + false + eq + = + true + searchCriteria[filter_groups][0][filters][0][condition_type] + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/products + GET + true + false + true + false + false + + tool/fragments/ce/api/get_configurable_product_details_by_product_url_key.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $.items[0].sku + + false + false + false + false + + + + + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/configurable-products/${product_sku}/children + GET + true + false + true + false + false + + tool/fragments/ce/api/get_configurable_product_options_by_product_sku.jmx + + + + + errors + + Assertion.response_data + false + 6 + variable + + + + + $[0].sku + + false + false + false + false + + + + + product_option + $[0].sku + + + BODY + tool/fragments/ce/api/extract_configurable_product_option_from_product_detail.jmx + + + + + true + + + + false + { + "cartItem": { + "sku": "${product_option}", + "qty":"1", + "quote_id":"${cart_id}" + } +} + + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/items + POST + true + false + true + false + false + + tool/fragments/ce/api/customer_checkout/add_configurable_product_to_cart.jmx + + + + $.quote_id + ^[a-z0-9-]+$ + true + false + false + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/api/set_customer_token.jmx + + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + true + + + + false + {"address":{"country_id":"US","postcode":"95630"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/estimate-shipping-methods + POST + true + false + true + false + false + + tool/fragments/ce/api/customer_checkout/checkout_estimate_shipping_methods_with_postal_code.jmx + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/api/set_customer_token.jmx + + + + true + + + + false + {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/shipping-information + POST + true + false + true + false + false + + tool/fragments/ce/api/customer_checkout/checkout_billing_shipping_information.jmx + + + + + {"payment_methods": + + Assertion.response_data + false + 2 + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/api/set_customer_token.jmx + + + + true + + + + false + {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname","save_in_address_book":0}} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/payment-information + POST + true + false + true + false + false + + tool/fragments/ce/api/customer_checkout/checkout_payment_info_place_order.jmx + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + order_id + $ + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + tool/fragments/ce/api/set_customer_token.jmx + + + + return-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/return_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + + + true + + + + + + + + 1 + false + 1 + ${cAccountManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Account management"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + get-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUser = customerUserList.poll(); +if (customerUser == null) { + SampleResult.setResponseMessage("customerUser list is empty"); + SampleResult.setResponseData("customerUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("customer_email", customerUser); + + + + true + + + + + + + + + true + customer_email + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + ${customer_email} + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + 20 + = + true + searchCriteria[pageSize] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/orders + GET + true + false + true + false + false + + tool/fragments/ce/api/customer_orders.jmx + + + + order_number + $.items[0].increment_id + NOT_FOUND + + BODY + + + + + + tool/fragments/ce/api/if_orders.jmx + "${order_number}" != "NOT_FOUND" + false + + + + + + + true + increment_id + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + ${order_number} + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + 20 + = + true + searchCriteria[pageSize] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/orders + GET + true + false + true + false + false + + tool/fragments/ce/api/if_orders.jmx + + + + $.items[0].increment_id + + false + false + false + false + + + + + + + return-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/return_customer_email.jmx + +customerUserList = props.get("customer_emails_list"); +customerUserList.add(vars.get("customer_email")); + + + + true + + + + + + + + 1 + false + 1 + ${cAdminCMSManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin CMS Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_cms_management/admin_cms_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/ + GET + true + false + true + false + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/new + GET + true + false + true + false + false + + + + + + + + true + <p>CMS Content ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + content + + + true + + = + true + content_heading + + + true + ${admin_form_key} + = + true + form_key + + + true + + = + true + identifier + + + true + 1 + = + true + is_active + + + true + + = + true + layout_update_xml + + + true + + = + true + meta_description + + + true + + = + true + meta_keywords + + + true + + = + true + meta_title + + + false + {} + = + true + nodes_data + + + true + + = + true + node_ids + + + true + + = + true + page_id + + + true + 1column + = + true + page_layout + + + true + 0 + = + true + store_id[0] + + + true + CMS Title ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + title + + + true + 0 + = + true + website_root + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/cms/page/save/ + POST + true + false + true + false + false + + + + + + You saved the page. + + Assertion.response_data + false + 16 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCMSManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseProductGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Browse Product Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Product"); + + pagesCount = parseInt(vars.get("products_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "product_listing"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_product_filter_text")); + vars.put("grid_filter_field", "name"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "name"); + vars.put("grid_sort_field_2", "price"); + vars.put("grid_sort_field_3", "attribute_set_id"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_products_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseOrderGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Browse Order Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Order"); + + pagesCount = parseInt(vars.get("orders_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "sales_order_grid"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_orders_filter_text")); + vars.put("grid_filter_field", "status"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "increment_id"); + vars.put("grid_sort_field_2", "created_at"); + vars.put("grid_sort_field_3", "billing_name"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_orders_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminProductCreationPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Create Product"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/once_only_controller.jmx + + + + tool/fragments/ce/admin_create_product/get_related_product_id.jmx + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +relatedIndex = random.nextInt(props.get("simple_products_list").size()); +vars.put("related_product_id", props.get("simple_products_list").get(relatedIndex).get("id")); + + + true + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + + + + false + mycolor + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + false + attribute_code + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + false + mysize + = + true + searchCriteria[filterGroups][0][filters][1][value] + + + false + attribute_code + = + true + searchCriteria[filterGroups][0][filters][1][field] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/attributes + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/get_product_attributes.jmx + + + product_attributes + $.items + + + BODY + + + + javascript + + + + +var attributesData = JSON.parse(vars.get("product_attributes")), +maxOptions = 2; + +attributes = []; +for (i in attributesData) { + if (i >= 2) { + break; + } + var data = attributesData[i], + attribute = { + "id": data.attribute_id, + "code": data.attribute_code, + "label": data.default_frontend_label, + "options": [] + }; + + var processedOptions = 0; + for (optionN in data.options) { + var option = data.options[optionN]; + if (parseInt(option.value) > 0 && processedOptions < maxOptions) { + processedOptions++; + attribute.options.push(option); + } + } + attributes.push(attribute); +} + +vars.putObject("product_attributes", attributes); + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product_set/index/filter/${attribute_set_filter} + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_setup_attribute_set.jmx + + + + false + attribute_set_id + catalog&#x2F;product_set&#x2F;edit&#x2F;id&#x2F;([\d]+)&#x2F;"[\D\d]*Attribute Set 1 + $1$ + + 1 + + + + false + + + import org.apache.commons.codec.binary.Base64; + +byte[] encodedBytes = Base64.encodeBase64("set_name=Attribute Set 1".getBytes()); +vars.put("attribute_set_filter", new String(encodedBytes)); + + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +int number1; + +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +number = random.nextInt(props.get("simple_products_list_for_edit").size()); + +simpleList = props.get("simple_products_list_for_edit").get(number); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_name", simpleList.get("title")); + +do { + number1 = random.nextInt(props.get("simple_products_list_for_edit").size()); +} while(number == number1); +simpleList = props.get("simple_products_list_for_edit").get(number1); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_name", simpleList.get("title")); + +number2 = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number2); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); + +//Additional category to be added +//int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); +//vars.put("category_additional", (categoryId+1).toString()); +//New price +vars.put("price_new", "9999"); +//New special price +vars.put("special_price_new", "8888"); +//New quantity +vars.put("quantity_new", "100600"); +vars.put("configurable_sku", "Configurable Product - ${__time(YMD)}-${__threadNum}-${__Random(1,1000000)}"); + + + + + true + tool/fragments/ce/admin_create_product/setup.jmx + + + + tool/fragments/ce/admin_create_product/create_bundle_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/bundle/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 42 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[configurable_variations] + + + true + 1 + = + true + affect_configurable_product_attributes + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + new-variations-attribute-set-id + + + true + 0 + = + true + product[shipment_type] + + + true + option title one + = + true + bundle_options[bundle_options][0][title] + + + true + + = + true + bundle_options[bundle_options][0][option_id] + + + true + + = + true + bundle_options[bundle_options][0][delete] + + + true + select + = + true + bundle_options[bundle_options][0][type] + + + true + 1 + = + true + bundle_options[bundle_options][0][required] + + + true + 0 + = + true + bundle_options[bundle_options][0][position] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][option_id] + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][0][bundle_selections][0][product_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][delete] + + + true + 25 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][0][position] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][option_id] + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][0][bundle_selections][1][product_id] + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][delete] + + + true + 10.99 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][position] + + + true + option title two + = + true + bundle_options[bundle_options][1][title] + + + true + + = + true + bundle_options[bundle_options][1][option_id] + + + true + + = + true + bundle_options[bundle_options][1][delete] + + + true + select + = + true + bundle_options[bundle_options][1][type] + + + true + 1 + = + true + bundle_options[bundle_options][1][required] + + + true + 1 + = + true + bundle_options[bundle_options][1][position] + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][option_id] + true + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][1][bundle_selections][0][product_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][delete] + true + + + true + 5.00 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][position] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][option_id] + true + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][1][bundle_selections][1][product_id] + true + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][delete] + true + + + true + 7.00 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] + true + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] + true + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][position] + true + + + true + 2 + = + true + affect_bundle_product_selections + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 42 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full bundle product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[configurable_variations] + + + true + 1 + = + true + affect_configurable_product_attributes + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + new-variations-attribute-set-id + + + true + 0 + = + true + product[shipment_type] + false + + + true + option title one + = + true + bundle_options[bundle_options][0][title] + false + + + true + + = + true + bundle_options[bundle_options][0][option_id] + false + + + true + + = + true + bundle_options[bundle_options][0][delete] + false + + + true + select + = + true + bundle_options[bundle_options][0][type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][required] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][position] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][option_id] + false + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][0][bundle_selections][0][product_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][0][delete] + false + + + true + 25 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][0][position] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][option_id] + false + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][0][bundle_selections][1][product_id] + false + + + true + + = + true + bundle_options[bundle_options][0][bundle_selections][1][delete] + false + + + true + 10.99 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][0][bundle_selections][1][position] + false + + + true + option title two + = + true + bundle_options[bundle_options][1][title] + false + + + true + + = + true + bundle_options[bundle_options][1][option_id] + false + + + true + + = + true + bundle_options[bundle_options][1][delete] + false + + + true + select + = + true + bundle_options[bundle_options][1][type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][required] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][position] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][option_id] + false + + + true + ${simple_product_1_id} + = + true + bundle_options[bundle_options][1][bundle_selections][0][product_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][0][delete] + false + + + true + 5.00 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][0][position] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][option_id] + false + + + true + ${simple_product_2_id} + = + true + bundle_options[bundle_options][1][bundle_selections][1][product_id] + false + + + true + + = + true + bundle_options[bundle_options][1][bundle_selections][1][delete] + false + + + true + 7.00 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] + false + + + true + 0 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] + false + + + true + 1 + = + true + bundle_options[bundle_options][1][bundle_selections][1][position] + false + + + true + 2 + = + true + affect_bundle_product_selections + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/bundle/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + option title one + option title two + ${simple_product_2_name} + ${simple_product_1_name} + + + Assertion.response_data + false + 2 + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/open_catalog_grid.jmx + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/${attribute_set_id}/type/configurable/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_product/new_configurable.jmx + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + ${admin_form_key} + = + true + form_key + true + + + true + ${attribute_set_id} + = + true + new-variations-attribute-set-id + true + + + true + 1 + = + true + product[affect_product_custom_options] + true + + + true + ${attribute_set_id} + = + true + product[attribute_set_id] + true + + + true + 4 + = + true + product[category_ids][0] + true + + + true + + = + true + product[custom_layout_update] + true + + + true + + = + true + product[description] + true + + + true + 0 + = + true + product[gift_message_available] + true + + + true + 1 + = + true + product[gift_wrapping_available] + true + + + true + + = + true + product[gift_wrapping_price] + true + + + true + + = + true + product[image] + true + + + true + 2 + = + true + product[is_returnable] + true + + + true + ${configurable_sku} - Meta Description + = + true + product[meta_description] + true + + + true + ${configurable_sku} - Meta Keyword + = + true + product[meta_keyword] + true + + + true + ${configurable_sku} - Meta Title + = + true + product[meta_title] + true + + + true + ${configurable_sku} + = + true + product[name] + true + + + true + container2 + = + true + product[options_container] + true + + + true + ${price_new} + = + true + product[price] + true + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + true + + + true + 1000 + = + true + product[quantity_and_stock_status][qty] + true + + + true + + = + true + product[short_description] + true + + + true + ${configurable_sku} + = + true + product[sku] + true + + + true + + = + true + product[small_image] + true + + + true + ${special_price_new} + = + true + product[special_price] + true + + + true + 1 + = + true + product[status] + true + + + true + 0 + = + true + product[stock_data][backorders] + true + + + true + 1 + = + true + product[stock_data][deferred_stock_update] + true + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + true + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + true + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + true + + + true + 1 + = + true + product[stock_data][manage_stock] + true + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + true + + + true + 0 + = + true + product[stock_data][min_qty] + true + + + true + 1 + = + true + product[stock_data][min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_backorders] + true + + + true + 1 + = + true + product[stock_data][use_config_deferred_stock_update] + true + + + true + 1 + = + true + product[stock_data][use_config_enable_qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + true + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + true + + + true + 2 + = + true + product[tax_class_id] + true + + + true + + = + true + product[thumbnail] + true + + + true + + = + true + product[url_key] + true + + + true + 1 + = + true + product[use_config_gift_message_available] + true + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + true + + + true + 1 + = + true + product[use_config_is_returnable] + true + + + true + 4 + = + true + product[visibility] + true + + + true + 1 + = + true + product[website_ids][1] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/${attribute_set_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_validate.jmx + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + javascript + + + + +attributes = vars.getObject("product_attributes"); + +for (i in attributes) { + var attribute = attributes[i]; + sampler.addArgument("attribute_codes[" + i + "]", attribute.code); + sampler.addArgument("attributes[" + i + "]", attribute.id); + sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); + addConfigurableAttributeData(attribute); +} + +addConfigurableMatrix(attributes); + +function addConfigurableAttributeData(attribute) { + var attributeId = attribute.id; + + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); + attribute.options.forEach(function (option, index) { + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); + }); +} + +/** + * Build 4 simple products for Configurable + */ +function addConfigurableMatrix(attributes) { + + var attribute1 = attributes[0], + attribute2 = attributes[1], + productIndex = 1, + products = []; + var variationNames = []; + attribute1.options.forEach(function (option1) { + attribute2.options.forEach(function (option2) { + var productAttributes = {}, + namePart = option1.label + "+" + option2.label, + variationKey = option1.value + "-" + option2.value; + productAttributes[attribute1.code] = option1.value; + productAttributes[attribute2.code] = option2.value; + + variationNames.push(namePart + " - " + vars.get("configurable_sku")); + var product = { + "id": null, + "name": namePart + " - " + vars.get("configurable_sku"), + "sku": namePart + " - " + vars.get("configurable_sku"), + "status": 1, + "price": "100", + "price_currency": "$", + "price_string": "$100", + "weight": "6", + "qty": "50", + "variationKey": variationKey, + "configurable_attribute": JSON.stringify(productAttributes), + "thumbnail_image": "", + "media_gallery": {"images": {}}, + "image": [], + "was_changed": true, + "canEdit": 1, + "newProduct": 1, + "record_id": productIndex + }; + productIndex++; + products.push(product); + }); + }); + + sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); + vars.putObject("configurable_variations_assertion", variationNames); +} + + tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + ${admin_form_key} + = + true + form_key + true + + + true + ${attribute_set_id} + = + true + new-variations-attribute-set-id + true + + + true + 1 + = + true + product[affect_product_custom_options] + true + + + true + ${attribute_set_id} + = + true + product[attribute_set_id] + true + + + true + 2 + = + true + product[category_ids][0] + true + + + true + + = + true + product[custom_layout_update] + true + + + true + + = + true + product[description] + true + + + true + 0 + = + true + product[gift_message_available] + true + + + true + 1 + = + true + product[gift_wrapping_available] + true + + + true + + = + true + product[gift_wrapping_price] + true + + + true + + = + true + product[image] + true + + + true + 2 + = + true + product[is_returnable] + true + + + true + ${configurable_sku} - Meta Description + = + true + product[meta_description] + true + + + true + ${configurable_sku} - Meta Keyword + = + true + product[meta_keyword] + true + + + true + ${configurable_sku} - Meta Title + = + true + product[meta_title] + true + + + true + ${configurable_sku} + = + true + product[name] + true + + + true + container2 + = + true + product[options_container] + true + + + true + ${price_new} + = + true + product[price] + true + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + true + + + true + 1000 + = + true + product[quantity_and_stock_status][qty] + true + + + true + + = + true + product[short_description] + true + + + true + ${configurable_sku} + = + true + product[sku] + true + + + true + + = + true + product[small_image] + true + + + true + ${special_price_new} + = + true + product[special_price] + true + + + true + 1 + = + true + product[status] + true + + + true + 0 + = + true + product[stock_data][backorders] + true + + + true + 1 + = + true + product[stock_data][deferred_stock_update] + true + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + true + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + true + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + true + + + true + 1 + = + true + product[stock_data][manage_stock] + true + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + true + + + true + 0 + = + true + product[stock_data][min_qty] + true + + + true + 1 + = + true + product[stock_data][min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_backorders] + true + + + true + 1 + = + true + product[stock_data][use_config_deferred_stock_update] + true + + + true + 1 + = + true + product[stock_data][use_config_enable_qty_increments] + true + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + true + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + true + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + true + + + true + 2 + = + true + product[tax_class_id] + true + + + true + + = + true + product[thumbnail] + true + + + true + + = + true + product[url_key] + true + + + true + 1 + = + true + product[use_config_gift_message_available] + true + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + true + + + true + 1 + = + true + product[use_config_is_returnable] + true + + + true + 4 + = + true + product[visibility] + true + + + true + 1 + = + true + product[website_ids][1] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/${attribute_set_id}/type/configurable/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_product/configurable_save.jmx + + + + You saved the product + + Assertion.response_data + false + 2 + + + + javascript + + + + +var configurableVariations = vars.getObject("configurable_variations_assertion"), +response = SampleResult.getResponseDataAsString(); + +configurableVariations.forEach(function (variation) { + if (response.indexOf(variation) == -1) { + AssertionResult.setFailureMessage("Cannot find variation \"" + variation + "\""); + AssertionResult.setFailure(true); + } +}); + + + + + + javascript + + + + +attributes = vars.getObject("product_attributes"); + +for (i in attributes) { + var attribute = attributes[i]; + sampler.addArgument("attribute_codes[" + i + "]", attribute.code); + sampler.addArgument("attributes[" + i + "]", attribute.id); + sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); + addConfigurableAttributeData(attribute); +} + +addConfigurableMatrix(attributes); + +function addConfigurableAttributeData(attribute) { + var attributeId = attribute.id; + + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); + attribute.options.forEach(function (option, index) { + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); + sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); + }); +} + +/** + * Build 4 simple products for Configurable + */ +function addConfigurableMatrix(attributes) { + + var attribute1 = attributes[0], + attribute2 = attributes[1], + productIndex = 1, + products = []; + var variationNames = []; + attribute1.options.forEach(function (option1) { + attribute2.options.forEach(function (option2) { + var productAttributes = {}, + namePart = option1.label + "+" + option2.label, + variationKey = option1.value + "-" + option2.value; + productAttributes[attribute1.code] = option1.value; + productAttributes[attribute2.code] = option2.value; + + variationNames.push(namePart + " - " + vars.get("configurable_sku")); + var product = { + "id": null, + "name": namePart + " - " + vars.get("configurable_sku"), + "sku": namePart + " - " + vars.get("configurable_sku"), + "status": 1, + "price": "100", + "price_currency": "$", + "price_string": "$100", + "weight": "6", + "qty": "50", + "variationKey": variationKey, + "configurable_attribute": JSON.stringify(productAttributes), + "thumbnail_image": "", + "media_gallery": {"images": {}}, + "image": [], + "was_changed": true, + "canEdit": 1, + "newProduct": 1, + "record_id": productIndex + }; + productIndex++; + products.push(product); + }); + }); + + sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); + vars.putObject("configurable_variations_assertion", variationNames); +} + + tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx + + + + + + tool/fragments/ce/admin_create_product/create_downloadable_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/downloadable/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + ${files_folder}downloadable_original.txt + links + text/plain + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/downloadable_file/upload/type/links/?isAjax=true + POST + false + false + true + true + false + + + + + original_file + $.file + + + BODY + + + + + + + + ${files_folder}downloadable_sample.txt + samples + text/plain + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/downloadable_file/upload/type/samples/?isAjax=true + POST + false + false + true + true + false + + + + + sample_file + $.file + + + BODY + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + on + = + true + is_downloadable + + + true + Links + = + true + product[links_title] + + + true + 0 + = + true + product[links_purchased_separately] + + + true + ${original_file} + = + true + downloadable[link][0][file][0][file] + false + + + true + downloadable_original.txt + = + true + downloadable[link][0][file][0][name] + false + + + true + 13 + = + true + downloadable[link][0][file][0][size] + false + + + true + new + = + true + downloadable[link][0][file][0][status] + false + + + true + 1 + = + true + downloadable[link][0][is_shareable] + + + true + 0 + = + true + downloadable[link][0][is_unlimited] + + + true + + = + true + downloadable[link][0][link_url] + + + true + 0 + = + true + downloadable[link][0][number_of_downloads] + true + + + true + 120 + = + true + downloadable[link][0][price] + true + + + true + 0 + = + true + downloadable[link][0][record_id] + true + + + true + file + = + true + downloadable[link][0][sample][type] + + + true + + = + true + downloadable[link][0][sample][url] + + + true + 1 + = + true + downloadable[link][0][sort_order] + + + true + Original Link + = + true + downloadable[link][0][title] + + + true + file + = + true + downloadable[link][0][type] + + + true + ${sample_file} + = + true + downloadable[sample][0][file][0][file] + true + + + true + downloadable_sample.txt + = + true + downloadable[sample][0][file][0][name] + true + + + true + 14 + = + true + downloadable[sample][0][file][0][size] + true + + + true + new + = + true + downloadable[sample][0][file][0][status] + true + + + true + 0 + = + true + downloadable[sample][0][record_id] + true + + + true + + = + true + downloadable[sample][0][sample_url] + true + + + true + 1 + = + true + downloadable[sample][0][sort_order] + true + + + true + Sample Link + = + true + downloadable[sample][0][title] + true + + + true + file + = + true + downloadable[sample][0][type] + true + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + 4 + = + true + new-variations-attribute-set-id + false + + + true + + = + true + product[configurable_variation] + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/type/downloadable/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + false + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + ${original_file} + = + true + downloadable[link][0][file][0][file] + false + + + true + downloadable_original.txt + = + true + downloadable[link][0][file][0][name] + false + + + true + 13 + = + true + downloadable[link][0][file][0][size] + false + + + true + new + = + true + downloadable[link][0][file][0][status] + false + + + true + 1 + = + true + downloadable[link][0][is_shareable] + true + + + true + 0 + = + true + downloadable[link][0][is_unlimited] + true + + + true + + = + true + downloadable[link][0][link_url] + true + + + true + 0 + = + true + downloadable[link][0][number_of_downloads] + false + + + true + 120 + = + true + downloadable[link][0][price] + false + + + true + 0 + = + true + downloadable[link][0][record_id] + false + + + true + file + = + true + downloadable[link][0][sample][type] + true + + + true + + = + true + downloadable[link][0][sample][url] + true + + + true + 1 + = + true + downloadable[link][0][sort_order] + true + + + true + Original Link + = + true + downloadable[link][0][title] + true + + + true + file + = + true + downloadable[link][0][type] + true + + + true + ${sample_file} + = + true + downloadable[sample][0][file][0][file] + true + + + true + downloadable_sample.txt + = + true + downloadable[sample][0][file][0][name] + true + + + true + 14 + = + true + downloadable[sample][0][file][0][size] + true + + + true + new + = + true + downloadable[sample][0][file][0][status] + true + + + true + 0 + = + true + downloadable[sample][0][record_id] + true + + + true + + = + true + downloadable[sample][0][sample_url] + true + + + true + 1 + = + true + downloadable[sample][0][sort_order] + true + + + true + Sample Link + = + true + downloadable[sample][0][title] + true + + + true + file + = + true + downloadable[sample][0][type] + true + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + 4 + = + true + new-variations-attribute-set-id + false + + + true + + = + true + product[configurable_variation] + false + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/downloadable/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + violation + + Assertion.response_data + false + 6 + + + + + + + tool/fragments/ce/admin_create_product/create_simple_product.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/ + GET + true + false + true + false + false + + + + + + records found + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/new/set/4/type/simple/ + GET + true + false + true + false + false + + + + + + New Product + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + product[options][1][is_delete] + false + + + true + 1 + = + true + product[options][1][is_require] + false + + + true + select + = + true + product[options][1][previous_group] + false + + + true + drop_down + = + true + product[options][1][previous_type] + false + + + true + 0 + = + true + product[options][1][sort_order] + false + + + true + Product Option Title One + = + true + product[options][1][title] + false + + + true + drop_down + = + true + product[options][1][type] + false + + + true + + = + true + product[options][1][values][1][is_delete] + false + + + true + 200 + = + true + product[options][1][values][1][price] + false + + + true + fixed + = + true + product[options][1][values][1][price_type] + false + + + true + sku-one + = + true + product[options][1][values][1][sku] + false + + + true + 0 + = + true + product[options][1][values][1][sort_order] + false + + + true + Row Title + = + true + product[options][1][values][1][title] + false + + + true + + = + true + product[options][2][is_delete] + false + + + true + 1 + = + true + product[options][2][is_require] + false + + + true + 250 + = + true + product[options][2][max_characters] + false + + + true + text + = + true + product[options][2][previous_group] + false + + + true + field + = + true + product[options][2][previous_type] + false + + + true + 500 + = + true + product[options][2][price] + false + + + true + fixed + = + true + product[options][2][price_type] + false + + + true + sku-two + = + true + product[options][2][sku] + false + + + true + 1 + = + true + product[options][2][sort_order] + false + + + true + Field Title + = + true + product[options][2][title] + false + + + true + field + = + true + product[options][2][type] + false + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + 4 + = + true + new-variations-attribute-set-id + true + + + true + + = + true + product[configurable_variation] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/set/4/ + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[name] + false + + + true + SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[sku] + false + + + true + 123 + = + true + product[price] + + + true + 2 + = + true + product[tax_class_id] + + + true + 111 + = + true + product[quantity_and_stock_status][qty] + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + + + true + 1.0000 + = + true + product[weight] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 2 + = + true + product[category_ids][] + + + true + <p>Full simple product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[description] + + + true + <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> + = + true + product[short_description] + + + true + 1 + = + true + product[status] + + + true + + = + true + product[image] + + + true + + = + true + product[small_image] + + + true + + = + true + product[thumbnail] + + + true + simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + product[url_key] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title + = + true + product[meta_title] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword + = + true + product[meta_keyword] + + + true + Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description + = + true + product[meta_description] + + + true + 1 + = + true + product[website_ids][] + + + true + 99 + = + true + product[special_price] + + + true + + = + true + product[special_from_date] + + + true + + = + true + product[special_to_date] + + + true + + = + true + product[cost] + + + true + 0 + = + true + product[tier_price][0][website_id] + + + true + 32000 + = + true + product[tier_price][0][cust_group] + + + true + 100 + = + true + product[tier_price][0][price_qty] + + + true + 90 + = + true + product[tier_price][0][price] + + + true + + = + true + product[tier_price][0][delete] + + + true + 0 + = + true + product[tier_price][1][website_id] + + + true + 1 + = + true + product[tier_price][1][cust_group] + + + true + 101 + = + true + product[tier_price][1][price_qty] + + + true + 99 + = + true + product[tier_price][1][price] + + + true + + = + true + product[tier_price][1][delete] + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + + + true + 100500 + = + true + product[stock_data][original_inventory_qty] + + + true + 100500 + = + true + product[stock_data][qty] + + + true + 0 + = + true + product[stock_data][min_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + + + true + 1 + = + true + product[stock_data][min_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + + + true + 0 + = + true + product[stock_data][backorders] + + + true + 1 + = + true + product[stock_data][use_config_backorders] + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + + + true + 0 + = + true + product[stock_data][qty_increments] + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + + + true + 1 + = + true + product[stock_data][is_in_stock] + + + true + + = + true + product[custom_design] + + + true + + = + true + product[custom_design_from] + + + true + + = + true + product[custom_design_to] + + + true + + = + true + product[custom_layout_update] + + + true + + = + true + product[page_layout] + + + true + container2 + = + true + product[options_container] + + + true + + = + true + product[options][1][is_delete] + true + + + true + 1 + = + true + product[options][1][is_require] + + + true + select + = + true + product[options][1][previous_group] + false + + + true + drop_down + = + true + product[options][1][previous_type] + false + + + true + 0 + = + true + product[options][1][sort_order] + false + + + true + Product Option Title One + = + true + product[options][1][title] + + + true + drop_down + = + true + product[options][1][type] + + + true + + = + true + product[options][1][values][1][is_delete] + false + + + true + 200 + = + true + product[options][1][values][1][price] + + + true + fixed + = + true + product[options][1][values][1][price_type] + + + true + sku-one + = + true + product[options][1][values][1][sku] + + + true + 0 + = + true + product[options][1][values][1][sort_order] + + + true + Row Title + = + true + product[options][1][values][1][title] + + + true + + = + true + product[options][2][is_delete] + false + + + true + 1 + = + true + product[options][2][is_require] + + + true + 250 + = + true + product[options][2][max_characters] + + + true + text + = + true + product[options][2][previous_group] + + + true + field + = + true + product[options][2][previous_type] + + + true + 500 + = + true + product[options][2][price] + + + true + fixed + = + true + product[options][2][price_type] + + + true + sku-two + = + true + product[options][2][sku] + + + true + 1 + = + true + product[options][2][sort_order] + + + true + Field Title + = + true + product[options][2][title] + + + true + field + = + true + product[options][2][type] + + + true + 1 + = + true + affect_configurable_product_attributes + true + + + true + 4 + = + true + new-variations-attribute-set-id + true + + + true + + = + true + product[configurable_variation] + true + + + true + ${related_product_id} + = + true + links[related][0][id] + + + true + 1 + = + true + links[related][0][position] + + + true + ${related_product_id} + = + true + links[upsell][0][id] + + + true + 1 + = + true + links[upsell][0][position] + + + true + ${related_product_id} + = + true + links[crosssell][0][id] + + + true + 1 + = + true + links[crosssell][0][position] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/set/4/type/simple/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + violation + + Assertion.response_data + false + 6 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminProductEditingPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Edit Product"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + tool/fragments/ce/admin_edit_product/admin_edit_product_updated.jmx + import java.util.ArrayList; + import java.util.HashMap; + import java.util.Random; + + int relatedIndex; + try { + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + simpleCount = props.get("simple_products_list_for_edit").size(); + configCount = props.get("configurable_products_list_for_edit").size(); + productCount = 0; + if (simpleCount > configCount) { + productCount = configCount; + } else { + productCount = simpleCount; + } + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + threadsNumber = 1; + } + //Current thread number starts from 0 + currentThreadNum = ctx.getThreadNum(); + + String siterator = vars.get("threadIterator_" + currentThreadNum.toString()); + iterator = 0; + if(siterator == null){ + vars.put("threadIterator_" + currentThreadNum.toString() , "0"); + } else { + iterator = Integer.parseInt(siterator); + iterator ++; + vars.put("threadIterator_" + currentThreadNum.toString() , iterator.toString()); + } + + //Number of products for one thread + productClusterLength = productCount / threadsNumber; + + if (iterator >= productClusterLength) { + vars.put("threadIterator_" + currentThreadNum.toString(), "0"); + iterator = 0; + } + + //Index of the current product from the cluster + i = productClusterLength * currentThreadNum + iterator; + + //ids of simple and configurable products to edit + vars.put("simple_product_id", props.get("simple_products_list_for_edit").get(i).get("id")); + vars.put("configurable_product_id", props.get("configurable_products_list_for_edit").get(i).get("id")); + + //id of related product + do { + relatedIndex = random.nextInt(props.get("simple_products_list_for_edit").size()); + } while(i == relatedIndex); + vars.put("related_product_id", props.get("simple_products_list_for_edit").get(relatedIndex).get("id")); + } catch (Exception ex) { + log.info("Script execution failed", ex); +} + + + false + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/edit/id/${simple_product_id}/ + GET + true + false + true + false + false + + + + + + Product + + Assertion.response_data + false + 16 + + + + false + simple_product_name + ,"name":"([^'"]+)", + $1$ + + 1 + + + + false + simple_product_sku + ,"sku":"([^'"]+)", + $1$ + + 1 + + + + false + simple_product_category_id + ,"category_ids":."(\d+)". + $1$ + + 1 + + + + + Passing arguments between threads + //Additional category to be added + import java.util.Random; + + Random randomGenerator = new Random(); + int newCategoryId; + if (${seedForRandom} > 0) { + randomGenerator.setSeed(${seedForRandom} + ${__threadNum}); + } + + int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); + categoryList = props.get("admin_category_ids_list"); + + if (categoryList.size() > 1) { + do { + int index = randomGenerator.nextInt(categoryList.size()); + newCategoryId = Integer.parseInt(categoryList.get(index)); + } while (categoryId == newCategoryId); + + vars.put("category_additional", newCategoryId.toString()); + } + + //New price + vars.put("price_new", "9999"); + //New special price + vars.put("special_price_new", "8888"); + //New quantity + vars.put("quantity_new", "100600"); + + + + false + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${simple_product_name} + = + true + product[name] + false + + + true + ${simple_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + ${quantity_new} + = + true + product[quantity_and_stock_status][qty] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 1.0000 + = + true + product[weight] + false + + + true + 1 + = + true + product[product_has_weight] + false + + + true + ${simple_product_category_id} + = + true + product[category_ids][] + false + + + true + <p>Full simple product Description ${simple_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + + = + true + product[configurable_variations] + false + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + + = + true + product[image] + false + + + true + + = + true + product[small_image] + false + + + true + + = + true + product[thumbnail] + false + + + true + ${simple_product_name} + = + true + product[url_key] + false + + + true + ${simple_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${simple_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${simple_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + ${quantity_new} + = + true + product[stock_data][original_inventory_qty] + false + + + true + ${quantity_new} + = + true + product[stock_data][qty] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + + = + true + new-variations-attribute-set-id + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/id/${simple_product_id}/?isAjax=true + POST + true + false + true + false + false + + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${simple_product_name} + = + true + product[name] + false + + + true + ${simple_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + ${quantity_new} + = + true + product[quantity_and_stock_status][qty] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 1.0000 + = + true + product[weight] + false + + + true + 1 + = + true + product[product_has_weight] + false + + + true + ${simple_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + + + true + <p>Full simple product Description ${simple_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + + = + true + product[configurable_variations] + false + + + true + 1 + = + true + affect_configurable_product_attributes + false + + + true + + = + true + product[image] + false + + + true + + = + true + product[small_image] + false + + + true + + = + true + product[thumbnail] + false + + + true + ${simple_product_name} + = + true + product[url_key] + false + + + true + ${simple_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${simple_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${simple_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + ${quantity_new} + = + true + product[stock_data][original_inventory_qty] + false + + + true + ${quantity_new} + = + true + product[stock_data][qty] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 10000 + = + true + product[stock_data][max_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + + = + true + new-variations-attribute-set-id + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/id/${simple_product_id}/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + + You saved the product + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/edit/id/${configurable_product_id}/ + GET + true + false + true + false + false + + + + + + Product + + Assertion.response_data + false + 16 + + + + false + configurable_product_name + ,"name":"([^'"]+)", + $1$ + + 1 + + + + false + configurable_product_sku + ,"sku":"([^'"]+)", + $1$ + + 1 + + + + false + configurable_product_category_id + ,"category_ids":."(\d+)" + $1$ + + 1 + + + + false + configurable_attribute_id + ,"configurable_variation":"([^'"]+)", + $1$ + + 1 + true + + + + false + configurable_matrix + "configurable-matrix":(\[.*?\]) + $1$ + + 1 + true + + + + associated_products_ids + $.[*].id + + configurable_matrix + VAR + + + + false + configurable_product_data + (\{"product":.*?configurable_attributes_data.*?\})\s*< + $1$ + + 1 + + + + configurable_attributes_data + $.product.configurable_attributes_data + + configurable_product_data + VAR + + + + false + configurable_attribute_ids + "attribute_id":"(\d+)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_codes + "code":"(\w+)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_labels + "label":"(.*?)" + $1$ + + -1 + variable + configurable_attributes_data + + + + false + configurable_attribute_values + "values":(\{(?:\}|.*?\}\})) + $1$ + + -1 + variable + configurable_attributes_data + + + + + configurable_attribute_ids + configurable_attribute_id + true + + + + 1 + ${configurable_attribute_ids_matchNr} + 1 + attribute_counter + + true + true + + + + return vars.get("configurable_attribute_values_" + vars.get("attribute_counter")); + + + false + + + + false + attribute_${configurable_attribute_id}_values + "value_index":"(\d+)" + $1$ + + -1 + configurable_attribute_values_${attribute_counter} + + + + + + + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${configurable_product_name} + = + true + product[name] + false + + + true + ${configurable_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id] + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 3 + = + true + product[weight] + false + + + true + ${configurable_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + false + + + true + <p>Configurable product description ${configurable_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + ${configurable_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${configurable_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${configurable_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + ${configurable_attribute_id} + = + true + product[configurable_variation] + false + + + true + ${configurable_product_name} + = + true + product[url_key] + + + true + 1 + = + true + product[use_config_gift_message_available] + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + + + true + 4 + = + true + product[visibility] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 50 + = + true + product[stock_data][qty] + false + + + true + configurable + = + true + product[stock_data][type_id] + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/validate/id/${configurable_product_id}/ + POST + true + false + true + false + false + + + + + false + + + try { + int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); + for (int i = 1; i <= attributesCount; i++) { + attributeId = vars.get("configurable_attribute_ids_" + i.toString()); + attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); + attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); + ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); + ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); + ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); + + int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); + for (int j = 1; j <= valuesCount; j++) { + attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", + "1" + ); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", + attributeValue + ); + } + } + ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); + } catch (Exception e) { + log.error("error???", e); + } + + + + + {"error":false} + + Assertion.response_data + false + 2 + + + + + + + + true + true + = + true + ajax + false + + + true + true + = + true + isAjax + false + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${configurable_product_name} + = + true + product[name] + false + + + true + ${configurable_product_sku} + = + true + product[sku] + false + + + true + ${price_new} + = + true + product[price] + false + + + true + 2 + = + true + product[tax_class_id]admin + false + + + true + 1 + = + true + product[quantity_and_stock_status][is_in_stock] + false + + + true + 3 + = + true + product[weight] + false + + + true + ${configurable_product_category_id} + = + true + product[category_ids][] + false + + + true + ${category_additional} + = + true + product[category_ids][] + false + + + true + <p>Configurable product description ${configurable_product_id} Edited</p> + = + true + product[description] + false + + + true + 1 + = + true + product[status] + false + + + true + ${configurable_product_name} Meta Title Edited + = + true + product[meta_title] + false + + + true + ${configurable_product_name} Meta Keyword Edited + = + true + product[meta_keyword] + false + + + true + ${configurable_product_name} Meta Description Edited + = + true + product[meta_description] + false + + + true + 1 + = + true + product[website_ids][] + false + + + true + ${special_price_new} + = + true + product[special_price] + false + + + true + + = + true + product[special_from_date] + false + + + true + + = + true + product[special_to_date] + false + + + true + + = + true + product[cost] + false + + + true + 1 + = + true + product[stock_data][use_config_manage_stock] + false + + + true + 0 + = + true + product[stock_data][min_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_qty] + false + + + true + 1 + = + true + product[stock_data][min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_min_sale_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_max_sale_qty] + false + + + true + 0 + = + true + product[stock_data][is_qty_decimal] + false + + + true + 0 + = + true + product[stock_data][is_decimal_divided] + false + + + true + 0 + = + true + product[stock_data][backorders] + false + + + true + 1 + = + true + product[stock_data][use_config_backorders] + false + + + true + 1 + = + true + product[stock_data][notify_stock_qty] + false + + + true + 1 + = + true + product[stock_data][use_config_notify_stock_qty] + false + + + true + 0 + = + true + product[stock_data][enable_qty_increments] + false + + + true + 0 + = + true + product[stock_data][qty_increments] + false + + + true + 1 + = + true + product[stock_data][use_config_qty_increments] + false + + + true + 1 + = + true + product[stock_data][is_in_stock] + false + + + true + + = + true + product[custom_design] + false + + + true + + = + true + product[custom_design_from] + false + + + true + + = + true + product[custom_design_to] + false + + + true + + = + true + product[custom_layout_update] + false + + + true + + = + true + product[page_layout] + false + + + true + container2 + = + true + product[options_container] + false + + + true + ${configurable_attribute_id} + = + true + product[configurable_variation] + false + + + true + ${configurable_product_name} + = + true + product[url_key] + + + true + 1 + = + true + product[use_config_gift_message_available] + + + true + 1 + = + true + product[use_config_gift_wrapping_available] + + + true + 4 + = + true + product[visibility] + + + true + 1 + = + true + product[product_has_weight] + true + + + true + 50 + = + true + product[stock_data][qty] + false + + + true + configurable + = + true + product[stock_data][type_id] + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/product/save/id/${configurable_product_id}/back/edit/active_tab/product-details/ + POST + true + false + true + false + false + + + + + false + + + try { + int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); + for (int i = 1; i <= attributesCount; i++) { + attributeId = vars.get("configurable_attribute_ids_" + i.toString()); + attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); + attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); + ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); + ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); + ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); + ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); + + int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); + for (int j = 1; j <= valuesCount; j++) { + attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", + "1" + ); + ctx.getCurrentSampler().addArgument( + "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", + attributeValue + ); + } + } + ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); + } catch (Exception e) { + log.error("error???", e); + } + + + + + You saved the product + + Assertion.response_data + false + 2 + if have trouble see messages-message-error + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminReturnsManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Returns Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/orders_page.jmx + + + + Create New Order + + Assertion.response_data + false + 2 + + + + + + + + + true + sales_order_grid + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 200 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + increment_id + = + true + sorting[field] + + + true + desc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + false + + + true + pending + = + true + filters[status] + true + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + sales_order_grid + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + 200 + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + increment_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + true + pending + = + true + filters[status] + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/search_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + false + order_numbers + \"increment_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + false + order_ids + \"entity_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + + + tool/fragments/ce/admin_create_process_returns/setup.jmx + + import java.util.ArrayList; + import java.util.HashMap; + import org.apache.jmeter.protocol.http.util.Base64Encoder; + import java.util.Random; + + // get count of "order_numbers" variable defined in "Search Pending Orders Limit" + int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); + + + int clusterLength; + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + //Number of orders for one thread + clusterLength = ordersCount; + } else { + clusterLength = Math.round(ordersCount / threadsNumber); + if (clusterLength == 0) { + clusterLength = 1; + } + } + + //Current thread number starts from 0 + int currentThreadNum = ctx.getThreadNum(); + + //Index of the current product from the cluster + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + int iterator = random.nextInt(clusterLength); + if (iterator == 0) { + iterator = 1; + } + + int i = clusterLength * currentThreadNum + iterator; + + orderNumber = vars.get("order_numbers_" + i.toString()); + orderId = vars.get("order_ids_" + i.toString()); + vars.put("order_number", orderNumber); + vars.put("order_id", orderId); + + + + + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_order.jmx + + + + #${order_number} + + Assertion.response_data + false + 2 + + + + false + order_status + <span id="order_status">([^<]+)</span> + $1$ + + 1 + simple_products + + + + + + "${order_status}" == "Pending" + false + tool/fragments/ce/admin_edit_order/if_controller.jmx + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_start.jmx + + + + Invoice Totals + + Assertion.response_data + false + 2 + + + + false + item_ids + <div id="order_item_(\d+)_title"\s*class="product-title"> + $1$ + + -1 + simple_products + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + invoice[items][${item_ids_1}] + + + true + 1 + = + true + invoice[items][${item_ids_2}] + + + true + Invoiced + = + true + invoice[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx + + + + The invoice has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_creditmemo/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/credit_memo_start.jmx + + + + New Memo + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + creditmemo[items][${item_ids_1}][qty] + + + true + 1 + = + true + creditmemo[items][${item_ids_2}][qty] + + + true + 1 + = + true + creditmemo[do_offline] + + + true + Credit Memo added + = + true + creditmemo[comment_text] + + + true + 10 + = + true + creditmemo[shipping_amount] + + + true + 0 + = + true + creditmemo[adjustment_positive] + + + true + 0 + = + true + creditmemo[adjustment_negative] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_creditmemo/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/credit_memo_full_refund.jmx + + + + You created the credit memo + + Assertion.response_data + false + 2 + + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCreateProcessReturnsDelay}*1000))} + tool/fragments/ce/admin_create_process_returns/pause.jmx + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminBrowseCustomerGridPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Browse Customer Grid"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + + vars.put("gridEntityType" , "Customer"); + + pagesCount = parseInt(vars.get("customers_page_size")) || 20; + vars.put("grid_entity_page_size" , pagesCount); + vars.put("grid_namespace" , "customer_listing"); + vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_customer_filter_text")); + vars.put("grid_filter_field", "name"); + + // set sort fields and sort directions + vars.put("grid_sort_field_1", "name"); + vars.put("grid_sort_field_2", "group_id"); + vars.put("grid_sort_field_3", "billing_country_id"); + vars.put("grid_sort_order_1", "asc"); + vars.put("grid_sort_order_2", "desc"); + + javascript + tool/fragments/ce/admin_browse_customers_grid/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; + var totalsRecord = parseInt(vars.get("entity_total_records")); + var pageCount = Math.round(totalsRecord/pageSize); + + vars.put("grid_pages_count", pageCount); + + javascript + + + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + ${grid_admin_browse_filter_text} + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx + + + $.totalRecords + 0 + true + false + true + true + + + + entity_total_records + $.totalRecords + + + BODY + + + + + + + var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; +var totalsRecord = parseInt(vars.get("entity_total_records")); +var pageCount = Math.round(totalsRecord/pageSize); + +vars.put("grid_pages_count_filtered", pageCount); + + javascript + + + + + + 1 + ${grid_pages_count} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_page_number.jmx + + + + + + + true + ${grid_namespace} + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + true + + + true + ${page_number} + = + true + paging[current] + true + + + true + entity_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + 1 + ${grid_pages_count_filtered} + 1 + page_number + + true + false + tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx + + + + tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx + + + + grid_sort_field + grid_sort_field + true + 0 + 3 + + + + grid_sort_order + grid_sort_order + true + 0 + 2 + + + + + + + true + ${grid_namespace} + = + true + namespace + false + + + true + ${grid_admin_browse_filter_text} + = + true + filters[${grid_filter_field}] + false + + + true + true + = + true + filters[placeholder] + false + + + true + ${grid_entity_page_size} + = + true + paging[pageSize] + false + + + true + ${page_number} + = + true + paging[current] + false + + + true + ${grid_sort_field} + = + true + sorting[field] + false + + + true + ${grid_sort_order} + = + true + sorting[direction] + false + + + true + true + = + true + isAjax + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":[^0]\d* + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCreateOrderPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Create Order"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + javascript + + + + + vars.put("alabama_region_id", props.get("alabama_region_id")); + vars.put("california_region_id", props.get("california_region_id")); + + tool/fragments/ce/common/get_region_data.jmx + + + + + + tool/fragments/ce/admin_create_order/admin_create_order.jmx + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); + +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} + +number = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_product_1_sku", configurableList.get("sku")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); + +number = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); + +number1 = random.nextInt(props.get("configurable_products_list").size()); +do { + number1 = random.nextInt(props.get("simple_products_list").size()); +} while(number == number1); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); + + +customers_index = 0; +if (!props.containsKey("customer_ids_index")) { + props.put("customer_ids_index", customers_index); +} + +try { + customers_index = props.get("customer_ids_index"); + customers_list = props.get("customer_ids_list"); + + if (customers_index == customers_list.size()) { + customers_index=0; + } + vars.put("customer_id", customers_list.get(customers_index)); + props.put("customer_ids_index", ++customers_index); +} +catch (java.lang.Exception e) { + log.error("Caught Exception in 'Admin Create Order' thread."); + SampleResult.setStopThread(true); +} + + + true + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/start/ + GET + true + false + true + false + false + + Detected the start of a redirect chain + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${configurable_product_1_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + true + item[${simple_product_1_id}][qty] + 1 + = + true + + + true + item[${simple_product_2_id}][qty] + 1 + = + true + + + true + item[${configurable_product_1_id}][qty] + 1 + = + true + + + true + customer_id + ${customer_id} + = + true + + + true + store_id + 1 + = + true + + + true + currency_id + + = + true + + + true + form_key + ${admin_form_key} + = + true + + + true + payment[method] + checkmo + = + true + + + true + reset_shipping + 1 + = + true + + + true + json + 1 + = + true + + + true + as_js_varname + iFrameResponse + = + true + + + true + form_key + ${admin_form_key} + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/loadBlock/block/search,items,shipping_method,totals,giftmessage,billing_method?isAjax=true + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + false + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + + ctx.getCurrentSampler().addArgument("item[" + vars.get("configurable_product_1_id") + "][super_attribute][" + attribute_ids_array[i] + "]", option_values_array[i]); + } +} catch (Exception e) { + log.error("error???", e); +} + + + + + + + + true + collect_shipping_rates + 1 + = + true + + + true + customer_id + ${customer_id} + = + true + + + true + store_id + 1 + = + true + + + true + currency_id + false + = + true + + + true + form_key + ${admin_form_key} + = + true + + + true + payment[method] + checkmo + = + true + + + true + json + true + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/loadBlock/block/shipping_method,totals?isAjax=true + POST + true + false + true + false + false + + + + + + shipping_method + Flat Rate + + Assertion.response_data + false + 2 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/index/ + GET + true + false + true + false + false + + Detected the start of a redirect chain + + + + + Select from existing customer addresses + Submit Order + Items Ordered + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + limit + 20 + = + true + + + true + entity_id + + = + true + + + true + name + + = + true + + + true + email + + = + true + + + true + Telephone + + = + true + + + true + billing_postcode + + = + true + + + true + billing_country_id + + = + true + + + true + billing_regione + + = + true + + + true + store_name + + = + true + + + true + page + 1 + = + true + + + true + order[currency] + USD + = + true + + + true + sku + + = + true + + + true + qty + + = + true + + + true + limit + 20 + = + true + + + true + entity_id + + = + true + + + true + name + + = + true + + + true + sku + + = + true + + + true + price[from] + + = + true + + + true + price[to] + + = + true + + + true + in_products + + = + true + + + true + page + 1 + = + true + + + true + coupon_code + + = + true + + + true + order[account][group_id] + 1 + = + true + + + true + order[account][email] + user_${customer_id}@example.com + = + true + + + true + order[billing_address][customer_address_id] + + = + true + + + true + order[billing_address][prefix] + + = + true + + + true + order[billing_address][firstname] + Anthony + = + true + + + true + order[billing_address][middlename] + + = + true + + + true + order[billing_address][lastname] + Nealy + = + true + + + true + order[billing_address][suffix] + + = + true + + + true + order[billing_address][company] + + = + true + + + true + order[billing_address][street][0] + 123 Freedom Blvd. #123 + = + true + + + true + order[billing_address][street][1] + + = + true + + + true + order[billing_address][city] + Fayetteville + = + true + + + true + order[billing_address][country_id] + US + = + true + + + true + order[billing_address][region] + + = + true + + + true + order[billing_address][region_id] + ${alabama_region_id} + = + true + + + true + order[billing_address][postcode] + 123123 + = + true + + + true + order[billing_address][telephone] + 022-333-4455 + = + true + + + true + order[billing_address][fax] + + = + true + + + true + order[billing_address][vat_id] + + = + true + + + true + shipping_same_as_billing + on + = + true + + + true + payment[method] + checkmo + = + true + + + true + order[shipping_method] + flatrate_flatrate + = + true + + + true + order[comment][customer_note] + + = + true + + + true + order[comment][customer_note_notify] + 1 + = + true + + + true + order[send_confirmation] + 1 + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_create/save/ + POST + true + false + true + true + false + + Detected the start of a redirect chain + + + + false + order_id + ${host}${base_path}${admin_path}/sales/order/index/order_id/(\d+)/ + $1$ + + 1 + + + + false + order_item_1 + order_item_(\d+)_title + $1$ + + 1 + + + + false + order_item_2 + order_item_(\d+)_title + $1$ + + 2 + + + + false + order_item_3 + order_item_(\d+)_title + $1$ + + 3 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_2 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_item_3 + + + + + You created the order. + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + invoice[items][${order_item_1}] + 1 + = + true + + + true + invoice[items][${order_item_2}] + 1 + = + true + + + true + invoice[items][${order_item_3}] + 1 + = + true + + + true + invoice[comment_text] + + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + + The invoice has been created. + + Assertion.response_data + false + 2 + + + + + + + + true + form_key + ${admin_form_key} + = + true + + + true + shipment[items][${order_item_1}] + 1 + = + true + + + true + shipment[items][${order_item_2}] + 1 + = + true + + + true + shipment[items][${order_item_3}] + 1 + = + true + + + true + shipment[comment_text] + + = + true + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ + POST + true + false + true + false + false + + Detected the start of a redirect chain + + + + + The shipment has been created. + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCategoryManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Category Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_category_management/admin_category_management.jmx + + + + javascript + + + + random = new java.util.Random(); +if (${seedForRandom} > 0) { +random.setSeed(${seedForRandom} + ${__threadNum}); +} + +/** + * Get unique ids for fix concurrent category saving + */ +function getNextProductNumber(i) { + number = productsVariationsSize * ${__threadNum} - i; + if (number >= productsSize) { + log.info("${testLabel}: capacity of product list is not enough for support all ${adminPoolUsers} threads"); + return random.nextInt(productsSize); + } + return productsVariationsSize * ${__threadNum} - i; +} + +var productsVariationsSize = 5, + productsSize = props.get("simple_products_list_for_edit").size(); + + +for (i = 1; i<= productsVariationsSize; i++) { + var productVariablePrefix = "simple_product_" + i + "_"; + number = getNextProductNumber(i); + simpleList = props.get("simple_products_list_for_edit").get(number); + + vars.put(productVariablePrefix + "url_key", simpleList.get("url_key")); + vars.put(productVariablePrefix + "id", simpleList.get("id")); + vars.put(productVariablePrefix + "name", simpleList.get("title")); +} + +categoryIndex = random.nextInt(props.get("admin_category_ids_list").size()); +vars.put("parent_category_id", props.get("admin_category_ids_list").get(categoryIndex)); +do { +categoryIndexNew = random.nextInt(props.get("admin_category_ids_list").size()); +} while(categoryIndex == categoryIndexNew); +vars.put("new_parent_category_id", props.get("admin_category_ids_list").get(categoryIndexNew)); + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/edit/id/${parent_category_id}/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/add/store/0/parent/${parent_category_id} + GET + true + false + true + false + false + + + + + + <title>New Category + + Assertion.response_data + false + 2 + + + + + + + + true + + = + true + id + + + true + ${parent_category_id} + = + true + parent + + + true + + = + true + path + + + true + + = + true + store_id + + + true + 0 + = + true + is_active + + + true + 0 + = + true + include_in_menu + + + true + 1 + = + true + is_anchor + + + true + true + = + true + use_config[available_sort_by] + + + true + true + = + true + use_config[default_sort_by] + + + true + true + = + true + use_config[filter_price_range] + + + true + false + = + true + use_default[url_key] + + + true + 0 + = + true + url_key_create_redirect + + + true + 0 + = + true + custom_use_parent_settings + + + true + 0 + = + true + custom_apply_to_products + + + true + Admin Category Management ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + name + + + true + admin-category-management-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + url_key + + + true + + = + true + meta_title + + + true + + = + true + description + + + true + PRODUCTS + = + true + display_mode + + + true + position + = + true + default_sort_by + + + true + + = + true + meta_keywords + + + true + + = + true + meta_description + + + true + + = + true + custom_layout_update + + + false + {"${simple_product_1_id}":"","${simple_product_2_id}":"","${simple_product_3_id}":"","${simple_product_4_id}":"","${simple_product_5_id}":""} + = + true + category_products + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/save/ + POST + true + false + true + false + false + + + + + URL + admin_category_id + /catalog/category/edit/id/(\d+)/ + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_id + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/edit/id/${admin_category_id}/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + false + admin_category_entity_id + "entity_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_attribute_set_id + "attribute_set_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_parent_id + "parent_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_created_at + "created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_updated_at + "updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_path + "entity_id":(.+)"path":"([^\"]+)" + $2$ + + 1 + + + + false + admin_category_level + "level":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_name + "entity_id":(.+)"name":"([^"]+)" + $2$ + + 1 + + + + false + admin_category_url_key + "url_key":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_url_path + "url_path":"([^"]+)" + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_entity_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_attribute_set_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_parent_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_updated_at + + + + + ^[\d\\\/]+$ + + Assertion.response_data + false + 1 + variable + admin_category_path + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_level + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_name + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_url_key + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_url_path + + + + + ${simple_product_1_name} + ${simple_product_2_name} + ${simple_product_3_name} + ${simple_product_4_name} + ${simple_product_5_name} + + Assertion.response_data + false + 2 + + + + + + + + true + ${admin_category_id} + = + true + id + + + true + ${admin_form_key} + = + true + form_key + + + true + append + = + true + point + + + true + ${new_parent_category_id} + = + true + pid + + + true + ${parent_category_id} + = + true + paid + + + true + 0 + = + true + aid + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/move/ + POST + true + false + true + false + false + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/delete/id/${admin_category_id}/ + POST + true + false + true + false + false + + + + + + You deleted the category. + + Assertion.response_data + false + 2 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCategoryManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminPromotionRulesPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Promotion Rules"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_promotions_management/admin_promotions_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/ + GET + true + false + true + false + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/new + GET + true + false + true + false + false + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + true + + + true + 1--1 + = + true + id + + + true + Magento\SalesRule\Model\Rule\Condition\Address|base_subtotal + = + true + type + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/newConditionHtml/form/sales_rule_formrule_conditions_fieldset_/form_namespace/sales_rule_form + POST + true + false + true + false + false + + + + + + + + true + Rule Name ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + name + + + true + 0 + = + true + is_active + + + true + 0 + = + true + use_auto_generation + + + true + 1 + = + true + is_rss + + + true + 0 + = + true + apply_to_shipping + + + true + 0 + = + true + stop_rules_processing + + + true + + = + true + coupon_code + + + true + + = + true + uses_per_coupon + + + true + + = + true + uses_per_customer + + + true + + = + true + sort_order + + + true + 5 + = + true + discount_amount + + + true + 0 + = + true + discount_qty + + + true + + = + true + discount_step + + + true + + = + true + reward_points_delta + + + true + + = + true + store_labels[0] + + + true + Rule Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + description + + + true + 1 + = + true + coupon_type + + + true + cart_fixed + = + true + simple_action + + + true + 1 + = + true + website_ids[0] + + + true + 0 + = + true + customer_group_ids[0] + + + true + + = + true + from_date + + + true + + = + true + to_date + + + true + Magento\SalesRule\Model\Rule\Condition\Combine + = + true + rule[conditions][1][type] + + + true + all + = + true + rule[conditions][1][aggregator] + + + true + 1 + = + true + rule[conditions][1][value] + + + true + Magento\SalesRule\Model\Rule\Condition\Address + = + true + rule[conditions][1--1][type] + + + true + base_subtotal + = + true + rule[conditions][1--1][attribute] + + + true + >= + = + true + rule[conditions][1--1][operator] + + + true + 100 + = + true + rule[conditions][1--1][value] + + + true + + = + true + rule[conditions][1][new_chlid] + + + true + Magento\SalesRule\Model\Rule\Condition\Product\Combine + = + true + rule[actions][1][type] + + + true + all + = + true + rule[actions][1][aggregator] + + + true + 1 + = + true + rule[actions][1][value] + + + true + + = + true + rule[actions][1][new_child] + + + true + + = + true + store_labels[1] + + + true + + = + true + store_labels[2] + + + true + + = + true + related_banners + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/save/ + POST + true + false + true + false + false + + + + + + You saved the rule. + + Assertion.response_data + false + 16 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminPromotionsManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminCustomerManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Customer Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_customer_management/admin_customer_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + true + customer_listing + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 20 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + true + customer_listing + = + true + namespace + + + true + Lastname + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 20 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + false + customer_edit_url_path + actions":\{"edit":\{"href":"(?:http|https):\\/\\/(.*?)\\/customer\\/index\\/edit\\/id\\/(\d+)\\/", + /customer/index/edit/id/$2$/ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + customer_edit_url_path + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}${customer_edit_url_path} + GET + true + false + true + false + false + + + + + + Customer Information + + Assertion.response_data + false + 2 + + + + false + admin_customer_entity_id + "entity_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_website_id + "website_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_firstname + "firstname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_lastname + "lastname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_email + "email":"([^\@]+@[^.]+.[^"]+)" + $1$ + + 1 + + + + false + admin_customer_group_id + "group_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_store_id + "store_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_created_at + "created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_updated_at + "updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_is_active + "is_active":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_disable_auto_group_change + "disable_auto_group_change":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_created_in + "created_in":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_dob + "dob":"(\d+)-(\d+)-(\d+)" + $2$/$3$/$1$ + + 1 + + + + false + admin_customer_default_billing + "default_billing":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_default_shipping + "default_shipping":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_gender + "gender":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_failures_num + "failures_num":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_address_entity_id + _address":\{"entity_id":"(\d+)".+?"parent_id":"${admin_customer_entity_id}" + $1$ + + 1 + + + + false + admin_customer_address_created_at + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_updated_at + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_is_active + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"is_active":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_address_city + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"city":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_country_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"country_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_firstname + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"firstname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_lastname + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"lastname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_postcode + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"postcode":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_region + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_region_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_street + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"street":\["([^"]+)"\] + $1$ + + 1 + + + + false + admin_customer_address_telephone + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"telephone":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_customer_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"customer_id":"([^"]+)" + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_entity_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_website_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_firstname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_lastname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_email + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_group_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_store_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_updated_at + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_is_active + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_disable_auto_group_change + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_created_in + + + + + ^\d+/\d+/\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_dob + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_default_billing + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_default_shipping + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_gender + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_failures_num + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_entity_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_updated_at + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_is_active + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_city + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_country_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_firstname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_lastname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_postcode + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_region + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_region_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_street + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_telephone + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_customer_id + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_customer_entity_id} + = + true + customer[entity_id] + + + true + ${admin_customer_website_id} + = + true + customer[website_id] + + + true + ${admin_customer_email} + = + true + customer[email] + + + true + ${admin_customer_group_id} + = + true + customer[group_id] + + + true + ${admin_customer_store_id} + = + true + customer[store_id] + + + true + ${admin_customer_created_at} + = + true + customer[created_at] + + + true + ${admin_customer_updated_at} + = + true + customer[updated_at] + + + true + ${admin_customer_is_active} + = + true + customer[is_active] + + + true + ${admin_customer_disable_auto_group_change} + = + true + customer[disable_auto_group_change] + + + true + ${admin_customer_created_in} + = + true + customer[created_in] + + + true + + = + true + customer[prefix] + + + true + ${admin_customer_firstname} 1 + = + true + customer[firstname] + + + true + + = + true + customer[middlename] + + + true + ${admin_customer_lastname} 1 + = + true + customer[lastname] + + + true + + = + true + customer[suffix] + + + true + ${admin_customer_dob} + = + true + customer[dob] + + + true + ${admin_customer_default_billing} + = + true + customer[default_billing] + + + true + ${admin_customer_default_shipping} + = + true + customer[default_shipping] + + + true + + = + true + customer[taxvat] + + + true + ${admin_customer_gender} + = + true + customer[gender] + + + true + ${admin_customer_failures_num} + = + true + customer[failures_num] + + + true + ${admin_customer_store_id} + = + true + customer[sendemail_store_id] + + + true + ${admin_customer_address_entity_id} + = + true + address[${admin_customer_address_entity_id}][entity_id] + + + true + ${admin_customer_address_created_at} + = + true + address[${admin_customer_address_entity_id}][created_at] + + + true + ${admin_customer_address_updated_at} + = + true + address[${admin_customer_address_entity_id}][updated_at] + + + true + ${admin_customer_address_is_active} + = + true + address[${admin_customer_address_entity_id}][is_active] + + + true + ${admin_customer_address_city} + = + true + address[${admin_customer_address_entity_id}][city] + + + true + + = + true + address[${admin_customer_address_entity_id}][company] + + + true + ${admin_customer_address_country_id} + = + true + address[${admin_customer_address_entity_id}][country_id] + + + true + ${admin_customer_address_firstname} + = + true + address[${admin_customer_address_entity_id}][firstname] + + + true + ${admin_customer_address_lastname} + = + true + address[${admin_customer_address_entity_id}][lastname] + + + true + + = + true + address[${admin_customer_address_entity_id}][middlename] + + + true + ${admin_customer_address_postcode} + = + true + address[${admin_customer_address_entity_id}][postcode] + + + true + + = + true + address[${admin_customer_address_entity_id}][prefix] + + + true + ${admin_customer_address_region} + = + true + address[${admin_customer_address_entity_id}][region] + + + true + ${admin_customer_address_region_id} + = + true + address[${admin_customer_address_entity_id}][region_id] + + + true + ${admin_customer_address_street} + = + true + address[${admin_customer_address_entity_id}][street][0] + + + true + + = + true + address[${admin_customer_address_entity_id}][street][1] + + + true + + = + true + address[${admin_customer_address_entity_id}][suffix] + + + true + ${admin_customer_address_telephone} + = + true + address[${admin_customer_address_entity_id}][telephone] + + + true + + = + true + address[${admin_customer_address_entity_id}][vat_id] + + + true + ${admin_customer_address_customer_id} + = + true + address[${admin_customer_address_entity_id}][customer_id] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_billing] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_shipping] + + + true + + = + true + address[new_0][prefix] + + + true + John + = + true + address[new_0][firstname] + + + true + + = + true + address[new_0][middlename] + + + true + Doe + = + true + address[new_0][lastname] + + + true + + = + true + address[new_0][suffix] + + + true + Test Company + = + true + address[new_0][company] + + + true + Folsom + = + true + address[new_0][city] + + + true + 95630 + = + true + address[new_0][postcode] + + + true + 1234567890 + = + true + address[new_0][telephone] + + + true + + = + true + address[new_0][vat_id] + + + true + false + = + true + address[new_0][default_billing] + + + true + false + = + true + address[new_0][default_shipping] + + + true + 123 Main + = + true + address[new_0][street][0] + + + true + + = + true + address[new_0][street][1] + + + true + + = + true + address[new_0][region] + + + true + US + = + true + address[new_0][country_id] + + + true + ${admin_customer_address_region_id} + = + true + address[new_0][region_id] + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index/validate/ + POST + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 16 + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_customer_entity_id} + = + true + customer[entity_id] + + + true + ${admin_customer_website_id} + = + true + customer[website_id] + + + true + ${admin_customer_email} + = + true + customer[email] + + + true + ${admin_customer_group_id} + = + true + customer[group_id] + + + true + ${admin_customer_store_id} + = + true + customer[store_id] + + + true + ${admin_customer_created_at} + = + true + customer[created_at] + + + true + ${admin_customer_updated_at} + = + true + customer[updated_at] + + + true + ${admin_customer_is_active} + = + true + customer[is_active] + + + true + ${admin_customer_disable_auto_group_change} + = + true + customer[disable_auto_group_change] + + + true + ${admin_customer_created_in} + = + true + customer[created_in] + + + true + + = + true + customer[prefix] + + + true + ${admin_customer_firstname} 1 + = + true + customer[firstname] + + + true + + = + true + customer[middlename] + + + true + ${admin_customer_lastname} 1 + = + true + customer[lastname] + + + true + + = + true + customer[suffix] + + + true + ${admin_customer_dob} + = + true + customer[dob] + + + true + ${admin_customer_default_billing} + = + true + customer[default_billing] + + + true + ${admin_customer_default_shipping} + = + true + customer[default_shipping] + + + true + + = + true + customer[taxvat] + + + true + ${admin_customer_gender} + = + true + customer[gender] + + + true + ${admin_customer_failures_num} + = + true + customer[failures_num] + + + true + ${admin_customer_store_id} + = + true + customer[sendemail_store_id] + + + true + ${admin_customer_address_entity_id} + = + true + address[${admin_customer_address_entity_id}][entity_id] + + + + true + ${admin_customer_address_created_at} + = + true + address[${admin_customer_address_entity_id}][created_at] + + + true + ${admin_customer_address_updated_at} + = + true + address[${admin_customer_address_entity_id}][updated_at] + + + true + ${admin_customer_address_is_active} + = + true + address[${admin_customer_address_entity_id}][is_active] + + + true + ${admin_customer_address_city} + = + true + address[${admin_customer_address_entity_id}][city] + + + true + + = + true + address[${admin_customer_address_entity_id}][company] + + + true + ${admin_customer_address_country_id} + = + true + address[${admin_customer_address_entity_id}][country_id] + + + true + ${admin_customer_address_firstname} + = + true + address[${admin_customer_address_entity_id}][firstname] + + + true + ${admin_customer_address_lastname} + = + true + address[${admin_customer_address_entity_id}][lastname] + + + true + + = + true + address[${admin_customer_address_entity_id}][middlename] + + + true + ${admin_customer_address_postcode} + = + true + address[${admin_customer_address_entity_id}][postcode] + + + true + + = + true + address[${admin_customer_address_entity_id}][prefix] + + + true + ${admin_customer_address_region} + = + true + address[${admin_customer_address_entity_id}][region] + + + true + ${admin_customer_address_region_id} + = + true + address[${admin_customer_address_entity_id}][region_id] + + + true + ${admin_customer_address_street} + = + true + address[${admin_customer_address_entity_id}][street][0] + + + true + + = + true + address[${admin_customer_address_entity_id}][street][1] + + + true + + = + true + address[${admin_customer_address_entity_id}][suffix] + + + true + ${admin_customer_address_telephone} + = + true + address[${admin_customer_address_entity_id}][telephone] + + + true + + = + true + address[${admin_customer_address_entity_id}][vat_id] + + + true + ${admin_customer_address_customer_id} + = + true + address[${admin_customer_address_entity_id}][customer_id] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_billing] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_shipping] + + + true + + = + true + address[new_0][prefix] + + + true + John + = + true + address[new_0][firstname] + + + true + + = + true + address[new_0][middlename] + + + true + Doe + = + true + address[new_0][lastname] + + + true + + = + true + address[new_0][suffix] + + + true + Test Company + = + true + address[new_0][company] + + + true + Folsom + = + true + address[new_0][city] + + + true + 95630 + = + true + address[new_0][postcode] + + + true + 1234567890 + = + true + address[new_0][telephone] + + + true + + = + true + address[new_0][vat_id] + + + true + false + = + true + address[new_0][default_billing] + + + true + false + = + true + address[new_0][default_shipping] + + + true + 123 Main + = + true + address[new_0][street][0] + + + true + + = + true + address[new_0][street][1] + + + true + + = + true + address[new_0][region] + + + true + US + = + true + address[new_0][country_id] + + + true + 12 + = + true + address[new_0][region_id] + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index/save/ + POST + true + false + true + true + false + + + + + + You saved the customer. + + Assertion.response_data + false + 2 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCustomerManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${cAdminEditOrderPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "[REST API C] Admin Edit Order"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/orders_page.jmx + + + + Create New Order + + Assertion.response_data + false + 2 + + + + + + + + + true + sales_order_grid + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 200 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + increment_id + = + true + sorting[field] + + + true + desc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + false + + + true + pending + = + true + filters[status] + true + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + sales_order_grid + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + 200 + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + increment_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + true + pending + = + true + filters[status] + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/search_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + false + order_numbers + \"increment_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + false + order_ids + \"entity_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + + + tool/fragments/ce/admin_create_process_returns/setup.jmx + + import java.util.ArrayList; + import java.util.HashMap; + import org.apache.jmeter.protocol.http.util.Base64Encoder; + import java.util.Random; + + // get count of "order_numbers" variable defined in "Search Pending Orders Limit" + int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); + + + int clusterLength; + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + //Number of orders for one thread + clusterLength = ordersCount; + } else { + clusterLength = Math.round(ordersCount / threadsNumber); + if (clusterLength == 0) { + clusterLength = 1; + } + } + + //Current thread number starts from 0 + int currentThreadNum = ctx.getThreadNum(); + + //Index of the current product from the cluster + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + int iterator = random.nextInt(clusterLength); + if (iterator == 0) { + iterator = 1; + } + + int i = clusterLength * currentThreadNum + iterator; + + orderNumber = vars.get("order_numbers_" + i.toString()); + orderId = vars.get("order_ids_" + i.toString()); + vars.put("order_number", orderNumber); + vars.put("order_id", orderId); + + + + + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_order.jmx + + + + #${order_number} + + Assertion.response_data + false + 2 + + + + false + order_status + <span id="order_status">([^<]+)</span> + $1$ + + 1 + simple_products + + + + + + "${order_status}" == "Pending" + false + tool/fragments/ce/admin_edit_order/if_controller.jmx + + + + + + true + pending + = + true + history[status] + false + + + true + Some text + = + true + history[comment] + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/addComment/order_id/${order_id}/?isAjax=true + POST + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/add_comment.jmx + + + + Not Notified + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_start.jmx + + + + Invoice Totals + + Assertion.response_data + false + 2 + + + + false + item_ids + <div id="order_item_(\d+)_title"\s*class="product-title"> + $1$ + + -1 + simple_products + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + invoice[items][${item_ids_1}] + + + true + 1 + = + true + invoice[items][${item_ids_2}] + + + true + Invoiced + = + true + invoice[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx + + + + The invoice has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/shipment_start.jmx + + + + New Shipment + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + shipment[items][${item_ids_1}] + + + true + 1 + = + true + shipment[items][${item_ids_2}] + + + true + Shipped + = + true + shipment[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/shipment_submit.jmx + + + + The shipment has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + + + continue + + false + ${loops} + + ${oneThreadScenariosPoolUsers} + ${ramp_period} + 1505803944000 + 1505803944000 + false + + + tool/fragments/_system/thread_group.jmx + + + 1 + false + 1 + ${importProductsPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Import Products"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + vars.put("entity", "catalog_product"); +String behavior = "${adminImportProductBehavior}"; +vars.put("adminImportBehavior", behavior); +String filepath = "${files_folder}${adminImportProductFilePath}"; +vars.put("adminImportFilePath", filepath); + + + true + tool/fragments/ce/import_products/setup.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/import/ + GET + true + false + true + false + false + + tool/fragments/ce/common/import.jmx + + + + Import Settings + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${entity} + = + true + entity + + + true + ${adminImportBehavior} + = + true + behavior + + + true + validation-stop-on-errors + = + true + validation_strategy + + + true + 10 + = + true + allowed_error_count + + + true + , + = + true + _import_field_separator + + + true + , + = + true + _import_multiple_value_separator + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/import/validate + POST + true + false + true + false + HttpClient4 + + + + ${adminImportFilePath} + import_file + application/vnd.ms-excel + + + + false + + tool/fragments/ce/common/import_validate.jmx + + + + File is valid! To start import process + + Assertion.response_data + false + 16 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${entity} + = + true + entity + + + true + ${adminImportBehavior} + = + true + behavior + + + true + validation-stop-on-errors + = + true + validation_strategy + false + + + true + 10 + = + true + allowed_error_count + false + + + true + , + = + true + _import_field_separator + false + + + true + , + = + true + _import_multiple_value_separator + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/import/start + POST + true + false + true + false + HttpClient4 + + + + ${adminImportFilePath} + import_file + application/vnd.ms-excel + + + + false + + tool/fragments/ce/common/import_save.jmx + + + + Import successfully done + + Assertion.response_data + false + 16 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${importCustomersPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Import Customers"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + vars.put("entity", "customer"); +String behavior = "${adminImportCustomerBehavior}"; +vars.put("adminImportBehavior", behavior); +String filepath = "${files_folder}${adminImportCustomerFilePath}"; +vars.put("adminImportFilePath", filepath); + + + true + tool/fragments/ce/import_customers/setup.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/import/ + GET + true + false + true + false + false + + tool/fragments/ce/common/import.jmx + + + + Import Settings + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${entity} + = + true + entity + + + true + ${adminImportBehavior} + = + true + behavior + + + true + validation-stop-on-errors + = + true + validation_strategy + + + true + 10 + = + true + allowed_error_count + + + true + , + = + true + _import_field_separator + + + true + , + = + true + _import_multiple_value_separator + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/import/validate + POST + true + false + true + false + HttpClient4 + + + + ${adminImportFilePath} + import_file + application/vnd.ms-excel + + + + false + + tool/fragments/ce/common/import_validate.jmx + + + + File is valid! To start import process + + Assertion.response_data + false + 16 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + ${entity} + = + true + entity + + + true + ${adminImportBehavior} + = + true + behavior + + + true + validation-stop-on-errors + = + true + validation_strategy + false + + + true + 10 + = + true + allowed_error_count + false + + + true + , + = + true + _import_field_separator + false + + + true + , + = + true + _import_multiple_value_separator + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/import/start + POST + true + false + true + false + HttpClient4 + + + + ${adminImportFilePath} + import_file + application/vnd.ms-excel + + + + false + + tool/fragments/ce/common/import_save.jmx + + + + Import successfully done + + Assertion.response_data + false + 16 + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${apiSinglePercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API"); + + true + + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + 1 + false + 1 + 100 + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API Process Orders"); + + true + + + + + // Each thread gets an equal number of orders, based on how many orders are available. + + int ordersPerThread = 1; + int apiProcessOrders = Integer.parseInt("${apiProcessOrders}"); + if (apiProcessOrders > 0) { + ordersPerThread = apiProcessOrders; + } + + threadNum = ${__threadNum}; + vars.put("ordersPerThread", String.valueOf(ordersPerThread)); + vars.put("threadNum", String.valueOf(threadNum)); + + + + + false + tool/fragments/ce/api/process_orders/setup.jmx + + + + + + + true + status + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + Pending + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + ${ordersPerThread} + = + true + searchCriteria[pageSize] + + + true + ${threadNum} + = + true + searchCriteria[current_page] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/orders + GET + true + false + true + false + false + + tool/fragments/ce/api/process_orders/get_orders.jmx + + + entity_ids + $.items[*].entity_id + + + BODY + + + + + + entity_ids + order_id + true + tool/fragments/ce/api/process_orders/for_each_order.jmx + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/order/${order_id}/invoice + POST + true + false + true + false + false + + tool/fragments/ce/api/process_orders/create_invoice.jmx + + + + "\d+" + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/order/${order_id}/ship + POST + true + false + true + false + false + + tool/fragments/ce/api/process_orders/create_shipment.jmx + + + + "\d+" + + Assertion.response_data + false + 2 + + + + + + + + + 1 + false + 1 + 100 + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "API Product Attribute Management"); + + true + + + + + true + + + + false + { + "attributeSet": { + "attribute_set_name": "new_attribute_set_${__time()}-${__threadNum}-${__Random(1,1000000)}", + "sort_order": 500 + }, + "skeletonId": "4" +} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/attribute-sets/ + POST + true + false + true + false + false + + tool/fragments/ce/api/create_attribute_set.jmx + + + attribute_set_id + $.attribute_set_id + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + attribute_set_id + + + + + + true + + + + false + { + "group": { + "attribute_group_name": "empty_attribute_group_${__time()}-${__threadNum}-${__Random(1,1000000)}", + "attribute_set_id": ${attribute_set_id} + } +} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/attribute-sets/groups + POST + true + false + true + false + false + + tool/fragments/ce/api/create_attribute_group.jmx + + + attribute_group_id + $.attribute_group_id + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + attribute_set_id + + + + + + true + + + + false + { + "attribute": { + "attribute_code": "attr_code_${__time()}", + "frontend_labels": [ + { + "store_id": 0, + "label": "front_lbl_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}" + } + ], + "default_value": "default value", + "frontend_input": "textarea", + "is_required": 1 + } +} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/attributes/ + POST + true + false + true + false + false + + tool/fragments/ce/api/create_attribute.jmx + + + attribute_id + $.attribute_id + + + BODY + + + + attribute_code + $.attribute_code + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + attribute_id + + + + + ^[a-z0-9-_]+$ + + Assertion.response_data + false + 1 + variable + attribute_code + + + + + + true + + + + false + { + "attributeSetId": "${attribute_set_id}", + "attributeGroupId": "${attribute_group_id}", + "attributeCode": "${attribute_code}", + "sortOrder": 3 +} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/default/V1/products/attribute-sets/attributes + POST + true + false + true + false + false + + tool/fragments/ce/api/add_attribute_to_attribute_set.jmx + + + $ + (\d+) + true + false + false + + + + + + + + + + 1 + false + 1 + ${adminCategoryManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin Category Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_category_management/admin_category_management.jmx + + + + javascript + + + + random = new java.util.Random(); +if (${seedForRandom} > 0) { +random.setSeed(${seedForRandom} + ${__threadNum}); +} + +/** + * Get unique ids for fix concurrent category saving + */ +function getNextProductNumber(i) { + number = productsVariationsSize * ${__threadNum} - i; + if (number >= productsSize) { + log.info("${testLabel}: capacity of product list is not enough for support all ${adminPoolUsers} threads"); + return random.nextInt(productsSize); + } + return productsVariationsSize * ${__threadNum} - i; +} + +var productsVariationsSize = 5, + productsSize = props.get("simple_products_list_for_edit").size(); + + +for (i = 1; i<= productsVariationsSize; i++) { + var productVariablePrefix = "simple_product_" + i + "_"; + number = getNextProductNumber(i); + simpleList = props.get("simple_products_list_for_edit").get(number); + + vars.put(productVariablePrefix + "url_key", simpleList.get("url_key")); + vars.put(productVariablePrefix + "id", simpleList.get("id")); + vars.put(productVariablePrefix + "name", simpleList.get("title")); +} + +categoryIndex = random.nextInt(props.get("admin_category_ids_list").size()); +vars.put("parent_category_id", props.get("admin_category_ids_list").get(categoryIndex)); +do { +categoryIndexNew = random.nextInt(props.get("admin_category_ids_list").size()); +} while(categoryIndex == categoryIndexNew); +vars.put("new_parent_category_id", props.get("admin_category_ids_list").get(categoryIndexNew)); + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/edit/id/${parent_category_id}/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/add/store/0/parent/${parent_category_id} + GET + true + false + true + false + false + + + + + + <title>New Category + + Assertion.response_data + false + 2 + + + + + + + + true + + = + true + id + + + true + ${parent_category_id} + = + true + parent + + + true + + = + true + path + + + true + + = + true + store_id + + + true + 0 + = + true + is_active + + + true + 0 + = + true + include_in_menu + + + true + 1 + = + true + is_anchor + + + true + true + = + true + use_config[available_sort_by] + + + true + true + = + true + use_config[default_sort_by] + + + true + true + = + true + use_config[filter_price_range] + + + true + false + = + true + use_default[url_key] + + + true + 0 + = + true + url_key_create_redirect + + + true + 0 + = + true + custom_use_parent_settings + + + true + 0 + = + true + custom_apply_to_products + + + true + Admin Category Management ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + name + + + true + admin-category-management-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + url_key + + + true + + = + true + meta_title + + + true + + = + true + description + + + true + PRODUCTS + = + true + display_mode + + + true + position + = + true + default_sort_by + + + true + + = + true + meta_keywords + + + true + + = + true + meta_description + + + true + + = + true + custom_layout_update + + + false + {"${simple_product_1_id}":"","${simple_product_2_id}":"","${simple_product_3_id}":"","${simple_product_4_id}":"","${simple_product_5_id}":""} + = + true + category_products + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/save/ + POST + true + false + true + false + false + + + + + URL + admin_category_id + /catalog/category/edit/id/(\d+)/ + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_id + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/edit/id/${admin_category_id}/ + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + false + admin_category_entity_id + "entity_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_attribute_set_id + "attribute_set_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_parent_id + "parent_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_created_at + "created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_updated_at + "updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_path + "entity_id":(.+)"path":"([^\"]+)" + $2$ + + 1 + + + + false + admin_category_level + "level":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_name + "entity_id":(.+)"name":"([^"]+)" + $2$ + + 1 + + + + false + admin_category_url_key + "url_key":"([^"]+)" + $1$ + + 1 + + + + false + admin_category_url_path + "url_path":"([^"]+)" + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_entity_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_attribute_set_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_parent_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_updated_at + + + + + ^[\d\\\/]+$ + + Assertion.response_data + false + 1 + variable + admin_category_path + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_category_level + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_name + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_url_key + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_category_url_path + + + + + ${simple_product_1_name} + ${simple_product_2_name} + ${simple_product_3_name} + ${simple_product_4_name} + ${simple_product_5_name} + + Assertion.response_data + false + 2 + + + + + + + + true + ${admin_category_id} + = + true + id + + + true + ${admin_form_key} + = + true + form_key + + + true + append + = + true + point + + + true + ${new_parent_category_id} + = + true + pid + + + true + ${parent_category_id} + = + true + paid + + + true + 0 + = + true + aid + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/move/ + POST + true + false + true + false + false + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/catalog/category/delete/id/${admin_category_id}/ + POST + true + false + true + false + false + + + + + + You deleted the category. + + Assertion.response_data + false + 2 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCategoryManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${adminPromotionRulesPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin Promotion Rules"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_promotions_management/admin_promotions_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/ + GET + true + false + true + false + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/new + GET + true + false + true + false + false + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + true + + + true + 1--1 + = + true + id + + + true + Magento\SalesRule\Model\Rule\Condition\Address|base_subtotal + = + true + type + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/newConditionHtml/form/sales_rule_formrule_conditions_fieldset_/form_namespace/sales_rule_form + POST + true + false + true + false + false + + + + + + + + true + Rule Name ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + name + + + true + 0 + = + true + is_active + + + true + 0 + = + true + use_auto_generation + + + true + 1 + = + true + is_rss + + + true + 0 + = + true + apply_to_shipping + + + true + 0 + = + true + stop_rules_processing + + + true + + = + true + coupon_code + + + true + + = + true + uses_per_coupon + + + true + + = + true + uses_per_customer + + + true + + = + true + sort_order + + + true + 5 + = + true + discount_amount + + + true + 0 + = + true + discount_qty + + + true + + = + true + discount_step + + + true + + = + true + reward_points_delta + + + true + + = + true + store_labels[0] + + + true + Rule Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + description + + + true + 1 + = + true + coupon_type + + + true + cart_fixed + = + true + simple_action + + + true + 1 + = + true + website_ids[0] + + + true + 0 + = + true + customer_group_ids[0] + + + true + + = + true + from_date + + + true + + = + true + to_date + + + true + Magento\SalesRule\Model\Rule\Condition\Combine + = + true + rule[conditions][1][type] + + + true + all + = + true + rule[conditions][1][aggregator] + + + true + 1 + = + true + rule[conditions][1][value] + + + true + Magento\SalesRule\Model\Rule\Condition\Address + = + true + rule[conditions][1--1][type] + + + true + base_subtotal + = + true + rule[conditions][1--1][attribute] + + + true + >= + = + true + rule[conditions][1--1][operator] + + + true + 100 + = + true + rule[conditions][1--1][value] + + + true + + = + true + rule[conditions][1][new_chlid] + + + true + Magento\SalesRule\Model\Rule\Condition\Product\Combine + = + true + rule[actions][1][type] + + + true + all + = + true + rule[actions][1][aggregator] + + + true + 1 + = + true + rule[actions][1][value] + + + true + + = + true + rule[actions][1][new_child] + + + true + + = + true + store_labels[1] + + + true + + = + true + store_labels[2] + + + true + + = + true + related_banners + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales_rule/promo_quote/save/ + POST + true + false + true + false + false + + + + + + You saved the rule. + + Assertion.response_data + false + 16 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminPromotionsManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${adminCustomerManagementPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin Customer Management"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ce/admin_customer_management/admin_customer_management.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index + GET + true + false + true + false + false + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + true + customer_listing + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 20 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + true + customer_listing + = + true + namespace + + + true + Lastname + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 20 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + false + customer_edit_url_path + actions":\{"edit":\{"href":"(?:http|https):\\/\\/(.*?)\\/customer\\/index\\/edit\\/id\\/(\d+)\\/", + /customer/index/edit/id/$2$/ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + customer_edit_url_path + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}${customer_edit_url_path} + GET + true + false + true + false + false + + + + + + Customer Information + + Assertion.response_data + false + 2 + + + + false + admin_customer_entity_id + "entity_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_website_id + "website_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_firstname + "firstname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_lastname + "lastname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_email + "email":"([^\@]+@[^.]+.[^"]+)" + $1$ + + 1 + + + + false + admin_customer_group_id + "group_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_store_id + "store_id":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_created_at + "created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_updated_at + "updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_is_active + "is_active":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_disable_auto_group_change + "disable_auto_group_change":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_created_in + "created_in":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_dob + "dob":"(\d+)-(\d+)-(\d+)" + $2$/$3$/$1$ + + 1 + + + + false + admin_customer_default_billing + "default_billing":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_default_shipping + "default_shipping":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_gender + "gender":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_failures_num + "failures_num":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_address_entity_id + _address":\{"entity_id":"(\d+)".+?"parent_id":"${admin_customer_entity_id}" + $1$ + + 1 + + + + false + admin_customer_address_created_at + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"created_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_updated_at + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"updated_at":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_is_active + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"is_active":"(\d+)" + $1$ + + 1 + + + + false + admin_customer_address_city + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"city":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_country_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"country_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_firstname + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"firstname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_lastname + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"lastname":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_postcode + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"postcode":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_region + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_region_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region_id":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_street + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"street":\["([^"]+)"\] + $1$ + + 1 + + + + false + admin_customer_address_telephone + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"telephone":"([^"]+)" + $1$ + + 1 + + + + false + admin_customer_address_customer_id + _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"customer_id":"([^"]+)" + $1$ + + 1 + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_entity_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_website_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_firstname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_lastname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_email + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_group_id + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_store_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_updated_at + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_is_active + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_disable_auto_group_change + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_created_in + + + + + ^\d+/\d+/\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_dob + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_default_billing + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_default_shipping + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_gender + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_failures_num + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_entity_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_created_at + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_updated_at + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_is_active + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_city + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_country_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_firstname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_lastname + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_postcode + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_region + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_region_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_street + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_telephone + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + admin_customer_address_customer_id + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_customer_entity_id} + = + true + customer[entity_id] + + + true + ${admin_customer_website_id} + = + true + customer[website_id] + + + true + ${admin_customer_email} + = + true + customer[email] + + + true + ${admin_customer_group_id} + = + true + customer[group_id] + + + true + ${admin_customer_store_id} + = + true + customer[store_id] + + + true + ${admin_customer_created_at} + = + true + customer[created_at] + + + true + ${admin_customer_updated_at} + = + true + customer[updated_at] + + + true + ${admin_customer_is_active} + = + true + customer[is_active] + + + true + ${admin_customer_disable_auto_group_change} + = + true + customer[disable_auto_group_change] + + + true + ${admin_customer_created_in} + = + true + customer[created_in] + + + true + + = + true + customer[prefix] + + + true + ${admin_customer_firstname} 1 + = + true + customer[firstname] + + + true + + = + true + customer[middlename] + + + true + ${admin_customer_lastname} 1 + = + true + customer[lastname] + + + true + + = + true + customer[suffix] + + + true + ${admin_customer_dob} + = + true + customer[dob] + + + true + ${admin_customer_default_billing} + = + true + customer[default_billing] + + + true + ${admin_customer_default_shipping} + = + true + customer[default_shipping] + + + true + + = + true + customer[taxvat] + + + true + ${admin_customer_gender} + = + true + customer[gender] + + + true + ${admin_customer_failures_num} + = + true + customer[failures_num] + + + true + ${admin_customer_store_id} + = + true + customer[sendemail_store_id] + + + true + ${admin_customer_address_entity_id} + = + true + address[${admin_customer_address_entity_id}][entity_id] + + + true + ${admin_customer_address_created_at} + = + true + address[${admin_customer_address_entity_id}][created_at] + + + true + ${admin_customer_address_updated_at} + = + true + address[${admin_customer_address_entity_id}][updated_at] + + + true + ${admin_customer_address_is_active} + = + true + address[${admin_customer_address_entity_id}][is_active] + + + true + ${admin_customer_address_city} + = + true + address[${admin_customer_address_entity_id}][city] + + + true + + = + true + address[${admin_customer_address_entity_id}][company] + + + true + ${admin_customer_address_country_id} + = + true + address[${admin_customer_address_entity_id}][country_id] + + + true + ${admin_customer_address_firstname} + = + true + address[${admin_customer_address_entity_id}][firstname] + + + true + ${admin_customer_address_lastname} + = + true + address[${admin_customer_address_entity_id}][lastname] + + + true + + = + true + address[${admin_customer_address_entity_id}][middlename] + + + true + ${admin_customer_address_postcode} + = + true + address[${admin_customer_address_entity_id}][postcode] + + + true + + = + true + address[${admin_customer_address_entity_id}][prefix] + + + true + ${admin_customer_address_region} + = + true + address[${admin_customer_address_entity_id}][region] + + + true + ${admin_customer_address_region_id} + = + true + address[${admin_customer_address_entity_id}][region_id] + + + true + ${admin_customer_address_street} + = + true + address[${admin_customer_address_entity_id}][street][0] + + + true + + = + true + address[${admin_customer_address_entity_id}][street][1] + + + true + + = + true + address[${admin_customer_address_entity_id}][suffix] + + + true + ${admin_customer_address_telephone} + = + true + address[${admin_customer_address_entity_id}][telephone] + + + true + + = + true + address[${admin_customer_address_entity_id}][vat_id] + + + true + ${admin_customer_address_customer_id} + = + true + address[${admin_customer_address_entity_id}][customer_id] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_billing] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_shipping] + + + true + + = + true + address[new_0][prefix] + + + true + John + = + true + address[new_0][firstname] + + + true + + = + true + address[new_0][middlename] + + + true + Doe + = + true + address[new_0][lastname] + + + true + + = + true + address[new_0][suffix] + + + true + Test Company + = + true + address[new_0][company] + + + true + Folsom + = + true + address[new_0][city] + + + true + 95630 + = + true + address[new_0][postcode] + + + true + 1234567890 + = + true + address[new_0][telephone] + + + true + + = + true + address[new_0][vat_id] + + + true + false + = + true + address[new_0][default_billing] + + + true + false + = + true + address[new_0][default_shipping] + + + true + 123 Main + = + true + address[new_0][street][0] + + + true + + = + true + address[new_0][street][1] + + + true + + = + true + address[new_0][region] + + + true + US + = + true + address[new_0][country_id] + + + true + ${admin_customer_address_region_id} + = + true + address[new_0][region_id] + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index/validate/ + POST + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 16 + + + + + + + + true + true + = + true + isAjax + + + true + ${admin_customer_entity_id} + = + true + customer[entity_id] + + + true + ${admin_customer_website_id} + = + true + customer[website_id] + + + true + ${admin_customer_email} + = + true + customer[email] + + + true + ${admin_customer_group_id} + = + true + customer[group_id] + + + true + ${admin_customer_store_id} + = + true + customer[store_id] + + + true + ${admin_customer_created_at} + = + true + customer[created_at] + + + true + ${admin_customer_updated_at} + = + true + customer[updated_at] + + + true + ${admin_customer_is_active} + = + true + customer[is_active] + + + true + ${admin_customer_disable_auto_group_change} + = + true + customer[disable_auto_group_change] + + + true + ${admin_customer_created_in} + = + true + customer[created_in] + + + true + + = + true + customer[prefix] + + + true + ${admin_customer_firstname} 1 + = + true + customer[firstname] + + + true + + = + true + customer[middlename] + + + true + ${admin_customer_lastname} 1 + = + true + customer[lastname] + + + true + + = + true + customer[suffix] + + + true + ${admin_customer_dob} + = + true + customer[dob] + + + true + ${admin_customer_default_billing} + = + true + customer[default_billing] + + + true + ${admin_customer_default_shipping} + = + true + customer[default_shipping] + + + true + + = + true + customer[taxvat] + + + true + ${admin_customer_gender} + = + true + customer[gender] + + + true + ${admin_customer_failures_num} + = + true + customer[failures_num] + + + true + ${admin_customer_store_id} + = + true + customer[sendemail_store_id] + + + true + ${admin_customer_address_entity_id} + = + true + address[${admin_customer_address_entity_id}][entity_id] + + + + true + ${admin_customer_address_created_at} + = + true + address[${admin_customer_address_entity_id}][created_at] + + + true + ${admin_customer_address_updated_at} + = + true + address[${admin_customer_address_entity_id}][updated_at] + + + true + ${admin_customer_address_is_active} + = + true + address[${admin_customer_address_entity_id}][is_active] + + + true + ${admin_customer_address_city} + = + true + address[${admin_customer_address_entity_id}][city] + + + true + + = + true + address[${admin_customer_address_entity_id}][company] + + + true + ${admin_customer_address_country_id} + = + true + address[${admin_customer_address_entity_id}][country_id] + + + true + ${admin_customer_address_firstname} + = + true + address[${admin_customer_address_entity_id}][firstname] + + + true + ${admin_customer_address_lastname} + = + true + address[${admin_customer_address_entity_id}][lastname] + + + true + + = + true + address[${admin_customer_address_entity_id}][middlename] + + + true + ${admin_customer_address_postcode} + = + true + address[${admin_customer_address_entity_id}][postcode] + + + true + + = + true + address[${admin_customer_address_entity_id}][prefix] + + + true + ${admin_customer_address_region} + = + true + address[${admin_customer_address_entity_id}][region] + + + true + ${admin_customer_address_region_id} + = + true + address[${admin_customer_address_entity_id}][region_id] + + + true + ${admin_customer_address_street} + = + true + address[${admin_customer_address_entity_id}][street][0] + + + true + + = + true + address[${admin_customer_address_entity_id}][street][1] + + + true + + = + true + address[${admin_customer_address_entity_id}][suffix] + + + true + ${admin_customer_address_telephone} + = + true + address[${admin_customer_address_entity_id}][telephone] + + + true + + = + true + address[${admin_customer_address_entity_id}][vat_id] + + + true + ${admin_customer_address_customer_id} + = + true + address[${admin_customer_address_entity_id}][customer_id] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_billing] + + + true + true + = + true + address[${admin_customer_address_entity_id}][default_shipping] + + + true + + = + true + address[new_0][prefix] + + + true + John + = + true + address[new_0][firstname] + + + true + + = + true + address[new_0][middlename] + + + true + Doe + = + true + address[new_0][lastname] + + + true + + = + true + address[new_0][suffix] + + + true + Test Company + = + true + address[new_0][company] + + + true + Folsom + = + true + address[new_0][city] + + + true + 95630 + = + true + address[new_0][postcode] + + + true + 1234567890 + = + true + address[new_0][telephone] + + + true + + = + true + address[new_0][vat_id] + + + true + false + = + true + address[new_0][default_billing] + + + true + false + = + true + address[new_0][default_shipping] + + + true + 123 Main + = + true + address[new_0][street][0] + + + true + + = + true + address[new_0][street][1] + + + true + + = + true + address[new_0][region] + + + true + US + = + true + address[new_0][country_id] + + + true + 12 + = + true + address[new_0][region_id] + + + true + ${admin_form_key} + = + true + form_key + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/customer/index/save/ + POST + true + false + true + true + false + + + + + + You saved the customer. + + Assertion.response_data + false + 2 + + + + + 1 + 0 + ${__javaScript(Math.round(${adminCustomerManagementDelay}*1000))} + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${adminEditOrderPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Admin Edit Order"); + + true + + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/orders_page.jmx + + + + Create New Order + + Assertion.response_data + false + 2 + + + + + + + + + true + sales_order_grid + = + true + namespace + + + true + + = + true + search + + + true + true + = + true + filters[placeholder] + + + true + 200 + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + increment_id + = + true + sorting[field] + + + true + desc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + true + ${admin_form_key} + = + true + form_key + false + + + true + pending + = + true + filters[status] + true + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + sales_order_grid + = + true + namespace + true + + + true + + = + true + search + true + + + true + true + = + true + filters[placeholder] + true + + + true + 200 + = + true + paging[pageSize] + true + + + true + 1 + = + true + paging[current] + true + + + true + increment_id + = + true + sorting[field] + true + + + true + asc + = + true + sorting[direction] + true + + + true + true + = + true + isAjax + true + + + true + pending + = + true + filters[status] + + + true + ${__time()}${__Random(1,1000000)} + = + true + _ + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/search_orders.jmx + + + + totalRecords + + Assertion.response_data + false + 2 + + + + false + order_numbers + \"increment_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + false + order_ids + \"entity_id\":\"(\d+)\"\, + $1$ + + -1 + simple_products + + + + + + tool/fragments/ce/admin_create_process_returns/setup.jmx + + import java.util.ArrayList; + import java.util.HashMap; + import org.apache.jmeter.protocol.http.util.Base64Encoder; + import java.util.Random; + + // get count of "order_numbers" variable defined in "Search Pending Orders Limit" + int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); + + + int clusterLength; + int threadsNumber = ctx.getThreadGroup().getNumThreads(); + if (threadsNumber == 0) { + //Number of orders for one thread + clusterLength = ordersCount; + } else { + clusterLength = Math.round(ordersCount / threadsNumber); + if (clusterLength == 0) { + clusterLength = 1; + } + } + + //Current thread number starts from 0 + int currentThreadNum = ctx.getThreadNum(); + + //Index of the current product from the cluster + Random random = new Random(); + if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); + } + int iterator = random.nextInt(clusterLength); + if (iterator == 0) { + iterator = 1; + } + + int i = clusterLength * currentThreadNum + iterator; + + orderNumber = vars.get("order_numbers_" + i.toString()); + orderId = vars.get("order_ids_" + i.toString()); + vars.put("order_number", orderNumber); + vars.put("order_id", orderId); + + + + + false + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/open_order.jmx + + + + #${order_number} + + Assertion.response_data + false + 2 + + + + false + order_status + <span id="order_status">([^<]+)</span> + $1$ + + 1 + simple_products + + + + + + "${order_status}" == "Pending" + false + tool/fragments/ce/admin_edit_order/if_controller.jmx + + + + + + true + pending + = + true + history[status] + false + + + true + Some text + = + true + history[comment] + + + true + ${admin_form_key} + = + true + form_key + false + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order/addComment/order_id/${order_id}/?isAjax=true + POST + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/add_comment.jmx + + + + Not Notified + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_start.jmx + + + + Invoice Totals + + Assertion.response_data + false + 2 + + + + false + item_ids + <div id="order_item_(\d+)_title"\s*class="product-title"> + $1$ + + -1 + simple_products + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + invoice[items][${item_ids_1}] + + + true + 1 + = + true + invoice[items][${item_ids_2}] + + + true + Invoiced + = + true + invoice[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx + + + + The invoice has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/start/order_id/${order_id}/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/shipment_start.jmx + + + + New Shipment + + Assertion.response_data + false + 2 + + + + + + + + + true + ${admin_form_key} + = + true + form_key + false + + + true + 1 + = + true + shipment[items][${item_ids_1}] + + + true + 1 + = + true + shipment[items][${item_ids_2}] + + + true + Shipped + = + true + shipment[comment_text] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ + POST + true + false + true + false + false + + tool/fragments/ce/admin_edit_order/shipment_submit.jmx + + + + The shipment has been created + + Assertion.response_data + false + 2 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + + + 1 + false + 1 + ${catalogGraphQLPercentage} + tool/fragments/_system/scenario_controller_tmpl.jmx + + + +var tmpLabel = vars.get("testLabel") +if (tmpLabel) { + var testLabel = " (" + tmpLabel + ")" + if (sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy') { + if (sampler.getName().indexOf(testLabel) == -1) { + sampler.setName(sampler.getName() + testLabel); + } + } else if (sampler.getName().indexOf("SetUp - ") == -1) { + sampler.setName("SetUp - " + sampler.getName()); + } + } else { + testLabel = "" + } + + + + javascript + tool/fragments/_system/setup_label.jmx + + + + vars.put("testLabel", "Catalog GraphQL"); + + true + + + + + tool/fragments/ce/once_only_controller.jmx + + + + + function getFormKeyFromResponse() + { + var url = prev.getUrlAsString(), + responseCode = prev.getResponseCode(), + formKey = null; + searchPattern = /var FORM_KEY = '(.+)'/; + if (responseCode == "200" && url) { + response = prev.getResponseDataAsString(); + formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; + } + return formKey; + } + + formKey = vars.get("form_key_storage"); + + currentFormKey = getFormKeyFromResponse(); + + if (currentFormKey != null && currentFormKey != formKey) { + vars.put("form_key_storage", currentFormKey); + } + + javascript + tool/fragments/ce/admin/handle_admin_form_key.jmx + + + + formKey = vars.get("form_key_storage"); + if (formKey + && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' + && sampler.getMethod() == "POST") + { + arguments = sampler.getArguments(); + for (i=0; i<arguments.getArgumentCount(); i++) + { + argument = arguments.getArgument(i); + if (argument.getName() == 'form_key' && argument.getValue() != formKey) { + log.info("admin form key updated: " + argument.getValue() + " => " + formKey); + argument.setValue(formKey); + } + } + } + + javascript + + + + + + false + tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx + + + + tool/fragments/ce/simple_controller.jmx + + + + get-admin-email + tool/fragments/ce/lock_controller.jmx + + + + tool/fragments/ce/get_admin_email.jmx + +adminUser = "none"; +adminUserList = props.get("adminUserList"); +adminUserListIterator = props.get("adminUserListIterator"); +adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + +if (adminUsersDistribution == 1) { + adminUser = adminUserList.poll(); +} else { + if (!adminUserListIterator.hasNext()) { + adminUserListIterator = adminUserList.descendingIterator(); + } + + adminUser = adminUserListIterator.next(); +} + +if (adminUser == "none") { + SampleResult.setResponseMessage("adminUser list is empty"); + SampleResult.setResponseData("adminUser list is empty","UTF-8"); + IsSuccess=false; + SampleResult.setSuccessful(false); + SampleResult.setStopThread(true); +} +vars.put("admin_user", adminUser); + + + + true + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/ + GET + true + false + true + false + false + + tool/fragments/ce/admin_login/admin_login.jmx + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + + true + + = + true + dummy + + + true + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + tool/fragments/ce/admin_login/admin_login_submit_form.jmx + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx + + + + + + tool/fragments/ce/simple_controller.jmx + + + + tool/fragments/ee/admin_create_cms_page_with_page_builder_product_list/admin_create_cms_page_with_page_builder_product_list.jmx + + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/cms/page/new + GET + true + false + true + false + + 60000 + 200000 + + + + + + + true + <div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-element="inner" style="justify-content: flex-start; display: flex; flex-direction: column; background-position: left top; background-size: cover; background-repeat: no-repeat; background-attachment: scroll; border-style: none; border-width: 1px; border-radius: 0px; margin: 0px 0px 10px; padding: 10px;"><div data-content-type="products" data-appearance="grid" data-element="main" style="border-style: none; border-width: 1px; border-radius: 0px; margin: 0px; padding: 0px;">{{widget type="Magento\CatalogWidget\Block\Product\ProductsList" template="Magento_CatalogWidget::product/widget/content/grid.phtml" anchor_text="" id_path="" show_pager="0" products_count="5" sort_order="date_newest_top" type_name="Catalog Products List" conditions_encoded="^[`1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,`aggregator`:`any`,`value`:`1`,`new_child`:``^]^]"}}</div></div></div> + = + true + content + + + true + + = + true + content_heading + + + true + ${admin_form_key} + = + true + form_key + + + true + + = + true + identifier + + + true + 1 + = + true + is_active + + + true + + = + true + layout_update_xml + + + true + + = + true + meta_description + + + true + + = + true + meta_keywords + + + true + + = + true + meta_title + + + false + {} + = + true + nodes_data + + + true + + = + true + node_ids + + + true + + = + true + page_id + + + true + 1column + = + true + page_layout + + + true + 0 + = + true + store_id[0] + + + true + Page Builder Products ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} + = + true + title + + + true + 0 + = + true + website_root + + + + + + ${request_protocol} + + ${base_path}${admin_path}/cms/page/save/back/edit + POST + true + false + true + false + + 60000 + 200000 + + + + + You saved the page. + + Assertion.response_data + false + 16 + + + + URL + cms_page_id + /page_id\/([0-9]*)\/back/ + $1$ + + 1 + + + + + + + + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}${admin_path}/admin/auth/logout/ + GET + true + false + true + false + false + + tool/fragments/ce/setup/admin_logout.jmx + + + + false + + + + adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); + if (adminUsersDistribution == 1) { + adminUserList = props.get("adminUserList"); + adminUserList.add(vars.get("admin_user")); + } + + tool/fragments/ce/common/return_admin_email_to_pool.jmx + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + tool/fragments/ce/common/init_random_generator_setup.jmx + +import java.util.Random; + +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom} + ${__threadNum}); +} + +vars.putObject("randomIntGenerator", random); + + + + true + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + tool/fragments/ce/graphql/simple_products_setup.jmx + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("simple_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("simple_product_id", product.get("id")); +vars.put("simple_product_sku", product.get("sku")); + + + + true + + + + + tool/fragments/ce/graphql/configurable_products_setup.jmx + +import java.util.Random; + +Random random = vars.getObject("randomIntGenerator"); +number = random.nextInt(props.get("configurable_products_list").size()); +product = props.get("simple_products_list").get(number); + +vars.put("configurable_product_id", product.get("id")); +vars.put("configurable_product_sku", product.get("sku")); + + + + true + + + + + + + tool/fragments/ce/simple_controller.jmx + + + + + + Content-Type + application/json + + + Accept + */* + + + tool/fragments/ce/api/header_manager_before_token.jmx + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + tool/fragments/ce/api/admin_token_retrieval.jmx + + + admin_token + $ + + + BODY + + + + + ^.{10,}$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + + Authorization + Bearer ${admin_token} + + + tool/fragments/ce/api/header_manager.jmx + + + + true + + + + false + {"query":"{\n products(\n filter: {\n price: {from: \"5\"}\n name:{match:\"Product\"}\n }\n pageSize: 20\n currentPage: 1\n sort: {\n price: ASC\n name:DESC\n }\n ) {\n total_count\n items {\n attribute_set_id\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n short_description {\n html\n }\n sku\n small_image {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n \t... on PhysicalProductInterface {\n \tweight\n \t}\n }\n page_info {\n page_size\n current_page\n }\n }\n}\n","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_filter_only.jmx + + + + graphql_multiple_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_multiple_products_query_total_count"); + if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; + } else { + if (Integer.parseInt(totalCount) < 200) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than 200, Actual: " + totalCount; + } else { + Failure = false; + } + } + + + + false + + + + + + true + + + + false + {"query":"{\n products(filter: {sku: { eq: \"${simple_product_sku}\" } },sort: {name: ASC})\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n }\n }\n}\n","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_simple_product_with_extensible_data_objects.jmx + + + + graphql_simple_products_query_total_count + $.data.products.total_count + + + BODY + + + + + graphql_multiple_products_query_response + $ + + + BODY + + + + String totalCount=vars.get("graphql_simple_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) != 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be equal to 1, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + false + + + + $.data.products.items[0].sku + ${simple_product_sku} + true + false + false + true + + + + + + true + + + + false + {"query":"{\n products(filter: {sku: {eq:\"${configurable_product_sku}\"} }, sort: {name: ASC}) {\n total_count\n items {\n ... on PhysicalProductInterface {\n weight\n }\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_configurable_product_with_extensible_data_objects.jmx + + + + graphql_configurable_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_configurable_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) != 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be equal to 1, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + $.data.products.items[0].sku + ${configurable_product_sku} + true + false + false + true + + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n currentPage:1\n search: \"configurable\"\n filter: {name: {match: \"Configurable Product\"} }\n sort: {name: ASC}\n ) {\n total_count\n page_info {\n current_page\n page_size\n total_pages\n }\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_full_text_and_filter.jmx + + + + graphql_search_products_query_total_count_fulltext_filter + $.data.products.total_count + + + BODY + + + + graphql_search_products_query_total_pages_fulltext_filter + $.data.products.page_info.total_pages + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count_fulltext_filter"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n currentPage:${graphql_search_products_query_total_pages_fulltext_filter}\n search: \"configurable\"\n filter: {name: {match: \"Configurable Product\"} }\n sort: {name: ASC}\n ) {\n total_count\n page_info {\n current_page\n page_size\n total_pages\n }\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_full_text_and_filter_last_page.jmx + + + + graphql_search_products_query_total_count_fulltext_filter + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count_fulltext_filter"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n currentPage:1\n search: \"configurable\"\n sort: {name: ASC}) {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_full_text_only.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n currentPage:1\n search: \"Option 1\"\n sort: {name: ASC}) {\n filters {\n name\n filter_items_count\n request_var\n filter_items {\n label\n value_string\n items_count\n ... on SwatchLayerFilterItemInterface {\n swatch_data {\n type\n value\n }\n }\n }\n }\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n weight\n }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_full_text_and_filters.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + +if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; +} else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } +} + + + + + + false + + + + + + true + + + + false + {"query":"{\n products(\n pageSize:20\n currentPage:1\n search: \"Option 1\"\n sort: {name: ASC}) {\n aggregations{\n attribute_code\n count\n label\n options{\n count\n label\n value\n }\n }\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n weight\n }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_full_text_and_aggregations.jmx + + + + graphql_search_products_query_total_count + $.data.products.total_count + + + BODY + + + + String totalCount=vars.get("graphql_search_products_query_total_count"); + if (totalCount == null) { + Failure = true; + FailureMessage = "Not Expected \"totalCount\" to be null"; + } else { + if (Integer.parseInt(totalCount) < 1) { + Failure = true; + FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; + } else { + Failure = false; + } + } + + + + false + + + + + + + + true + + + + false + { + "customer": { + + "email": "customer_${__time()}-${__threadNum}-${__Random(1,1000000)}@example.com", + "firstname": "test_${__time()}-${__threadNum}-${__Random(1,1000000)}", + "lastname": "Doe" + }, + "password": "test@123" + } + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/customers + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_frontend_customer.jmx + + + + customer_id + $.id + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + customer_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/customers/${customer_id} + GET + true + false + true + false + false + + tool/fragments/ce/api/check_customer.jmx + + + + $.id + ${customer_id} + true + false + false + true + + + + customer_email + $.email + + + BODY + + + + + true + + + + false + { + "username":"${customer_email}", + "password":"test@123" + } + + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/integration/customer/token + POST + true + false + true + false + false + + tool/fragments/ce/api/create_customer.jmx + + + + customer_token + $ + + + BODY + + + + + true + + + + false + {"query":"{\n customer {\n created_at\n group_id\n\n prefix\n firstname\n middlename\n lastname\n suffix\n email\n default_billing\n default_shipping\n\n dob\n taxvat\n\n id\n addresses {\n id\n customer_id\n region {\n region_code\n region\n region_id\n }\n region_id\n country_id\n street \n company\n telephone\n fax\n postcode\n city\n firstname\n lastname\n middlename\n prefix\n suffix\n vat_id\n default_shipping\n default_billing\n }\n is_subscribed\n }\n}","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_frontend_customer.jmx + + + + false + + + import org.apache.jmeter.protocol.http.control.Header; + + sampler.getHeaderManager().removeHeaderNamed("Authorization"); + + sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); + + + + $.data.customer.lastname + Doe + true + false + false + true + + + + + + + true + + + + false + {"query":"{\n category(id: 1) {\n name\n id\n level\n description\n path\n path_in_store\n url_key\n url_path\n children {\n id\n description\n default_sort_by\n children {\n id\n description\n level\n children {\n level\n id\n children {\n id\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_root_category.jmx + + + + graphql_category_query_name + $.data.category.name + + + BODY + + + + String name = vars.get("graphql_category_query_name"); +if (name == null) { + Failure = true; + FailureMessage = "Not Expected \"children\" to be null"; +} else { + if (!name.equals("Root Catalog")) { + Failure = true; + FailureMessage = "Expected \"name\" to equal \"Root Catalog\", Actual: " + name; + } else { + Failure = false; + } +} + + + + false + + + + + + true + + + + false + {"query":"{\n categoryList{\n name\n id\n level\n description\n path\n path_in_store\n url_key\n url_path\n children {\n id\n description\n default_sort_by\n children {\n id\n description\n level\n children {\n level\n id\n children {\n id\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} + = + + + + + + + + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/query_root_category_list.jmx + + + + graphql_categoryList_query_name + $.data.categoryList[0].name + + + BODY + JSON + + + + String name = vars.get("graphql_categoryList_query_name"); +if (name == null) { + Failure = true; + FailureMessage = "Not Expected \"children\" to be null"; +} else { + if (!name.equals("Default Category")) { + Failure = true; + FailureMessage = "Expected \"name\" to equal \"Default Category\", Actual: " + name; + } else { + Failure = false; + } +} + + + + false + + + + + + true + + + + false + + {"query":"query getCmsPage($id: Int!, $onServer: Boolean!) {\n cmsPage(id: $id) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"id":${cms_page_id},"onServer":false},"operationName":"getCmsPage"} + + = + + + + + ${graphql_port_number} + 60000 + 200000 + ${request_protocol} + + ${base_path}graphql + POST + true + false + true + false + false + + tool/fragments/ce/graphql/get_get_cms_page_by_id.jmx + + + $.data.cmsPage.url_key + ${cms_page_id} + false + false + false + false + + + + + + + + + + + stoptest + + false + 1 + + 1 + 1 + 1395324075000 + 1395324075000 + false + + + tool/fragments/ce/tear_down.jmx + + + "${dashboard_enabled}" == "1" + false + + + + + + + true + ${__property(environment)} + = + true + environment + + + true + ${start_time} + = + true + startTime + + + true + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + endTime + + + true + ${redis_host} + = + true + stats_server + + + + + + 60000 + 200000 + ${request_protocol} + + ${base_path}DeploymentEvent.php + POST + true + false + true + false + false + + + + + + Errors: + + Assertion.response_data + false + 6 + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + true + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + true + true + + + ${response_time_file_name} + tool/fragments/ce/common/aggregate_graph.jmx + + + + false + true + true + false + tool/fragments/_system/debug.jmx + + + + true + + + diff --git a/magento/setup/performance-toolkit/benchmark_2015.jmx b/magento/setup/performance-toolkit/benchmark_2015.jmx new file mode 100644 index 0000000..e58e610 --- /dev/null +++ b/magento/setup/performance-toolkit/benchmark_2015.jmx @@ -0,0 +1,6905 @@ + + + + + + + false + false + + + + + request_protocol + ${__P(request_protocol,http)} + = + + + abandonedCartByGuest + ${__P(abandonedCartByGuest,0)} + = + + + abandonedCartByGuestPercent + ${__P(abandonedCartByGuestPercent,100)} + = + + + abandonedCartByCustomer + ${__P(abandonedCartByCustomer,0)} + = + + + abandonedCartByCustomerPercent + ${__P(abandonedCartByCustomerPercent,100)} + = + + + accountManagement + ${__P(accountManagement,0)} + = + + + accountManagementPercent + ${__P(accountManagementPercent,100)} + = + + + admin_password + ${__P(admin_password,123123q)} + = + + + admin_path + ${__P(admin_path,admin)} + = + + + admin_user + ${__P(admin_user,admin)} + = + + + adminBrowseCustomersGridPercent + ${__P(adminBrowseCustomersGridPercent,100)} + = + + + adminBrowseCustomersGridScenario1_ViewOddGridPages + ${__P(adminBrowseCustomersGridScenario1_ViewOddGridPages,0)} + = + + + adminBrowseCustomersGridScenario2_ViewEvenGridPages + ${__P(adminBrowseCustomersGridScenario2_ViewEvenGridPages,0)} + = + + + adminBrowseCustomersGridScenario3_Filtering + ${__P(adminBrowseCustomersGridScenario3_Filtering,0)} + = + + + adminBrowseCustomersGridScenario4_Sorting + ${__P(adminBrowseCustomersGridScenario4_Sorting,0)} + = + + + adminBrowseCustomersGridScenario5_FilteringAndSorting + ${__P(adminBrowseCustomersGridScenario5_FilteringAndSorting,0)} + = + + + adminBrowseOrdersGridPercent + ${__P(adminBrowseOrdersGridPercent,100)} + = + + + adminBrowseOrdersGridScenario1_ViewOddGridPages + ${__P(adminBrowseOrdersGridScenario1_ViewOddGridPages,0)} + = + + + adminBrowseOrdersGridScenario2_ViewEvenGridPages + ${__P(adminBrowseOrdersGridScenario2_ViewEvenGridPages,0)} + = + + + adminBrowseOrdersGridScenario3_Filtering + ${__P(adminBrowseOrdersGridScenario3_Filtering,0)} + = + + + adminBrowseOrdersGridScenario4_Sorting + ${__P(adminBrowseOrdersGridScenario4_Sorting,0)} + = + + + adminBrowseOrdersGridScenario5_FilteringAndSorting + ${__P(adminBrowseOrdersGridScenario5_FilteringAndSorting,0)} + = + + + adminBrowseProductsGridPercent + ${__P(adminBrowseProductsGridPercent,100)} + = + + + adminBrowseProductsGridScenario1_ViewOddGridPages + ${__P(adminBrowseProductsGridScenario1_ViewOddGridPages,0)} + = + + + adminBrowseProductsGridScenario2_ViewEvenGridPages + ${__P(adminBrowseProductsGridScenario2_ViewEvenGridPages,0)} + = + + + adminBrowseProductsGridScenario3_Filtering + ${__P(adminBrowseProductsGridScenario3_Filtering,0)} + = + + + adminBrowseProductsGridScenario4_Sorting + ${__P(adminBrowseProductsGridScenario4_Sorting,0)} + = + + + adminBrowseProductsGridScenario5_FilteringAndSorting + ${__P(adminBrowseProductsGridScenario5_FilteringAndSorting,0)} + = + + + adminCategoryCount + ${__P(adminCategoryCount,0)} + = + + + adminCategoryManagement + ${__P(adminCategoryManagement,0)} + = + + + adminCategoryManagementDelay + ${__P(adminCategoryManagementDelay,0)} + = + + + adminCategoryManagementPercent + ${__P(adminCategoryManagementPercent,100)} + = + + + adminCMSManagement + ${__P(adminCMSManagement,0)} + = + + + adminCMSManagementDelay + ${__P(adminCMSManagementDelay,0)} + = + + + adminCMSManagementPercent + ${__P(adminCMSManagementPercent,100)} + = + + + adminCreateOrder + ${__P(adminCreateOrder,0)} + = + + + adminCreateOrderPercent + ${__P(adminCreateOrderPercent,100)} + = + + + adminCreateProduct + ${__P(adminCreateProduct,0)} + = + + + adminCreateProductPercent + ${__P(adminCreateProductPercent,100)} + = + + + adminCustomerManagement + ${__P(adminCustomerManagement,0)} + = + + + adminCustomerManagementDelay + ${__P(adminCustomerManagementDelay,0)} + = + + + adminCustomerManagementPercent + ${__P(adminCustomerManagementPercent,100)} + = + + + adminEditOrder + ${__P(adminEditOrder,0)} + = + + + adminEditOrderPercent + ${__P(adminEditOrderPercent,100)} + = + + + adminEditProduct + ${__P(adminEditProduct,0)} + = + + + adminEditProductPercent + ${__P(adminEditProductPercent,100)} + = + + + adminExportCustomers + ${__P(adminExportCustomers,0)} + = + + + adminExportProducts + ${__P(adminExportProducts,0)} + = + + + adminImportCustomerBehavior + ${__P(adminImportCustomerBehavior,)} + = + + + adminImportCustomerFilePath + ${__P(adminImportCustomerFilePath,0)} + = + + + adminImportCustomers + ${__P(adminImportCustomers,0)} + = + + + adminImportProductBehavior + ${__P(adminImportProductBehavior,)} + = + + + adminImportProductFilePath + ${__P(adminImportProductFilePath,0)} + = + + + adminImportProductFilePath-2 + ${__P(adminImportProductFilePath-2,0)} + = + + + adminImportProducts + ${__P(adminImportProducts,0)} + = + + + adminPromotionsManagement + ${__P(adminPromotionsManagement,0)} + = + + + adminPromotionsManagementDelay + ${__P(adminPromotionsManagementDelay,0)} + = + + + adminPromotionsManagementPercent + ${__P(adminPromotionsManagementPercent,100)} + = + + + apiBrowseAndBuyFlow + ${__P(apiBrowseAndBuyFlow,0)} + = + + + apiBrowseAndBuyFlowPercent + ${__P(apiBrowseAndBuyFlowPercent,100)} + = + + + apiCustomerSync + ${__P(apiCustomerSync,0)} + = + + + apiCustomerSyncPercent + ${__P(apiCustomerSyncPercent,100)} + = + + + apiOrderInvoiceShipmentSync + ${__P(apiOrderInvoiceShipmentSync,0)} + = + + + apiOrderInvoiceShipmentSyncPercent + ${__P(apiOrderInvoiceShipmentSyncPercent,100)} + = + + + apiProcessOrders + ${__P(apiProcessOrders,0)} + = + + + apiProcessOrdersPercent + ${__P(apiProcessOrdersPercent,100)} + = + + + apiProductSync + ${__P(apiProductSync,0)} + = + + + apiProductSyncPercent + ${__P(apiProductSyncPercent,100)} + = + + + apiSnapshot + ${__P(apiSnapshot,0)} + = + + + bamboo_build_number + ${__P(bamboo_build_number,)} + = + + + base_path + ${__P(base_path,)} + = + + + cache_indicator + ${__P(cache_indicator,0)} + = + + + catalogBrowsingByGuest + ${__P(catalogBrowsingByGuest,0)} + = + + + catalogBrowsingByGuestPercent + ${__P(catalogBrowsingByGuestPercent,100)} + = + + + catalogBrowsingByCustomer + ${__P(catalogBrowsingByCustomer,0)} + = + + + catalogBrowsingByCustomerPercent + ${__P(catalogBrowsingByCustomerPercent,100)} + = + + + categories_count + ${__P(categories_count,100)} + = + + + checkoutByGuest + ${__P(checkoutByGuest,0)} + = + + + checkoutByGuestPercent + ${__P(checkoutByGuestPercent,100)} + = + + + checkoutByCustomer + ${__P(checkoutByCustomer,0)} + = + + + checkoutByCustomerPercent + ${__P(checkoutByCustomerPercent,100)} + = + + + configurable_products_count + ${__P(configurable_products_count,30)} + = + + + customer_checkout_percent + ${__P(customer_checkout_percent,4)} + = + + + customer_limit + ${__P(customer_limit,20)} + = + + + customer_password + 123123q + = + + + customers_page_size + ${__P(customers_page_size,20)} + = + + + dashboard_enabled + ${__P(dashboard_enabled,0)} + = + + + files_folder + ${__P(files_folder,/opt/mpaf/tool/fragments/files/)} + = + + + guest_checkout_percent + ${__P(guest_checkout_percent,4)} + = + + + host + ${__P(host,)} + = + + + loops + ${__P(loops,1)} + = + + + lineItemsAmount + ${__P(lineItemsAmount,10)} + = + + + orders + ${__P(orders,0)} + = + + + orders_page_size + ${__P(orders_page_size,20)} + = + + + products_page_size + ${__P(products_page_size,20)} + = + + + productCompareByGuest + ${__P(productCompareByGuest,0)} + = + + + productCompareByGuestPercent + ${__P(productCompareByGuestPercent,100)} + = + + + productCompareDelay + ${__P(productCompareDelay,0)} + = + + + productsGridMassActions + ${__P(productsGridMassActions,0)} + = + + + productsGridMassActionsPercent + ${__P(productsGridMassActionsPercent,100)} + = + + + ramp_period + ${__P(ramp_period,0)} + = + + + redis_host + ${__P(redis_host,)} + = + + + report_save_path + ${__P(report_save_path,./)} + = + + + response_time_file_name + ${__P(response_time_file_name,production.csv)} + = + + + reviewByCustomer + ${__P(reviewByCustomer,0)} + = + + + reviewByCustomerPercent + ${__P(reviewByCustomerPercent,100)} + = + + + reviewDelay + ${__P(reviewDelay,0)} + = + + + scenario + ${__P(scenario,)} + = + + + seedForRandom + ${__P(seedForRandom,1)} + = + + + searchQuick + ${__P(searchQuick,0)} + = + + + searchQuick_percent + ${__P(searchQuick_percent,100)} + = + + + searchQuickFilter + ${__P(searchQuickFilter,0)} + = + + + searchQuickFilter_percent + ${__P(searchQuickFilter_percent,100)} + = + + + searchAdvanced + ${__P(searchAdvanced,0)} + = + + + searchAdvanced_percent + ${__P(searchAdvanced_percent,100)} + = + + + setupAndTearDownThread + ${__P(setupAndTearDownThread,1)} + = + + + simple_products_count + ${__P(simple_products_count,30)} + = + + + sprint_identifier + ${__P(sprint_identifier,)} + = + + + start_time + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + + + starting_index + ${__P(starting_index,0)} + = + + + test_duration + ${__P(test_duration,900)} + = + + + think_time_deviation + ${__P(think_time_deviation,1000)} + = + + + think_time_delay_offset + ${__P(think_time_delay_offset,2000)} + = + + + url_suffix + .html + = + + + users + ${__P(users,100)} + = + + + view_catalog_percent + ${__P(view_catalog_percent,62)} + = + + + view_product_add_to_cart_percent + ${__P(view_product_add_to_cart_percent,30)} + = + + + website_id + 1 + = + + + wishlistByCustomer + ${__P(wishlistByCustomer,0)} + = + + + wishlistByCustomerPercent + ${__P(wishlistByCustomerPercent,100)} + = + + + wishlistDelay + ${__P(wishlistDelay,0)} + = + + + + + + + + + + ${host} + + + + ${request_protocol} + utf-8 + + Java + 4 + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Accept + application/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + User-Agent + Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 + + + Accept-Encoding + gzip, deflate + + + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + true + + + + + stoptest + + false + 1 + + ${setupAndTearDownThread} + 1 + 1384333221000 + 1384333221000 + false + + + + + + +props.remove("category_url_key"); +props.remove("category_url_keys_list"); +props.remove("category_name"); +props.remove("category_names_list"); +props.remove("simple_products_list"); +props.remove("configurable_products_list"); +props.remove("users"); +props.remove("customer_emails_list"); + +/* This is only used when admin is enabled. */ +props.put("activeAdminThread", ""); + +/* Set the environment - at this time '01' or '02' */ +String path = "${host}"; +String environment = path.substring(4, 6); +props.put("environment", environment); + + + false + + + + Boolean stopTestOnError (String error) { + log.error(error); + System.out.println(error); + SampleResult.setStopTest(true); + return false; +} + +if ("${host}" == "1") { + return stopTestOnError("\"host\" parameter is not defined. Please define host parameter as: \"-Jhost=example.com\""); +} + +String path = "${base_path}"; +String slash = "/"; +if (!slash.equals(path.substring(path.length() -1)) || !slash.equals(path.substring(0, 1))) { + return stopTestOnError("\"base_path\" parameter is invalid. It must start and end with \"/\""); +} + + + + false + + + + + + + + + + + ${request_protocol} + + ${base_path}${admin_path} + GET + true + false + true + false + false + + + + + + Welcome + <title>Magento Admin</title> + + Assertion.response_data + false + 2 + + + + false + admin_form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + admin_form_key + + + + + + + + false + + = + true + dummy + + + false + ${admin_form_key} + = + true + form_key + + + true + ${admin_password} + = + true + login[password] + + + true + ${admin_user} + = + true + login[username] + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/admin/dashboard/ + POST + true + false + true + false + Java + false + + Implementation needs to be set to Java as per http://stackoverflow.com/questions/19636282/jmeter-error-in-redirect-url-for-get + + + + + <title>Dashboard / Magento Admin</title> + + Assertion.response_data + false + 2 + + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + types + = + true + massaction_prepare_key + + + true + config,layout,block_html,collections,reflection,db_ddl,eav,config_integration,full_page,target_rule,translate,config_webservice,config_integration_api + = + true + types + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/admin/cache/massEnable + POST + true + false + true + false + false + + Begin by enabling all cache types + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + types + = + true + massaction_prepare_key + + + true + config,layout,block_html,collections,reflection,db_ddl,eav,config_integration,full_page,target_rule,translate,config_webservice,config_integration_api + = + true + types + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/admin/cache/massRefresh + POST + true + false + true + false + false + + Refresh all cache types + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^[a-z0-9-]+$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + true + path + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + 1/2/% + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + like + = + true + searchCriteria[filterGroups][0][filters][0][conditionType] + + + true + level + = + true + searchCriteria[filterGroups][1][filters][0][field] + + + true + 2 + = + true + searchCriteria[filterGroups][1][filters][0][value] + + + true + ${categories_count} + = + true + searchCriteria[pageSize] + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/categories/list + GET + true + false + false + false + false + + + + + false + category_url_keys + url_key\",\"value\":\"(.*?)\" + $1$ + + -1 + + + + false + category_names + name\":\"(.*?)\" + $1$ + + -1 + + + + + + category_url_keys + category_url_key + true + + + + 1 + + 1 + category_url_key_counter + + false + + + + import java.util.ArrayList; + +// If it is first iteration of cycle then recreate category url key list +if (1 == Integer.parseInt(vars.get("category_url_key_counter"))) { + categoryUrlKeysList = new ArrayList(); + props.put("category_url_keys_list", categoryUrlKeysList); + props.put("category_url_key", vars.get("category_url_key")); +} else { + categoryUrlKeysList = props.get("category_url_keys_list"); +} +categoryUrlKeysList.add(vars.get("category_url_key")); + + + false + + + + + category_names + category_name + true + + + + 1 + + 1 + category_name_counter + + false + + + + import java.util.ArrayList; + +// If it is first iteration of cycle then recreate category name list +if (1 == Integer.parseInt(vars.get("category_name_counter"))) { + categoryNamesList = new ArrayList(); + props.put("category_names_list",categoryNamesList); + props.put("category_name", vars.get("category_name")); +} else { + categoryNamesList = props.get("category_names_list"); +} + +categoryNamesList.add(vars.get("category_name")); + + + false + + + + + props.put("category_url_key", vars.get("category_url_key")); +props.put("category_name", vars.get("category_name")); + + + false + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^[a-z0-9-]+$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + true + type_id + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + simple + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + ${simple_products_count} + = + true + searchCriteria[pageSize] + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/products + GET + true + false + true + false + false + + + + + false + simple_products_url_keys + url_key\",\"value\":\"(.*?)\" + $1$ + + -1 + + + + false + simple_product_ids + \"id\":(\d+), + $1$ + + -1 + + + + false + simple_product_names + name\":\"(.*?)\" + $1$ + + -1 + + + + + + simple_product_ids + simple_product_id + true + + + + 1 + + 1 + simple_products_counter + + false + + + + import java.util.ArrayList; +import java.util.HashMap; +import org.apache.commons.codec.binary.Base64; + +// If it is first iteration of cycle then recreate productList +if (1 == Integer.parseInt(vars.get("simple_products_counter"))) { + productList = new ArrayList(); + props.put("simple_products_list", productList); +} else { + productList = props.get("simple_products_list"); +} +String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("simple_products_url_keys_" + vars.get("simple_products_counter"))+ vars.get("url_suffix"); +encodedUrl = Base64.encodeBase64(productUrl.getBytes()); +// Create product map +Map productMap = new HashMap(); +productMap.put("id", vars.get("simple_product_id")); +productMap.put("title", vars.get("simple_product_names_" + vars.get("simple_products_counter"))); +productMap.put("url_key", vars.get("simple_products_url_keys_" + vars.get("simple_products_counter"))); +productMap.put("uenc", new String(encodedUrl)); + +// Collect products map in products list +productList.add(productMap); + + + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^[a-z0-9-]+$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + true + type_id + = + true + searchCriteria[filterGroups][0][filters][0][field] + + + true + configurable + = + true + searchCriteria[filterGroups][0][filters][0][value] + + + true + ${configurable_products_count} + = + true + searchCriteria[pageSize] + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/products + GET + true + false + true + false + false + + + + + false + configurable_products_url_keys + url_key\",\"value\":\"(.*?)\" + $1$ + + -1 + + + + false + configurable_product_ids + \"id\":(\d+), + $1$ + + -1 + + + + false + configurable_product_names + name\":\"(.*?)\" + $1$ + + -1 + + + + false + configurable_product_skus + sku\":\"(.*?)\" + $1$ + + -1 + + + + + + configurable_product_ids + configurable_product_id + true + + + + 1 + + 1 + configurable_products_counter + + false + + + + import java.util.ArrayList; +import java.util.HashMap; +import org.apache.commons.codec.binary.Base64; + +// If it is first iteration of cycle then recreate productList +if (1 == Integer.parseInt(vars.get("configurable_products_counter"))) { + productList = new ArrayList(); + props.put("configurable_products_list", productList); +} else { + productList = props.get("configurable_products_list"); +} + +String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("configurable_products_url_keys_" + vars.get("configurable_products_counter"))+ vars.get("url_suffix"); +encodedUrl = Base64.encodeBase64(productUrl.getBytes()); +// Create product map +Map productMap = new HashMap(); +productMap.put("id", vars.get("configurable_product_id")); +productMap.put("title", vars.get("configurable_product_names_" + vars.get("configurable_products_counter"))); +productMap.put("sku", vars.get("configurable_product_skus_" + vars.get("configurable_products_counter"))); +productMap.put("url_key", vars.get("configurable_products_url_keys_" + vars.get("configurable_products_counter"))); +productMap.put("uenc", new String(encodedUrl)); + +// Collect products map in products list +productList.add(productMap); + + + false + + + + + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/customer/index/ + GET + true + false + true + false + false + + + + + + + true + import org.apache.jmeter.protocol.http.control.CookieManager; +import org.apache.jmeter.protocol.http.control.Cookie; +CookieManager manager = sampler.getCookieManager(); +Cookie cookie = new Cookie("adminhtml",vars.get("COOKIE_adminhtml"),vars.get("host"),"/",false,0); +manager.add(cookie); + + + + + Customers + <title>Customers / Customers / Magento Admin</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + customer_listing + = + true + namespace + + + true + + = + true + search + + + true + customer_since[locale]=en_US&website_id=1 + = + true + filters[placeholder] + + + true + ${customers_page_size} + = + true + paging[pageSize] + + + true + 1 + = + true + paging[current] + + + true + entity_id + = + true + sorting[field] + + + true + asc + = + true + sorting[direction] + + + true + true + = + true + isAjax + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/mui/index/render/ + GET + true + false + true + false + false + + + + + + \"totalRecords\":0 + + Assertion.response_data + false + 20 + + + + false + customer_emails + \"email\":\"([^"]+) + $1$ + + -1 + + + + false + customer_ids + \"entity_id\":\"([^"]+) + $1$ + + -1 + + + + + customer_emails + customer_email + true + + + + 1 + + 1 + email_counter + + false + + + + import java.util.ArrayList; + +// If it is first iteration of cycle then recreate emailsList +if (1 == Integer.parseInt(vars.get("email_counter"))) { + emailsList = new ArrayList(); + props.put("customer_emails_list", emailsList); +} else { + emailsList = props.get("customer_emails_list"); +} +emailsList.add(vars.get("customer_email")); + + + false + + + + + customer_ids + customer_id + true + + + + 1 + + 1 + id_counter + + false + + + + import java.util.ArrayList; + +// If it is first iteration of cycle then recreate idsList +if (1 == Integer.parseInt(vars.get("id_counter"))) { + idsList = new ArrayList(); + props.put("customer_ids_list", idsList); +} else { + idsList = props.get("customer_ids_list"); +} +idsList.add(vars.get("customer_id")); + + + false + + + + + Boolean stopTestOnError (String error) { + log.error(error); + System.out.println(error); + SampleResult.setStopTest(true); + return false; +} + +if (props.get("simple_products_list") == null) { + return stopTestOnError("Cannot find simple products. Test stopped."); +} +if (props.get("configurable_products_list") == null) { + return stopTestOnError("Cannot find configurable products. Test stopped."); +} +if (props.get("customer_emails_list") == null) { + return stopTestOnError("Cannot find customer emails. Test stopped."); +} +if (props.get("category_url_keys_list") == null) { + return stopTestOnError("Cannot find category url keys. Test stopped."); +} +if (props.get("category_names_list") == null) { + return stopTestOnError("Cannot find category names. Test stopped."); +} +int orders = Integer.parseInt(vars.get("orders")); + + +if (orders > 0) { + int checkout_sum = Integer.parseInt(vars.get("guest_checkout_percent")) + Integer.parseInt(vars.get("customer_checkout_percent")); + checkout_sum = checkout_sum > 0 ? checkout_sum : 1; + int users = orders * (100 / checkout_sum); + props.put("users", users); +} else { + props.put("users", Integer.parseInt(vars.get("users"))); +} + + + + false + + + + "${cache_indicator}" == "1" || "${cache_indicator}" == "2" + false + + + + // Default to disable all cache types +vars.put("cache_types", "config,layout,block_html,collections,reflection,db_ddl,eav,config_integration,full_page,target_rule,translate,config_webservice,config_integration_api"); + +if ("${cache_indicator}" == "1") { + // Only disable Full Page Cache + vars.put("cache_types", "full_page"); +} + + + + false + + + + + + + true + ${admin_form_key} + = + true + form_key + + + true + types + = + true + massaction_prepare_key + + + true + ${cache_types} + = + true + types + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/admin/cache/massDisable + POST + true + false + true + false + true + false + + + + + + "${cache_indicator}" == "0" + false + + + + + + + false + ${admin_form_key} + = + true + form_key + true + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/admin/cache/ + GET + true + false + true + false + true + false + + + + + + TRANSLATE(?s).+?<span>Enabled</span> + CONFIG(?s).+?<span>Enabled</span> + LAYOUT_GENERAL_CACHE_TAG(?s).+?<span>Enabled</span> + BLOCK_HTML(?s).+?<span>Enabled</span> + COLLECTION_DATA(?s).+?<span>Enabled</span> + EAV(?s).+?<span>Enabled</span> + FPC(?s).+?<span>Enabled</span> + DB_DDL(?s).+?<span>Enabled</span> + INTEGRATION(?s).+?<span>Enabled</span> + INTEGRATION_API_CONFIG(?s).+?<span>Enabled</span> + WEBSERVICE(?s).+?<span>Enabled</span> + REFLECTION(?s).+?<span>Enabled</span> + TARGET_RULE(?s).+?<span>Enabled</span> + + Assertion.response_data + false + 2 + + + + + + "${cache_indicator}" == "1" + false + + + + + + + false + ${admin_form_key} + = + true + form_key + true + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/admin/cache/ + GET + true + false + true + false + true + false + + + + + + TRANSLATE(?s).+?<span>Enabled</span> + CONFIG(?s).+?<span>Enabled</span> + LAYOUT_GENERAL_CACHE_TAG(?s).+?<span>Enabled</span> + BLOCK_HTML(?s).+?<span>Enabled</span> + COLLECTION_DATA(?s).+?<span>Enabled</span> + EAV(?s).+?<span>Enabled</span> + FPC(?s).+?<span>Disabled</span> + DB_DDL(?s).+?<span>Enabled</span> + INTEGRATION(?s).+?<span>Enabled</span> + INTEGRATION_API_CONFIG(?s).+?<span>Enabled</span> + WEBSERVICE(?s).+?<span>Enabled</span> + REFLECTION(?s).+?<span>Enabled</span> + TARGET_RULE(?s).+?<span>Enabled</span + + Assertion.response_data + false + 2 + + + + + + "${cache_indicator}" == "2" + false + + + + + + + false + ${admin_form_key} + = + true + form_key + true + + + + + + + + ${request_protocol} + + ${base_path}${admin_path}/admin/cache/ + GET + true + false + true + false + true + false + + + + + + TRANSLATE(?s).+?<span>Disabled</span> + CONFIG(?s).+?<span>Disabled</span> + LAYOUT_GENERAL_CACHE_TAG(?s).+?<span>Disabled</span> + BLOCK_HTML(?s).+?<span>Disabled</span> + COLLECTION_DATA(?s).+?<span>Disabled</span> + EAV(?s).+?<span>Disabled</span> + FPC(?s).+?<span>Disabled</span> + DB_DDL(?s).+?<span>Disabled</span> + INTEGRATION(?s).+?<span>Disabled</span> + INTEGRATION_API_CONFIG(?s).+?<span>Disabled</span> + WEBSERVICE(?s).+?<span>Disabled</span> + REFLECTION(?s).+?<span>Disabled</span> + TARGET_RULE(?s).+?<span>Disabled</span + + Assertion.response_data + false + 2 + + + + + + + + + true + ["customer_form_login"] + = + true + blocks + + + true + ["default","customer_account_login"] + = + true + handles + + + true + {"route":"customer","controller":"account","action":"login","uri":"/customer/account/login/"} + = + true + originalRequest + + + true + true + = + true + ajax + + + true + true + = + true + isAjax + + + + + + + + ${request_protocol} + + ${base_path}page_cache/block/render/ + GET + true + false + true + false + false + + + + + + "customer_form_login" + Registered Customers + form_key + + Assertion.response_data + false + 2 + + + + false + form_key + <input name=\\"form_key\\" type=\\"hidden\\" value=\\"([^'"]+)\\" \\/> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + form_key + + + + + + + + false + 1 + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add + POST + true + false + true + false + false + + + + + + + continue + + false + ${loops} + + ${__javaScript(Math.round(props.get("users")*${view_catalog_percent}/100>>0))} + ${ramp_period} + 1437409133000 + 1437409133000 + false + + + + + + Passing arguments between threads + +import java.util.Random; +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +number = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); + +number1 = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); + +number = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); + +number = random.nextInt(props.get("category_url_keys_list").size()); +vars.put("category_url_key", props.get("category_url_keys_list").get(number)); +vars.put("category_name", props.get("category_names_list").get(number)); +vars.put("testLabel", "CatProdBrows"); + + + true + + + + + + + + + + + + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${simple_product_1_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${simple_product_1_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + product_id + .//input[@type="hidden" and @name="product"]/@value + false + true + false + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + product_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}review/product/listAjax/id/${product_id}/ + GET + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${simple_product_2_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${simple_product_2_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + product_id + .//input[@type="hidden" and @name="product"]/@value + false + true + false + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + product_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}review/product/listAjax/id/${product_id}/ + GET + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${configurable_product_1_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${configurable_product_1_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + + + continue + + false + ${loops} + + ${__javaScript(Math.round(props.get("users")*${view_product_add_to_cart_percent}/100>>0))} + ${ramp_period} + 1437411475000 + 1437411475000 + false + + + + + + Passing arguments between threads + +import java.util.Random; +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +number = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_uenc", simpleList.get("uenc")); + +number1 = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_uenc", simpleList.get("uenc")); + +number = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); +vars.put("configurable_product_1_uenc", simpleList.get("uenc")); + +number = random.nextInt(props.get("category_url_keys_list").size()); +vars.put("category_url_key", props.get("category_url_keys_list").get(number)); +vars.put("category_name", props.get("category_names_list").get(number)); +vars.put("testLabel", "BrowsAddToCart"); +vars.put("loadType", "Guest"); + + + true + + + + + + + + + + + + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ["customer_form_login"] + = + true + blocks + + + true + ["default","customer_account_login"] + = + true + handles + + + true + {"route":"customer","controller":"account","action":"login","uri":"/customer/account/login/"} + = + true + originalRequest + + + true + true + = + true + ajax + + + true + true + = + true + isAjax + + + + + + + + ${request_protocol} + + ${base_path}page_cache/block/render/ + GET + true + false + true + false + false + + + + + + "customer_form_login" + Registered Customers + form_key + + Assertion.response_data + false + 2 + + + + false + form_key + <input name=\\"form_key\\" type=\\"hidden\\" value=\\"([^'"]+)\\" \\/> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + form_key + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${simple_product_1_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${simple_product_1_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + product_id + .//input[@type="hidden" and @name="product"]/@value + false + true + false + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + product_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}review/product/listAjax/id/${product_id}/ + GET + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + false + ${simple_product_1_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${simple_product_1_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":1 + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${simple_product_2_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${simple_product_2_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + product_id + .//input[@type="hidden" and @name="product"]/@value + false + true + false + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + product_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}review/product/listAjax/id/${product_id}/ + GET + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + false + ${simple_product_2_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + + true + cart,messages + = + true + sections + true + + + true + true + = + true + force_new_section_timestamp + true + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + true + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${simple_product_2_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":2 + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${configurable_product_1_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${configurable_product_1_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + false + configurable_product_sku + itemprop="sku">([^<]*)<\/ + $1$ + NOT_FOUND + 1 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + 1 + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^[a-z0-9-]+$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${configurable_product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + false + ${configurable_product_1_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${configurable_option_id} + = + true + super_attribute[${configurable_attribute_id}] + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + + + + + + + + + true + cart,messages + = + true + sections + true + + + true + true + = + true + force_new_section_timestamp + true + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + true + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${configurable_product_1_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + We don't have as many &quot;${configurable_product_1_name}&quot; as you requested. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":3 + + Assertion.response_data + false + 2 + + + + + + + continue + + false + ${loops} + + ${__javaScript(Math.round(props.get("users")*${guest_checkout_percent}/100>>0))} + ${ramp_period} + 1437409133000 + 1437409133000 + false + + + + + + Passing arguments between threads + +import java.util.Random; +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +number = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_uenc", simpleList.get("uenc")); + +number1 = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_uenc", simpleList.get("uenc")); + +number = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); +vars.put("configurable_product_1_uenc", simpleList.get("uenc")); + +number = random.nextInt(props.get("category_url_keys_list").size()); +vars.put("category_url_key", props.get("category_url_keys_list").get(number)); +vars.put("category_name", props.get("category_names_list").get(number)); +vars.put("testLabel", "GuestChkt"); +vars.put("loadType", "Guest"); + + + true + + + + + + + + + + + + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ["customer_form_login"] + = + true + blocks + + + true + ["default","customer_account_login"] + = + true + handles + + + true + {"route":"customer","controller":"account","action":"login","uri":"/customer/account/login/"} + = + true + originalRequest + + + true + true + = + true + ajax + + + true + true + = + true + isAjax + + + + + + + + ${request_protocol} + + ${base_path}page_cache/block/render/ + GET + true + false + true + false + false + + + + + + "customer_form_login" + Registered Customers + form_key + + Assertion.response_data + false + 2 + + + + false + form_key + <input name=\\"form_key\\" type=\\"hidden\\" value=\\"([^'"]+)\\" \\/> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + form_key + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${simple_product_1_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${simple_product_1_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + product_id + .//input[@type="hidden" and @name="product"]/@value + false + true + false + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + product_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}review/product/listAjax/id/${product_id}/ + GET + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + false + ${simple_product_1_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${simple_product_1_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":1 + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${simple_product_2_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${simple_product_2_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + product_id + .//input[@type="hidden" and @name="product"]/@value + false + true + false + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + product_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}review/product/listAjax/id/${product_id}/ + GET + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + false + ${simple_product_2_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + + true + cart,messages + = + true + sections + true + + + true + true + = + true + force_new_section_timestamp + true + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + true + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${simple_product_2_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":2 + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${configurable_product_1_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${configurable_product_1_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + false + configurable_product_sku + itemprop="sku">([^<]*)<\/ + $1$ + NOT_FOUND + 1 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + 1 + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^[a-z0-9-]+$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${configurable_product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + false + ${configurable_product_1_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${configurable_option_id} + = + true + super_attribute[${configurable_attribute_id}] + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + + + + + + + + + true + cart,messages + = + true + sections + true + + + true + true + = + true + force_new_section_timestamp + true + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + true + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${configurable_product_1_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + We don't have as many &quot;${configurable_product_1_name}&quot; as you requested. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":3 + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}checkout/ + GET + true + false + true + false + false + + + + + + <title>Checkout</title> + + Assertion.response_data + false + 2 + + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 6 + + + + false + cart_id + "quoteData":{"entity_id":"([^'"]+)", + $1$ + + 1 + + + + false + form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + form_key + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + + + + false + {"customerEmail":"test@example.com"} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/customers/isEmailAvailable + POST + true + false + true + false + false + + + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + true + + Assertion.response_data + false + 8 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + + + + false + {"address":{"country_id":"US","postcode":"95630"}} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods + POST + true + false + true + false + false + + + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"12","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/shipping-information + POST + true + false + true + false + false + + + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + {"payment_methods": + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + + + + false + {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"12","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"}} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information + POST + true + false + true + false + false + + + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + order_id + $ + + + BODY + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + order_id + + + + + + + + + + + + + ${request_protocol} + + ${base_path}checkout/onepage/success/ + GET + true + false + true + false + false + + + + + + Thank you for your purchase! + Your order # is + + Assertion.response_data + false + 2 + + + + + + + continue + + false + ${loops} + + ${__javaScript(Math.round(props.get("users")*${customer_checkout_percent}/100>>0))} + ${ramp_period} + 1437177203000 + 1437177203000 + false + + + + + + Passing arguments between threads + import org.apache.jmeter.samplers.SampleResult; +import java.util.Random; +Random random = new Random(); +if (${seedForRandom} > 0) { + random.setSeed(${seedForRandom}); +} +number = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_uenc", simpleList.get("uenc")); + +number1 = random.nextInt(props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_uenc", simpleList.get("uenc")); + +number = random.nextInt(props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); +vars.put("configurable_product_1_uenc", simpleList.get("uenc")); + +number = random.nextInt(props.get("category_url_keys_list").size()); +vars.put("category_url_key", props.get("category_url_keys_list").get(number)); +vars.put("category_name", props.get("category_names_list").get(number)); + +emails_index = 0; +if (!props.containsKey("customer_emails_index")) { + props.put("customer_emails_index", emails_index); +} + +try { + emails_index = props.get("customer_emails_index"); + emails_list = props.get("customer_emails_list"); + if (emails_index == emails_list.size()) { + emails_index=0; + } + vars.put("customer_email", emails_list.get(emails_index)); + props.put("customer_emails_index", ++emails_index); +} +catch (java.lang.Exception e) { + log.error("Caught Exception in 'Customer Checkout' thread."); + log.info("Using default email address - user_1@example.com"); + vars.put("customer_email", "user_1@example.com"); +} +vars.put("testLabel", "CustomerChkt"); +vars.put("loadType", "Customer"); + + + true + + + + + + + + + + + + ${request_protocol} + + ${base_path} + GET + true + false + true + false + false + + + + + + <title>Home page</title> + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}customer/account/login/ + GET + true + false + true + false + false + + + + + + <title>Customer Login</title> + + Assertion.response_data + false + 2 + + + + + + + + + true + ["customer_form_login"] + = + true + blocks + + + true + ["default","customer_account_login"] + = + true + handles + + + true + {"route":"customer","controller":"account","action":"login","uri":"/customer/account/login/"} + = + true + originalRequest + + + true + true + = + true + ajax + + + true + true + = + true + isAjax + + + + + + + + ${request_protocol} + + ${base_path}page_cache/block/render/ + GET + true + false + true + false + false + + + + + + "customer_form_login" + Registered Customers + form_key + + Assertion.response_data + false + 2 + + + + false + form_key + <input name=\\"form_key\\" type=\\"hidden\\" value=\\"([^'"]+)\\" \\/> + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + form_key + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + true + ${form_key} + = + true + form_key + + + true + ${customer_email} + = + true + login[username] + + + true + ${customer_password} + = + true + login[password] + + + true + + = + true + send + + + + + + + + ${request_protocol} + + ${base_path}customer/account/loginPost/ + POST + true + false + true + false + false + + + + + + <title>My Account</title> + + Assertion.response_data + false + 2 + + + + false + addressId + customer/address/edit/id/([^'"]+)/ + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + addressId + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${category_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <span class="base" data-ui-id="page-title">${category_name}</span> + + Assertion.response_data + false + 6 + + + + false + category_id + <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> + $1$ + + 1 + simple_product_1_url_key + + + + + ^[0-9]+$ + + Assertion.response_data + false + 1 + variable + category_id + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${simple_product_1_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${simple_product_1_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + product_id + .//input[@type="hidden" and @name="product"]/@value + false + true + false + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + product_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}review/product/listAjax/id/${product_id}/ + GET + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + false + ${simple_product_1_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + + true + cart,messages + = + true + sections + + + true + true + = + true + force_new_section_timestamp + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${simple_product_1_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":1 + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${simple_product_2_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${simple_product_2_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + product_id + .//input[@type="hidden" and @name="product"]/@value + false + true + false + + + + + ^\d+$ + + Assertion.response_data + false + 1 + variable + product_id + + + + + + + + + + + + ${request_protocol} + + ${base_path}review/product/listAjax/id/${product_id}/ + GET + true + false + true + false + false + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + false + ${simple_product_2_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + + + + true + cart,messages + = + true + sections + true + + + true + true + = + true + force_new_section_timestamp + true + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + true + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${simple_product_2_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + This product is out of stock. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":2 + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}${configurable_product_1_url_key}${url_suffix} + GET + true + false + true + false + false + + + + + + <title>${configurable_product_1_name} + <span>In stock</span> + + Assertion.response_data + false + 2 + + + + + false + configurable_product_sku + itemprop="sku">([^<]*)<\/ + $1$ + NOT_FOUND + 1 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + 1 + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + true + + + + false + {"username":"${admin_user}","password":"${admin_password}"} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/integration/admin/token + POST + true + false + true + false + false + + + + + admin_token + $ + + + BODY + + + + + ^[a-z0-9-]+$ + + Assertion.response_data + false + 1 + variable + admin_token + + + + + + + Authorization + Bearer ${admin_token} + + + + + + + + + + + + + ${request_protocol} + + ${base_path}rest/V1/configurable-products/${configurable_product_sku}/options/all + GET + true + false + true + false + false + + + + + attribute_ids + $.[*].attribute_id + NO_VALUE + + BODY + + + + option_values + $.[*].values[0].value_index + NO_VALUE + + BODY + + + + + + + + + + false + ${configurable_product_1_id} + = + true + product + + + false + + = + true + related_product + + + false + 1 + = + true + qty + + + false + ${configurable_option_id} + = + true + super_attribute[${configurable_attribute_id}] + + + false + ${form_key} + = + true + form_key + + + + + + + + ${request_protocol} + + ${base_path}checkout/cart/add/ + POST + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + false + + + + try { + attribute_ids = vars.get("attribute_ids"); + option_values = vars.get("option_values"); + attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); + option_values = option_values.replace("[","").replace("]","").replace("\"", ""); + attribute_ids_array = attribute_ids.split(","); + option_values_array = option_values.split(","); + args = ctx.getCurrentSampler().getArguments(); + it = args.iterator(); + while (it.hasNext()) { + argument = it.next(); + if (argument.getStringValue().contains("${")) { + args.removeArgument(argument.getName()); + } + } + for (int i = 0; i < attribute_ids_array.length; i++) { + ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); + } + } catch (Exception e) { + log.error("eror…", e); + } + + + + + + + + + + true + cart,messages + = + true + sections + true + + + true + true + = + true + force_new_section_timestamp + true + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + _ + true + + + + + + + + ${request_protocol} + + ${base_path}customer/section/load/ + GET + true + false + true + false + false + + + + + + + X-Requested-With + XMLHttpRequest + + + + + + + + You added ${configurable_product_1_name} to your shopping cart. + + Assertion.response_data + false + 2 + + + + + We don't have as many &quot;${configurable_product_1_name}&quot; as you requested. + + Assertion.response_data + false + 6 + + + + + \"summary_count\":3 + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}checkout/ + GET + true + false + true + false + false + + + + + + <title>Checkout</title> + + Assertion.response_data + false + 2 + + + + + <title>Shopping Cart</title> + + Assertion.response_data + false + 6 + + + + false + cart_id + "quoteData":{"entity_id":"([^'"]+)", + $1$ + + 1 + + + + false + form_key + <input name="form_key" type="hidden" value="([^'"]+)" /> + $1$ + + 1 + + + + false + address_id + "default_billing":"([^'"]+)", + $1$ + + 1 + + + + false + customer_id + "customer_id":([^'",]+), + $1$ + + 1 + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + cart_id + + + + + ^.+$ + + Assertion.response_data + false + 1 + variable + form_key + + + + + [0-9]+$ + + Assertion.response_data + false + 1 + variable + address_id + + + + + [0-9]+$ + + Assertion.response_data + false + 1 + variable + customer_id + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + + + + false + {"addressId":"${addressId}"} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/estimate-shipping-methods-by-address-id + POST + true + false + true + false + false + + + + + + + Referer + ${base_path}checkout/onepage/ + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + "available":true + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + + + + false + {"addressInformation":{"shipping_address":{"customerAddressId":"${address_id}","countryId":"US","regionId":5,"regionCode":"AR","region":"Arkansas","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/shipping-information + POST + true + false + true + false + false + + + + + + + Referer + ${host}${base_path}checkout/onepage + + + Content-Type + application/json; charset=UTF-8 + + + X-Requested-With + XMLHttpRequest + + + Accept + application/json + + + + + + + {"payment_methods" + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + true + + + + false + {"cartId":"${cart_id}","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"customerAddressId":"${address_id}","countryId":"US","regionId":5,"regionCode":"AR","region":"Arkansas","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"}} + = + + + + + + + + ${request_protocol} + + ${base_path}rest/default/V1/carts/mine/payment-information + POST + true + false + true + false + false + + + + + + + Referer + ${host}${base_path}checkout/onepage + + + Content-Type + application/json; charset=UTF-8 + + + Accept + application/json + + + X-Requested-With + XMLHttpRequest + + + + + + + "[0-9]+" + + Assertion.response_data + false + 2 + + + + + + ${think_time_delay_offset} + ${think_time_deviation} + + + + + + + + + + + + ${request_protocol} + + ${base_path}checkout/onepage/success/ + GET + true + false + true + false + false + + + + + + Thank you for your purchase! + Your order number is + + Assertion.response_data + false + 2 + + + + + + + stoptest + + false + 1 + + 1 + 1 + 1395324075000 + 1395324075000 + false + + + + + + "${dashboard_enabled}" == "1" + false + + + + + + + false + ${__property(environment)} + = + true + environment + + + false + ${start_time} + = + true + startTime + + + false + ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} + = + true + endTime + + + false + ${redis_host} + = + true + stats_server + + + + + + + + ${request_protocol} + + ${base_path}DeploymentEvent.php + POST + true + false + true + false + false + + + + + + Errors: + + Assertion.response_data + false + 6 + + + + + + + 30 + ${host} + / + false + 0 + true + true + + + true + + + + props.remove("category_url_key"); +props.remove("category_name"); +props.remove("simple_products_list"); +props.remove("configurable_products_list"); +props.remove("users"); +props.remove("customer_emails_list"); + + + false + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + + + + + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + true + false + false + 0 + true + true + true + true + + + + + + + + false + + saveConfig + + + false + false + false + + false + false + false + false + false + false + false + false + false + false + true + false + false + false + false + 0 + true + true + true + true + + + ${report_save_path}/detailed-urls-report.log + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + true + true + + + ${report_save_path}/summary-report.log + + + + + true + + + diff --git a/magento/setup/performance-toolkit/config/attributeSets.xml b/magento/setup/performance-toolkit/config/attributeSets.xml new file mode 100644 index 0000000..07339c6 --- /dev/null +++ b/magento/setup/performance-toolkit/config/attributeSets.xml @@ -0,0 +1,132 @@ + + + + + Attribute Set 1 + + + 1 + 1 + 1 + mycolor + + 1 + 1 + 1 + my color + select + my yellow + + + + + + + + 1 + 1 + 1 + mysize + + 1 + 1 + 1 + my size + select + my large + + + + + + + + + + Attribute Set 2 + + + 1 + 1 + 1 + attributeset2attribute1 + + 1 + 1 + 1 + Attribute Set 2 - Attribute 1 + select + attributeset2attribute1option1 + + + + + + + + + + Attribute Set 3 + + + 1 + 1 + 1 + attributeset3attribute1 + + 1 + 1 + 1 + Attribute Set 3 - Attribute 1 + select + attributeset3attribute1option1 + + + + + + + + + diff --git a/magento/setup/performance-toolkit/config/customerConfig.xml b/magento/setup/performance-toolkit/config/customerConfig.xml new file mode 100644 index 0000000..8fd74d7 --- /dev/null +++ b/magento/setup/performance-toolkit/config/customerConfig.xml @@ -0,0 +1,10 @@ + + + + 2 + diff --git a/magento/setup/performance-toolkit/config/description.xml b/magento/setup/performance-toolkit/config/description.xml new file mode 100644 index 0000000..06fa6a2 --- /dev/null +++ b/magento/setup/performance-toolkit/config/description.xml @@ -0,0 +1,27 @@ + + + + + 7 + 7 + + + 12 + 12 + + + 6 + 6 + + + + + + br|p|span|h1|b|i + + diff --git a/magento/setup/performance-toolkit/config/di.xml b/magento/setup/performance-toolkit/config/di.xml new file mode 100644 index 0000000..a293edc --- /dev/null +++ b/magento/setup/performance-toolkit/config/di.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/magento/setup/performance-toolkit/config/searchConfig.xml b/magento/setup/performance-toolkit/config/searchConfig.xml new file mode 100644 index 0000000..7e32f3e --- /dev/null +++ b/magento/setup/performance-toolkit/config/searchConfig.xml @@ -0,0 +1,13 @@ + + + + 200 + 20 + 20 + 5 + diff --git a/magento/setup/performance-toolkit/config/searchTerms.xml b/magento/setup/performance-toolkit/config/searchTerms.xml new file mode 100644 index 0000000..cbe5e4c --- /dev/null +++ b/magento/setup/performance-toolkit/config/searchTerms.xml @@ -0,0 +1,17 @@ + + + + + iphone 6 + 50 + + + galaxy s3 + 100 + + diff --git a/magento/setup/performance-toolkit/config/searchTermsLarge.xml b/magento/setup/performance-toolkit/config/searchTermsLarge.xml new file mode 100644 index 0000000..3beefa4 --- /dev/null +++ b/magento/setup/performance-toolkit/config/searchTermsLarge.xml @@ -0,0 +1,669 @@ + + + + + Apple + 5 + + + Samsung + 6 + + + Google + 7 + + + Microsoft + 8 + + + Verizon + 9 + + + GE + 10 + + + AT + 5 + + + Amazon.com + 6 + + + Walmart + 7 + + + IBM + 8 + + + Toyota + 9 + + + Coca-Cola + 10 + + + China Mobile + 5 + + + T (Telekom) + 6 + + + Wells Fargo + 7 + + + Vodafone + 8 + + + BMW + 9 + + + Shell + 10 + + + Volkswagen + 5 + + + HSBC + 6 + + + Bank of America + 7 + + + Mitsubishi + 8 + + + McDonald's + 9 + + + Citi + 10 + + + The Home Depot + 5 + + + Mercedes-Benz + 6 + + + Walt Disney + 7 + + + Chase + 8 + + + Intel + 9 + + + ICBC + 10 + + + Honda + 5 + + + Nissan + 6 + + + American Express + 7 + + + Tata + 8 + + + Nike + 9 + + + Cisco + 10 + + + Oracle + 5 + + + Allianz + 6 + + + Siemens + 7 + + + Nestlé + 8 + + + Ford + 9 + + + BNP Paribas + 10 + + + Santander + 5 + + + Orange + 6 + + + Mitsui + 7 + + + HP + 8 + + + Pepsi + 9 + + + UPS + 10 + + + Chevron + 5 + + + AXA + 6 + + + China Construction Bank + 11 + + + Hyundai + 12 + + + IKEA + 13 + + + CVS + 14 + + + Hitachi + 15 + + + Target + 16 + + + SoftBank + 17 + + + Agricultural Bank of China + 18 + + + Tesco + 19 + + + MUFG + 20 + + + Bank of China + 11 + + + ExxonMobil + 12 + + + PwC + 13 + + + PetroChina + 14 + + + GDF Suez + 15 + + + China Unicom + 16 + + + NTT Group + 17 + + + Walgreens + 18 + + + Comcast + 19 + + + BT + 20 + + + Airbus + 11 + + + Total + 12 + + + Barclays + 13 + + + JP Morgan + 14 + + + China Telecom + 15 + + + Deloitte + 16 + + + Toshiba + 17 + + + ING (Group) + 18 + + + Sam's Club + 19 + + + Deutsche Bank + 20 + + + Marlboro + 11 + + + FedEx + 12 + + + eBay + 13 + + + SAP + 14 + + + FOX + 15 + + + Generali + 16 + + + ALDI + 17 + + + Movistar + 18 + + + BP + 19 + + + LG + 20 + + + Lowe's + 11 + + + Sinopec + 12 + + + Sony + 13 + + + 3M + 14 + + + China Life Insurance + 15 + + + M + 16 + + + KPMG + 17 + + + Porsche + 18 + + + Unitedhealth + 19 + + + DHL + 20 + + + Panasonic + 21 + + + RBC + 22 + + + Philips + 23 + + + Accenture + 24 + + + EY + 25 + + + erbank + 26 + + + Boeing + 27 + + + TD + 28 + + + Woolworths + 29 + + + L'Oréal + 30 + + + UBS + 31 + + + Bradesco + 32 + + + au + 33 + + + Costco + 34 + + + EDF + 35 + + + Goldman Sachs + 36 + + + Credit Suisse + 37 + + + Carrefour + 38 + + + Time Warner Cable + 39 + + + Starbucks + 40 + + + Itaú + 41 + + + Facebook + 42 + + + TimeWarner + 43 + + + E.ON + 44 + + + Ping An + 45 + + + Petronas + 46 + + + Bosch + 47 + + + China State Construction + 48 + + + Gazprom + 49 + + + Capital One + 50 + + + VISA + 50 + + + Renault + 60 + + + Honeywell + 70 + + + Sumitomo + 80 + + + Huawei + 90 + + + BBVA + 100 + + + NBC International + 50 + + + Gillette + 60 + + + SK Group + 70 + + + Telstra + 80 + + + Dell + 90 + + + Macy's + 100 + + + DirecTV + 50 + + + MetLife + 60 + + + Canon + 70 + + + Sky + 80 + + + Morgan Stanley + 90 + + + Telecom Italia Group + 100 + + + Sainsbury's + 50 + + + Kellogg's + 60 + + + ASDA + 110 + + + Société Générale + 200 + + + adidas + 300 + + + Eni + 400 + + + Caterpillar + 500 + + + Johnson + 600 + + + Scotiabank + 700 + + + Mizuho + 800 + + + Prudential(UK) + 900 + + + Danone + 1000 + + + Tencent + 20000 + + + O2 + 30000 + + + Enel + 40000 + + + Ericsson + 50000 + + + Vinci + 60000 + + diff --git a/magento/setup/performance-toolkit/config/shortDescription.xml b/magento/setup/performance-toolkit/config/shortDescription.xml new file mode 100644 index 0000000..724bb08 --- /dev/null +++ b/magento/setup/performance-toolkit/config/shortDescription.xml @@ -0,0 +1,23 @@ + + + + + 1 + 1 + + + 1 + 2 + + + 5 + 7 + + + + diff --git a/magento/setup/performance-toolkit/files/downloadable_original.txt b/magento/setup/performance-toolkit/files/downloadable_original.txt new file mode 100644 index 0000000..9fbb20e --- /dev/null +++ b/magento/setup/performance-toolkit/files/downloadable_original.txt @@ -0,0 +1 @@ +original text \ No newline at end of file diff --git a/magento/setup/performance-toolkit/files/downloadable_sample.txt b/magento/setup/performance-toolkit/files/downloadable_sample.txt new file mode 100644 index 0000000..679aa53 --- /dev/null +++ b/magento/setup/performance-toolkit/files/downloadable_sample.txt @@ -0,0 +1 @@ +sample text \ No newline at end of file diff --git a/magento/setup/performance-toolkit/files/search_terms.csv b/magento/setup/performance-toolkit/files/search_terms.csv new file mode 100644 index 0000000..6522526 --- /dev/null +++ b/magento/setup/performance-toolkit/files/search_terms.csv @@ -0,0 +1,10 @@ +searchTerm,priceTo +Mizuho,1000 +Scotiabank,1000 +Johnson,1000 +Caterpillar,1000 +Eni,1000 +adidas,1000 +Société Générale,1000 +China State Construction,1000 +Deutsche Bank,1000 diff --git a/magento/setup/performance-toolkit/profiles/ce/extra_large.xml b/magento/setup/performance-toolkit/profiles/ce/extra_large.xml new file mode 100644 index 0000000..911ac7f --- /dev/null +++ b/magento/setup/performance-toolkit/profiles/ce/extra_large.xml @@ -0,0 +1,122 @@ + + + + + 50 + 5 + 5 + 5 + 1 + 600000 + + + + + 3 + image + + + 8 + + + Configurable Product %s + 16000 + + + + 2000 + 3 + + 6000 + 5 + 10000 + + 20 + 20 + 2 + 20 + + 100 + 30 + 15 + + true + 2 + 2 + 150000 + + tax_rates.csv + + + + admin/security/use_form_key + default + 0 + 0 + + + admin/security/session_lifetime + default + 0 + 7200 + + + admin/security/admin_account_sharing + default + 0 + 1 + + + carriers/flatrate/active + default + 0 + 1 + + + + + catalog_category_product + true + + + catalog_product_category + true + + + catalog_product_price + true + + + catalog_product_attribute + true + + + cataloginventory_stock + true + + + catalogrule_rule + true + + + catalogrule_product + true + + + catalogsearch_fulltext + true + + + + + + + + + + diff --git a/magento/setup/performance-toolkit/profiles/ce/large.xml b/magento/setup/performance-toolkit/profiles/ce/large.xml new file mode 100644 index 0000000..79abab0 --- /dev/null +++ b/magento/setup/performance-toolkit/profiles/ce/large.xml @@ -0,0 +1,122 @@ + + + + + 50 + 5 + 5 + 5 + 1 + 300000 + + + + + 3 + image + + + 8 + + + Configurable Product %s + 8000 + + + + 2000 + 3 + + 3000 + 5 + 5000 + + 20 + 20 + 2 + 20 + + 50 + 20 + 15 + + true + 2 + 2 + 100000 + + tax_rates.csv + + + + admin/security/use_form_key + default + 0 + 0 + + + admin/security/session_lifetime + default + 0 + 7200 + + + admin/security/admin_account_sharing + default + 0 + 1 + + + carriers/flatrate/active + default + 0 + 1 + + + + + catalog_category_product + true + + + catalog_product_category + true + + + catalog_product_price + true + + + catalog_product_attribute + true + + + cataloginventory_stock + true + + + catalogrule_rule + true + + + catalogrule_product + true + + + catalogsearch_fulltext + true + + + + + + + + + + diff --git a/magento/setup/performance-toolkit/profiles/ce/medium.xml b/magento/setup/performance-toolkit/profiles/ce/medium.xml new file mode 100644 index 0000000..d02370a --- /dev/null +++ b/magento/setup/performance-toolkit/profiles/ce/medium.xml @@ -0,0 +1,122 @@ + + + + + 50 + 3 + 3 + 3 + 1 + 24000 + + + + + 3 + image + + + 8 + + + Configurable Product %s + 640 + + + + 1000 + 3 + + 300 + 3 + 2000 + + 20 + 20 + 2 + 20 + + 30 + 10 + 8 + + true + 2 + 2 + 50000 + + tax_rates.csv + + + + admin/security/use_form_key + default + 0 + 0 + + + admin/security/session_lifetime + default + 0 + 7200 + + + admin/security/admin_account_sharing + default + 0 + 1 + + + carriers/flatrate/active + default + 0 + 1 + + + + + catalog_category_product + true + + + catalog_product_category + true + + + catalog_product_price + true + + + catalog_product_attribute + true + + + cataloginventory_stock + true + + + catalogrule_rule + true + + + catalogrule_product + true + + + catalogsearch_fulltext + true + + + + + + + + + + diff --git a/magento/setup/performance-toolkit/profiles/ce/medium_msite.xml b/magento/setup/performance-toolkit/profiles/ce/medium_msite.xml new file mode 100644 index 0000000..2f9310c --- /dev/null +++ b/magento/setup/performance-toolkit/profiles/ce/medium_msite.xml @@ -0,0 +1,128 @@ + + + + + 50 + 25 + 25 + 50 + 1 + 4000 + + + + + 3 + image + + + 8 + + + Configurable Product %s + 800 + + + 1 + 200 + Big Configurable Product %s + 79 + + + + 1000 + 3 + + 100 + 3 + 2000 + + 20 + 20 + 2 + 20 + + 30 + 10 + 8 + + true + 2 + 2 + 50000 + + tax_rates.csv + + + + admin/security/use_form_key + default + 0 + 0 + + + admin/security/session_lifetime + default + 0 + 7200 + + + admin/security/admin_account_sharing + default + 0 + 1 + + + carriers/flatrate/active + default + 0 + 1 + + + + + catalog_category_product + true + + + catalog_product_category + true + + + catalog_product_price + true + + + catalog_product_attribute + true + + + cataloginventory_stock + true + + + catalogrule_rule + true + + + catalogrule_product + true + + + catalogsearch_fulltext + true + + + + + + + + + + diff --git a/magento/setup/performance-toolkit/profiles/ce/small.xml b/magento/setup/performance-toolkit/profiles/ce/small.xml new file mode 100644 index 0000000..2256776 --- /dev/null +++ b/magento/setup/performance-toolkit/profiles/ce/small.xml @@ -0,0 +1,124 @@ + + + + + 50 + 1 + 1 + 1 + 1 + 1 + 0 + 800 + + + + + 3 + image + + + 8 + + + Configurable Product %s + 16 + + + + 100 + 3 + + 30 + 3 + 200 + + 20 + 20 + 2 + 20 + + 10 + 5 + 5 + + true + 2 + 2 + 80 + + tax_rates_small.csv + + + + admin/security/use_form_key + default + 0 + 0 + + + admin/security/session_lifetime + default + 0 + 7200 + + + admin/security/admin_account_sharing + default + 0 + 1 + + + carriers/flatrate/active + default + 0 + 1 + + + + + catalog_category_product + false + + + catalog_product_category + false + + + catalog_product_price + false + + + catalog_product_attribute + false + + + cataloginventory_stock + false + + + catalogrule_rule + false + + + catalogrule_product + false + + + catalogsearch_fulltext + false + + + + + + + + + + diff --git a/magento/setup/pub/.htaccess b/magento/setup/pub/.htaccess new file mode 100644 index 0000000..8179299 --- /dev/null +++ b/magento/setup/pub/.htaccess @@ -0,0 +1,5 @@ + + ############################################ + ## prevent clickjacking + Header set X-Frame-Options SAMEORIGIN + diff --git a/magento/setup/pub/fonts/opensans/LICENSE-2.0.txt b/magento/setup/pub/fonts/opensans/LICENSE-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/magento/setup/pub/fonts/opensans/LICENSE-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/magento/setup/pub/fonts/opensans/regular/opensans-400.eot b/magento/setup/pub/fonts/opensans/regular/opensans-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..6bbc3cf58cb011a6b4bf3cb1612ce212608f7274 GIT binary patch literal 19836 zcmZsgRZtvUw51zpym5DThsL#WcXxNU5Zv8egL^}8cXxMp4*>!Rfh5d-=k3gW1;PMQVF3RzW%ci{fFmPHfCS@z{{K`l z41n@~^u3v|;D7Xg7dAi*;0~|>xc(Q?0$BW~UjGHq0h<3YJAeWd?h+ZWM9EYu5@Hs0EOnnkAtTzP9coXJALmS|h&nzJd% z7?C@cPUEGrLHk-#NysfAePe#dP9_6D5VGbo4fVVs0)83}G7LoWV`e*{V_8RPK>Iqw z*X0)8;uQ6FzC+dip(fgJU!9*!>pW6;pdJ$jHReX|0V)o@BosG=sN|PYN^-JAOY{e4 z&QjmR91WNK#}_%Ei?QhW{ab*7Eg=}E)Ft4XeyVhoR4<|byJf1$4VGsxP`9bNBp-((Wawhx zlK;u}?+b5Ii!k>ELIS zPOH%u!jQg8T>Z_#S%<^^|CcOH?XN>$IX|aEQjBic^$pg1`=0Y3Q(mv* ztDZ~~0GdAF>L|BQmHQ*s3r;T~(0;3p;I?%VHpGPt-kXLE3iel2aEIYw5<*Tu6)mB2Zdp4#k4Oz!8SUkT&;Qte`Iq~*4U zD>qT9mSnB=3s~xUgo_vYp#API=~%dKiKqTMXWvn)p~21nSE!cT5SsJTu)R?b1p!+K z!OU2E?^HE49L>c*z)KLpsv9>&-7AKaYlMAztV}6vISI-rtA6=8k`=+S>+C0X22_El zG+i&#b34h$o{gdGZ$>$81)ovjw6Nn76?gBhm&(oX%Gl7C`RDCRpH0f?NEokA^!>;1 z%KC0rbxWq(b)XGCuDPUgvx=VFeE!Yhn7tF%LI~H+p>549%5AqnPWWvF870oRi}Ig6 zBdaI{Fa=dRbLL@+G zt@VO%=$Om*EulLy$6I72!E$J{;p zONB3HLoKgq^6jJF(Q`)L`!cZ+Rr3W%j$jUFFQ>qTy9U3hZ4h|+TM+XM0=d);0+WP* zH3@dm#w7zwp0FtidDmt@7NF1}mU4P$EY|Wkj4mH3R0-KSyk}mz4A4$XnVzGU1ny;{ zr9K{Wq#=h@cd(g4{+b*Qi^ZU3gD1uJhMpP)`|4#)S7%CUD1V?qjVHn4L!j5zA}ut& zDHYpt7rryJOpQZQcQ??@EKS$QO8W$u#LG?i4dgC}^LsmrmVoh-0>Cp<6C#oePz@ic znc{A(*xo*}Gg=DUR{sWZO2O!S=0$cJl7by8{!t-+*TZ&T9bbJ7wa2)MA?uM1^}3pD z!Mnm7PnG9ji{zTSNtd|?oe?d4$WpWLW4dMJVHy7D6t6X`N}z*zqg8B$JmXh6AP)aX zx4a+uFaSa*g>S$NC3TbnlQ^&r0ToUZAvLgxBh<1THf>}}Ts{7zD84WCblCDox?M#`(f%UZNrShhw|$nZN-MhhQP+c9hQHAgGJ_IV1b6^2F=- z?fhtv>A1W^6@54mjz5;7t*eptF`~4*cKXD!5$8W)UW}qW-In5GvPn;l{`(-SB7%7zGad2Yj6(!|Yd(VI^ zC&ZiZE>|fAm1H4v7inHh0gbSXh9;d3^mP3F9aj*xVgTHvzV&rhAm#ZR@sy6HY+57} zeQrb@_!T>7O|l5W&I8EJk4PD+eu7{9fix|s50>4l<-?he4QGVD*`Wl}V0uT=;4nY9 zEm;IJTr)#{>0^c~9uJ7iFJp7d=}N}i50uIDTAPbS1r`Kew4)^8WcXFFN4I32xs6b< zM&&#yNQ)TAU!+&2w1Dp$`K)N4lwMf`e_{ncP9W&odNN_CQ>@#pvQ|mh$&8I{E#bl> zB{VRuj9O6?c8!sDjhgs5*MQE6OxJ83X+X`AI_G)kQew9Ci-&)8eq=7sNlRp^bIxEQ zg|HclB2$$1v8c0Wisk@^O2sd2(kXv7=Ek#Wb8SVE1(H9H$$OHV^iX=5ZwM=Pu02e89|at zbFfF)-U0D3q8L$vmV7d@9I_-tBZ=NZjrKjDDP1X`vP+F--+M2*vuCD^TJ&x$t+uqT z{gy!y{@6Tm=L znG~jgC)-NfHfDLrDM=uoHZM=BNVmK{Pe(M(RjT8*-;1b0XSnNA4?|eUJqsD)D)@}; z{CpywKAqMb9wZ(6Y~4v3R-)tP9!E5UYUGBA5QC#xIu11gw%N*a*Q8(2M!m|E=H27^ zZXFt9A*oM7qF3D|Vt(Kk3UuS_L?(%S$5+s_seNGFSQN>aT|4Kk!7e7pa-zOiWG5|c z9*LIZxA-x!0O~*=M&|Ask{QPsIKK+<*}x{ZpPV@RFv0}Cxy!_fQ5O%boHd;%F?A!I zO5Q3|OR+`Cag+~w)1E`G!l8k?0rG9pOi!bU>Nj4|dc0g^TCPr_d(JY#_j4NZwiEyY zad+EiOP~qG{re_HT!Tu0b}9m&-+EnjeHax=I0qqe8wB6WTvwsvvc>M%#>dW980a;2 zMVnq%$yM7!W$r6;h2PBNLB!~Rfh|Z-k(5|?RbP-d8v>mau#JQf#7N;F!=a*C;qCy? z-m2K+j18jpX{S=OH5CGrQ#tkR&98;#oJ5MO+Z2@HIhCZe9J-ooRY{5V4N2VqE#2+mpdE}`C!1{}3U?V2V*Cw6Z>cq&a?X6gN(o2l1eaxDB zZp*{cNN;-(ALedD2XqzE89oT3lwo4=3mXEO*jLdO;tIv_q~k}02M&l{usI;}&@iUz zS};fwOPs4NxW-!BNaCWH?9w7-4k@XNVd5jN*`mdTZQRL6xF(d~cf{E$>60g9qm~}Y zo7$|>Jg_GaK?QkIjVIX6JktAcoEf>akVgU zWSWB@uUgK$ipXjs88B*f2>-^rktwrEXY&}L*onyN5S?Zl2}fWO%usD4O$9u{&mgWL zP>D}i8zKqYtdn#5(zA?O9K6f7SI0}a;RPGsZ{G)MVvdyUK55Gb7vW-S)bR572CP?b za}s;<5HMCsc1n&o(w~fCN%MLk+{Yo2x*$8G91S&vvII6dWWkg-7FUf&Y? z9a_&9hO?#ZUpRyL_MID@2}}j)E_FG>pa1$+&PWrcPSnWvfu}#_QPg_Nx=~*Hnc^a>lUicEr6y*?-!uaoR-ZkCvaM>bWQNB8YB&B0oyeY2FKgtn%Mx|B|zGtOO1xCMaIm9^>Fp z|1Zg8OMJ9}eN{aF3gzDii(~7!d|(Za0-`;2k%0_;ZYFVCxV_h^Z`S-Qr|J?3@e{Bp zWBK#47K$Yk)?@m$)2Q@24WltBwoOG0=` z@y25+2eUMkxw{C4muMZPmuIalcyZHmwYd1)B_%v}UX70wk|SH>5SVaaxUD;o@Dhcd zh|FNgT%rNB>;WzIlk_BtC5QT>=H@A3%zvd6fyU|_QtC%GbeFenirHKlnE+3UCz2cS zk;eR6X486;dzQQ*fR3!(Nh;MRJ{bSHddVHbMq`(MVV%4ojZ;9K@Btr1 zb&lxztBj%mYk@aVL;7;(v{QVF7HXojz~*}pj2?DmX~(V(#+08OeJ zhm=J|GYGwXImQ+yP_H8Y7I^9%H3M=rIWD285Gfd_$Fs6g-&4TN%3y&_2;W0Zgk}?w za_=6sPZ)r-$*f_hY`k@=Ayu>ng@d#DTXZXv@7tq;l^n^-4L&Y(M|&?5enQ=r16|$p<#N$V zGU`*|0teb@D;665)nY&vB9MAqupeY5=L?@rVjLSO~G+B!0t zm${EyNFQnV=DmK*%;_DrL%M2Do309pBq|<}a$zU42h~&usMl~SBu?9&+rk_=74cQT zNV8{uni!(;sxMT=@Aj)b(6z9^hi-WTF2)J4%-4c^LK$#bcfOaKYdpP^kf|JyHNn}I z5x>SC_yMRhQ`0u`nPp~B=t>&gGk;%$c%N8k@8N%$iD@4a!%(|(C9~zX_v_sTox}sT2FIn(x96wW|MzH>Z{$K+l@aG}8 z6emVN+jssSjniGZmXNPZFtVI4TBfB)_LyEv6_EK6Ls^Fiq+Is{ZZ3K>b*7~W21#}9 zJnFv%kbM7`$-~!N(d}_e)dO(jo(KsJlKze{>Xl({HqB9Y4T;k2@Z>};t`hD1DmDC! z3T6A<3lKNJL{T;eovS}lZp@1AxubzxSE+UuV$d|QW#k!x;H}TvqxXL&KD1M^9Q%He z6ZgH$h5>Azg;)s2sFnX@8vfu^vG+65Lhfb}t)iMB+XuUzefy&Htz(>7Lm<1?o=E{4 zqX&6#ZqO$13oQZbYjF#N)sLcNDrR67tPVY12MNsIb{<<)r!`6RZ2W|!Z8tCieo|33 zi1qv~T-j_0iW0s!NG^i0x2yQ%t)MVp0}bG#2ekg%oXooKzG6ut zec^f);@(EShH;OOYpZ+dLn(GM@`1x8GOmIsf>Ma+_7 zGmm|(C0ZbVC5ewJ(d<6^76s=Pz$)?c)GW8lu@oqkY47A!;P*8s!q3_RE%j0npP+Fi zu15RnsE2SDZd<6n|Z1F%S ze?Hl_XAf<7|COS&hj$ffTe!u49A?doGv1Qrv;5%FrxC63;QH~{jnKtZjdEq~bVAjk z+9pg(>Q_D_BW6l_iw#1?r({A3oHB#c`u8GgZzDjH&jN1LCDR(}O~bL7ZZaj_`a)0Z zyV74I4-+j}<)#Cw#d}|WCHz84q-zbWV3fxsgQ3-cIV+>z#|FW%gLQ`rjv^+yZBXnU z)2Z74=G=FolM7RW3~PCvffhenR+hPrb>;7UpH7&~(`n(UeY&4nhcKZf+Q-p-Sb5|W z(>ycw=5m7Xyi{jwK5kQwOn$R*i!~L$RiL*hmj-gNBcCplXlk^3GsdUpQF<4IheJE@ z6TYI7vr#FNf-2tM5XjcD1QJ|#h$`lmCfpYVv?XNN%Ag(67E}~t<9|!V2#vZY*UALQ zWf;z|hzP1gj#Gyqjx}lKNP=h`o}{4*_)*CJ6waG(g)uqPjRabn8aMcq)?kdhD}>jsQ)C=kk5O*e zqvnQ#3|V4k1?inmPEB69MjrLUifnrLxp;6N%`+ZG-U(r^b`fphQXkyna z9$|Nt1-^D-q!*mN=E`_fr}nlVBUpuy8#$EcZs`D3kdW&3pr=0@4xC$G!+A9Z$ z@~9vnLRWykpS9^XMK&gn8tg!~7SQw=zdw;&ibQ}lo~#6WDfy5}AvE1wm8`77Bd+2c znGRGYpWKaPL~I;BQ&0}i)Mq){(}mCj39Yq+668S}qY$+%F1f?km~mJ%t?)HdhOEy$ zEB;>Cw?uBDq~}m*pcX@m!-kBc3xG1Yblce0N~^Dsp&%D{gPqSJ1+JkL{j)|u!%%yI zyr4k{xTA(cxIXf7&ckTQ16STp7Auz16ZHhvTH1xuK<>&M6O$qc%Ua>sgtDU!3ogas zWKpyQjywXw46+(qb%#lbpo=HIb}zCyOEV9ro8Uc#&H`(_9dZZa>(9rDO{X@pjj>?E1r%zqv_Nw7(|wg1nvD(eI}a zY1qR9g@+Tu$aVk>BqD=82o9lKelCRU)1mT96r*K~aBAOT23E}m8|YE!iWo@QM-ybs z@F&)c^c=1|!lO(lxXWt>qjMKCBNmhCR90j{Ijn=a0Y==3q@HnkFWP|}RcKbu61sAT zSIyEPfbM(RQVdo{!;gtBqeBkuv1tY~mrafxO+6^1)tH}voDB3ec!O=8(f{WQQPMJCxpXPS8bZJa4`LieuX~<<&FA=Cv{tCj< zD$Z2nXKYL*Z$77+;s9oF>i!O{+YaWV98uiL2g}$o{5d4N$`#zCLDQwcH|vs`wuI%E zeVPG1Smv-FdsGelNDPio#3^|~^)+HEW!_Lr!%HjL4}Wc+X4bz=J1%IKw&JwPqaODS zW^a}yt9ma_{h|vz`P@x!X}~;k6^7%k*#SYUKDj>i{Fl?W!=GAz^cI~)g1x4wJT86U zhO1OlAuaEWU3SDlR5J7M&e$aveB3~3%_d1Pl8AG(0g7mzf;ET%w+!Hp-TB}Guz1Y; zs4|*{y3Vsu9k?G;k;EHhreUIm<&l*Y=cQr`n?mA!xqLv_9>S>W@M!6)lRwc%l6{h!X@Zkfgu|qQQ z+~C`oDuTrdU)GT6T(dU$@O*X_7_NZSznB1@R(6s9)#bz`v`Jg2HOeM2)Y&29nH?H# zO!q~3Xj>}Y@F~kpaOPal+thT*YnCc04F%vd8K3CasF+=6eUFOU)GS7I49y(_G`&?( zT;2F?ddsl9Vd=i&gqdsf{WUN666Ly#?~TzY^$YU8d!!a%kNK4{;co5&7)a1%Yy0sm zA1SQBBKQgVLb@FdK8T}kVX}$*D(N=6K;PuI3@4mr=?VRS^$id;{JdIjKf3i0BE4$8 z^8!hVXBGT3F@7)ob;`%gI3I|aM^plWDM8!kboqBkU9l|5UIKXz?}IJ8jV?0!grb9} zQpH1fO^jbE=C2Jwxev7>wvCrp%C4=D&RDyto{Rsp(S2qyiyPqLvO9OuKKIv8i+Lam+9p&%+e#Pbb=LzUxuIB!;j2{cG(cs)7 zhD1-Qu6E$hq+L;Op*5POg13v@0Ek7$S=7_Q862gfOMUUscusILHDiP`U8SCJFY-&& z1>2-~{pT;Ca6ZsqeKI!>KtHm;HZ!f}l?Sq?X@2J}MbH1;smyYrEfg|0@2W`>V~o0F0l^%&kdWZ~4K?%Uv*Dbu$zR`!b*8my%6Y0EgdQd5 zjL>9Il8==%v?Mq^5q}*h=S-CQAb4Z4AxJEg%TK3>5PfCt44^X_tsc}yMW0Gb8g)F6 zuKV1BG z44?MR&tCORGEDPd9u3%!pUH+k7Qdg%jfGo$fQCf9{Mi=hIlik4;-SbPF%&1MXXC*K z{{ZE;eC!sYX^5L3F&syX#A(C)fe(eFISkfnTbLOwn-rb%v9}{=sbnV)=_+T6rfFGqip&Olf^X*+h^QNzs++ zsUhH#Q>+R1b;3vo^Z#kWNo*q6%udadA`ObceTs0Nf2L(&~%b@ zD+GjFLBG^nzw|dWw#C@~CjSwU(#%(YwFDp^pQ3tk4Mn$bBB7iTE!f)1B{ABa*+Ru) zALtkYCrp-z!(q!?SJ#<6uVCD1@`1+owfdYPZ-juqT9_(d2K> z{N{ghL8o>L+HrJ0T*wl5fM-+G;N-Qnb?|x#8(Dc>*$Z#g3vQ;ANxQaqRz2MCy{~)~ z)|b_KGbvL`NA1;G2I3QLgoSL>G}%Oj+OabYLtSYI*p1oM0D3#Ui$6 z*TZ`~@i|09b}S$NKk>B9SQsjrmKNd*4O`s?s*mG!Rwc-}_?sQ~n8&c^Sqaax&IlIi zZ6#?2&VPc4I?LHPD95g=VCcux`gb3wV6CdC_^>FSj`%j?gkd-uQjxhnO5{(+D*o2h z$~e>%7HF64j^-=MX%1a{ZgCg4#+S~GnCHYXPEB@u&ldQ`=uxN-K;9%pF41{3lug@$ zBSSYIM=yqx+1_~zxTr;$u<(LSvmC5j#Wd+j0yOej4*%;i*U0z?D{KCF$Nc-#?TK12 zCtW}zVeA_}Ol<4PV+m>EGYx6!TKPkC!LuXd2`7q3iHhVq<=;KfqepXY9HwCqO77(w ztIn0I0N>LUq>&V3P434=KxCzKZh=K}&-~u3SGn%u?{%^Dp%ugUW=sQ6>`$29n{cu$ z8Xvck)%Q1e64!y^_tp$Po($sW;#3bj2K7;lOkUgre>Tghd5B&;2NA`zQHd%;W!HWVzVsU;+MYZ zHnqjEh^?^kBj)pnY;&z(lyl~07`ui^`4!h`Yxb?w>w-Cx20edCO=hwy9djmvD%sWVyX61$w|{i$FMd&*g~WP$9wecvWj^S>=v zCKg}2RJh=D*bnaUd1UtrjCuoIYpFCWYrC-0@Q3TlT!*q29A~2D z0g>md0zY#a(tp$-D^@(+u#+G+!7#x9qqEUxuzn!r-F)gpl0p=9WD}rVQW$ZUqfxec zVA7~)d#It@fdKJ8uP2eQA)%C;sxhM+nsTlPR=}$`D!T!Lv3CXGDn$z7_yr2Dqds-D z>|H2vETd_aHZ-NMGfe;Zl44P0)LZQ22@U1fYtczXxvDw*s~vKnZD?O@4@1Wx@@Z;G zk|N(~>A_~RNNEF1zYvxBw1#_rsd$@}_PpU^crJavbR0^oS(+XVZz_?=z6Rr|p1g?Y zQ}eggc-P*Hv3NeidGUPm)yCgrZv=PRlnBX+Q7n^2ss2qsF`49#K8-A_`-2RA`SEQS z!nemcRZ^POWXUg?DN_a=v^F%0d5E#GsRfBDn+O|lfI@$(P}eZMF$*f*tT0<8Y<8(g zQvb?$wI$TVT2J|~L>BFa*-(HRLhs~}FJArfyf9nSaEZ?e6__}qGUkbS7&pn0kk%Uz zS1LDEo^Dg+Q-ez;8`>M`nBKnn`@Q(HG;S9fyw|)uGwd6q2kvH&Ul~!8thbw25xVCu zGIi2nm8!b;H7Culw$Ok^HKP-wOk%2{DY zrb_)8fwpOpug>lk^ga5sB@e!=)FEq}P#l$t{SKVfk=%=As~IMMrDQ%$<2{NrXioS6 zjsEkXBcjHFqH~5ZZ#W~}SLxM}#2M}UmBfnOpo}xNF%6qUWf;2=|8V`K|4Lb;Ei+G1 zeCebkc>IrkI;=V;)#smOY<>!S(+!*%XVbFum}eDD#D&(fMQBnaQ!f^>DFy;I+O*s? z@+u<$dsDa2_#LU z{qy5c{l|nMiiJ=ZY-jqgXoJEbH6wPiM7C!JDYZtf8>d_;)#tDE%Wt(rH#LKl3tj&- z#48J}(`^)L6$D7t$aDS$XeNjBGk7%Dl)uT0>nM=poNHl7tu{4PAS;)wl0LnrvrhlT zsr|c7sQW!-z|1@7Z#?yl`()}3ZaJDj$r;GI5v!ozObBx_oG|Px)T6HxXt&S~vLx>O z6*u1;KKA0HGVvp=3_6~%!bq4x!w_OvVogh^5h_11Mo~ALs5mCL?5K}uKP1CT^_mWd zP>n8oUhG+rr#2>Qlke*IL1W@v+s^TMAjE2-teBxi{?t;F`C2zlO!lbUqL9q@Sqr2@ z-hdeTmsVfS89pJx;@@X7Ff2gy8d|98GIoayOZ!jMTvFr#8y%TU$p!6dPOUw^3BKf; zNRVp&3i<&Yw?0E;W#NcdGkRuw!CnqBK1M6jy4CJ}9Hhrryj*rx5-J@|2#p$CYvJl~4#@6J#)A9>%21M8jw2(!mP{<`B z>|DLI;D_>!&*N;J3lB@xSbEctr@8*)#v-Ye;->qHf|dm@SxZocRz97*;CD1HG0#O! zq`&B|jUP)dI9SxPjPIy3mD2C}BTUJGzS|xSM5BzorObpy{XB5-`h>1C>3ZRM zq;6I&0IGYFK_7bU$!9*U4Jg0VqCyr*8 zev)G4YN%31p%e@bWBNK;Q@S&)dO(CGe{(Z!54mO3Gz-9DA&=YtS>q@)zz&Vo3}oik za4OM07mgHN0kw3ks5_A z5KzxPkfE|DRX6u-j1ULvnTvb+8e^ZIJu1ZL<_*AUf*Xr5lciMmG&{)GmAuIzD zMcuE9i}a?%wwH5#}tG22`{LcP7T0g@cPHh%BU ze4!X~%TrBBO81OEuz+l>gzIn6uXb2=`tsHouH#tjt7^+nAOGayB93fpu{;E^$T%Ti z<2I)Q<&RAi3vXyxhT5FqqfFEhXrFej+*E#L-zgQ|fqLIo^=1IkWhTA%f4*XT>8uLP zL}D9e8Rr%JDK_7{GFTA`hp8y!A8lUxjh;m_L9Wvd!yTK_F)hZ*KvxbPlV(3Hx+i={ zwsrdf?x#bBe~wrx;U$VU@0{qLP(I;{DBiQ@Z{j7_g1&Uzgk#Sj#cSmLITA1a3$|Pe z#QK^%*Ft8gfJzp&YSOqvK^u_)6>GrGC?lqR5KN@v(+L>eJ14XAwNfzVGqc?fFqJavR}8I|mnUIR5Iu$?&RHeq%jR59Sf4FD3jUKeL;bMO=ckRpSTX3tb3xgf1L zw@wObtjkE@3CEJ~#4<^}D=5kqbaC)yKlEcgoDH`$p02Qy|X|75}SU1q98wx8hh3;a?U1A zSwfS5i!L(GOCy5ucZSHX<>>bEq%hl}lg?3deYRPI=Fb7qbyG#o9Vcxd)P&wUdl9~1 zc$r1ZS3m3_B~&Rc{@py{u!)F5cyGihyb|%yr=OcUmfLf(`17Nf%8^G$m}!ijXJu{$ z;s`9XR_ap3!;8lp=c#wrz(1Y9U)#Sr8iL^i7%v0LGFBcyS*fe7nvqQ?mMf^Bx<~W%VAh{G!0y))^_wVyJ8!g1T|i5q708$TSD7uN_c1|HJvM|h|6FT$+_6#lnbcl*n zo%^b*%F>B4Vak`Z>=Ck zRYj0Sr)gv(nLiV)`5xmcW=0VIOEv20sNn+UEtj>{#2ay+8GELz6G`wG1O-zkDO!$o zHB0{p15=c9^cnJ|DE7Y*y^Ak@hn zJ5lfq33a$7Fu#0B4(AphxNilM+vEe*MII^A6<-Np z&O{RZO3-PCFQ4Mr4^M!m_`W3~FwAr8mFXv6(liwOp-zm$3D?hQkV}D_j%6NMDPCswCf)pdzkB)Ud5 zRzjkpsM<7{@S!?;eyb9+@LGwM+cw zJJN1-QL><_JD6l2C3#OkWkiO)qrk3y4d1Vyu&;gY)g@;aXMbX)P;vh`bJg#I*8gucc_8^@*?L- z&xrS&qPcw%m6KRjCXk~p{moYO#anbLjCUYZMfba*&@9e=Gg$caCM%1nY`r89>{{MJ}~HyeUwhe=qC z^`fF~E9^IM?~LT<4)&XF#w)`y^F`*r7$ZlCER(3aDjvQZn!FQTt>!<h1FT%|Mbo-p{rk~uYg18>@^(G zl>gl$5~e0V`_uK>Z@%)!J?{(W{bE}#w(vlpt;Pe7$N&V3mC&MRLnpv6l-WEq6|IDD zMnK8!M?z{U#*ES)gbc_{;d;7~o~#WkHTp~yeWyIHhdwb7K0|uxv@ZrU>IHmcOV-B&o;B zhgL0V!4Y*E`w?Koa4;V%h!i@ECoi<7qGCW)q9$dWNad0|DbfWK=UMT9BVUH&Xi8TBbo=UldI!ag8npwOk4qRB!*81s#K<>;ylApOg`Kt$2iw1``Qejc52 zO<5a!n)ljYZ6h_Z{+jE5md4-T+?F~_=Mc-vWBU*Qq>+g$O}*zEc6%d6KMYZZXD+56!A+@hD0!1{$0vg{IUkdC%62agDF8{zUDR0*LHK z_S_K!k#n>KCw3X0&DV4_uglZZl+{4|^NhOav+8C#MN_!6A`xA+edK(tfhUrIM$TLf zSm~+H0LjZ)`8_-!(mwMc)he|!GS8P@Iol%_&PPiQ-pb_}H|fA5CwVD6^@K|uX<)K4O%){JmV;GXs5h%nWidwHqdR%^ny7+l#$s9Yr@3 zcA4)n5q)a1c9Igt%hkHDA{6g_L>{EREbk>);Yx$$ks%!oLya%A%71`M+)hlHOE`%^ zn<%@3V&82`-~`Z&KKvCY%P{+lLy1j+B!NSeT8f(ZT(pfSHk6b*vc##m{3xSdj*?#* z+rtG~S40-m%>udW2u45WhBY)uE-?)sDx))&!`z3$4gMZG11kzfOG0Z`{@QX((HX{g zfYLvUuefq6T+JRLv=%*jr_sW@7{;qj*&Vk!G*OgIwX!ummIx(i_T${a=9K90ghils zt480A!I$yG?Hb~$(jsyZ)0kf^N%Tr#@`A)g!we8>Ac#9Z)JM`wEZp~~EY_r?JP?oF z9baMSSAUmvSy;~7u3V6G?SK*Z)DW)I;ZF^5o9tbs;>1DF-)giJMAPOYg<6z*5&V~a zcoOXt8!Nj3O5w_a10Ctgsa|l_U9wVQ6TD~qJ_`FtX!Vc*eV8~(1M&e8*!#M22!Sn5T3=l7AildmrGBG*DNS1>1o z1d2xC>#=a5Q+~eK4{0i=<#xDPs>wXCTzXlW zMhe)YVWj*WCQ~#No6;{=9l>1)62Zi`{%2?r1W`InEo6#`^%A1B3I%y!MGi?*P!?x~ zV@FaHTuodbH<7~CR2+AK^0{VPq&Z>Lr$&drm;muZRae^;t|GY#m0l~VqXYg#7)CUB z@5W+IDgHGVdv4OGjkZy|fbF`9-*YqvC{iwxf?HjgJ1I-50$J8Vyi-91Nx0j$5lr$q zDZog0(z9u%I%B>+efGqUVk}$RZ`@zPeEkv=%19VsLONiDzJN$JZ z-7~7L-7|cA%7-P?38mi(6fs9^1djoW_mJTam1gR@^8J#i#8J$XT-P%79hx~dA<^AK z^H`29SG_*VKmqujfJj6LT;w|;`%{k~Yd0P|rwt_}Hn-9gy;@aIKR`o3+oJ}FRp_S{y-FREA93}Oi=}1=gY95r8F*D7$ z4=#bpt+K{gmp3%h@Itrvw9p6D+%dy5e#fILqV7hhHat35<4=2FUcK>NOERo0V6o$A1oNqpXZ}aE`u$Aok2H63VabKy{qT;_goHNXGVN{{8 z#DFwwM3Y^)r2fhW53*~x{JE@jZr^4hGq%P0czFsF4d7b2=ef$Q=MS#cEHExaZVT1{ z;~b)mF6Rx#pvcQ}7FX<)+pgDTP1+Qw&fCpgJnO-FTL=gF(1daD0d1Z~Gk#04vbLH^ zz-_hpE;yx12M?YPQz_0+Q53)fuQD6EzL7mMC?B2nrCYAaD#gS^z&n6YPBR94h?F2$ zNFoB2zHyA4&8O}bw}mF_D8FY;{p z4?a3hKOX;krgDl=qB*pCDWZDl*s#LmG<0qmYJ9LJUr>k^r=*E3MrA4yG%bNY{J89( zREs<``R!UOaguZsz^#yg3Rf-xa*Pb+A=o#a1|e}Vo$A9i%=$6in@fZw$q%G*{SUi- ziIT43lH@NdgO|V_Jt)~5)ThS2T?wcu6z_qU^68lK-2tV@I!UGkV`__gZd_g|bPA5? zX4JEIY!|!7GA>mag2_b*01e13Gwz!fjNygd&DL-@%z~jzXb7zR5gi#s5vquBAR~nA z0v04DL;9y}vK|I9) z_NtYfB|%`--8kce&w_WZYA>BOb$SEVd`fgmXx%PD1VCeMZq^l`ABT-Nv1S*N^Q@Dl z#zS%fICPOlTN{+gA~rkIp=<+NTtzk5%Sn&Q5#2zjeYl$Xo^*lgc1mWwG%7w=8Lz2ExCeS4I z4$9LU2vh+>1V_FJ`7ors;f8dcr4@uO3Iwl6DV+MUiQm6J6G-LyAEp`Cw?sI!-So7s?Avv4?ElGK3Cf~OiZ&9vuK z14!4qZ{GYIKf$`zo4PubByz8#IdWYY5X#kl@b7aD=PziKoe3=xSThGFYq8NY=Q&V- z1ekS7x$?MLJbh{q-6t~-r`|~ihY57I>jwbTE{fZkLD1Pp$;Piy%q<4e5DXOf1CfDP zC4X@q0MsZWVtYSsCuv}lCe1^L2U5`^>JEs8%l&R>#%AYZ$^3!bJAe&mzM~O(83cUw zBs{P|1Y$j;x)Lt^yoB-8H3u#Mr-+F%0SCj7jBY#v!jg5MUCRCb^7X1!A`E%cB$Gqy zDB@%kNYE~f3SG%1A<2!HD;r*S=|Tir89+?MSZ{=I@zGHB1easLuE=enJ4U6%&Pq(P ze=Wrt0Z|5>2RMYQ(tS#Gk+)GVaE8SL=912@3Fh&mSOX4O6Fm+nT>2j_P(G+8K(OA? zHG-)ZpGGVZ#Xn`r#yF)k?EQ5UhIokOOUc-o5YBxc|7|Rp2e05ds{^h{3Vt+O31v|344aIM zGm4inhn{nzaAmX&C9zj4frwDC0JnmrnAifY5%hH+ov4uoAWE<#NgB6_HhrX4^k#E-E#u$;&Q=9*~*koIscXwCwSM5;{j z&xWp|x)xT^*Ag-FBP-Q9so&RPT(D}sy9a^zy0DV`h`Q7hSI&+~rwa^Vv1JX@gsurR zwb&VOiTfZ7(i>DIK|o6=8w4!vrQ<2XmbJk042-8a1Aw?r=q7rqtO0?Z^)cWspr;`q zs%Vdcb&44xJo_`1723Rz__jz52hES+I)05n;ZrjqgM6zQxp?S318*1_$vk1(kZY( z^7_#DvKV$YC)APM#tvB zF)VtZ8Kx00qeET}4>_*WS$9B!3W=%#=p;|qq9rw2IF(H3PjrJ0miL_ky_=fYH<(%b zPW6H9_2)e1{HP3nKu|_SuU`5AQQyORjm6;-oj(!v^_d}k0G}*qWa?Odt9U2dGr^5P zCc&I#Wnh78c5P@H3=BIL0W2w*_VlWz#S+dyq66wXPy{&zP(Y#kl?*c&naqn0V-Im! zVct3kcqbKgw$(-mGhkw1ka_ehXtI49?zk*dqCU_~lB!Hjb1~u-X|2nJm0drBYD@m$bLwBhf|TkuZ^f zm}gFuIDo^P&Sg+U zP})x7RcPA<(y(?M)(wM7$61TK8pLHLaFcoFLG9`+s~KhSvofMWBYj^Pyg__~Gz^ zVrbS#zm;grG_HblLAo8oP9-#NZWhufM^z{3$3WUXaXp!-{3nNL4!8}cV&;ca=%d3VU1nt3Zibk$*NxWDo#&_+*|0lf5wV?=jBDrG`mXh=@QcmV1oxO$u)7p->W4y2zy>e5D@(8NHwYQnOtxt2>|}8N^y*? zLAVaH#{wjP5`|*22MN^&kfV^vT3GoBfg)2d0D~#z%a$(LVn&qQ_*P!*r8zUCG6=Xh z2)Hc<Dp_VfW;%qc9N}3_UXK>S6uMG{LPNv$U0AX?USRQuh@!*>kjltVfT(mB(+Zwq zg5odCBCXx1G$Wy-UE5Uv#?9=l*mm8)yx2Nk-|I@sJRLm%^SpL|459|Q&g?!}8M|UQ zJv+MwV>MeE*c@%Y;7T?k z97s`Mem7DIS@~7AlTK4UNweiV>x~Sb{@XV(9;ls!iLN^^iEjxhs!PZ&-&GZW195r+ zndNf~o5y&{3~)cb5$&+}@B{56aFCAkWD348T0K@~OkjRv+rdrAe<)I%BI2)PbzK|s z@lCV-d|y$1{46^TE;86z<-=ScRwp{iz6%o(UH|^74(U`A^(JYLS^Px7UNYX#$!tEE z8eLVw#5=>3-R9@LVgOe(L?0SjGzC!3xZ+r{(+i8_xgl9G<)?l|Op~UxGr}(IbPX0a z1bc~Q-CsQ$w%6=9msPWkij)lLN`s%BjKG*x$&BJ8m-_)4ksZrbC#k7mq \ No newline at end of file diff --git a/magento/setup/pub/fonts/opensans/regular/opensans-400.ttf b/magento/setup/pub/fonts/opensans/regular/opensans-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c537f8382a42986cc5e0d5a06b1460df4f0a5e25 GIT binary patch literal 38232 zcmb?^2Vhji7WT|7ThceXX@rp7Y&IdJKsuo=NhnezBmomZOy~rW4k8Z`5RfKPqy$k! zj2I9X3`Il)3xYmHo+T$(Z@!z9mER zcZ|93QO5iuaew#Vl8zZWzS_DFpHJX(#h59T)2!cT4Ph+6&Y0vkX3i{o(kVk%#)49C zzuWj}6Q->4zpEEMPegm`CREOxhVMfdi)h5VX~OOE#urx|OJyt)eV96J;<(DOT-mso zvE{RHKW8Go2wJU1;qzX6j-NPX)}2kO%FpBTTa3vkZl5})^61b<#xu6+0rdIvDV29l zlcOagV{7Pn`yG{2#!U!X-36aFf&lHOO`SRGU!KPwVQk$oJTFa~F>czw3*#CX+js)? zADBCC^!N#fhCI#KgGKmkKq2a}zjohwmfp`~r>~;-H{OlR5_f{|fhYsy@tL!Kp#T$n z(x3EWrED})3i}K!Wo^dHn{hi!m@s49WR`Jz<*Ykc4^fw0zAW0J=lo;(^trw9gt6Gv#ni<($J7Pw{dVPr)@o4nR~cGwexY6QQZLGPi*~3j zUwhQ1_hqUuwnxh-();Q~^zrLqSCYH|PFHdK=EQ#fzbV2FHY^?C|KGx^*Qq~ux zA4>nrFR>z&At=T8T!Qyfybs0uFqATs#b{><%DpH{QI?@BM|lM8?L^(j(B>|b$5Cof zow?k^Wd*+9i1HxHCX~%6TTrS|wxRArDBDpUMtKDFU&8mV z;GLtjeSo2&O+S>U@F{4XTU;RYqO|F&9sFMxXNV z-UX!_aQeMoY(w3LP`0ByjPeNTQ_o((`-f=%W0XJ^to@f+P~tH*L>Zkb)u2i>s8S88 zRD&wjph`76k9wb=^buHv2>SXkyE2MC3eij`1dKiyjlL-TQ2L`3p`{@x#kelPdnw+B z;(ZvfFT;B|dNCYj1jbmkE7I}Jb|(spX@*Mhf4CQ&0<0vnnPejL;ajzbIdmqI&dj6nHJ;u8p^d#RN&`5y0W+upGpGSGr~xym z0W+upQl%cWst2v=L92Susvfke2d(Nst9sC?9<-_lt?EImdeEvKw5kWK>Ore|(5fD^ zst2taK&uAOssXfW0G%2@r+Q#q4UDT<_p9c^(rdW95ViWC^hN21(jQM>k(bq8d0Fk1 zm-~dgycKm8gL{^s+>5dlWf{tHl;7u&YG7RrtgC@_HL$J**44ne8dz5Y>uO+K4Xmqy zbv3ZA2G-TUx*Awl1M6yFU44x#)wu)n1@LK3lk{jkuD>@HL^B0apaD{#0W-A$GZoj( z-&{LC8U#=JYT{YUJU^5VQ9eeYZ|38h`S@l&zM0QLTX7X}5^)i6!T&PaG_vi`b}`y6 zzAmq}Z2A8Oe-XqF0qbKFb2DV0q$e3mcS&kf4U*hM$$C%{&!K#bBC%LJsX`a=WB!oS z!OX&B7LR8QERA)?YQh4Zy1%yBV)oR>Vq}oejk+p520% ziuGKy}(XF`+}@StFPcy#_HKeX#EqsZu4qTer!0K*h)W(7y4P6(9b#xjf!+K(w^~m z)l~?S1`Qr)XCcLd2jTx_?Tz0)X+mWyEsdV$_=bZr^sazrp{xxszX+P$gr5IXybojz zpzC1v9sVDPnjH6Jr3ZfibXL@AH51Lm>hJP7HlF`rk|ckFK~@z>Qa)wUzue3|0c&YocJXzyY#wBKf*W#8+FiwpgfT~Y+a z=s7#vf#-^wpJVnAd!)Us_qn{Qp5vqwU;fYKFD}1$dEMpdmj`LA>7PvvpPu>jCflr_ObjPR5KArJt*9)gUski?_{fFLv^z(oIuHf(wL zv7NhW9)IG=J+*tEdU~H{|1$^c4jnms?78QUvl(N@O}cRBqthn;eNGj-ubRzdY{Fd8 z$=mar9+u*KtW%lv*l`AXl9>1cp3VdUydwz74LsvN!(G}(8<jd!DaDR<6jvp>pcWLBc~ob<$KcG5b~wsCydu>jr#R6c``G>J=zKff zIpEKw4h~!v*jL(DqPhK@RM*NOWfeuymBr;{&T`yymz3c~H1*yKD%GQ;c#H+f2f!!= z75S+i6(61XPP>OW^D8~~j0P}|(jnDjNU>9oq~2pZy!YseLeUAM{v}Ix?l&o}3VZLB z&PpPhz>!509X$4EK=Xm~$S!APq5iNbWxuNS_VCKWRF63Y?b+=fb3uP10WO^R}7LOR*nO*l7B13;=oj3o7g@D?oenH`U{xGN80Ezbe)!MB!$AbuRaCa0 zgEAP3{FR_9z?wTaoOsN49j)J|MSdRmob3yJP z^hNDmTE;v9&U||X+C3N;$gvLP=dY~TAE+jKrX)wl0r_B53`$P*grw}}^lnMnFVTBw z%6^&NtttBzdbfe9^d6S7-$3u-Df^A|9+9%&MDLL)`_1$omEtia|4GS^ChPaf_`?BL;Hodo%k zTB6(fR)-XOw&+cA3iHT1e`A*T;L#-uuM@JQu!pnr{ti40y-EQN=z*_R1sJHZbE+pb zB`u;`sweF_cQNu~P@^M=$HHCqG<#o~V?g?*l`H!?`(oyljRp=Lj=7x1d6*4QI;8+M zcn|+X6_25J^0<|0PP@I^O0<=J<+eRdZ^NUIpy-`!_f*h4at|qcMzYKH=x3w^xlMUK z&1@4S1mFRpvkw@%09=Y$#FBL}B^6YRb$aB2%CVTdQbA=jt}Dth6Hu)ZfFTZ@eJVRg zJJC)b^d4`bEi|Dw1qcub_yC$DdsK|6O3&iCN>p))*6}}tU$oOvex*f>UIyV~2MjgA zi;uG#(99HHdrX)ic6%Qu=#~s7NcCh1^wBfPOC45PmS*n;F-`sQeu>6fkk5rrH{li- zt@jwGPH|nLIlWXxpHe;9UWf%gvR2TV04#iz&q;CG(+K@OkWbyp)AlED8#p_+`D+mW z%GaHnzZSK9kG86lm*VM^?7P#d(Jm>T^yHNoavIx}VE$_WgV<@F1iIeq^(W+Cd(TWH_u&4~2`VqyA>IlyRgSkpWym>}*OeBTRlfZME|RMg2&@pQyn0nw&6sAum3G47*A zAp`?vOaX}3JLLd;y}0Ou3r-h(Qx0(PO+Q?SZ*HPG-Epfw)uD?4REI7GQXRS&M0N6T zaWmDSi@{WfE{doQT@0Z*U2#!Nb?Bmm>d-|g)uD@_RHp|nhEW~5xP|J_MH$thi*l;d z1sB7q4qc3(I&?9T>d?ilDV~gGGLNDUo*aCAo4CrwRfXUheBBuzDpNd}&9z6<2T^;B zxT4x)#T8W@m*UB4t~#DRh^iCB6;+)muBhsy6i;?@)hhZRs!kSHRP}aoMOCMyBzsKb zJaT-|og}{DR40{|H0fX{DTPpJ$Eri2*&A6Jmfnut4j7fT|IFBLP(SK+K$dXH_RI9O zN?#u^8e$r|9pLnRro~}#IV_Gs$*#roE!sqN=x=)pl{e771kcA8dEZJ%w}-LCGb9zGS7Z?XP2JtysSdLL2>?8 zcVC};ci*0(-KBDkdv=|gaM>glx&C9fs!eU62|dSem9>-Yj2dU zDAmpt-&dsl#$yY$?|5?Ys$!mAx~!C&8o%Nl^R;vG5^e7yt(fnlvWS;14a%xwl^m@_*rAu+oh z&$OiR?5v#J>`Yib#)L#mJIR=Zw;XN@kFW%BCE%}z7ft(HLCFW@Z#@3`6N`@Q$$GGQ z`$PR}%kTN1>Eq#3$BgGE@7o{o_Y2P0hg==`kzRZ6Te3U!P@UR)NmqaE=8W6skLy>S zqRnq78wZX|;!8qqMYmNp@p6M9Rec?viZJE?_UUZz08a$4Y!7BunNb~yY7$~0Bfxob ziJw`LWm^GL6hn!L8w_EF!sr2>DAZ56y1t(nZSfRnbJa8MPJdY4WD3;bFaf5#+-*rq zOG{5nx5kUVxH$jFWUDPaGs6<%j5DZ$@j*dM0+1{-BPTm6;i~V=+{u6JU$SdgNq_#@ z){U#TJ-B||L%gPcX=zbWX=#7{`qqv2Z+&q6{f}r`w)WOAce%Y^FOTAxg%OcS=nR z4pO-+fp>^XaYW4$%wNz$mX#8fD@tI20jjt6S`jSNs?rcpTd$**FjWmx3qgv&fUJy; zX~`WNu>oO$VeO5WrQnkuU?D=+!@G?emS=#|NrL zz5|RgO(1i4PeG|jcNl#$L;}(fH@GG-BkN*Dh!|bE=+6~v$0P@y3uK}0U@#L+A{M|4 z!>y7f*%}g>n`r=^p%Kmmsd(G^oe!+rxN66SYAKzY`J4MrY8gL$ujM>n%TG}sx}&Xt z=C-I0Bu$y#77vk(&YaNfEGaQFJX8wUwtmN|jq4uRNsVd0YF&08+lhi>9XOP?^V8I>I5PT)|7NRu75SGj#M=eeZ3 zE0>Q7ZZkT2L3FRcixFeBpJz>G=e&>41dA2m`@oibMp8gJ-*lmd7)wlF2c80@oFwvsR8 zGx*(nhIY5MUOTCM%oBN6yjr zF@r#mi1_xTIVACH-UAYX#D+1Eq-U570wT{+rO|E)aX7P^MY=Ju2S-2Ui`yUY z)M}q-|Cx1i#BKEze7-j7f%SV%Z@9anc1r2+?-sw?pp065pq(kaZvDB>oGA}?Oy^15 zZ|&w~lkdvvGp+BCmoVSgoIV9K6s=lPdeoJK)cV+)Tx7(%ZoG*FIp#m+?d3_ zURzhuvuTbPcf{M27>s)xR^WC=*(8}+&7hYF^pf+@6AT@bN1z7^EdfI9^GyfNNM{NS z3G_FrtPO8tgjC5;!febLCzJ`Sej$!HW1^MRs2nNv8*bJvXg@FR^VT@eOWKOt9vPM^ z)i)h>&6F2>_39UzHh4#BX3ch<5tA$J-KyObf&NKsHu~2Q;~9?lLB6}Eim@_q@KipN z45~p=Ct^Gel58N=K#ZcTz{t_t67)7qDU6J0*ES+PGCtlB>WnklAg!4rBO(lpCdrvz zMsq@jc~|NnjCeafn-AvwruP~&=DS}40`9o@$``-B^M&?b{@wlC*RLDCsk~@|G@U=q z_gL3PY3H?5doTX=OYIULdit3s*VXi2+-JgpiNuE((`3-qK(b5~vW)1h>(1!Eu72XS z!D3M`vpA$<80Rt4sKzhkH=1hIn5|2H6G!=rkXmjemNsC~&CYTORZsS5DOihnoB^w~zJ5#n zPXA-sh69_lkN?rgGgjXD-P|WOKUnk7iw`d2T^8Iw=aIE@*Qu``-F5qcn}$9&|Ii0- z9J{po=7ZB7dHzz(oy%6=Rk^vZdz(Dr&aor!&F{8yA+ZWa93hBw5(98Q)m*|SqxJ$RL3JT zgA|c8uDF^e&MGV#|NVdb19A_|c=1bi`K<>p+^N~tKJ>tb5nIcOH^_Y&Yiw)VU|wdH z-17IgzT~E@+IimT$gT$-?|)C9Ne2*G@!CPkSfN{y9VE*_nnjR!^pV}^6tcPH3Sogg zbk$lhXMW2SLw;`ga(&^D#QL`sFieOYCAkx5mE!pd-oQ_=?7R?Vs4JG>06(z|sx6j5 zvb}UzR~E#uxq#NC`;~Q3`WM0LBj)}@_9NEu4~Pk$fxK^@?1CH)Gjk=Wv8Q~p@kcr6 zM_x0UUwBYkqa6Va=JJzDl>7x|9BfQCNiFY^4}DyMl_AMPNX?XcUu(Y663bEM$~zlJ z$vfrYD^_R|R;)lbfLqIc7-aOrYNn3xiE?n`59mlwzJmARvmewPqqX7aNA%?{(0B}$8bcggHGO)t#XIjxS!mWbHDc7z>>Jppg=E=fnJW#p`YT%m5CSu zNPdIDMqp@+2IDOdzorsqGC}PM1r} zAQ&#(CZAx?X z4Groybnyo1gZmp6PaJZ~=r=rnWtXGEwGQD2>h~VxAse36p8QNZs~s7(w3M&q^bopPv8H{ z;pfyt`;IMsGRiMcJOA=Wa^du4^QSbeYx;P_`upyoK617Ia`voPFLK0xZaHBSfo^VPR4sXI4vqAC_?}7Ah8tIE*%AsdwPBLgO0%I`ka>@DP4avjT7jlmVsU-=NL!{o!Q1h;OVgly3fuut{sr*-S$nq&7LEz2?2$HB8vP= z<2kuw(|l=E(@trrdT6tjw5jQ9(A3winZ>zdsa@8(U7;jXlOb@bp!ePu`OI2hb7-vT z+s)qbQM(KI)x`~UT9$$_Mp0Y=AHfvQ2OcWYG0H(9pT_LvB-kLK@lKahH>%)}p=s$G z9Wg~|wptwWK>ow5?;qCcwEGY9vTy$JTK=iS+JCfnxPwP-S*JZKX-#>q1ip%o{gU5u zaM-3&?M3Zt?S1V{Cx21LRgD!iw7V&LnDo(dQZ)h!z(-`rG}DeSh4x7<#7s4|wo$9C zm8DwA(^Lcldc8yeYe73c6Ya@Nx4WqsF*9*jX2R}P8VO%@{mR&v^>Jn5q74QIP14BtG&+}&_QNp zDeffFx1}NEoD}ne4>1{4;12LW>o9N7-hv zSS`eBAcYPNz!Icf40X>J8$UCJY(F8#n4}=-5#{yw>l#l2OqXcx>M8dnT1zB{)Z>5F zo@EYNV(9;t_N;nb+pfJ#!iHDyLfEULFU@TF;oraf{NulyVAnpX-2pD1$j9*&+B9v4 zRrO#Zj5f)ZO5pzon73dr9a9HAmJ5&KngRXX1cjUcG z#(J!s)4twY%jZk+P5xUyf9?30<4V9M|7rrhP0{NgU3b60Rof+S4TgRJ%NL_2V^ILZ zP4)Oo1H*KQURCUXkn_cK8{r!GWk90I7)8k_&n$VIeAd>hh5Vl8vteYjW*F zzUGYfuy*#_y4`!8|5&PM+MynL^Q`vC_@=2+#rm~t*WCj$knS%*=EbvAcZW#GyeI>f zBQlI+nB>iZ&TGWM(cw(i9UWL9?LKo7>U^RwTf}k%4TP+(kn~4-aP_+_QX3=cOyYeu^(W`F_E!gp@@y2UZqm-E{iVCr=k`95`#jz{(-% z#qfNff1%)$;h>R`{2v%SPEIVEhCX?xiv)6Fg*l{EwOYE;PfJ&0H$$S+^GCt!QFz|M zAT!AYr-w*_`|CRS?OvyB_ik^@1XlBoS08>_ zp4Yf=+e`QVRTi=nx|y;Geeh>O9;?@r$DyG*@!>Qxlhy`#yy+w~gK2gAYpv@sKAGQf zQ0po!X<8sPN=KWXmkOE&`sg(uZJStIca#Au&D9hO4Yhz`)F4L@Q4v?@kFNnV;suQ2Lsl1yt-GowJCA-}L#KtzYht0k;@htjjrDw~=@ z#G$5cT{rLG<~Xbfp{)cJH{KEVT-y$n-StZ z*b#sY&#fa9KraAz?jiNUnqLj*d%BdUIMtIdQoujtnZZIT*6PVnGhXv z=pDTdw13?`BSrZj>qO76-UqX>Zo!8rzo87ryohH@+n-rsBu$dhA)rdUWbtE1t?6a{VZH|^fW2Zk657tJqSn3A#YM3ZfH?bb0yDw0V4|aJv0<^HmLL)3fSqFHRzGrTg$lQKLZZ`1N~q14nG+$rSo$g@?R)=U zKfE`2f42bV+!~W<)?aHkRo8Cav`HDReW3k_*Smv@*C5QXY~i?Ft6uu%n^!NKd+%>x z6fn$8@W3i%BnxM-p~!Ty`GEt%pr~WL0+SOmAcW8Th6RgksGxvm8%p)sPza=^ai`rv zjyBj+()f#T7MlMv_~F#d+{GE%fyZ{Nc;F5jckuvj^w>B9p83xy`4fI^}iLA{ov)BXl^vGxagAMg#%m8#7x zV*J%1*Hp#WgxIXnQPx;nEcC>9M~FEr+2w?HQIAVRWOn2j6Q|%&;o2uItv1j6s{UW! zzjtA7pi!w=u0344bzANFZPgo|;0Zh!uaupG2l3;-Hq3qYP3O0-esT71?={mQ6ysrq zry9P)5NHq<42G0Xd?$lR;q=zcZSSa%E{#zk?um@BwFzqz9OzFLE;z>&oa`H&&=~GO z+#4eUI}E`GM^=Kg@ZZ`uT>a?H@0$YEXLs*^s%-m1_ihi8y05nJ_S}e|UT5uxPbQr_ z-G5_(L;h;-mhDe~Ut%CWgAB2V{S0>p2OxGI2)_VSEF>OayrSXWLC9VamUob_q69^Q zy-RnrI|?I2w(1C4(OcasKWufzV;K;EG^|t3>|FTO$sUISgzifZYv0zq{4%e+Wp;8! z;i%z|YOglt$*&IR)}3#3E{$EVvM<_B)ND#R=+^<6_Py8(?hqss7)^105MgaOG(j&@ zB|)MwZiIqtGRY+ns1mZXlmk>*ub30EZz=>+aF5OHO9TRCK*VQeu2|q92r;FrOzok$l!&g?F1mHI%)e z=P>y6#O63Wycz}(s?W{>;gs~(+opVUB0agP|L_+Nyr6xg{k{I%duDaWbN3!P`TbMF zdTW+VtIwUeW6P`4?;gH**1!Kd`);M*q)6xVzK@4yS|OJD7)M6 z4$j@T*S%!B#L7o5m|WibcDdWkISoJGt;-S*bcaIB;c!;23rlh!fO$Dq5GjaMOz-jm zC%CZoqJ@h=uhD!{Xa&9+XDin zlVAG5S!d2juPnRw*n3ScLFOe5?L2tI3vV@LQy(SlxL|y|dI22^_QoE?KnpJshE?b_ z@lK(Pz(7Ktj~+b1Y)|0BYHI2_cWB?GOZyI;m3}-aFFU7m=iFRs_wqW;CfW^Pk*u>j z8;gd|n)l8IK#(Lc4_GP80jSB4q!D43U}4?|@BjoatS!v@kd~m6Z|mB-;O3jIfY)qM z%WXq%Q5r9WXvd7V`g+0{jX?~?AcPHd`y=Clnc)*tXh}zy+#Lay6$24mK-mx+7O;09 zaEHmHJY03B+#P@~Ls*E#8frB_LnD=#qPn`zz-Hv7$z^=>D_S8xe@0udVAn2_l-_*| zpR1)dt&$A4YvT>J##eKZ;xGEfhoNtnrFwV#G2=vcpiD-)>61^jEPqDmLNo+Kc08m% zZ+IPZ+sQWQOG7LIDEMCG6G@sVB__lYG0FVQh{lpP0dqGNSUa1mK{N#msibGrM6{?X zR%@i;7$-6#$G`D6u1o1LAc~VgZHa^L0Ok(7%q=+c3X4W$fY7&=%|DXo7-(-jOom{g?}-38METWqp_PS06^e-t zbA&rWg7nN2qzu@gCDGaneN1?#GIffPl17UwB(+a3Bb_XuW_g6kU3$quf1^|V+tH+0>@lI+t`*k8j&(s zj=7?vNQw|~0CYDAI2sHVq=^X}^?Ir*gpPN$y0$KG3_`|0yBKe3U}#`$P^`&-yq^Hz z2&G0>#YM=pS>ws|`r-`I%{5!phn`%&ZR>(}E`I;sXY=-`C~Gs)o%Lrul(JyeVzbrf}iC?;1!arfQ3Q4dBj-oE@qx@(`hcY*0CPAB zzFCPW6(l1{pa%){Ttt_>IdN^M0wf)R($~~*w`;yBc!Fw>491X)CP>BOOjo+$YYpKc zB9g4D9%8AX0hV^%)Fq-YYw7bfE3BsOdzFy^)xqyS+El0XdwudO!U?_~c_wiBJ>QQ| z7<}H6X5SB%muBBjLZUZ`%nM$3{m3)FeDlM*1|KY4yn5=RTNm~G@c8~GyFR{b&Yh`a z?|%t7V_R!_SGP|q8R{O_keT%)^AnjKBU@7hC?iRo$ zB%mVIkVp=-=S3;XebIY`Op6A0j&b9&-t=28wp*VF2SXRc47S+oM^W#`M>dv zGz6IqB%4W0kpo=Uh;XMZYiqS4L)U60|2HCcNOYknUK>tKm}?b4dvE|%I-ap+ncBBI zdqR76U)5BT$v-{xOx??!Z6?L}!d~s1w502~r*CUo2oK&Et!O~r!E9-E)2h9*<2Okk ziEg1^iNMz+@P%K>3^R-T3;Ey+AntYShr)dX-;C~(622)XKcX#po;$exIc*7FcT9Uj zd+nH%E=6b~`L3pKo6hoM8j%X^OORm(v>!&1^so@HTrk`W5*$h-g%z=IgTzphN+FId za-q{{wUQ^U1)dbW6$ubMxpd(B!B$gX$=3(8q(0BxH?V(h;hvkigWPN1yDjr)=`WY; z&u+6U4LI=-!G+K)Q9h zJZ#aT#-jo!%58*GTp!CeQOE~?n^}gyrgSR;%qfyBblm{8&=Q7MD6AS6l1{>)u9F6v zjexubx@8zNS(`BotIYY?(~rM(_nnJpy?^NI3l{>$kCawRwbi`i#PT)L$O@jZZSN|> zN$rFB#DGMcCc!UiA=3QTx)f3#$%L_xLk6B9CPIPuWj=Ky#R1lH8ZP5h5`wf=7smE_y;LJG|vs zgDJ3!RT|r=inAByjD4VRdU^injyd<_jK9C%-Tej(m(CRAY@X6Kp>4D~Z_^zPyFHTD z-7VTG_}oTeNP`%8E2)2+yp{SQDj`8q7zkidr`0C1j0og;+6OSNTeqHhnSG?amoBIS zm-lt|?B^EG<}OEDU^v65*DdFCtZ}5$k!?H@#AncK2~D5VI~sQ} zKvmaN5sGg4;rMt6E=Y zA9-TU{om&pPQPjAmfv_|kG;EON5tyPw?BC2bxH(4t}5h1p?U^9($`(6FVXN3Aq7Cj zTtY4Y<}yMnw4jn|0VBufLs4PgkV--82PsZiS7UgLnVea^brlN-r3c_G8}2Tf^w`&Y zZcrkW9V}YUhV(bn{tDJ6BmkL(a#V!X0)CS7{UF)gk)aYNW&(rVLX)5JAtU6%`1UCY z5OLP5+{D}njAcY_gb{gU#t35~EzQQn+=N`8QU~kvNdM)dmQP%~aQuqfmi6zyWaNtR z3zv;uK5}XQMcZf1dU(f-S=*(z@0z@N$2u*%+MGF5Y!~n4vH?mcwp#54b8fh9T`$j}BvfHgGIjMx$7*FntXM-^K^dvNBRS z#K*O56)Jaz9r-r?zeTD@nV_TJNqb6@rD zovDAZwf*7!bN}r&CsR8jp3!!`_KH^X)>%IM)Kl8qPwnGL9`9qsXMJRwG+lia_{Xw) zbzTk%0e@jJAqfUgWwg7+7no#ZWsrY_PL2@XI`{z~E>w|(A*8;IG*LJbAhD6OLYc4L zdhlYlss&Smv370SL;`#`C=q9Z(}bi5`RsZk8PADSVKJx{7c$I5SVOW!j$D1))au7) zZyY-@dB)PkE3~3%XGTw(AUjGc$BZ98$)F@I&8+A=X`a^Y*x0&sMS;^?f_^hwu9c4? zE)~d32Lnvd;gM6wBh2vLy7aeVK5Q<9(dKHk2%VSB);{C0v$fq)BH!Fw+o?U;mv4@~ zatW*^aue2JoW;eE&r3pTGK3N6HVAJbxkwT_3VfL!B4(bgB&}#XEk`u{z?ZJXK0WV# zgb*jrk;Aps04tBN>+MYd_bXfpm7|f>q%`xb$;-Kg?p^`V0w^~WncA{snuu9-R1fL`|%&2Oj8=A*TT<@t-XSN@P^`Q_gX z(31@tFnfP5E~pqT{et)S`Wi4JfUaVdrLV9$ob!_3m z#fuLWuPMYff-j0Nn#vg;znbju`n<&FeESpY5eqOb|hmE)205> z8t4^~ltmIqneNc+q`-N=P%iE?}qXX`}h&5|HQ9{RSwK4?46KNHg)l|qRlHGCzf_dc>=bRb$53`R)va0 zSlGjo><@@oZMjP33I5$e+6?Uj6V6*92ZE(S+C1TeKVEE}@U1N2nHkwx$hFnE4U3OA zb}7v)F7zDPy=B&h`EP$Sd+vlWMFsiOI`{6mdenW}m2ZkBM0DJF&)UxO3wN%YJh-rX zVX||0YR+6>-ZJJ3ijr=i`$^y>Wt;-fVh5y|x><$#6!WERT4K`~%yXlYujn+@{#wdD z_f+M_9-dxdy^d$0F8R$0VH1V3v3h$5uZhI~b4%qz$UbUme>Xdn5H7p6S}Q}`TeaNn zhbS4QpVeWCK<+vbL^s4~1@@&^4b%2KQgdG$zo}nsD)aNJso@K>-=2R*7~@ZjEZw1< zFk}Hm^mn?}s8qnt31&qHX+s2&fh09@2=xBY+BpdX5DS=ygU7VK1t*6x7z0V>kixMg z6xzGUUgRVSoE9OPLvk`5O2v$KXZ9$4|Md_5E~RRX2G6fWa%Sjnm$;(oec2)nY$3Y2?UB6GkdicO5?Z=wk;D?Ys+r^XJS#lSNp^c3-`YnR%j_=WilBp>-wp`( z!h){K2J8kF&=J4!L5Gy3yc^EjCpu!Iqgp^U(+Wy(kyv4HsAmXn8-h3cR~`BVA+Nud zrvUCp-au_EL?6(`)R5%d0EzqigHbwiQ-A>qQZ()&_;}sB(3U9D3!8=Zhq4jDfl`1U zHyHv~HF3%a)t8QM`9{IWC1<1T>V`|Nwg%kz%8gHOxIN~t5_~zB2Pnyi8v#& zQY6(d0^3_!fTAM}e8ZCvkHn`)TWAXq{s3`>4-8kqc$MX`MXV3bdcbsr9LH7}$zW`T zAT}by`9iLuKLZD`YAk1lMOYt#nU&?bv!GNPOsb(A`GeeOqVSnFMae7kXoZE;ft2(9 zg+Q&Q%>?jDlixuUWbQc)i<&~4v@bl;QTa^MF)60$3#sr@DL+0(Y%=lgG2nlb4uaZG6cJN8Y0DTp!zYUUyRykz5nLi;`3T_bHcLBt0DI{P0(@PaTquh7SJ4SlLu zDB1^yVN#Gy3aA58iL#2iKjgA}69ni$Q^A zh+f#N)Z*pKmtRGDlUm4by?>{)=g?ZZJ1rzYg|7-7M59%RA?Z05*t6y9p*6I*MT4)8 zz**{S6tboT&Q;o5XcN{FmTLr!&?1?^0SMQ5k&TX`e0DQ@6zHB&G$yf*SX=sGt_MJe zgO?vGAnGI7MA>x0pwTBedD}3@p|(3w;)Lc-yOhW&>#$>|5;8Gpo@d(CeqyiE{OW3c zfDhq+IoR~-H`oon^td!y->oFA*d%S%R%p8b4cxJ?AU@w(#1%gW*dN2 zZ+AWptik*-gGKyI0g^%X6I-3Hw_U>;nwStD7aJ4ZCNexU$(kg#Z&(8DVx1FvG4$~e zawS9O7dB5HkGL2~2vK<6tFT@um`T?;e83h8SDe#;7DeB$-{u_dr?=TI3XXgXG2$gy zn>iZ3Zku6$qRmsR4sB++)8p+?I1JU>D0bZ4uvMFA*65&lsP|K>i!E?J&8pF6FLw`2 zLHMqW*t%yjAOHbJ4>?kGU7kF=!ty{WVVkJ5)Z`?P*by5O)u~M<>bHNpR^ zJ1%yOOw7&(=75JC@L)y*EV#d#%acPg`{KFn}DA$YFos_=yPG4Jzqd zb-vp;?#|l}pbv%TwpZR+b)xQ$riz)KfB({$I8NGLwcEFAXY886)u;Frj*UB`mKSY& zO?!}sR5uPRrrkT*Z`JbCH_`qbjGfq5;gw5>GD0qO_Hu3?P!{_y+eTc)xdu`yFng~I z9OtAj@lYP>w8k5Cz2!#j&S7Wub|bA{f2q#(Fge3oZ4k z9y{zU+BUW9v%a3Rq(v3mg0{uU5k4*x>Z0DHcO*GaN_0A6q9ek*9fkr7`r=QS-$G7z z6V#o z+X*g2NDN%Bt9>macbG?zsKQ;O@43S6IJ?s9mQ?0p+tp`BYHRDUFE+gKx82xy_1a(M zkS{K3h%sMgXPf@9cGrU|u?&jb^@osq+ljo|bixr*_Bo{o!+n698T|ts3gpeE+u`61 z-7P|KVWiDKTf!tn!VFn&ZCczF>F88NpQdE&(|$n(p@FMzm6soKhIWik6MM)+M!wjY z)FQq@5fwc(Ro`@Orvw_|7g3_tmUWKqd-Lk?FFtc@a?gkQ)tB6{u%dV00q*-2Y7I3X zee&jK%8$!u_9<}KJLF~Fwtd`=J-w?FJ02P^xli%@(wdBd}dhF-WdP&shmx$WpG z##QWLFgQq$97VIH5aViK1=y?hm^-**2gzi%!iEin;pa>J&1NREVm2u-025r-46Prpt;!X5Y-mmf|TUM1la7Z zwl0n%L}V5p$jyohhH9@`>i5#3-_NTB25F_E=JQBGWK~oi;{#`Wu#Zc(a`i3H!h9WETI*0_) zVEFh+{rD<=I{iFj&%6D6!{FN?)4iDy0{lWGlM-OU#7E*c?UgZ`{YwJjQi1EZnLC07 zB02Mwf@Xw0Rj{KVIL+jga>lqvpS`9Xnz$3L9OS? z(yMTI6%pn=*Wz%cGiK)JZ}uAjRl}tCw-}}7p}86ltPfs1{_xTNJ6y10Kz11@UoeSf zv94^H+eYyR3$`lo_;y&7V>u2vgTb2$VI2?G9PDx=<&40QkEjM=E=iR8sj7w&m{#I+ zKxCGgk?}nkm7$F?rToTqvE?8qJFjzg*PO1I>DX)Uz)643xImopr$;HF>3Aa;I4B3& z4>n+g;?xE`^A8d8=17tVU?M0?TS`X#q8*tv_kqW<`oB7Q@#9I^d+s>#_a^kQ%ZTlz z!yX)`U05*Wm1U1TyKi#Yy4?>S-6cOiZyabgORyAk_=@1q>fXWE+9 zdg~8m+|YWCVF#~zJrCXoZctZbG)p|r5z{s*GAuegnzEYFSDR$>6TXh?_jS(AqOXp& z@IzeNS9BEJz0y~M;dlFb#f$N$`s#|e$Nn#UJq1~?!5xz5Yzv>p)tya+cjG#}g}biR zrYf_KvK@ra#p@FBcJ~IA%iV3m!z2!W^mRJy-^RPv3;L=;1`EE`d7%nc@-TOaueVS^ zn@M9d>U$MzP)J&LlJbHu`~))vix_VC@LOa64*AJ&jajKf znseDMAbDLYK1cuqVBWn!ts#-O1W`OVU#@%)NB{*$H2*I@16V_^!ReIt1RxDO>~p*5 zprWAH-v}0TWZg4!6|h4#f(Bh5uo?g>Rv)t#SXF6<0Sjj>PzJA_u8f88N`J}DMMj=* zB1jBpmMWtS4p^uO*(eiMin-OD$AJI;p+TVEK=U;QfJmtL?w%xw8NBZoW2CSSscda%<`}>AkZOapf zVc}p*Jy=N!p%2lR;u>QLu7QSq8VLYvb@Fz?QU=+Dk@PbKLRgaL#%MH`kir0pfOy{R zDMCx2Z8`8cw|Ydm>XFuaR(y|@yJKL5^5hQf6P%7%q}YU~Mx;W;4x>FR@uVT3zcjx< z=Vn=p9AL5s-eGLiA!j>bLhHSb!wQKsMiN`9P?>!T0qp5!GYG#7bhV>M>>2RYC_hZD zB5Ve=6aQZy_MBk^JGPB5vwg4u7~t`fJ=k%KsdjzX*Ep1}h7I4(@54TYQ5tjDJ zaUHmm4siNI=yu`GYVCPy4c=|Gk@Lyrg!2i5?89HzorP@EX@B|$Mp3L5PA640V!Mjb zDD=qdpx%bm*hH5z4v~`d=yZb7?0*t8ZXrK)7*)}X^2_0RLfSQAx5^EgCg&41NB$>l zH(-s(Y1xe{I?V(=78t#h_6)x&oTO00;J?Sz9*m`*T&2i1W{g5NK>^qdAv4*6lYqs6 zZ!Mz!x}~cp>`jzUHtp-0lhvhbW>$CKyR>HIO6~96y7%mo=k6)}^uFjC-ps8y=ULNWDEQZ*oHN5?!cv6e%&)( zT9*CZJG;gzJ8G+ zr^OX3l2MC!bLzv?^x0mrKM%h%w%+3 zO|e!Ai?_C~;x#0*avtw&)j2<(oh8N-^Ni$v%kivoFg9E77L;gx{Ae!wloa7FX_-Mp z!-&atD&j*Z6P_u_9}>b-w_cc__5&yr)M-jKwdW_o{Alez6Y)KkkgF)b}?c=VAoN#DH6 zJ@w~w887Is%ik9CuYxUuIASyDp}=|xNT)QYFiA}xwh=*XKNGeD z>(;Uj1{Ce^grAdQU2uca+55Ry)r7FO6^N%qZae(H&Ce9Tsnhat^0A8Oxc~&mh@P$} zn2NIHZ~QEl8ejiz^cd7EhHY-hO`!cZF!~?OE*+K9ak~50`_Qo{KC8!Q8T?_aS5V`}^)m>acWiMDCJhaN5CbKNYZ24NKwdieL`xeQh=@pkxdNUy@{z zSzq)}#Js!*B~#`ieg#9{H-W4tId%T{ad*xeJMJ&H=VxZ-cgxG_r5+ePclPMfGv|)# z+`W5e6e1CJtN`Bk>c@Zvs$c`5L4q8+1vm5^%GlY!8Gbha2WXp37;fy;q9e59(jcjT z4h?iWiPEf)sU_QziwEBnmysDXI&kKQv|%^*v!{0o9uqiSIqyn!b?ZKF1>U;$n74wc zbmiQ8*7|7s|A%|U9OEQS2Ys%WuMTuc@57<|1h7~h*?g8ho-_XG=ZsgLi;_?BLd21b z47=ws=#1yn*prn-KfQqeahfar3V<~+hkk&;=n4oQ-Fbe#OFkJsoCkn|Q3d#3)eeZC zPv5urP3qXfDsD9}~E%k6k?!PCq8VW8Np8_x?5k*-t&0)d0qohU6Yj8Z)~+r@v9M&X?4KbKFuYx?bzX3eacJVR=j zclTfB&t0^H`h(waQ1`JPg`T!WWSCm;eIk#i{e7Zan>Kw2hpt(aab@`6HI;x zDDqCwKH1q)tjNDLJcGoP<~<}WHjlL2FhYDqIlEF!%V)e{dnxAn$+>t&n+M^v7X0x$ z=eLR9i&)z@Z>_xCcYvG3Y}hMMrygT|SnUz3#qaYVXBKiMA37FN{U{AmoQELRT=BC3 zHh=wB18}efcj9M%9NF0Yn(4?!zB6_KNp%a>;XutTs}^WK8q~;k?fiGkw%1-8hx7E_ zcxl;yfW*{P%YT7mPxum6V1GpdyVX5Bo-=-7EQxFEh7N0TggLqFj3BKu znzkBSa-A}tKL4B)`?gee#$=fL+{>@mEi{;m zO>YxlO_bJ%{YQUB{=&W{Yg+Il{!{uYbOMzATPDyQ#WE~(M{GxMD19$IO9gW#26fvS zVrdS?P>%FXVx|m~@awQ_zB?3C6u+ZkR-lz5nF<~tEYuV*$I|9I*a~WyIH+9LX;o~S zpkp??nOM>Kfy`zo1ixDk=N81r!9^&Jy|Pfoo40QP*Ys_$=-Vzm78D$a2@qt0>P5Yy z&203IvBfvu{A`?Qj1FTXDbD;M>FYgi%hyf4H5`or#vR<^K0UyP_-eVuDbT3W>clP> zCB7O^OZ|LEz^|g?V0gP3heURh1kL^moz*Fz^JaH=T%Z&rJMkku3J%v*gWDRh;m$|v zRC2Q8U@p;j791Q@!h(Wq1(eQ1cm(<*!92Jiz^l;OxKgg z6XG4DOzUG1(mV!+mu}eq!J_|Xbn01wgd#g*f=qDM2@GgF#J7R1zx9rZQ%5Y2e%lMq z1us4nt8RggH|B?`G&HR%i6{AxE2z74)M?31r-c~z8E4|739?21Lwof5%JdcP z&o}OC1%c{(FEv1z;6kzepU$p5sEX^1|90=*y>Pi8B7!{K%jFfG_XR|ZF9Oz4YLp}f z9ZCU_S9mBFjA%%jiCANeqo(6HnUt~Cacr6<3)+-eYMF@^u!hvANt&@v$2v`uTFW?T zCc~uC-`Tq~nwWojcfS3;^ZM@hI%jv!?%Cz=BEW^imICxyv*A--!t?4OG+95u7U>-N zLm4TNDrJ)xSAP3R+Zo9QOv7NfosOGu0K zQvzE$kYMwm#~R7N%E!3XfnMtsj4J_xlj%!Le~fW?A;C3WqkO{r42;_rU|bC$EJUwz z(Zsh|R*x2?4N+`&T6vqNZ%s&0`gz-V2X#F_J&xiyWsW8GDeK^|9Gd=8>F0W{0OkIe zU!Z*#0pfttivW9ll2V5Z{--XhI4Y~t2Na({>$WY>MZR*ysIQAQmQuFANIfrMKFf}A z2`khEh*dn~LGSQ*U115K9h;TNh!Au(x!P$D2`?-Eqrk|7{2%`c}~%O z!tVD0_0Om_d_g}5U(5h~@DY9SbK;YPo60$C`JW$zFYX2rXCf_paW~Kx!q>tl{}I5 z72*sK{pB6R39u|8$T+4hr*GI+?qE!IV2xzI(<6A(SJBE4mZ$|t6Mp3}l`=673AXMa zP$Z5C*H&%YYMThz7IG?74J{Ad8LEfAZ%?cAcIQ#&jg;b)mXw!M&Zm6g(p)QCovy>KtErKx#i{kF`%*_z|CVM?YfU?xb~f#H zdSZHM`ZF0J87&zXGToW|58#1@EG270mY%I<*JQt(J&~j26z5ds4CO}VuFl+?^!;a=e$ao_SNo?&mHx5|6ad)}vh%NFfR@wt8Fz9!#ZpYEIRtNx|_ z2LEpVtK81|ulc9^Qw4;W3S!`dCJ*GfJb9wyz% z)?zRCHIr)Rdca4Rw~3U->6cpK0I$0?u~j$Q)w1p~=4>=-)N|j-dbxyew$kX2ZgOok zWERr6?_29$?&}Pm0aF@{TI3m;%)1kLTcNMu)@4W&w0g5)6QOx0^J`fyY}7&>h4lmE(@eX}*fBu4ziFxa z+g$jqi&ih@Du{eMWo&u;hkNZTd@cNyXL!AhHUHmsUDQ?hSlCBcx{;a)t%S^iXB&N1 zZfGOoAYjzgsHd=1(BoaKCoHv$d}=9AFm-Pm5piGlrkDTV{#Loa;+1FU+DIK+?~xL3!%vVG+Zk7l^nC<_iC=G^E!^6&Ph++S?z)`)4jC&ZkTsO5-!+Dnt>Vu3tbY7jisW z#IbD&meS@W)W4LvFK0Bbpfy%v6|M4JTI3PVcdTW9eUxh?9;fx6KqaRfHt-EiRrnsi zf%kpXpqA4RKjTQ(hu`85{*GPPhacf595;^fT~2%O5uWE-7ge(1MUHQ~@iwkWq3Fk} z_%}Yo=X^8mFZopYC|;+%H)20y;t#a_7|!EeT);aVD?g$2F5!>3h&LEplQ@9)aT!|K)6bEjc_Si5ip3yK;!XS-XK@O@!Z{ul ze!+4241R}UKE)m{C15Z9B_(oUbFwsF(j=$a*xIwX$z$toZ+5%gr9r&RZDKQB;ti%t zd?qe1@dAOpY-nPG57S0{VxvB>-z+!UF<=;2_IiE5sv(S3R1QeezV&bM z!>-t<>5{8dx41Uzv1OXZ;)u1YboJ2QbP(v(zt)Len^_` S)0Gzotc-JM?Hi4}ZTDZPiC;_r literal 0 HcmV?d00001 diff --git a/magento/setup/pub/fonts/opensans/regular/opensans-400.woff b/magento/setup/pub/fonts/opensans/regular/opensans-400.woff new file mode 100644 index 0000000000000000000000000000000000000000..e231183dce4c7b452afc9e7799586fd285e146f4 GIT binary patch literal 22660 zcmZsBb8u!&^yZs4wmESowrx9^*tTukn%K5&Yhv4(*qAukeD&L{+O67q>#5V{x##IV z{l`6h>vp@zi-`e10Npn{(tTN_YxCRmIVMn%D!3L|6nA35hpGpD)!9{ zef#*|AOyh!fQc)}D}8f^003Aa005ms>xd~NuB0La06>I)#{_(%EYB!BUtWox2>^hE z`}Xz!L*CzXKO-9h`)|(rTVDVG0AWyXSQL$1oe97DLHdqi_y!N<2n4sOy_wB7C-6PS z>$gpag7p+MGjRIWBJh02K>cqZnOS?7esdxKfFK_LU}yi!vWwQ-#K0H;kPrTjVg3di z2-xpH^KbH-Yy0*IzVQVPvfrVS zYieWQ{ynbJ^SADs2M~h(07BXt*q8tS%2?kqOW!$Cm?1=S+1oie0{|*F-`vZ0f57Xy z;#_-2lW(os#kVg0KirEDU$~hVe&?+2{p~~i2eTH%+HVW;4ZtLC!OVYloRu-^KRdOA z#p1qhq;IURzYA&z4S}R@s1G*qBrpj)V*H+W90)N0;J#j+A}jM-9BcHeljaJ;CZWY* zA0BA=y&k`bikBmz(zvjl#zZfM0XgNTDFX*3`2E}*s`jJlw1If96@D605R9|_vG zS&$Cj6Au`o6o)ET0%_FoG1XV#N^O&LG){ldbj>_7>UV^viY#ezHft8i%G$eP)w(MHlIZGb>OBVKBV_g#d2Z4ZfjiY@6`*P!L@TlmLz%OI&5gy4-HJ>-)t22%Fd#k)&OLVDMsL{u z3F+<^`fj#|YixitJqW%H-!Iw*Hpl=}(?_crz=|GZwd_D(-zD4B+}zvfYFuOk582X+ zV8T$LiFC)qQ{k>~RlY1+S8V22!LV~hvI}a}SY!wbMS#b{;bL(_xf&mKb6k~R4t0)c=88?Djji4{N` z4d82QUS>g#rR$As|4(!GJ)pT>$V}06?hqt)ci&$S9~J3=jao zzkxxRety?(C_|tUApj)zzh__);4R;V5CHn$9QE~0{q?aS#0bax#(;;6fiE<0^!`oQ zLBM!Y2;*C(MaFkC7GpTmDt)dI=cvQyo?H9op|AXKD*T7fL7uILb z$JxH@}Epi&2Fyp zIgEC<1*8)xbb9TcOBv1QD>kcb9_J}G+%4B@-EIWJic*$GACV#8YxI8_u((Va(U=*E zQiF6-l?Lk!)r=hR!?U&C2+PY|UiU~=>^9rI?w934gT!-r{2rbke}w+oc*4^3%<$@b zC6~F#==a7XY=w@)SsO`2h-gE{}l-5$Z>b zE9tk=kn`~cF&6jo1u`J7A3snuKQ$*wZmz&^CqxXoi>G*+!zxpXQH8>?_fsI`JdOEYRRl6HI%1ESG z9@HU*OZm=`FnMY8*C}7bkB+^+^@;t2wqvUMloqJXNh0Ic?A*VlwWnQ^t5Bco+%`Ol-MC0$)=$w6?23s6$mC$VY-D0 z;h7M>*l-@p1`9d}sIG8lI*OYi^otymNwn*AZH_t}xNaICC96;`YuxfP!d}x7Q(vj= zGbB%(T?a($mz`s>Z}^T2J#m{&1cdC>LbmG=jtja1wwf`UP1Is87f>wl^V6kNfq53j zkArR1Rjfb_*7=9xi1E&FqVq~rJeTEVDnGQZr3iZ5vEqoFs|IatR5y#QmYcm(SG_Gw z=Cjc15%$>MVYdwP2eZM`cXkM0E$l9x>Q1Q&$%2Sw`o91W6jqQZY0GPJgw-n-`x6BI z4%qvg6S7Ocd~z6BeCTK1I^vR0uf2G-I3{RUbTma$T!J>!c;B@mWn4ZAyNZ*~4#Qpk z8f!I&G8PR)6`WH`dc?N49$=EHsBTBiTfTUs+!?Rf3!6_Y^TN3XQ_6aThpi}6N+CA? zF1$brYeh4`xBn9as~I}fhTwu|X*G13?}_yTmMAp8sT-+If>H;4r|FN|Eq( z1L{kL`qmEw%_jjwbOPB~36&|v4#q!NF($Gvnf`Pmf9$ZTHLZKY-pZ4jB30awlYE@^ z@v~f8^-OwGoF>LPzSi?vW3+Fbejc@o2KXHdT%=S5dYUmI8G&%Z;tZ}193l+5z|o)I z_{qq9^}@qO9co;fXH6*))FebxwNIps>ex0+gyJ`IR=Ccuikn+oxEsde;m3xgVByAB z``!3Od-dsP#{)Q69I?p?*mTNDJ=;1)Ev8l^}PAUs+-lwl$ zUX$!mrrTtu+msiohytaMaTg01w1gmD&S;rYD`@2EksjyF#Jur~F+~tVvtIi|Pf|8-G3%;lO1qZ^?DVJMQ-{>8%qD9L7od)^pCO+Cbxa zUm%y5@7gdw_Tu=SY7A9^C{30Ix&Yu*_)AelLRmyKMc-dPnKoVh2Fmt%K-7lZBz`jb z4DM9nM$6DZ&zg^)=Z0i5)jv`3S|DOhzklR z2m9dHywCE_g2RDU?~8B;jVX1O&%ZZ;Z=agK9O}<5OJ{f*cgJ!zM_a6SmTP;?@}v6W z!sM~pk#p7mb)6HW@{VtG;oT2dd|gylrq+5pG~dqWnB~4KP!^y|GFUJ?4!?CVV~Yx63`Mc*A$;2-BlbC+fbrzi=_*lUHuu^I3+Dz^owT5w zr+%`zmmCNiYAMMGEXqh(0@E2i>Dq+ZPOELuk3boP=)QYQSPZ<7=+L;k*qYI+^*IT_tUr){! z#JU-j+$WQiVTq@6ify6Gu>;*nh_e0E09)1$V$<;2fGiKew4WkH0mNc??dgHwr-VU! zr1MdgicuGnLwVxW_|zxzmAO>|8z;}`&cxddLiW5uVf(M*H@e9)q7P=?h#is66tue# z!HjfdaCSWL)u;ztV%_>h2&cGps=BF@YbyTYqN8zBnW?i2&P%L0pDfil$I-?{)VHF) zL`nwM$sqQTwb}ymRm9uW?h7{VH>aiES$opcO^6Yd}u*{fWA!3404*!^q?x4So4i{fta|ye8;winh8S5weaR+NxM=vwv2JQhRlFm*vYbtQRLG8zrzrfj{Wlh z5c$2cf8tLo3%v_p(;STZ)3AlN+FWOIE?#oge)i5Eyvc*Ty3e2N`(??HiO!7h=hHs> z7GLh8)>#4YR%~?X?*g{hZ?AB^@XNfY?y4ksklPyya(RW(3E@%b>EXc!(W@!@E!ml5 zsB|%rkqx42xT-&_>G5{Y_A+6sT6f^j4?y6lm$ki#)g=%vdnHn_owL{HfZAeD2Mx^w zqcPaeQLONVQGt!h*--CN!7g#)qyYk1K~Q5gkiMr3_pAU^b*`V$0Jt{jU0XeKZv7!| zvdm$$VhIZTQR+MuN0Cxck6)al{wf%575k0M>{PkNJ`s-(Odl2o*KXt&elc{t_YwKv zhe9`XZXFEQ_w2O_T;}2_y|&!bk~D-~>Mbm6Gs#ts0X8w4oOI+>gvjq1c^(2` z7891C=<);1w}hK+mNNkdJ)djlT~B8})OaN#?ig_x}@KWeSM)qpO^AQ;Fp2h=hxn4qkfO!YJ(Ir8t>tXZNPm>JB* z%0;7&myJ*lZ1j6lI^6GDnW^j`y^}Bo-4mj_2zUf!MWa>HpnzZosbDIAQ|KLrYp1gy zisc|!;GyixC{jR-j#- zZGJson6dGxwq7ocrtH$)tIl{DPF*z5rx$i!@!4<0^Uv@)-(DK6sBQb+^pNXz=(>F+ zCL>0#t&-QNw4Hz6k`T~c{TmyDZba6bz{v|bg}}VCw4wx@dDD_=5IeHg3HLQH5O)RA zvYBaHI~rE8PiLlB-nSXhGD@VKcdCDkYp=Pu6y`H)jV3q6UEH!ZQ@A2BY9dFQ`c5 zjpOEz8Sm(h(fK`paiInDe56AP5X0gDfgbEHRQlzrvjcP+SH(m3y6@eyd!bc zzj-EO`xf;gR7X`|RmkW}Z1VjvhUG1{iw3@^BZLaPg~wtyUEdk@-F|3Z#Nfg8_w*ms zr85+{9K)I2&YShTt+Lo|*RvLG9j77T>TYsMb}!+J06q_7P2@VxI>D33`h40HMF>@6 zH4qMOc6$m@=2q_1iHc32-e1$}oj2;Gui98I@jASaC zWSyZa*B^V~kYvzR88I8Z*y?R{Xx*&WquAN5wr!ZC#3t{{_mhdY2@&%k*6-sXnc&38 z`46N!sTk%>-r$O#_hr@8rrX%S*MTCDaV2C{e65;j1 zA@7sgXU@A!87`(+mHy%tt4v!o$^IXnG(~U5qDbNdF!+|M(vd6i#9aB?ml5NuQ8RO~ z^YvE6MG(D=&f6!aO_dc<@QG3n9NSWqzMu{W2P_@V?c4bV1FTN zYilWMN6U;(ok*bAST-?}$pu<9!rVbiXFJ67kc0ZixD$>Y3Vg*>;Nw0Vg8%|x>zZ7vYWh(?fLf3Wdi@#(*n^@P_UsXwa{GkQ35A)nq%jZIe-~qL}`tv=0RN-s1UF!2P%dr2D`OfF7n9-rb;EL=veIOPSV+RFY_i88?R^4=L}4 ze(!k1NoaIen~AC|i6#ZXrU<*apPu+=sc=z%DHF3fi=C%f)RBQ-BNJJ^7Eu;53A}f` ztU7Kn`@EJ8#J&_91>OoROf;SZsy98CFhZgN#==`%J+W_Ob)H8z4o6wTU_-15VW+^l z6^IUc6n0xj|MjAJJ3jc(`@nlKQlGgzj|mNr;kj@N!}H1PJ=&k&ocy5j z3jPt_bI@N~(IhpV6-F5#lK1Be0zOEyx5( zpqAt*bQw%OF1&M%#aoMIRCu>jQ+}mU0cx*g&Y7>~h_Qh_eq=zZz!Q4+so&bIZfZ(o zIS*3SY=DfBOGyDQ;GHLJgy@I(-zRL2tD0A}llS1}*tgPwroq@;*om-b^io>RSu!c| zx-LXIQ-t(-u*#veDp!o(ZM^DxMF#vBy#lKqeLJf)?eq>=Qrf{-BpVN7PouS4qK`hZ?VRe^^;#P+$y)|DG*KV0NS0iJMJnE^JIeqvNdRxEwkdqs%3l0duP2V8`dyb{bBS; zm7++>sk6GA2al@5gCjZcBSRIV@|5#+c-xaFwFtbB&F^*jc41WXVCM@D%rgl3JV(1T zV?oNzL9@_6P52PDl8hmapm3Z>VG|SD>jWv`=Akl#bfC`BX`SB(GVVP>m$HrYLvKEL zxC!Hlq;~*38PY5OQcRy?DAn`G6_W&cpW-JBO~;~gL(4@S-9K~GXtqEEP^$<|evwj9 zpiDPWi@)ihRe(#{CwwiJEJ3MRujOj@adF)E$u7d_EVtR|4mm_={M`9+mBt%VUBJsH zn6oayJExDfu zTI+3&&t6N9UY)fXPpQWz?Y(%@+-+v3CDT!RDh)nId+UkdS=l6D_;9`Hxg5! z%L&tf4>_ZiK5b0N@fiM71peJlR5fmkgwdC4^_P=QF%>Ok>}T>PoFDy4uIJ;h(tQ5N zM(v!ugH&N%ZT-{U$_@uHt^vbt+_NT!_~1a0VT&;lHUuts+7@Ev;V5IxJ8;gO<9X|9 z7ZJX#O4?ErlXY&<{Y^>Bm2cbuLZ=wc|79O*TCQ=3iDZ~YXTA#7$gqlTslZ^jd(wEx z&dkY*@WS^rX6vDV8FSRRAor@o=||56T2g%2UkK~#!eVzz99wcKWQtAp{1NuCrq0|8Z>z-+@eHdTm>YBTDI>`SYDgc#ca)?TxV52)KXBAR+X-wtE~cUqa@kg1Gk+o!(XG8N2gk zK8wUT0}bKh2_hy6`)nSKO~Dk6eFvw9e#JH31~@z)$U2kq3V08sj6@t(5>DLjmWaKE z))kl2@9x5IAj!WL*iWzgNsNn5y%|&Ab9fyg{s%X7fC-*?5z0EwRfGv0m9m5yOQCXW zXgz{NcDjeD9i;yG1`e4!4%(1)47o(KdUffMcbWd%;&M2uy%vqr3vUwChqL1J$DWM? z$3+xN6NP?VKu?n)3Ln2kl)80@vFpDQ!h&e1;j|hQ-V_t2Mc`piX}iMJzBm-7dVghQevE3B|CX9ca(Z|ELQ$zHMQSa zK&kG}e}zi;>YwCayQoIGei0e1e0pwo?OrWgE*n?X?*5{5It;CjzHeDRwP1M6=j?Gx zzr9Kj3BXq`AwPJOT>VoMqFpPUJvA)#5+u-ft&Y+PVDPG zu>Bb~i!}n%;;|mYua7Orq}*%Mhsm0SQ`7h29#`p)qjgOOj&6zGu-M8^wEaK{q*pOGBOPnF0TFtcJBDz2%pR81 zykQwu>O9E1bIlo14l!!&{JHwqj$oYG3oORbEU5gY`sYbE!o{$d_2{LNPNgBr>1-?C zMMqEk8@+#+I^f(e$YsrAHW(cR<&LFWW|)Y$?JISC{VemI+!>tx`@m_cP;h`y8}8v`nRI7| z5mv!2bx(TY9=mVcA(Uy2k4#0!!!;9csV*x=a}encb@2EmokQhF{L!PmkAv||Ci5Rb zcVf22g57f^q;3hpoS*jdSw8k93}|<#%;(MFtnQ*_=iTP17kfA7WB(qk+57QmI%1>` z`LJinKaV?fons=6^kyrB?k=OPXP4W54PCZ_8y>DZTQ?a8TopK+c8)5woguahW?2246s9!*3G7<#u4WGvpmG_WKS?cBo#n1cXEi~qV;Om zI3U|Vg)L)c2_!2h5zlAe06(vyS}C(JL6*ZSi-*zp;3ywd4+Iyzk;JheiLNhuTIq-- zH^^MXyb0h3Ui!`vok!D=T#<*6Zk=BEn8QK7iwk`AM)T!-u}$Z+psL1`g?d}|5s*5u89-wVJPf|zDiUsjHW|czRY@KAlOZw-@BzNaO zs`if-)0;)))v35qI6 zz(g~cD9{TMnw7mr37uge3d6X5-NqH0hvf*RQAtNs3q(7e6E4mtC}m%|^t8*P)Adxs z^~u4VZ3?D_@NUbw;KJOyQNM$Xz@1_jqElIvJhGh*X94xuj%cOf47}16>DAFbO?0B#ZQ;@DgBXpfxl0h0d4_tlgntC(W2s-0$Eh}(I zDb`;M@0srB^;J9&vk!#!TED6ZQ(aR`V&f-GkzE);WF10=l>cqBTb+k?yqVf*X|=Kl zt~kiUj|4fdiJKAlBxLC}o%BWZ+g!Zm?jYtMy)CD}^K&`BPxyh)E&aooy%G>sUPmQ% zMJU&A|9z5qMNQ|-e!=6S#~B}Vuw$v$PVBa{jR&Xnl~7JDU$5ix02;f#OBI`HSvvyM zmAN8uB&bPgN32bG11OStOycK{H4r(_e0-k0&U}W)sP*>E#n4~+o|T*B`n;BN?HBXU z-pA?Rk=x@iopL|C>hX6te{K#VrV&7T`jQ=o{g{GzaUeF=Ms{+OF4OnOF+Tz=%Smng zS(L#nbg=pYblZCdX+IyS-%TF&r~aL`>pa>vm7kS;eV<5y-KPO1u3-t|SfnJt%@))y?S!gEp(0)>w))iBCI^N&OD2Pq z)S?uqO^LBngPbW2v^iL*n9J}>g2n0q<*cIvQ+u~YV+;40k;w^I+>B$uGk&ESI?&a%4qQ;Y1jNZq( zV^({6%}PoO9#trq*aHQwquUp$)*Bt|EUNGl;iohy#3oQbU=JPD@!Lc=^2lNOh`8A{*=T7JC3c~v+9L)7Rz644WToV5n9sb zb?_;!VCiumuign+8Kjz`+%B82r`Q4eg#$xb?G89;AU{hPJ^O$(%kosZ_(20ku;+u) z=4<@1n?E{}(5gt0DgV40k(+$97f`hDNRq!9auMLMQTNVXXjeyrQj)obZwhUX^2e`L(B{Gw zvW?p{htf1yNr<0jO??QTXuHiET@_uY`H?o^~!E#(2m$q*L^5Kl5dpv;6GdxV)Hy_Js zpn0fg%Cs@?cLgP7PUhV%iSwNFYK+pS4CY?*=*h-Iwb9SawiAgi>SvW38a^@Ur5ETE z2J9oZh9u`wa1lBjSYl}kMp_zGD;fy$a+H>E6^cjq3)hs0sJx_VLbvEh2F{yH!p>>s z+hLH5xwn}KhzDwlEhjBE{ih7XtA{U*oA?r0&FKjbCC7Mr8vNUDTFvPVf&ZHFQB zT?wa#7buc7vu{=)6k{-1%1}35OfBv`>#kpX$;&Xq_Q9x~ERGfruKC=*2Cxb6U-$1! z4u%qpNy~QvxmDGwiAlr{vZ}q*#>h{GVfhNLfk^hrnq!+OJ!nFvWR!*+LV{^z+sIT548+L@kWth6?0;YH z(t`RZ3~}a(sBuKWhwNYeB-}S*@ZIcgjFwKexlvKx>GbuW-bMOko^l(B#jB_+J!~HF z3T%xK}%igi$r{4ju z&HTnsFc_)wS*=<<434@y_06fl1VcY<$=r99%D5vQ=CC=(bMaM)SPi=f0O&M@4hRFZE495ocZXjRrPP>+?*~$z4xgh3sm(hL6$gl^#|O5Mi;cDI>KHov z2)nekq0#e=pD<{4j3@$h(twpEwjE$=2h~{q&Eyk=17<`ze%5QC3-@n3eB7Ihm;sQTfVAq;D3OzbqW0 zSIvd>XZOuRdyEx+fi;F-N$Ehof}gwf)GS|BPGqf&n+kR{hQVj$y@`!X5JNq^j?f%j zXgWU1m=3yKb`yEmpQr{K`POo&zbSUR#rtxg9f=jayrYW8r=ZNhIqHBF2%8bzoY;ph zYO0PPX z$QV|~=7#H^cur~*pD1r=9ndW*SSfZn{2nT!n~vm6FWVba_>+Zv>D0;1y@e5kti>%| zw&MLBp*Q!DW1evuW$EJ=4F{RN>BNb$Kx{!sgj{5Cu+QzWcVXQe_U=5wt<13FzaHJ- z;JS7>EUc}X4>8(*&JE`k`8s%KdsS@UP@L6y@kXk$AfryM4M*xAaxxmuLl?6bndUghRksjH-OG+ROnyaRE{$S4;DBL#GtDVoj&MD^B%WOh4yW9%f;BAf5UG0tY zy~#RRYc+YAuHxrf_kP-IC+M8ITOfJI?zpdJH{a?syS+*BD>(l8R$Z*%8#yj(*~gd9 zXA1Z+d8#LyG=d+(Mnf;?=h>kW>-o#7R*_b%2RFD#{1VWS=zmHDim(hQUIwDL9pd9kGp=k`W$MlNMr1rQkX8(ZI3&?+k1k5 zS*(~ADIoQVhQN?jAwuEd#-17Vm);?1mOh#rvG@k&{;6b^Ci4#y1R;e|{0|OuWv0ws&pD z6}uiHDf5x6P8XMEJs3>Y7&}EPo2~)CNyDd)3zQ#Ag}%tRM#01`BCd(a#nAr_2ex7;x4E#gzlD) z>nQ}yl1;bo3p;6wb|uuqb$gYyElPI8==^9%JM8I?UdqO{(+oJ@hOSTcX>ie(SHuEE z*U95o=N^VcZE)ZEP1t)S%?#EsB&n`dCt=ZC!jJ@4>(BlWSj6PoN^N)h*U5g9h0+u? z8O#-W9%p;SzZri*MgK08s4B~4Ln!rU1P(RoVo6iIy0Nwt2bl#|!Mwuc@4~63Vy$5g zQY}lOS4A?ZhoKJ_{mzgfiyAjns!rL?9-mQuOHkQW8)~3JK}B$pPiyz9!9xt=qO`Y& zUgrm)p)lX#ClWVe*FfKVlvQc(tfFwUuH6^S#Mjkp_9fsGdR6gbbe{BopVvL*94w*f zstb_6FD2V`rB)=jO?{If9Opx5|Oi zz{s(i8DeLVi$DEa{1$hy&0_Sid9OE}<+IY(khuTG^+ct~X}RWlJJHaojpxSKRC2#L zpKV2sNOh^3af+Rj%-^|`PH+GF1tOnW?{YWYP2kL98)T%BS#Mi&IAdCXl^VaRYvK3r z*7a*x8RXvU`rgvU<6G?%w*dDlG{XWc7C!H;60wykK2wIMIO2nAd!h2nsnBMqp~07* zK})tFmu7C~+UcwFxZ%uvA%7}E=XvE9X`|R>UbY`D)WQpu-8IHoE*c31?AI~-mymgO?xjU{r*J_Ut~OVlUBto9>hio;pK{ZL2<95 z`~m#Bf=X?LHV7jvxKxT%pg(-hS$CPa+HN~NCB#$YwKyD;bc;bNz2NeG7%xS@Uw;9- zr*m6j$Y?;gTDw_smyGi9()A_2%C5?~%?yn{B&EA!Wv{(6GtNu;++@2e({oYgzlf`t zJwkH3$Z-uhtNIz==Ff}~2h*JHhB0kDhQwp>L{kAx=8h-?`z6%@+mT%P98&VmRRfyj z2*<+_LwTy4lrT6n<;7gk&{*U}q($`rNFGNh2X%4cRui#06F?_uUr*7%Ro(#IF9W|n z`ZGwjkgK4eA6VAu==;)a(P;S`&`?*<(eYp!IORestiqToCs?hI?MbNn#Cd1w;3oF{ zBY$j9S%QAd>`uLlhWKKav+RJ{^Uot#CJ8=*tPwNUf{O(f76>SC8D=X&Kt^;|ZtibU zxd2`1K<EvttqCCi}SP~&$N3SnNr;btH zcL9yd)f&4jp3i)8h2-ze=fSKR-bh$=jJ~hF&_5ZUpxkk}8QT`8CxwsQxL3LcHz%R4r^@oV`)=)-RT2%uMTKy(gtVEh6!t}9TAPL>F!B;nf95G_w z2`YuGy+$yG0NP~UiI%{esDPxDHTWnJbg2sO@ zYJtc(P-D;(2Qkk?!UPdQJ>dB@U}~@`i{@ZXN+dOmCP`{&rnzaeQsvMWHd;iz=Ce9q z1q5=>vst!l&@>VVyGu-`<4v~v=X_hRMuW#GqgF=CCJaAx=^Ez**C+%%pjgou+!Z0k z%D0(lFuz_gwc_+bYlUKFnK3!=a&1Jf6W>1=oP4C624Uzi@AQKC4nCo47uGqcW@1 zFF3sscsc1w`z9BRGy7f?+DaO3c?ld*gqY%!B6@oUTKn7L(CZ3JF;81smQI_;H}SM( zSfguBnX{d`>|tkSWNZh&kcpn~xU?ia%rI!V<^>H?K<}N3;O5A~OqsQYnEgi0uprA; z(Loh-g7?8Z3O1KCrX#WX`q5vSD6B*}RPX89JwUGXYz*cCmOY=kGSsP_qG!mdrK+ul zULmc>?olQ@Zu!`!M)kC*k%}Vy=T45adTBJ5`0;PIlvAs9Kje-6`)E)HdLn z)q1r^%1UC4Gv}5luzy6;5^5q(8H}q_L#%rgs>RB^LosM-UAQzxIP~ikNyH ztInDtxtV#)Mpd11gtYXha{}<|zyoYWaRQth0>ahFW6e3uin+|ZwZp0=;q>ddIT>q| zyvZR5smj5(w^bP|XWsxpZvVpd!334!+Eg&%-VO{Zpo6XrkYo1A!s!n&MV3=1oK!Oo z=r8bO-F6iVPY;||z<46Bu;NC;Ge`PsxkvW6Pm>OA%y~S4TL@mxx(inG4yWRErqDFgm3bd?TAh=vc>#>?oNO~h$X<#=u zSr2MGFj}w8bL3?`R?k{#1s~fQeQ@`wZL8&<78iQ^IWPZgWw&Rek6##Bl5+febOdX& zr`!v-Q8#5IucX}jSM`2c$ZW~O=(4)#$@IQO(th~8$3worgTc;#ke_mUTQe{@bMiti zB25dEv-K&o-D;LBEprDKIgx1#9*+Xc?3w3k2rN}86D><=sTJi|?BvuI2eZLoL@uDp z+?BXAyy`wS`2zYvsNAwTBv91gj4^Z2pmD9}P^NmtJa*aYH~x)3np6ScS1p%G0=ZjV zoIv57bHcjQUr1UiwpN{~{NodH@w0RKT@Ks@cblhDJ3PO0`oO<`R6K>a7K5iDzS>P! zjN)!G(o5`yY#f=+h8otpOh-Z)sS#DJOc(XQnoUEy@j%tfERdT|L=>b$P!~^V`Sx{m zW4E))~py z()PrLy~#oI5tU!iCBD{NaR>Zj@23?q*b46BDcd`hGkyavmQXy^C zv^V@`0a^=*ZA=EZ)vN;&O<;Zd2S&be~?-d)Yl93ZO<(fOUEdqf8FxeIfmcF^* zIC}~ZoP71p&ejWeMt|YKlkLrtuoys#%<2U*P%i3< zmINH^{K0A<2&W~1QBKCP#O}< zZ0+vHkM0s)nzJH`C=cO|Prjg2JGL_N?znTAGYTXj2Fn7^AD~eFz{&Fm0+D55 zbVP@fETc+At^IA8KY)=$VDkLyLtEqzqD_(c1K!i4>PC)hU)4q(L}+y&+M7aT1vx)a;P#X1vW5?EC; z;OZa_!>`~v>voQ-yA4s~8*v3h0o`U?W%*ZeZO&r+E?m87DarpETu*{7SRb(XJZ*#< zkni1x%S23G~zFm&5x+zjEUcujwCoK+nhfpZN+$wLDbA#9tw zy&xV^)cykp7_^pf4Jup)G^Z2j{j`*%)?kf{PfdRV=W(3MC+_>cs^w5v+NJLyErp`; zClNeDQ#B#U}X6?(nuAWH>_No+lyMTq189Okz_8v$unQwoQqrB*_a z_&u+o-k_F{)Z_~mT0wGfNQ{q7ERQqf2AWP%R$V^ea47Aff{GLIEn&rkGBd4!9pX7I z@bv-KHvlVHU9$*SHI&^lnHorD84C5dv}G3&PiCnBKVf&4ieqIrzso5*(80)xDvDXf zy~EDxs|`57ig5%?!WZkXYx+DXNolF9%!0K}Ab#(ct03JcL4fKjh~eR>O<+E@TJbE7 zrPqJ@JN*hPAALGrSNJyl?zXQ+j_S2-;?)6XH$A<(VH)nfcWY4^<|09!Uuc6cEKi1dNP0t)Y&E=K%oq#{Y)^tCoez58hnGsr}vbR&X z*TkSRfwE+o8%5DqFw5^KiD*wThTBteTRtMTdZcB~iZR@?k_eF^&TQ8<-Q!M9Y7-xm z<;ntc>tuD`X=c^OnXd9VyuZp-UHcwFqYinJcnBT39Tt9u0F@nRn@eumx57%#Z%7oi z7*TbYrHZ^Pt#eD*vxYL*$?-hQ4#9?>MYSL4S76_eP-+d^`CG70!YYkB>~+Tr&A>hE z0;k`Eo^q4SQ%mpxy+cJnaYyL3v8wMJfy1fq5IbRtNIFT9Qo$6P;}*cNk`!fXDyS~wBh*EK)4OILqx_t1B;>XAq2 zKe}}<>QWdeB0p$9aDQ-m(=l{Hh zSF)7L^I7@4>uSq=mD5Hoz{aavW>n4`Gr#erJbbSIw5RIGMnCP?XX;bWsy$e}X5PMN z6Gp5JYryOQi#PqUXChgW_rZI+#s}y5FR^vuJsq0v-^KOBFm>m>j?n!~`q=?V=w5-4 za}z2lVa|=Nx%Hzm-1-se*l2@wt(rh8Lrox7Elm|t2zsWwZ;98esSK}#7=Ex4!Ykw& zgz#dnf$nB4DUnXhE%2&{z$-Z^KJItob<&2=yudYy4{52+dT{@`dM*a8e96V^`*{jl6+jPK;G=CO$TdS5ycu z-cO?HIl{0Ssjen)ZCb$6#zkZ)#tLf2!YaBn_N60PLXymjHhIqp*Z4Oyo+Jc3+R-q3R8PAtVhMF@LB`jhsb-LQ_(!NG^qmwS~9DFt5)xQKw6_2Z?7^pU;9uJg4;g) z0L!{5V(7vM6uyHZVmR<8)`d`VqAN8vmDQM99oDo|gM(Fmg|1Zcd0a7}4r#B}keFi4 zO~=EE>uWB2``rhBf50f}>gr_NclRc;r5<cAqJr$e+u?(l>o zr!&5M6YsxpE`tB6{*B;&4a71%0$szbZ|?8W@%Bolm>oB=oarR2j%#o=UgABa5zEWOBX*m8?Alhix+m1J=^N7{u+&Mm)8f57tBi{9?h<&_6dUk&mmac)G-hk9mE)AXHs4yzs)@XLu=xtMmRML6vb?!V1uQ=KD> zjp9XNANc=flzli#QLkuHCCJE2p~DrO242z0y6?wSH8>o0Rs_guI+L)=>0#G+da!Z+ zL|0wRJ@aM{TfD4dy7=v~hcenNUg#=Vv?Q1Ja!dhOS@L3Dx91KdH3t^pWDL@r1p)QB zN%fwR8*UcL7qaF~oN)h~@e}@dcd_4J+^sOTr*vTK?3rW7PM>U6LRwDmezZWng3E3{KP5LPDZVGEr^SecdIj0Hz# z`JmfUbNuG9rs*R(486T?N_MB{ai*!_C2y9uTlYE3;ak@pbC$Qf_a3#p+W!CJy>ble z^gHj;FBe9J@6w0ol;8cF()?VUZ~~X|yQz`_30S-9thrPZ{#TH~J_W$;%V!_Jpm>cj zV>{0+_6jFrhGQd0FuK`1;d{87KlwqM2lH!`Z3Q@w-JSeE?-c1!47)TLCw|CeUi)kU zCi6weE+h820BHd?xy7dxz)yOtcd`P0!f+rB9EWHo39Q+KZ4droH)`ao(>u=>3B#gs7BoWOckqskU-pb&a#K>o~V|$W#^Wt21hR%USTk|_UFJevOoHfGI z=Ff|8kbbbv$B+T6eWyT{8H)n@>;O^>E>rlk16ZvHGoJio0~}H6rv|WQaF5fIr+sQb zUT%R|h{mL0-dcJu-n3#K{a%)0laiu#3y!zmnm|f|Z@;#rztNYKW&M%$K7tRtTsni& z(H{cC(=dwi!V+1))3EZ)yn)F+)2vlGEGTNPo)OkQssiz280Q39b|`k~9FKum4 z0xiZ^UPupW&4UGxi+P<1ytcf+BjBlX&ynQwWY}q)Jp0eDpJ|vc>&}zU$z3%y!Of)O z0$NVa1<#R=!H#&>^5A*34|o;tKl(j-6yj?ZO^5sT`-pus-%)GZH)*x*R`7_#KG$Dl zU$AEqVQd>YneE|3wqtJNJ7oZ2w*}4(*kFqa;N6JemFpF7Zba>3D_`@)R*0QxA$Fvt zUSq}l+vrdwR)TsVvmP9RUmaH!Fr}q>*qsGwTE&}&oACzR265bWsb@jaCfERG9k^bK z*38CUQ6gT^>a!C$!U}G66;}vNb+#m4kT)peeTCmh5GE%1W;b?0P!bwZ#X3GTB6O*l zDh=}aFbzI*8`+N{_$=K6v}_E-q?(9X@R&)omb;_WYgZPtp za5L#%m2|d3Ek`1gsd*f`W9%jrn?2fn;>~}Q0}_^cjV{eb=>GwC+%CWX0C?JCU}Rum zV3eFSTV&(!cz&C&4DuWdAaM4ogb9rPSNTtXeI0u-kjufq1QG=RYH18{0C?JCU}Rw6 zNcy`LNHYAZ{8!DsjsYlw0zLo$kVOWx0C?JMlTTz^Q543%ckg|FR2Ef3q){;BrJz$5@AjAKh@&~T@aHXC^1ZKCXcM$I`yLlsdV zIa9#`=gQ6>y$-n3 zXt_fO-40r&PLdoSaeR!H%98Q;vH8LHBwGFqT3$f12u-`Ezc^Py#Vp|l^WK{efM3R_ z*+yVidDeBFV+Su;^Ds4S7Ld}L@tN6n*7(1oIYy*Ep-!!v5Owtix6C3Y`Oips*il}* zZqoKU@@t4BZaQ{-BsqGP`E8!_2xFYvH45-%FlNn3#vf?l z4)f=|9PX3b?<_tSFRTv(&>o{5SVgU}1>8P$5Zh|pi-K2q1dGsGTN zseyjS`%?${syOd_CAkZ5N)4$`IVbO-hXD$FTLtG4MlAAPK4L`BIij%Z&Cwg?sw(ef z74y!u^A*{fUM0+12h6jvs zOiWCZnAR~}Vfw{v#+=05#k`F981o|*1r`^U7M6RgGORhQCs^OH1+i^ld&DlqZp0qP zUdDcoqk>}#CmW{^XA9>B&TCw1Tz*_>TvNFAaoypT;P&F~;Xc5_#}mM_fad_uCtfMu z7~U@44ZL@F|M5xjS@9+CRq-w3SKwd4|3;ud;DDfj;5i`$As?X$LidFJ3D*dp5MdE1 z6L}))Cpt&;k(hy4jMxgX8{%T(PU0=%%f#PE7y)67#12U=$u!9|lJ}$%q$WuVNw-OF zkiI1SP9{gDO=geG6ImtM64?c^KjiG>667YyZIgQ?FD4%%KS4oAAxmM7!Z}4IMH|ID z#YKuwl&qAplx8WNQu?8+pzNVsq&!3Uj*5Val}d_ApUMH1XR2JPIjS>MkEni9lTmX~ zt5fGt&r(05VW2TjlR-00i$yC+YlAkMc7paS?Q=RTI#xO{Iy-a)bp3RDbkFHA=&9-D z>7CJ+&`;6dV!&YFVQ|3Uogs_i9wRfO7^6u>r;OQfKoMglV*_I!;|${-;|<2=OxR2u zOwvp`OjZHm5tDl+zf69anwc&#{b0spres!NcFEkxe2w`I0CXFPng9U+008g+LI4E- zJ^%#(0swjdhX8H>00A@r{Qv|20eIS-Q_C&{K@>eb?HSKlh=oPR%7WH2NJK>96(K@` zu(9dsX``9Z(%s^*_65Gd#xIBuU}NPIe1K1I>Q;HQ85^nG>QlGQxpnWYY5;wBfDNmq z6F@@K*unr;8W+%u8-s1k;nv_5jNrxKRt(|Y;5PJI9R|1K&Kfef1EbcX!CjcK-VE-> zL1Eb79^y-bd$C)1HTVgG_Nc+n@a%akBSMvy(XJ7q0*B^v?GpuvafU0_pjb!rI=H8m z;GswxH>ij)dRNJg$*VDrgC*jGYBl>3KgKCsY|$4IIoP596e+g3uHu|JpWFp{0%24* zC*+OO8dVM!sfnmkIjd~ErmTGQJ&Bo`Y?RIw?Wgin*DO*bv+7GGHL3jS67__>7>5l# z@TCezSXca(#hXY*Dq1Gl=&na{S|A?PeZ4+r=814CoP)1Erp&vsQ_Xv>?k%Ht784v7 zGFCJ=G|zo%6(n3 zcQ~eHuf($_xj&03@#w!~@&hCMrV%xx3>||Npk@hPSN6 z-JQW!fw7H_0>cTefspV9!Crvi8uS4OZox_58HWep6}t7u8~5_bU2>PZBZ`*zt-O6H6TNB#=lF$)u1<8tG(^Nfz1UkV_u<6i`SJ#gtG=D_YZrwzQ)? z9q33WI@5)&bfY^KG<2-kuv3PEaw_OSPkPatKJ=v@PF(b-5;qsKztm7)X`M`R%vxPkz=8(j&nYXNAml(yw zHZil28@!iT_Hu+@{Ny(WIL2LWbDUYsW(U>Wr-nP+<1r6-$Rj?6zxRwMJmmzw@XvPg zlIOg@&u6}}i8%zA%RFkSV;}X*r-2}igjm2r7V(M2ETM^|EN2-P+0RN=u!_}u;TxBD z#Ys+anb*AIjl@a3BuJtpNwTC!s-#J}WJsoDNj9fB!+9=nle3)T78^J!Ib7p9S0q>R zB%iH(mjWr2A}N*qGq^*+`sT!~_VKtP`-Ih%R;A6{ za<;Bp{{lIAr&0g_086+4$WmCb0RfI#xd;FV0AnDq0V71P10!&-7eyc-OSk|IQA@A} zQ(9QCG#jueSzu-$id9&!0wrOv0YzgYVz2@uM6wG31}d@)1_mm!6b1$=S+WEu2}M#w zvJ40ZDzOFuM6o0Rh*4OuK!{ke1_MN~CIN_1ShxfLh*+@(0Yq6@Sy{LN|Anvwjj;s) ML;wL%uV=LY00kR;TmS$7 literal 0 HcmV?d00001 diff --git a/magento/setup/pub/fonts/opensans/regular/opensans-400.woff2 b/magento/setup/pub/fonts/opensans/regular/opensans-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..38ae1b57d6b689ab9ece36ee3a49255fc9a6f3f1 GIT binary patch literal 17848 zcmV)FK)=6tPew8T0RR9107bX}6951J0F_t(07Xdv0U4SA00000000000000000000 z0000#Mn+Uk92y`SlO7y_C+krg)=+oc`Dq8DEM6huHkhneB|NlKf#u)nzy1gP= zl?M~5i#j;hQ7zX_7YY;?1MFz1UX^Nd_Hr2x+LBo6^tWARt*0}I!XbMhx{c|UVUFma&VQL(!qtDpP=$WaBK5-m2(Pye>Eoz31o~b@@74BT7i+uI(^YFC> z`u@UQfZ4?XV*z12+f0Q=aIJ7aF4c&)KknDw?8I#BA8hZ`uy^Z-Hjku2ON0pVtbKd) zcW)IA%z~iFU}y%wVNPolYCB`a^=9`FpZK~TlWe(|5+0CYK6ZMT9MB68zlf4txa0l@ z@DB)1I3T%50*Oo@kqaaegtYh9WNWhfTMzUH3W-LT6Dsa}zRmuUh7|ODht*`P^ zJLiCV#w0SvMaSu6u+0i6(}E`?0dE>ZYh#|3*PhDb^BUV0{-4=;qeUe~bID7pT_$D| zQxc(hKEY(VCx{hFkSexvf(Z|N z`~9k1JX)eLG~x>pLZh`e^K}^TwRcD~ODone4Q0=^A{saT!{3{#wfh$YgCpq_CExI3 zs+BI;S@PxXu4(Y!-(B$U-vzV_fD}MN5aJ+3E9wJlC7aZz2$Ma|ini##!&JYIo%FDCh-S`ZF^5pb=r2YH zMb_5qKE|{7{Rzk2(0zd%Z(#Ew{0ia{O zXc_=q{=C0O?}8qH{`;Unmbr%t-Dz7rRSRiK(2`y8X&89JPqr!6?*aY=??=eAT(%*$Rx2T(`Lh*pSNJ~|JHdUudvdp$c>iOe}2N(4wu{wEwGv*Ra8od5hQ8Vn`mrKq1vrL$M;0 zuS09GLEDe2s%qEmNDueu5iM3qUyc>9BX8fDt=gGA0#!?tDpOu6oaNE$dmxW#6UeX2 z?ZRC4)-;Bn4-c3=AEQ0p>{(pM+u;L#EEk`Maq?$^Ww0{qV#EL8&mgxz>#y3Z-8y`P zyqmg1lm8>innG0C5di=+JTS?RWx)nij>fhd)IH+*&FqsnEV)QHZovom!F-7TKO(}P z0}-Ub1(J}j3zd`M!l8fOO+AiBdhzw?4+A71G-!y(B(W*eX7gNaJ}9tS4dxvp@3s(W@ba1)Rer4hGU`~KQXgr7|K}U0vFuO2mar_N-#eqntxFOJ&M%S zh}48CqhnxVVdI8w?ZMNFuTQ@L0z!j^h)fcjGHo`@*}Mgd*2;Qj<4f3|3U@nW4l%$A zE^ygRoER&|7-J+Q^ps*|=EpcY00000003||<7hiGHpz&)fhoOk8uFTKq+(WC9`;rr z?Rv^Nr$$*mc8#LlWcE>d;Bit6ud(ORZN-erz9@dNxWYuIq`s~dlQem8Zl0cUdhNND zyyd-#N1Jk9yQ6&34Y&A?*h!m4?G#0gHjzAPpo4;0(=fnvUK<4Zb9k^CoDUbSbRgzI z58i?pkcc!uv>3+XmeZyZt7ej=Vx>=8$*fw-md8dx)xlUZIGQ_%xA_+HvD9jT*4jj3 zs~uwPDXNL~IUvcQX{jUCR41L5=InH)^VKYOJ(BIodf^?jl{u@hLsEgN$>d=pZ#ov`&ml!-c zC}v|oGfS&G5Hqnd-gOo6NkCEBd_Iq%a~IOjP(53KJrBSR0MXXeaD>qPL-Q+!iXbRS zsS7|>nO|LWJpf?w0LhFm^FbJIlW*(;-vPX^4_{w^E=E!lQKZI@)SC9v!v$LG6m}qM z%382CtSjrsO4veH$!<6ASr|UUA6l)3O%ZE#p7bNZPGI}9#uM^I zliKrt{OkJnvG~*Nr|VBwo-RLKcsl!Z{OQ2c&Zp&1)1TTtx%hY&^j`Ws_XB(}!zdHi zbWwNRBM-iF0n#I@b^T(wT5oQ0f-p(5yeO->S<)5bLaMgw2lK~iz1i;er)TFEmsi&} zw|Dmsk5A7!G%Q>a5g8R76B`$wkeHO5B27(8&&bTm&dJToFDNW3MtMb5O*6ZFfSzt1 zzqfBdC>R_X86F**m=uYpr{?Dt7E=xRjpfx(v!89Od6&6{$ycF(%10nRvGz%9{$NaL zJ^oeIJ@qWAH(}A)b9e7OdVK%EVVwT-)!P>@KXzj1w~sOYxp6b5&YC@E=7NQo|H_JG zXIk5v0Bw&$;n{Awge=L({Gy}bf1_FQ|BiaOb#}MNYaj1=_fn2mGk|p7&I1f}D*m@o z!Dp2JlDv7>Uc}9I@?2&o)|t9Lr_{OHZ?TBoq@u{3xg6W@ zOKv%}@F# zPa`$6`Gf0YW!h~j+pg~BWVzgZxtA_w2VCqXi-1JJG?@VhDlwpbTS#F7bgcYSa?t^0 z10fWc&fK3se_ZAVpoI6N2WLGZP0>QTze|jWr$ZeBHeRpo5aQhllTx;4&bDiQT`VPzOtVV!M%q`7hpi2YSmI`(Td99=aTAPOi&S$Jd)^}nGJ1D=OE|Abs1-}1DNd|Ga zj_uE$l;daO?&Uz5szb^JGT7M%m*qK^;{})JC0F1TSL8!ni4SvSKEhS_=$TPPBCcOl zLse7VNiwiraAi!(x-LtE8<~& zAV7@6*gzkpC1H3et-dm~$Fv74cShh8%Q37(-#UtqhTrXMtWow?TGVqOjSep$cufbc zUHJAx={G!vt?%tsx2y<=LprXkc(lLAux^dm-j1{l<5H?1jgf!2jIwi(W&f4c%8XKR4NtHvxg-1v)QST?>&4t=u z?xbI$bGhSoeQ>#!qf<9TNKG?pw)jBFKpTqy=c7_`DyN2^db*u{Y1J*|Vzrniyqbgz zY!PW{Jba4?^G^74*H+n4v!SeLS%p6_v_<0)5yf!4 zfkkgNlBrzg11x}qdi@ej!`SI!Xu7&F4?SRoNno{ayzL}w#@O|zy+OvV#egj`ajjEO zD;`{o;%bmI5V*ij8zkw08MHKw8theD`W`*?K^=|eAY9TE7$CT*Hkw-+C(Y$E2>CEx zNkIPGnWpmnQ#eQFb!I40K~O^ zoSKxzavR{MGa3T{pD2i(>>d9t2!M5#UP`!4oct5zu51 za4AKAKb3+fTq+}=X&~Uzi+~`S0iJM~jDTi=fXgld{Adn%!sRjong@cKd?!vk#B#x& z#(8Z_g~*!~Weg_d!xh`z4doILu+j~Hl>ug4d7g({F(+V^0>G*O;HvXHW!ap7)d&Eq z1t49WlOrc6e~o8#WXSlO#u)@et=?cE_g)o{XTDC*{q-G;UIrLHpxnUwh5vLJwRH2q z$m9fxR12i?OeICIGnhneB*QqDcFKvFB%^HOoT$)5@E~G4wc2qT%NJ8GB#POItzF?) z64nnMjLm^F+X)zPCTl9Pk7E&8gAlARbw>mg=_H;d-jZVGJlfZ}4UtqThKpU6RrG4t zS1k5@;SO18hpf>yiopk~ls)?2d(Kwg4@asPj)5wp>0mr`2i8IIPfp|S10S4nR)xLa z1p`XmqMuS2?3iMcLxUeEG?&QryWf zfY|ymT08nmiXwK7Oa7~|xFMJ$?t~A4>iu(It46jLyrbUu&QV2pak8zbDj@c=IXU7j zV@_!qHv#}fJc-l3{1lEQcri|FDCC9|Ymn~WP%c0LiatfcS~{E)WGx76s9aRD4^5Tr zXsW!xux<<&NRDPqFzW#yiM`2L&#|!}O?`QaZ0riF{@QGymrQ*CoRh8tmvb}}x}Rh5 z_e#_Ddpbr2_`}%U@|w&xz=r5{lb%sn?FqVw><-8C;mnvCkE4k>Jv+`4yc*U$A?q}M zs9|cQCxisuI`9J^_f^lJTs=M6raepc^>irX$4IGP*{EolI-_E_0_#-Kp$$eYfG;O% zH(U=-R&91P6CuRLjIh!eVT`gZm|Eo3OO58N6&^eRAJhT3$R-mKQP+odTy?kp(h?j1 zS4=(4Lj7i21X*>p@*foeWb<0J!jud4@Ux}Z*GI;1pIVT&hwn`Fh6SvcK(oN3F2|jv zdQ1m7#rly94KfAC{oPhtOpF3%tUYp>WO=r9vBU83E?joaNmiIlE11R{nh6lbZ zW#x@VW#3 z;Kj*Ib&s(*+CZj8&?Fj8W!x_b>ElI60Uf+e)ohl~EoprSaHi_ZC@C8n4PMpqfeDF+HTX2uA}*arE3eaGxwKjBRa~26#`xIE?5asF zvO5ron89#1wAK&yLkMitmjS?Ly z7|yu?i~bM<J?<*GY<^de@{y zwUmL>q|riaTl(u_@;)fPB=%Z3ghGq0q|BN%$)MgeZISkL;s}kGXYvtnK%K_)>*Nm&_ojOT)<4(Fw4i36sv%F7Cgi)F zTeN<9MkwT4x+V9d!G73-HLxB^E7Q&y~x$Z$_TzEmo^Djuf zbx#mjd$CK-B5Ov24zVflO%Z^is6PUyFqz;t@h)_irXRB1Cot`{!MmW?O zC8>D%z?_&`SW93dg{Uu0p<-iAcbF!&TH%&U!;9ye#&S>IYGdO3kB#A%!6zOcb7pBc zy$;VEfcXdY+SP^qm;BzF16&+2>RP*pIG;3(xgu`Y@6ufk7Z%mh{CjI|V0~01mi2Qs zTYwtFajfBx9AG!I_K6P9eXxqetM|6hS->ekDajHcR%}cFHoq+Td3`^xG=VW!;c`z; z@vZ1Woib$1aOfL9cXXz&8-wM=H*ZFKXcvA>$|^}|<|m1qUL|fo?ZOMu@{(Shd6yHI zLZ*dlT{>j9^lY!JD$yr2PjA=bsx<;u=CX+~vc8FensL&9M=BaxQ%(=e?A2s*n)_dU}GRs?W$pp{^|s+B`+91uad%8{$;S|R4cqkl(99^J{KsSQZWfVPyURE)Sx1aanyKE`hO zREwhds_GPyqYju9bwkZiRVbE^(A<4;8|8;%P(rno`G4kGog9aizE%(gk>?1XZ_S|ibCw3L2|ZI2`v9Wfa$zE3@SLWv{cL@|OeRF##R zJ42dtyW*~ zJ+q+c%P5|(vSg=^e@t8~nvxP=5LCJiM}E8&))MBLI}n2l3@kD!yQis(ko5>6r5Ke& z9f=J|I08N(a2+7<{Cs%?*S_t6m+ZInTJHXn7xY)Orj~t;Xnmn;zn`Bse@N)f^Ye4% z?Fe2}Z&%OWf1IMe{ryor5PVYHTs)@-kH2hocFFe-xZoC3Nbrn{@DEA}mlH*QUAaWm zmx3k*n#4M0a4WHYkDa7L;;k}5>4Ao_SO+(!c%Z*ol^fq@?&v()WI2(!zP+9IqQ(tHGT=UMC zuZ@=*mb+=goU4k)s>+b+x|HLS`C7l7w}p-*bR>*~evKHSb#k&i1yT(&x~0}y-72UN zaI3k4HTt3Zua8GZ0+4A18fQ^3APG#k$Ns?9WF?^OFxECG4BFAr*&5+=M)B07SXV{N zC;vBF-Rb6|yiXawI)9Fo7w)J1=>9cE^fe`zq08gb4Qy@cU_Orl(z?{GNR=gH>~9GJ z(x{MH4gHmd3)GRZ^DN5-LPlL>A*tIo+AAP+yYJK0cQ?mtT8`Yg=3oW*0y*)tAO19-Xl0wnq8cX48;v*|T>?C5H5 z8$2t#{Up)CLb%Iu1&h;F(UjB?F99wMrP$!19{u6Bm4Y=eS@>z=`TpgXf6=#J$oakB ztZyA3Xlm+h3TC(l7GuwPkI~LLY3jey)Z|<#(~pIL!DW}W-p%mNm5tGGV}6X;Jn{eT zJ$nD|rTKqFHC3KjqSTJ}^RkrSYat=&GD_MV>uocu zLSh>;PdgE?!E6dzsloer+?TIL@^GMq@1%eF>WeqmU;fd!&Unnu0)H@XXqniXJeCC(<9@U{g+2CfB16> zBUHzzsNYc?FC(Sh9h_`Fa+Egq#C3Ye{~65D#r)I(UD_S!M4LsBkEL@I5fCSvls+r;%ju>O35-p~1^2?OgOqHexQxKX-r9SUTK+w=|& z%~KoutJUQ_tn}9b4?g|T>cOas+EUB&M$Rq&(_jf38?U5Qii_q>BPJ1FRZ(i%K&!tw zXDt{kt0(BNiiGF=gfmn3UJD5>O}(BLMC!Z5%EB~;1an}Sn3FRRsHLTI;&aFlLxWnGsp=`yo;bV}XII!$x4gr=z3rZ>eUZVqjH~6NEqxSlh;zHU?N3Ju;~!#yCQ|&TZtaG<4=n(+ zoe!H5zF<}K;}YP=uE>Gm4qk@cz6j7b1lDrt&?P;86du)NhYqWbj}5QH*hV(sZbTUW z2mkv0HwhVp8OSs|9u7Urx-PjX*Bb!C;!U`7otcPVpsZS;J6@GB;R86~YYi8G2 zIMy`{JVQMGkFzEK0Mh<%c?55bdKm4qS%}ZT2-t=UOF6I zCIT^6Dya=r(W`&Y&CDk{B|A;7PiWiimF-Pyl@wVHnro3OW=}fomqAO}UzVJF&yuBO zl!D%tX#L)<(~)4F>YPyM73-e%%AB+VKDo{6s{WHW0W~&E5wO!u{TC?1)S#uTUI=2i_7;DtUW%dp7x z`Jv^HUzN*72RPBaG8;0(=g7h5LQ5bogYSJZIDGgEHJr_pY)F$`D}9cNoLm}8LxvLi~KhKOQ?v<6tJhS>b>J$6wtWOuifO_=`K|I zu5KtRCuRBY>gU6c6TZ{S)0_QcgRb-d{Z^3N+N;u5;USiNTMggI_{FB$CVz9?ea+UM z9vMK^mpgUA^d!QPTP;5yT+X-q^}d3QESXH`5A|q0&*?%E6S_sQQSX30anM8TBpt;Oq?g8cb7{)CY=1!BaovSJ!R zGPNKd!uu;QN@y>fU%-DGdnMW~p+#0!1n6KuRAlDH+|518HdQ)5iOVZOdDfP)=|q3- z!x={TNOX)lPt9y;9-E2bf8XM)*2dX84t!jN1_NN`EeJ}K^qK)ci8Ikzv(t+=FEtOa zdaz^WE=3^RXDTr5;%50hNW|*u0}q*gYJO3bCpiREfP8v=7>0yN-|TzP)6>6q>qh^* z-k#n&T0=@E;8O_qUmHROj|x==z#(YBJ7w>q@gW`Qc=*MOe#VUCj=n~$Rek5HohzMt znVy+^)|k{y{nstq11inx8v9;;_3eFQg+rfD-F=olAg9JC;q$WR--(fTK9tVSgkVBk zTU0sd!^pDv-7XJ4u1awSV3#N)vn*jIoEN=U_i`{?FGJBOKWdFH5tS0$Y0tL0;CCj; zz5G6Rajf6PrksZ^&&+alG`$jSS%+N3RyLeEMlr<$Gm8e}k3!CP*S7hzVw~Sa{0S;P zQx+YX;Gn#Y+my^U?Q?ff+f=F1$lH_spFyghuE*eD3tzytafDZv1nq*B!+$z^d=B*LmZbl&8+qv)oD#*P~@g7$I)S zuEi|*M4EoIKdksoG57^G)Ob%JjzUV6tX+`2Ho!HHF9^)8E0!daBH%5%LUGM2=@rA> z#|FSjy=$uVTDeX_K-U?{o%wyE3|F2@*G%6W;=m&_f{P{Vati|E%{i9^3zD@dhu-ON z#_7pfsY<5!tco;=uf^ZxDj zoxZv{n=nZ4_Tm7+u9V}^ke8oVYsfF+KZ-$BxSE{cO4nUB`|;#r(M7xQCzoBOZsxis zme+)m%1h7Us70~3%F-}WS(R&QW{GPYwVXt%ERDq$l}F>sOG%{C3fII7d8w@(6iQor zT6#xUI;FM8&gF6L-C>P`2V{!u1@`OxfjppHk)0q&V!*_KaVv~o)PTD0Gc@aL0Tagl z#7a-Ft05tUm~*vyBdq;ogaMKoX;7}=K_T0q>~aYliy1V7nG}q#bv0u9&}!eYZ|@bM z=$_yeQ{VDhcNeq2lYG-5b%?Sc$F!zM&ysk)-GNH)^90)YX)Cm%U$l=BF%9XdZ;*_H zM;Pd%@?pPteNO-Br)qgyub_O0+h5pK;-7Dt|GjJwcJ z+6)cd-q{M>+z#E@SP2TfcKurD)zzT*jiDh^)4{=EuqgKY}tdGpaq;88~kq6HojI%1m8xWb97*HrE zEE7v)R%-+>DHyF#tuP8UfC+GFRy$HvW>pQ=y!m%+a)d9+ornre9INp0%k|LQukODZ zSrJ9gljd`aosQYUykjt^IAvfFP)+tn^H|X&l{zUZ@x#|Q5&Wp4iFB$jB@OSBp89%G zr>6Q6($h{rYh6R)KfDSg;v+!r78q}g12R${19J?Zrm#zC#i>4lOj^|tZyI8VeB*GLo{+MtNcEz0qi=^N@5*(8rq7VU?|!_UiO+|5A2o zqjpqGP(usf8=Q&xGJk|C=WmCH;VO^QF`c$xdJ*wh}jOy?qQVOuUfijs}dSSfo!F zfK~Lx4d=?xBgf})*t|)}uH4|9_ykf;ZXPKk;Vixr zHdLT`x?r`!v_dJE0A*P>9&7-?^P#5@k?YnRLC8+9b5r-QiYZCW^QC%^*w8WM!OK4u<=JFy00I2etp!WSG>)_ z>}oPKH85@~Hy0-}Eo*IU&sd&11%voy#&=Lz6_?3njpOq&MI@B<8>u{I-meoSrp_=J z($UmrogE$(9vK?G10usnVKGr(EyAN?BBEsS%&8xmZyjp0yplL$8_9WMmN!~MBg(V9 z6PlN{ClZe)b07yr>G;u{F{OPIL?(t~d}|~D*Pl9$V0-$sH5}^FeDsCczV>t;`s5Z! z+#R5D6&j`5|9rci$5^P^xoqG_|2Ao6dVsT~lMZMAYvl>A35#uw?OYK|%qL>FuUpJ; zyJC0W#AN3}e0Z*(1115BbhB~@I_*>8SET$z#2+7jF#GuG)7H}Hm};R%7;4t_d(S_O zsjTXMb#iW2V>ba&=xTHk8Aav!8-*bQ1mP*mZ{!~*Eyz~ekXm&K26Uo69TcmR|JJ8) zJ)yj3dSHkdo){R|)Ys3AZj+gj?Kx+A6P{DuE8iyDTGUrwTVLPokHdNBVs#P6rB3~R ztO|VoT1NWe^XP1{)t$?Whq<_ocOU0;0%5Wq4wv{60&KjAln!#y=x0qyZW*tG%|~~euNRz2lHMj2Q&J^Rt`y=D zQJEM|DnrEusUBu|?iw-;H9T$C+x`aB&{#tJJ2eB8;jj7sh)~wge{WB|o>}!o0Sb_l zHu+F;InzGP`utLM;r2e@dBT0!O1H31U4H|5fB{R}^PBH2)?Qx^`}U1T+}pi;`YtB* zUQuI@LK~>Pq=x`Gy8dP4q}ZZ(e$ctn{9?7N0E<#;MVT*x41?bpkIK!Ai_M}$MP>iL z>GpY3sS6kc`)5BI zn4MY)Irq{{;*Cow3Snzb%UG5;*XaOZWl|+5Qo%Ai&+&g&zqFKy;#a5ebLKjq)ZWzs zUw(|0SC)5kWb-uBZ9u>XW5x+V{wNsUQ40>2v&<inO*^z$mQxL);P6_xw3~b8!-t)H zKiy!Hryaa#f5zyjqfTBcUII_-tP5J%j?5;Ma32IbC9$!XecV*in_bK^kkZrJ-{wVN zt9yx|sW0=+-bmC=ycH0)Wd@MGFr0N`Zq01ROmw4&CtV4+X^PHLP19v@*D2=lSlb~U z8p6fskrwwS^C1M`BJ|uU43|Lb-TCvs_U&T=Sud z!p@mT!coMua6{F}t3qq?t@cg6-BPd2ZLg*ys*i`BB73H!a&=0rT9%ht9JCr>tBAl~ zLXuPK5dH#`T~)2#)z+_ewf*B=m0jDg?N9yzB{CP5i%5+U?K|n)Vpmm%cD41-8M09b zOFff%H6_myxAYvVs)3ApZyow-uWUGIY2uWW029XfG)Wg4{+Y6?s#D2ZEq1m2XQyno zC)0XU)*`|`QFlXi-)^){a>y1s=aVUKp{hxBZ?dX6W z4{Y(6)7b!o%VCfVZ7K|kwV6D(pT&sYWxSasYw+=+n2NAfVp19T!4Al{;UiHzIp8cfD!hJ!t83c&csK{U{tTx zOFDq}(^*S55e%p&m!2}Rb9pyP3XaMS4F z#1$M5-jz;=Hm;Aq{ZzeGwd@=fHv;T ziX5Gd`8T<BY+ zc|@`av%OrG8w7Sc>6PFiUoCFu?Qkj;P~|omum@yo>PdeIw%X<<$wI3yn=XWj0?$*| zEsuq?(g~c$rZ(PW|NA1(Qi2g&tYtpwyfc;k=v~RCE{iDi^3H+BhJPOlyWP5io6L1V zAjBC!j+m`+@_D71Z4P_T7n&h6B<|w?a{}>6H~sLE{i&7qCLD_UEDQP#$P8h+lAQyoac&AC4yGr@B)V<7ze zvo0=!rh&;Ca{yvO+AW5ePnG-X*hJhh*9wnFiqer~SWHCh_1fLaQ~dSUyX`bG8uY1u zUDWAB0B}qc?Enf!a@aT|Mu5oErM2>oq%|tYO#vw``mR-mo4CT?K3>{i|2>$1DeCwi z1N;?7<9_6|Hb0s<0*Z$MMq^1wghmv)-#=yp=KZ7@335mX@Zp_6NJHEMIJ6xwy~N7) z0DDF7e)(|#C&>K<%Z(AyPI&}KBdn}o#*}`y7!oFc9;c}QH&~C%SvQaa4fR{i%hwH2 zx~~^usxe^Bfv}WcAH6H3yuC3?x|?Kc@_s9VK6Hj?nsJ{Pd{8ObbI{j=aWzO`%+3&= zrgymrI%GvGfaulC6;HDzFAVHp0wHji*HjmsC2{M8tdX*z0i;qn6QK{p;w8!G601y= zfUu~*Ywqpztm(5Rku+*R8L7BnNJ?`a;En5+g$SQ;->daDEbC0>QnEyFr&FCt8+?o{ zdxLf`$ZfVWYjO6rf^#L~P?=#W+B6Pp^~>GFw?3EKst60*abx~$Z%&Mf3}xGdF>M}9 zq#V=Vx3tMsp(IZPD?rsmO@}-z=HdLj7fP#jrc#E_Y@Or^aus{S<8+F55q^Kt6L3uo zn2Ml>%V1+=vipGPc@Gu#fUA<=YBiLGN-)SSAVkX+5WN$?)15ZP8@zc8^E~OKGlTt! z?7vTgAJC?U1=QSKTd?<@elad09W#l_dM2Vxw6;9b_aUg&ra$?-roJ38^t66%1mU7{ z{Qvd#S_!2P1P`Te3hGe|jRSOiL0TSbkulDp6L4$uQ6<}Ii$={pXBE_)P%>QMqdQLk z@re7laifx3Z}TdrT(WVs=q7#MnXtVRL`Ttv0tlm`tEJnERdSnyP+=TM+bZKJT^>8| zC7j-!2~<0zg2BW5j5Pa|MmVd%`?4aUA3 z8MkjZJcJT_X|oO{oaf4h7nbzP2qumM4`YyOCM7AEebzLBct%?4BzTT za)?7VB@S`3-612OREQsq)F+GFLL)j2hJYB$LGxn9QAZev@)ozVw;w@wgO7tWbY=>4 z;gb;ZsgjWS2&+B{!*v5@+_94US^aWlkmEaKCrRS~h_5M#eOUd2r8>h*V|SkB+j!EN z>`a6Phy&^u^lhB5#BzVt#~*pzno_Tfpanr2Cd?2xT%S`6XeLQ&geOfEk!5wGq;e>! zK?;D3?H!4eF5W+LBshqOYb!Q$gITj&-#*d?aVSM9s=RDqrd?Qt6AeoVIn}~QSi74Y z8t7EkNW@u5glr(rLq0q|M-3!CYq(t^#T6@+{Kx*8X9DHG^ftsQyj%t^DyL^C!gIAyplcW@0fD`+PhQwmLey*<{q$F$O}S2HG9wg z4vQ<3lQ!uI1ibj@nj8@;YQ}nPLz6>k;4+r7lEy2%dI-UxmqI0{XLV$&$@_kU7pBDzQzU<{DGRLz;p!Kix`Z$WxC*^uhEn&{UC zhGTb+kznE8A9ScH5DkL}N(S6M{x{a9)K;_S4#-01F2ssrvIt`lF#K$aYRDit`-QY+Bbthy``Z^anu6} zU}2^;o2<(0uo&cVK*Q=t1P1z6APL7kwheWNao-%9EFkN$d20PU5E;w|!yQJnZvxDJ zzusM)?>5E{?ef;i%g$>iB_jF>gzLPLe|p<5_OoC71dBexsvnvIhcy&9bQ*44^tz z?))@^%3eAJ*mZTGg8(&dGD^_A6~D<3xdzC5L-L!Bcn?^DO4o*328iG#0o0^jGOrrT ztV{RD3#G{uGF4RxaMYN1pd(HnR*1S#d|tr+v*98D0=Od>S;X>{Q9>pRC$UnCUrYsp zF_lJ;jjmRqDDSXqQzDXGMZ|AjNntR=!E*Ym_qVAs+c>KNS82a!sBK`8sRT-L($mA? zdR3vz4KeZVKv>E^baHvIZrHI4RgYZ?UT4T9c%?8vOhzhp%-kA*MYLDZ8Dg;E9$S=& zcz-%m5uAkQ^6ZSES&OvZLBibn%tR0G{}3rR`ke$@sN1!YP6_AP924{1%1T>AQ_MD&{3RFL5POI1Jqb z)Rg`a65r)c^@%Roq)h^JbgGj5;51iZjZW4Ogp!)6LP^92@ZfvBN`C$IdX&5_FOQ}> zZhWNG+ca(0FEd=Vha1hXdVJRM5$40C` zbZ2u=5#e=-9veZ{JGudJg-q2zgE+bpszEcAH4cUmegh`seQ|IV0fFpEb{w~S!nU)wJ@u)B>z>hHSTr5Y%sDKbN zP*+Gi0c4!6H+kl>`-4vtM*Q1wj`0GRfNR*~O=rDC>91qvEw$o%%DSU!Hq51#bTt2h z8OO8%gJxA2D-*N!VDimFP;olJqSCP$7cGkNx9$p)@5aOnq6U7U=08Y;W&BHwGjqzt zitoQLS`{66{bBNTZr0gU@t)G1vfo9)#e(3^=$1Kn$)uDLjYo9}0+E=v7cG0XT(&P) z+lreZk?zQ1k)z36T^T*ywyE5xLXe_ftC8*6ho;|ND0T5@pXX<%`|V~ujf3jL&;{-8 z0dskqmxMMXwE7-{3Dd!UrUc1N^YX-~@ec1EBLl?z*Qs+!mj*KON+_<1ZJK)@w#d64 z0=F`st!|qW_td~7@hKKHGmn{J3hXRs|$O763CN(ZTxHIFf?Se zoat(%P#5zmGf%u5IQtR5^WdwdD)JPA4tCw4DChZ&cF~xMoX0ZJGI(5PU-TyI&I_Vv@(0h$ znbte1hzAYA7vF)%N%&*s90c1w|y7mueOqSloGkhSw!d!lES)VsQIO z-)x{|iUXB(C7D+|+Ih-_=G>Z%Z9-95n3Z2nvBv3U-*0g!`I0Iw@_hIHy?)`C9gA6W zgT~LRltLiSJC@!kcFV4dF1iB5V{yBy#iD;8Y5Gvn6|}i47>~&;*?GO{+U#u|XyauC z&#h&*jX)-_Q&i9xo9pB@{ml*(c65~?n?LB*NtSp$bS;;c><3SIAsDH9{Bj%45gE z(q8D{`z9E<{p{1ns+jS`Y`DPl7uPXQo`pB3Vy0y;XY=_b=PBT^+is>|zk(TUiha3n z?C{4h!sX<}pvN2nfP#uE)A25ewBPfa91G)zF-sH2$SMTcup|H8;BOt2f4}$ERc~j< z?D!=#OkR{yc-)4Y4VycXi&KMzZP77|$-egOAxn?-YAn%l?5Ssm{KiEfCt-Iik}F*> zi1@*aU`>^g+Q?m}O%>!;P9rqn26KZ)q-7ZCv{RRK6({FO3mC#JX4GngSB6gwzFvv< zNid8LzmwV$!cU51@V}}QlC32m2$;c2@lijqEFplj0c3bHea_(!UGv{N#D52o?Bv!c z8!Z04TdupM^cVgQ40!1;(K_#%UqJe!b=~@i)H8o+AE5sC;uX5qU1{E~@V?0#e})&w z%H)ryuCg_-fP6 z_>piG$W1}sG+pDC@vlt&_$$6z)UUr0D71N7XO{i3=ZjzVH^TX{&8PY77t`8ev6Ipi z=WPzkPi>eebC`@{BSl+nPb^`~~R-;TX}6O9bRtbd1o(e*P6G+!K{_+&hY9-1BCa;^<7NNs}v zzdc&oKhVSk2DDixSr8pP;PYyW)RYlT`$go`r&y&M&^fxt38*)T=ggtW_m{Ufm-koq z=ciIA#yo*Xl(PA%7RkOSPDSzO(soO! z7sUNL?;2UGJ>!SDapV&kxz=s8cg0ma6)o^J_9$azsIdJZ ziGg^mGF9|UZ@b0sGG{=l{qjrof<2n3J#tY!*vP`JX*qsqrX>kv8K^R^&%}yGH2h1C z?`C?nJx&MnS?U9)b_MaGB!YpxFd8#q+tIQXR+LJK9P=U=9|En`$zG4n-mU zh?_uc*`P>~1L2}$L^oVb&%Z;+s3;*kYyEX!EhV>cDEpqq3hLWRDYM&O)lDk(kh>-H zmA6WAQGG%lg$~OLQZ_?s@<;D|D;Py3JEWUzWA^OH3o0LI zNSqyp&(zM3EY;(f@v8jLF6UCuIK{c`VtK_ei|!OeWoB}+qhaNYA5me*ds?{=QC1b& zeF*R(61DT-kErQhS&&`7@?H!3IwiR0?>Vhbn}Z*rOp$$#hQ~ohLLn{?=As^6XWxheqzeWv?nPuWGTZ%W7 zJ_^m-A_I}Q1QN;p9-U0|`Ygae4)IZraKp%(z$1lBz`qCBIz}o(mx(}(xfrTVSTox) zgneBZzfD(p43V8lNye&pSJ!Nt891LZo^#_4cNs&;y)O3qy);myaMaFAOkKoo@5pTj zasyD57(d_zxO@=rN$u}wQ^wUQI09Lb=P~7Ox#_#*^ms7|7A{QKPj+2PW=?(>5kH~+ zF^+UyQ^8P|*m7En$ef?IC7aKhxJKrNNTsy@>10FdlF*dG0_XYuaNB;3boEAv@V7+R zKnIV`&vUBEXhri3m}Cp+ar&7|Owae6u1^sGRzzoiVi3~to?}$HHJLPBopi(`S^a!V z^F@L$p_3is14i$x5FF$tPfxi217k#aBrHeWYCt|Jy6F-h1B=r-II{)EbJRufj;mzf zMUZ#sS~?CKMEueD@&CtFF=Em{yR-zbs9lLQvfS{*f|M){6VDBF5bW6PB@oDYa_Bt8 zt&FV2sO6H4`f8cUw@NI7iQ*fGvETfAiJHf3Uy_i$u9 z#FRf%LcdS1Mblda2(Rf~;rCy(itnwN>$fTCmV|3)?HvOfk>sNS&RtQ$8!txqUlNP& zkhr1t?R~LT4D2YQ&dTc9aI`8fChk)MF-l!>X9yld;5%({@(R0DT?;qiyL?W`??(f| zIT*hQ%H<8Tp58Up<~FMW#HTI{sJp#%PB1T;oS#q#g6#)9q}SjHqs)j&VzV_nZ;Y;p z2bQe*XJLI~pUgvUnQ|x#pvNv^^JuW*uMg+C1)oiVLWl30c>9VXAL$nE!44K*=(cVO zuV=|Y8Mnk|&RD}`VclyDB?f{ceTjijeAL0wWgL0-NZ*iHR;88W*;SDr+$l<#-a@gq zZ?=FwFd27Y+cs7BR!&HTv%{qU*_B&lR^{h{-ysM##PDc26y7}AlXV^S+@zeGB z>5FxqRVyO{F-9R2~PHQH~&1 zhu|1YjzST|XgOA^3A}nT)~(>8Tlc2K{r|590q_-SP0_f?_M&9^1}9)UKvx0LP2?p%U3Ci zLPco_O9z;g61M*O;}Rch6JI@tcHh-=eG{(FQEr>coO#MD!R6~@=_a${#;q?D!1vX! zh}aeZDBcOuEI?qXitbj94qb{n-q8~h;(~_DW_qpYh>=!?XSZ2dx-ByQhSVI#9n?=L zQ2*xD8Rc#xlFU4e;IH6npr%;+;yUZTy7&x)*-lOFpm7qpGz`oQ++!XKe*RzekOq^HB|?s80^9|A)Hmmuh2F4hil&S#y`8 z_~=Z;Mt!rhygj|c(2Fn(f-n+=VJ4{u;^7}?&Fb`V1P_GP1R#fDnp%hBBv`o~=v7BWL3pXolLaPCMfl1G9 z22mWd40ozRfDLo8lO__ybi%4vv{*7_IKYk7IixjB?+q%#2PV}mn5P6|4muZGup-k9IV@MU#7*UEN-tH>O<=94kTup;}b5U%mmQI+<=BTOT zYE!N>G;*M0imXxVBhFmhHPopU9|$WCLI^#vxwgQnqT~+MNNQ;(iaBzMnn)yGFgMNy zH_V0aDJ!|Eb(cxORlFGCA|y&(sm=(^RIWsY4^^2nLQg{(RxESMHq5g>P|S}zw-xhH zgcHPq_?=y+sjfhUMP)BQ-k9DmXfWVI0|IFNO!E!WfiCo*4l*T)1+e;wf;tJG^-F;meP|0D*!83lS;to$)3(ZlQN3nrWI9wpbqwrg~tUdBGs)WO22C0>k1RY>~8kteX00bBFrMQ*z9ihFngN4%-&`n z$yH9MOXP+DMOqcNRW{4Z%Ze3M^NqxjswaZIJ?Mysxr5_b-plp#EPH5Jy_EeNKlNM|=TYbEUW+Qe|J3>| zmZ?iP%5ujZZNhhWLx+EbjM|;uL)(pvI41d9xj@6=bv}{2Zp9`a&Ei5PXWcj+Z{s;c bqasiBtVQ-AqMpFfGhSyPK~i3=+z$W%7m}wj literal 0 HcmV?d00001 diff --git a/magento/setup/pub/fonts/opensans/semibold/opensans-600.eot b/magento/setup/pub/fonts/opensans/semibold/opensans-600.eot new file mode 100644 index 0000000000000000000000000000000000000000..d8375dd0ab130207f023358d62ef6ff357108b7f GIT binary patch literal 20028 zcma%hRZtvEug*@066|f(g2wLhi?D(WC3sh*Z^PvCxAV`{67~g zfck$dD}cv;cT<4te;N{i_J11J|M)ilvHr)O3&8&0=KRmb`~MY{=KqNa0ElbIsQ&K^ z0RZ^_asluL0mRY(kYK!TXR(vs`Z`nA1}^eJ-XODHS5_-lsV9afM2XNXveC}i$NRT* zlrqtLSKaDCQazIX&kXm=WO)QEh#oy-6N=JG{r1rXNE#mIB}EaaZBvOP9iTawg}(-c zdci>(SI($5XCNvMAJU;mZKx0Ewby}5;0^{^b7ERADdCrxM-TYnV5=?4fu?y9>ZDO8 zI=ob7N&~TIJhPwL^zIFz+db>bbh$$`6-nzFtKoap4Ea3Qa;?z#CI*mMj!HqX<-D67 zJMwIZ2J?9sb%cbtT=Sdui9&cBwb6Km-GRXj_AzJYG>BpSL^hxsn-s2U4j)IEY&&U6Z><{=O!g~P8g!UOBm z@pmUIGv^S?*9iz<{vT99m7nPtlc zsj;;~5uQVXRZMfUX+F0Q33T}BED4uD_a`VUdjwI-wkyrNNfA^_{U>3yOz6kzQ;0XH z^D=yO)}P3sLG4y!`&Rh(=1}Lft333t&YHv8MnKm!de6_rNm~x0xHmDM16}S=(ipoz z)Cs5eoz8c|xlZp@Hoa}XheD+>JNwHmxdZ&pjaZ+moNqve^3nI0M z(+wHLPcZbKErc;(CE+FJ6xa`3IwNva27Pghw)_wDX(4PW@y6zn%KL(p1={`cOAXuw zY(mRaA6@S{*oSeH7MfRgQH3!V3W)+#&3 zZ3+YaZ%%8tbIa@3pir|#kaLWyLzVNsWZijgfsp_A0fDz5I!$v3A) zm87g?^ca-rpC2P(wL2dlXNF-f^b9dkeeBu8Z<4i!G!*g9UXwJIZDr92d3x*5n!Tdb z_|1rV>;6q2U$=)hh?nUTn#Zin?9ED>W9Y0Ga2MgfRfnPTRmw(k;DIC|=qDJm5pb@> zsX#I$abQ?$H|&>vH%=9`JB;fBEP9 z6>}k8iM<-p;gC<$J;OCvRHy>zGRtp9N6(fJrP%RHmoX&fx8bMzkE76pKfhP|uj4)zF=@YKWN4)9sj^LfV+fPe~>90h`c_-48 zb-8t=nnQIZ{_aehGK4iJN>t~uhfE*M8-U$n$rfM-ezo|CY<9<7}P82t5i+10^l296R3^``Cy&l z+AbBwoK6E!glos=5cD5U$h)ih;<&zD8do+cV8rVbf|3HLopRe@nPIayWdvhvqDU{q z!nVF;T-IX|_%UV2T`&E+Qd2e6kkLCL4@$tV<9N57CxS}M-V6LqKy$6~7Zg@DZT>{I zf_L8xpPn8`@QwbcE^(0vStEde@F@D1o+G*#-B*72@$uW`+O%|ZtHD@p4eQK2 zrwFWeZcZ`UI@-8WW^_V8otTAlfzo6eu=Q;?QYx2D0D?#nF6-+4! zQ;;V)AxrEd$;G6hMb(H@4+}MvBi}vx820XK~BMm!n95>wISyaPJ*Iy3Ta z39@M^(it2kUB9FN*T(1LpRDhCVvkzR#8t=}1}a$5T$Fg_O}-S5gzD%+t|)zR`2DFM zjyZ}^;Q}M#^Xb#`lT|cux`3(VjT-S?sASq9Cg#%U3NhM`c8dLy0};)_Zz4}}I-!8H z#!ec!rP_%JwuIiV`Xo!V6BbPZZw;#}^Y1U=ahW(f6-n+88dA%&606>BW0#1@kGCdE zi_Y*k#9&-Vj9+#CkVEZ2GnN66$w5PjV3$MjPsKDf<)KNX1NpZIPU3XGS@T3}wh>Db ztx3(C=9Zh|2t|TJQPn2p7=@MN4-92z0cv0_F>R*(Vy3)RtQEPorXwt5FACmt>?7n}^F#7_wgpMZYuX~ayUz@MA<@ede|O$PBCJtDKpB>SD)|t1b?Qq z#o$PCMcKq@NR}-Z`Q3cL(iM=cW2aKd^9{CH`cjBN`3RD~^lIIxPs!F=@A(xmQp-Gf z10%sPI1(ULl9Px=!0ObDqYnR3+$~Q9fPvNGGh(O4i2$~p>Q8}?W?BvQX8O{k8WZ%{)5 z7bh}n(6zRqi6T^kl#;TxIeY_+6D7I7%Yk#9hz-B%05Upf zJ~+1!%=a}&f%1g`27f~i7NcE0O`&=O~x2soN?l2>aOHGUXJ_S=AUBA5#5iyqEl8bo#sH^@pBwL?HLvW{K|+DiPf;QE_LN(LzxeTiXqsJa+ieoN>*R+?&pB1ad@oZMaQ zvY|_5%E8^8U7J0snI)#!BxFHL9p55V`nqOTa{>xrN_9t4(}ch+Ou>tnNNRqC`^XF4 zg&R{ey_J>SLbOI?bY}7a*VDksnfA@544{i3GU~Ewb4-3lJj3dWun}V_E?UNU#d>21 z&Z1$@VH0=;idmRw&%@*BtJ=f0?z;Ruz#9}u>MW^F|<}>}lorRB=%QrqX-p7cb>Nyvg{)o5w*o!DH9OmvFd*G+i zWmhe;!;Tx>IG3C&ihju3%d`#cfZ2S!9f}P3vd@G6Owv-tX*8_c2hT_t6W+hFJ(DBG zEJr4sZI_|bW{tmyloOn|e$6eYWMP4-NGjyWIl7Fv;j3%>1&3=It>8=uMZS|(lgzeo zlJIk=WSM&t!`KQTHWpo5m{potN4)Qh6Y?;6EwgG0!#=r(C^$#``&xRoh^`r=h>nynR7xdua zRML%h5Pgo|a!U?PEYl+XBulpL9+=7;MFiv*#-*I>aVBsyvf=N&*LP}$$&RUTS`c9=h_er!5l&;#XML`g z3=3y|8K}fTH0fa*<4ovA&*J~a$%ZKdVFVd%VM3%+?;& zc(*lOe&(~=Z<4CA{+zlYf~Elq^z9NAA24$h^^2uh#U`CpLUb3JeZN1`^~g5rciheJ zjFbA0X7|lnNVxQ5S9Z51Glmln>0g6sP4AqmHRH)y2n*g0`A!<>Z~# zZ*pkSb6hEh=ItNb-?NZw;8J21WMd(I^Tnk!A4kfgON%2_x&`vix90^6_YK5n-(q|> zX=69S%BvHS{VZP`=GZF#NegG7)73Cd8axuOMXOj&o#5NpAj`CyN6QBP`P}XjBn*AJ zTM*^J?6)rAbYHLNkd+jpmf>__7iELb&muyZV93SB#ISswqS4^2UPIqhL#dA{k9c=P zCRgON)dnF$qHA%w6%g*EIML*x$Z`M?s7~<@oFW(;I|=05{j~X(rkUrqDh7&m6YfwN z(}Mr^6u!abv>Vc>2QW)~2!l?CER<5y#W>#J<#2O_z_rcea{kSI;;lWsA zx$ZYc8BaBvEG|-s%FAEPm!0RdgZ-SjfWPGz@+cTJuTSZ*O@6;HY!U7g5-SmX{(bZg zWrcfn(Z)Xd)wrlG)vr*a$yRhHr&TC8>|$bcr6AsbZMnfl@axbRW;?GKEtTZhUfGzFk=bcAAprRbXjN z$0ie`;D_qX@{27w0AYOxYu0kD7@a+Y90~vsp}3QPl_+j8%#*@)L)I}QQXEKaQwxql zmxXi7=JaM1Ji~tU;4k5R!0_^hER!E z#qTakhiPbe#Qt4U94fpFfokhy$zQUg>~oN~0?G|Kbk9uHhZ=RT>N9EBhF9WMjq$P> zoH)022aP^*t1LkXsy#n1(ei9U-iyFEYcJb%}qtD>; zj#yBMR-ce+@FZGUN$et_45uZd^LOq12h^3rn%+sXs3Hy-cxv`Ct)XiVzh~Xj5A!5Z zA>&6KSxtfn9!P^)G+$tJQ*Y8o+LqF+Fx9J3Hn zem^uc6B6KJ@9O?N!}D)TxDoupP>jO!6KjSD+aa`rY$z{O(%1+N$bG9q5JNZ9S zg-nacj?Z@u=|+SH6>|{I1K9T?cVT1OQclSUv6c{m&d%FKI1>6@x-@#he-L6nshwu% zofrw7N?AkRYd=!&OGFQiX9o~Tyok@9xYZvk?aJd?oXF@~{LKdhzjWOn)?`XZE5EKR z3(A@=eHLJC>E`OMnrXEaNAQb!YM&B>=;u(1RFr~~ve%RQKn9@+bI{RQq|IC|>&V*e ztK1}}RK`#zSH%_8CB`_(iYeX?J$a}R%J(!!$aD%+QIosS>E3kic7JKP%pTHei zXF%Sok3$C;a*G5VB91&g5O*FNr7FeQ{ks$gSDu}>#Bt+8*ie#aOtHzhNIs0gE=Z@& zYHK$x(Jud{BTkFGAR@n3T7nZt#5eQWgcEj z{mUmvk8;HD`3e5ZEb$Cxpe0eC7+ChFq z8fT#9xYsl$x&YnAnR#}gxaYqEr69t+fi=u+g10mBNR>o_YZfg8MYdXv=Tj`*E3%Os zs|zzc5{uaR-2yF4x^=Bk+RZGT*Z4d2Oib(jFJ7C3DxG$f z6@FrRo+GTZaL6Z3wWs4{f;Y4@_i_v(=g;exKbj& z%TQQNR$jyI*k?ftmemn~H%G!JkbvteXR!^f8>rU(M1E82phK-3Zg8T2G?&aGanKVh zrsXcaTU#AQRes&A%3wtzI3agdCAsPX$f;VV8F_|x$@nv_+`_z^Qzdn)8fV-Nz5Pca z->Y0KNOa%d`~>}cQ05LPJ)xE$4I_)5W>aq9`neYa2w6Bc%IPIwT^Y=dEtZ5VBMzqE z{YXx<6^?>Nw9E=0nxL7%Hab69hcPTe>c>F-O~@FqD_AoDQ-Gz=B)aHBQDp)!&o|>Q7ok^S~znyx6CK2 zS{#V)`&D2;K@TJG?&5FQ0RkBR)l5OQ4Z%djR`iTm6F@}=TUpY2YEO#}xW8Lbp{qj| zAKhHbSg((x`?KD+DV~`bU(&%x9B(K}(HnN9(rStjQySqz6nGa0tsPVdM=joHn>t8O zLe(7rUvI#5vDMOQ-xBJt&aBO`C)8K!_vERTX#7kfVwl}vGv~T|?nF@Zmd|jRigz?J zqsX(!YXHnj49PbSpXJm|=(Pmg@lXpF*uVJ8VwYcb&qP&OsX9y_N#Ak_Auo4>SMs7H z6E|n zzVt4yk{3G|+TEq>-cP_7CUN|#!2Qy%Hn6bINl-BQNp6v%N5o1d1tAv;d*R^A+kvlD zU;KvX{09t+!V$}P7QYA4Llj=F-t%el5+S+s_*!||3%Wur=_z|-BZF!@hFXNhgwtoxxVFx3Hj4UuJKC^KIHE2L zwRKa^z-Gu=GeSP51+e6&9LY?w; z)3Qkr07Zi@5WbR{j8lG{o1%)|Dx7ysZWJoJpm4ZI3uLkp-gtBxBNk-4UHXcjlKwlo z)z{U5fH#M-H!t2{d;<16@Hx6rU`aJ1Y16|<%!S%`4DTH}2OK+LMsa)lhKz}V=AlL@ z){sL&C~8SkDqH%>&G%hZW@FCGbQUJJx?U`0Iyi|XNpW!|pZ6ecap++38wce$>A-#0 zEzTD9IomS~m1Jh9*2}^+1<$oSk*ek?LsLA-6Hs4qEEu=b?tFYC&&2oXB#n?}kR`b` zv5P1~IXRU)4#c@D>O^7y2hiAh^f94z+C7D*XJqdxDDGz^ zwYg|=qDtTyO|J5I0t%{1n1tGkPc`RqG~y)h0WOgGH}l-|`i->bMku^rc(#qB?Z7~E zf>f)FT*F$(nnO&SppL=MHa#T^LDosNXJ-92n}sAPNk+n)kVqI6jvfmV?DPJ7@$%Y; z%}ZA{jUk6oPPU6DGifPCjusNXo{(nBzbN}5C(U7ijN|QsEiInW8yv>*UPp`$_Z^QR zre{u-$hFlk1@*mzUN+QHKRBDqm%Y{YO)^t_`kjwbHM9S|9I2on`I}&87&fq4PNl~r zJ(Ll4MlMxI#gvWN48PQ;|IoopLmrWA!QKJk+LYSn)SxF1_-P0g#|UG4 z$7Ch3O$@{STE^nwPlMr6A#OUadWjJEsqG{gUTVeqg?tP=FaqJXu)yL#ZU^2tzF?aS zvhQ|@7n_@iP<#4ZZiT%cd~khl!2M;qEfn;TCo*@rwC;$Zl0{F^yhrfBtRL&$Bo36$g?9e9lTu26 zEVw&*4z0bm3fxDOLy{~4Gix2!mSGSO4es32s$Cl2UY@Ot;`7fYdbBMgMP;wb^vOAk zWB!nI-mauBu|gjDtMpq#ny_98UKAQzfP;yaYM-oFv|BFrnW~{esHg}7o=x=bu%d;` zdnoTg(xngWeoiAs7!%%oXZ&OnHX_5?o zT)tgwvsj}Zt@v`0*`0}BfckWi2_Lz5;a+c>$e8mhOH(&V(WlS2ENZh~PDm)-d$>Le z{i)!-2C3-2)OL;XVahSp)^-8~>MQYM2S2D#_U!AD1Mwx(7(Qz5;^^(z;i>rE2U7nMsxftXauP$dsW|OGm zzms~ulW1y35))H~W#j!>wa#`KwX8kPy z9bRW3cKRw%YjP{xiD(mm!uG5m&mUqVpHBP_d4v|x756$E$!^pA`hs)%{wtqkQh0pd z57pplZ}$mTaJWO4X{rYPEK3t}D1pp)nW%}q4h9+{wF zSm7`!ND)=nl_#+cO-64md|(o;Ad*t%=~$O+j-*I#pcNCM+y!!GRBkONMhC&&w-Cj{ z#mXu?R}k;XcrEbQm7a6fHKyDB!3(46%IP;5ynr3eBT?}OQya0dzM~?CG@Lq9AbZ&+ zR$T=NDTOdt7$NXQYVM1y+R19{(S&|JAk?52`&=R?hj<_F0p%nNCu~9aGC7`N$?6)A z6J|~rRomM0mztU3SiPB6ZT@y=)jGq0*h!vZ=Yl&3H~+5S@KNyj7J2F+hnj?gjE!#* z(Y#gK2Dd`KoTYK%aR$BNv!C2D0^7B+cAGXeH0?CW<6Y8YRf}lWHP_-wArGzJwcU`{ zqFQh5_iA%&KXYWY5*=Wk_FWMqQ(WA|zeAWw z8@4f{ew1fOyS62YQm$@^{AeEYjP+@wtyW+o--IUw^N3Pt1=jz z*h)PXme=XXtx%#4d^iVxXgwy-L9ByRPVcoKcks|x^^(I@EZoyC@$xUbz<|VWwVU6OlB%Wcy;GZ__Sl#5gkjqk zXk_zg8VZ;U!->(9{P+F1-2t1^aT~sbv*Mfp!{^aWcRbX3NYduT04t$iq;-BHVrJZ> zf5wa9+<;kxL!@umAHz`=y`ac%jR<;~;eG5KhC1$x+YM*&pl0@eXpJxWm{_7;DGSGn zFVI!x?Q`?P-Fnkf<%~5|R}Sti$!a-$veul#xa-aLZrET6LbHn^OP z03ZFOC++8tV>sC7?rokvBA`}bJ7wav&umJzu!C?6O;12Y?Gg3hLYd6^62?#YJ-gA2 zjZ^pd_w{J_i9UbQuRjdyw`Yxx#M~O_mB-ltTL4Kf_O?^43sFqvMLRZ(&?Habcrf4u^O^(4w$LaZ5tP7sntQ3scv60lO; zqGMyUZvC}q#>;=sh^paU=S*N>$TMREw~Kwn#PUieIs@2p55V~{k+|^d|3)Nr{?gec z?_$dnqo2aiSCPf9cZZ{s*jgkJ!70z>iB#Hm3Sr2z+1Q8gW1P$W{F3V2E){FzrlC{Z zpZ?d%XfV=idgO}?klFdKxTG>FVg$W7wu%oCe^>LKb#ZEtOM**Tbswb5J?R8lx1Mg6 z;O{?lUB{`Xl{OzPFy`lBP<8`1B1%z+hv*wvD!4BcbsT>+HfhNr0eg{CDi{q!|Q@n3H>_h(<{FTGrx-?9kT(guli4 zNMf}^$oT$^%LSd8y$&Cj6jbS_CNauPU?%URIL(}zwqn2JFz5JA^6s$Xy)k3TH)*0x zaxftZuGE(kK4+&s;}ZYmvibc>zCrs}H~U3JerPSGc5h1Zum!jELQLGgfB1|i;jM$B z3QjWz;ZQP_q~U{S>QG3=+T@K~6^wM;09+!ezaa$A6z_K@i7dlXS|PV>Yoi-rSP%j2DhZvWKAu|&+3V$gE*P25pR+C_)Cki&6?)YCPs39b_ z5(S^9LuS;ZVDd}8saoxs2CYx+X&p0rta(PiSOxFZn6mio&46*8aTVCD&K>U_<0jix zXY7v+17N4XdQT;fZ3=OWdbGkdi68%$OXVj+u9ZCbv>&4AV~?COMag|S90NUpkuk)t z3oFD%JTk?H_h1i_H>v)qRwd4*IL7q_i#=?@R5HsQ8>mK=Agm#l zJ-^s7FV-21`82q%r&Kebs+(Lsx-_H|5iGwXo;;pr11DvLkO48ZAl9!^t^Tg6=h7}L zjm>w&6R#SiPSre*B%bW2!>6CaM~n>IURTGbg-qPB9X<}!#0*O7s=I;w24DXqXvm;URG=A^VEeoXYTNm z5~)A5TNX|yU`5GF@c;-njihzQh@jenOeSR@o)8FUzux}Kq4dWMPU{=z;U3T>Ry3g& zb2*tDN#aj!hU7%AKzHx*F9&1TceMly8fsYzuE`;1y%+Ort!FQ%kBZlJsy@)d=9@`{ zTS+n>Ew9BrR52%M^2Huuf@&zp4g_SVLtogPhcIpzl{?JgNaIjCmUCo!zJ_>q(MdL`|eQroJd>;`N@^n(j4 z2O5sSt*4%UbW`JvmA0ABD?+W* zyVN%#umMlf*0q7AV@JuEj&Cn>87_0w%@TC)GY&1XmnKa4bI*l9!v*g%ubf*IS1G+y zX%Sxs5c)p%SVDIc-@_y?G`1?R{bWzhEGS{F|EpiE`Q0%A{>#B*b> z$%NJHK?urR2tOwNFj*XaA+xGg$d}o4J?&T7&`M8LpBMyLelbdG2c~!RV1u?`HMU$H ziaiJgwsFC=r6dUdC8wrrlnJ-di*=9U&gX#ZH7yI_%E0vER#}N|{Lp%q#YY4v#IKBoejV1&o zUyp4aeOdTs*I;o~$`j#}x3}wt_o1wom7hcp%|~hU(X@GVmr&RU;chDA(c(13D-0nq z9v`V!;(eUo)Y8KqFKEmH^4yI1JG0F)3Y+u-VW4`^Q-3_7_qVIOLJrm%|MRAwXVi(_ zdvR1e$7~_fz1k_~u7#UPo=UyUws1c8y-0C9=`{AVcDl-=ZPCO*&j8_{-Aj1kG?K=0 zazbTd&X3uEN2=n_c+@-a|D-JtPB-#?LIZM5iSqhRF^biCO#eV%8fg3+AJhBrj!9%H&ONJ53K<`<&KSpU9ZdG6&|TCOS$e30HeLjegx zbtJ23)|^(!V`M&@82-XB?5O&C>kZz1Z;Dn*(no6}Yo*vOp8{ zXY)xOH=PL-!}#Zi-NHajm-ODWP*#O7&aZei5Gx@LKkdegH+q9=%0f%kR7^Z7 z9+~MS#f|(2;_JhpU$nmAmOSW4g0cI}c^Z%Ei9X;$)NLH2?LkoWv+eILwF~C?CWROd zQ5pQwa^gIo+xSUn&1Otww*vYuH>+Dkgiy9#{S`_s7yMQ=rTm+euT`W|3fqR0V7}UW zbBD9|GmiMj69AAeh)f~MXFKA(R=+bh_K8|qj_{XTh|u?Q$`wiqS-@|pF&qdA*svBXN+?HeJ!y%%)R$mioBwUFqO!SUe_ zkH?xn)#_crHx+ua?6(Hn|MY>IwmF2iG?ienUL2QHzAx^G*+VvPvliyq!9w8+)gXhx z53$M(hPaq&JP6a9b60l54=mCi)o5n$)U4_ZUkDz;f@ug~bQV|6Dm;TIRLTgLpJf}! zEr5_;|AYq%j;PH%zWMz;$_lWdN29tePwV=jXo!zZT10&IgzIq=ps*p|V>|QT>|;h% zz(;yIVjl~x(Md$4-$*gaKLfstj*Y;=ZY{yf{A`X?Cys&f*M&DaHPS&WG`z(Ow{59?AA`S`Duj+*Hnb#`-U6dX zza&a-$|JXw^*P9v>C))LrZSbM*ZWVp2csp5`{Njh>2EC0A!5{re)X&Wwel;-XRNo7 zC4N2T@;)*KlqW{d{^MCFcz)081U=ZFp zVg_n$?#tHWwoDGGOL*yBn|!S#g5&)iBJQ1x7J2cc9lL|wi_!k4r5wzqWcI==q!}AsMccguS}F-fM`7&LpnNFq7Tp=!#M8ohrfR$})>( z>BRfeN>yfbS;_TJiELUK4F&$?xTOao_19LL&D<<^nt>j1C^qnl#6WuwicarsttpIU zfU~T*KjF$FQNzo|boyU0QaF^_As?G73OB_?aL?S+vT0)9d^nZkUa9>A`QD~fi6Pe7 z%*rtLZPtx;FfrDCP=av%Td2cQaN{^3)FVQXoHEFN@|pw#_8o=gCj2|lNtR}& zT9433K1dxpp5tYV6rf6_Ee7rTQuICR)`or6>_qG_>C~YV&&H;kfgs<}HO(jI;~5$1 zNerK0M!8e6qcW+VG=XndpiowzC@NvaCS< zd%zYUQ>ax*@rVoS;v%ybWrv)2TAbhK}pSEYJRD0UhAHC}5Sj+4-%0aaS%8i28gj#8EVtgXz_g*NFn`j)IopHtwZ zqs>Ab5jvdHy%x$$tAbmhkfNTQUt)|9=dbL7sV{3TCqi3EoIu1^ zD2Zk>Lw`TwFeh5^WHC3xGe%n`LK77ci&C*x5wO}>m=zcwA-(NJ63~p0F{D1mu|kR_ zt0$Y!>>=ao%|u-WqiN^xPL+U&SxGQkUu%%5%Z%ZXm#oaH1~K)A#R_Fl&DcUWUMUJEM*3MGC4Ai>CE9=_pu*^GJqC|EoM_|9UZCF;-k=tyS@bk&* zKHKnO6(q**?aqT6hfJ`jopWe+RgilaEbHH~#_E0jX2D0lo#>~X%xD%RqNPp}@Z)I; zc%v+$K}W<;3{C&>DdkI5Ly!8-m=CAeGPLTrmX#Pr;rvIV#HIan%Wd|mpHl(gkTPC- zv~JEEpQCWVlu+t6;78IRGwVAgG%DyuUNi;}YtR9|UA@o31uTk&35=dZpMmfJ@ht4v1PL ztn>(US53^c+rk!icoM#_;ECXh4$tAy;%WbjIfI`&($eYz|rn-BG!7-1}P8UqBZTZw6EXE=b ziy1)k0$L+@1JG+B=RvSF5M9o<*4NiGpBfbz@|Tj%lbJ)5ZEtm3)?__MjA+! zcfJlBs$WHgVYqVY25_zzYZ=6&k53F4V1ACOeWV=eK~A-Z2>`@m*IUe`iJUG~bB{tDM*j2RiXMzWy}g7G75pmK!(Z;EHIoT&-ToDB|Vy=@v%PO93ToHTc3E)8<&coa9C^q z$jPlnNIKYju}O=JO-;8go3bI6teOa z7I-z(o4-R|=k6jVZr$*TQ{tT{dDe4ITCynHtdsqaAAkp^jT($HOQ1`+$Q%a5EJ31m zvl&@*$kZA~R*J6Fe23&B_Z2vCd?A4&#@F{cGKMzVI-UWuVI&vq(=VaJJCH4Y8Qxh` zzZzlMau-(WCb~a3tZ``&{aK*ms66q*gkDTCg{ujtm1YFQoRQ+}lskZPJ`?f~w$*Jt zIPf$g`Ks*GBj6WiZ%~V_4EN*7TuY-dt0q9_u&^A;s%^8p|mY4OXgXYL*VRtDCo zbb|0%aeXvTXAanvrA4>OS(?PGPuE*&^{JiIOwmA<5D{p^Wpeibx;1}p$ar$W~EaomTaoGhsX;ih$*2`0+8(=d{K+0ndmYDj6vWkN-?G1W=CayG{i@jXfA zMfIQMVvDeHj^1$}ProkhWBC(vkp|5?2_e7Ad`&~(C)5C8X0gX5+LfsRkho6N_xi^B z!RkebKi3x-k}BgjV!SvE-c!jYr}F!VoLsx=cZ4ug4!rQaMGyPP5Mf7nHy>HUyazlI zHFv??OWxxV0RNlr&ON^C2Z0x^g`Q#bgt2+x4q!OE~pw$?Mk6 zmIPYQ1qhw3n}RgL4GFT-q}$Ffz1%6kmGxdFL@5V1CJb1Q+JrI5IwraaRWTEcH7^Ds z>h$=cV@g6FF$;05x=Kb;PvVsCV z5CPuOB^m4m)Ijq+S!#1Z!yhCdkVK4C{Sl=z5FEDS`BxiDro;thmcso+d|Re)x)rW2*NmWV6lJE!`(KcS$>l{rMkKV#l`NHO8NrA`SJ$FG1ao1 z9~7q(-q-4#d?=S~$*L@h5FY`!3Wuev!{$2z3`M7SZgyLtelxtWII{PX{3AUM;9R!# zkcu`>*fM+Jc23w(REjeD(xKF79`UzV(az z-j2CJtb|lCrqQS>5-fCA!*{7V;GnV;!uJY`B{b55bEL<2mDHe}g*U+Okt9xpjFQTi zBy!mul?tGI0M4pP5E+6937E7q5ZejRn!jq%@Vd^bH*-fu)iFwulm|3$tCf(ZWGeX? zpKLiOs-jFCp+>~`vhGZZSOadMvG~Si40Qi&W$}WJe@v>+N&;>#0n@ zfdi0RUkZy~8cjbAEKkZpF(RxeEg>Zd_Pn|PE1)b+>?up2=L_jIFE`0+0(~WU**pJz zMJBnEp=NgZx1doJ{=W)W;VPR%2Ob76_U}<2%p9@p^Q-;EIe)#*^$qv)EU8buQ*_jx zP8nUPH)CW(UgKaRx9Uuni9d7}4gW^RwMpf4MUHO7vHSB;janu8+_YKjN1j#CG}&!z zpP1N9We*0TfM)$Wdwp;UW7OBkrcpw$48whAU=;N^?}*QD^}lWy&c+|VvxZz=J^lsb z(y4D$X|VpE0IdyD@}(DXwgM>pnE5KM5Sb|nii?@^vR7-*l}d>)u8Iqv=~sXNzHbtS zq&WD&JCw!_j&MM7K$+f7BQZfjF^g8TX&I*&G=SyfO|;ovZhQcN9WZDw;rv5)iDt6# zMI!Fbhp0*l+l@pX$HQgf$wQLs6m?CQNS0xN3nHUhQ4b1~P8l1)r4sDo)oqlLFW)%| zwXjXI?l3y=iBS<1IIO8S$HW5_yo4}telj`L-R&Y5J9?z1jINjr3SmKVw87EFL9@CA2h_{C=AK+xD7G-E1Z5aXnSiT-8&H(W?YGy{SONqL zU|1M=r5>4QC_UPPCn-)3zb!%?cQUZ2qcmncHq!!7s;ln+a^M`0WfmhYTkfMtvmXpr zV{cg!8fL+jU}y;(nW=yyF*j*=|V8R>334TnQvL(Of` z!mAY4sOjZKO<%UYjRCdpx|g)Viux+ z!;%e*!tnnZ7dh64Bd(8kE5gJBEmeXocVOeYxGtQMT36A=oHH+$iC@WmEyWVPFU~b^ zE|e9#qJc<9RZN2rJ4g4K$0Uu9&ypS1xA3O2w8R_lQy9G;64!ek#LgVB;iZTWQ;|q zSgsNrKA)=QXJT0-u54MiGg`3zk&iwoUqmikBQ| z|07K)!;&o%!9%wU)Y%r#XbBHGlE`8Cx{i6X8-YA!dK#@F7^2meEs+7a~kJ5PK7m8em!A?1>L1jLNbB zyv`2{#K8VV84z*hoPLIRsy@F##f)Se4Jn+mvRsJCXpG=aY`>|41?*B)oqs+8?64Fn zkivEpt=?;s5TZD=$7@SZT6qlpLji$SIkm$c1;Yk^c!M^@41((o2wgx$$rQ)6!M;(*H(ey zzmzbzAp)?~9!F$VxRDmadyxi$UnxH zEa6>N8e{_IG@$j?sxk3@&Bn#y+#;mHQvPU}1s52~1Wf0a&k=5`UIcx3yrDgn!g06w zb_wqO$sxIn@70vYW8|3V5O{1;vpe(7vJ(c@)}5L4$V1xbw*==AZr+xf*5M3vr;sfy zlEjF=(@~0~%?k`@Mti`ccchBM8-*^Jp#HWtYDzoaQzw&$9-%(?E=^W*1;LJh!ELMU3CLxm-EatJ>6ls?bL6S~LR9nRCQ^ljB z%MVvmLC9%miomM#=Lo+UO!vtJnpTYzW;D{sHWE#9@uMZhO;JLzK|{{PL|&350tl7p z1qyfp8-t@cwtt6gIEzY1+6yRziZSpf3Z*xpDToJofT@9_UG>WBp&-fvD1!2d|BL{m zM&~DbWjh%I;|k%ff)3=eo7{|{t$Vvq6jAxjo*YRQP^r=|wARjilL|}6XG4J!b#Tj zfPOd>j7+q}PhR%#h%evtz(Udj;dhNbz z61bqUOFqcdk*e1tA|~xoE_@HX`IiyI6bqTPwK~i3Hvet;a-i0(7uI*7Pdpb2x^p72 z4&aftj8tE+RY?hU z1v%qO^2K^hDqN+O(BQaOI^U{{6A#M%+5>rIEC@2xKG7V~rH!RLf@u5ChHsE9C7dWJ zE-y`zb0XBlf;%DsGf&j$=rlThq2p1WS97cZ@2xkwp5R}I7dt9TNy=RDe_~;H()`aG zOFEi^2pTQ@X4t%Uye7ATh?Ptum`pB{Tda6IBfFCWo$>qb*4VS$_Xw*Xb0OSXYNY`# zM)CW>&Oqu#2Dc0Hj{@TXLnx1c*j=`SI5271Z5R&G^j`QtmxeWEcL@=0!`grn`78Hp zn-|V<0Yu(4lLh1KGzJjEQKMXOa|fk?BwjJJgN#fqwn)a@Y*$f1K{9#kHX69C1bx<_ zQB8tGWIJZaB8^h6A=qqvGEGf{Ms&J38nGJ9|Db>hIwE+pJ;n0lwEN(jbyXr z76~61LIc^dwnr^IP?jdc%EWLU2o`VeTLPnQ;oCRL=P>A;;H8~f{_QLV__6F5=vk08 zpdL6t`&;c0FyX#fUcEd9A=^*UYPI8qI8hcu^z* zEcZsLGP>G+0U|nuf{hw-02BfQ*8;)$=B@)~3`Aj2zDCRKz*bW-XoQrX9Rbqyfg#j` zR5}0#CoTaYbDWjsBJ7kr)~7B*sVfv2Csi8}}qzJW#rqH={>|J&h&o%4XyD!o_VKrm6( z&#nxG<~BiqH+A@MkD$Dfh6AEGW(*_xMEaTnvI%HiWDBFHo3S+uUfaUKxgsedB8PVO z=Vld@3xh1Wr7&TKYlrNB8v3y`30uV~UxHTYI|QeTEGzSQpsX?D0j^@w2T^ne9WUC*msEyQOU+E2)ttHfc-o6JRUfumPd zaYND|yH(Y+U5l`mSC?xhwoJB9G95Y*FS3ZznZ>Z_fpjly5v;7qH+BkEF~(+Y_X))y z>Z7r3angQB<>oB8om z!mnLJ5K|myZOHPM(X|}mIjaI3S|&gSFv;etLE$KLeA^?(ijcUhAs{GGlmW(qxir_K zsA;4Pl^fW}ohBjNGXmyn>Fl?ZCz=ug#&g8T2m=Y}`4iI~@mfed1CpMtC20lyn{<)-WWTt#kY4I^o(eaX3L+J9T{nP+GBF3d1NBWGy$CuR_s*LBcQ^LbOJiL(+5P4s8}lcqh? z$uXam*lL+3;&PxuJ;n_COs0x~f(0)cD7njmn;ohf=!E9qhy~=6q}|-9owj?TO+dXC z-4Rb2rG#ZKm+m(9L3_h7_Q}(hIu1EfV6SqrFq|^C*KunaD*4n)gha#>-jT{U*xAWz zP}m1N?Wh6(Ea}N46y#NuGczb=U(zoun)4?IBje;al}MiL7=|q5$)afBmPCozJlIG& h1{iKYDIA5bqxNz \ No newline at end of file diff --git a/magento/setup/pub/fonts/opensans/semibold/opensans-600.ttf b/magento/setup/pub/fonts/opensans/semibold/opensans-600.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b3290843a7a3e621867b169c8487de9a8c7a8054 GIT binary patch literal 39476 zcmeFa33yahwm-V}8EQ&psH7@$NL4BWkO4?YLKuq-5atYk2_S~S5Tk&Cf{2L7B$LP> zLO`?;5mB)~1R4=VL~)=IZ99#KjjcElhpWi7AvwI?+NUZ5L)-WJ-}k-meeV%=om1!R zaqYF&wAb3jIAbgf9}4T-uix+?6K;9tZ;bJtcpBTku&5u8#T&*e@ZH(JWLSCnw1|9s zzn3xd=Kkd)@}C<2@MgvWBJqCvu<}lsfBIncVtjuC->W7}9(U)ysdpS=%<5!Jk|xZ! z+u3oNVF_bFiFn_$`p!v{mj&F{7vHN;->OODrr(L@A&f;_z|}PAj#d+(H^B@A}eXUOlIGH&v%_g;8%BEI9j^3+w$_mxwn(_(G7u z;PIWaACUk}eA7!>*l;$UDTVz84`+LM_j&XNSVZB9OcIAqwi^~1c zJ-_|dX;YZVS39+(w`5}6G)>f2#olA@@kjYOegWx{R3U9c`n&YGv`r3?D&z-{_9%Z* z8kI(AoBE^SEB>f4+}Pe&hBOg(Gmz+ed*d6%GE;X`cjF9Gchq;OJ@+LkMaYe9;(Y^g2b?Esz)`cZrxr^np4lEC;J5o<( zXN6aGvVK<1;oXV98hNSVyExq^?N0XusQ)dX|TL-I01CEy44(NRJ_{LwX!(JyIRgM&#Xu z^aRpoq$iR82%aCsm7}(uXhTJv7Nlgn?}(JnEoiSE?bVC+@{p@LlHOK5+Nwue^=PXe zZPlZ#dbH)QyI$1&De60e6vl#4(uS0X9Jv@_-jxQ_*1&q;drw?@Aw7iq`A7?p79uS| zT8#80-W^3cjq;x(S)2Rl@81&Sx>0|Q;2ptnHp&HKyf&l+-~;vKMlGI3p3jkD0F^O- z%9v|f%th&L=u;l9-I01?O#iMI8e*3TKSlj#kOEn-c9GeT5-~Rf z867HhfJz;pQU|Ei0V;KXN*z0me4iur6Qc?d@b!xG%?bIIbgb9f{Fb;97}Zj6xcXGzRHrv~!~s@$bgJ1@%6S_O~KEgR~9lS)}bq z&*9w;r00=dKzb2r57H}0dy)1b?MFI*^eXyv5a~6fLrAZqPXx!e@U9+x`#X|<_5uKz zddzn{;7Qok05~=Pjtzig1K`*II1*OXW3DlS$X$orbw2Fai8*h;N@&0;Xuv9H0Q~9! zzk0y09`LIN{2Bni2EeZY@T&*>8UVj~z^?)DYXJPH)tzW{CtBT!R(GP+ooIC@aHRnl z+kh3+fECn$71V$g)PNP#0IE_CSk(ho^?+49U{w!T)dN=bfK@$URS#Iz16K8bRXt!; z4_MU$R`q~YJz!N2Sk(ho4S-bxVATLvH2_WxfKxq2T!#_Yv0hiLhlST*c_DK3L+X!I zj5H9XTj*t-k6zaK=;cm9FKd|&y|J_^= z%oI?822gEdDyOhu8|1%2wkqm#t;%SvOY4o&xr7Vb7w*9qdIm zknP6bP_~EdWy8R6_oKfD@K?@WXNMtufmWl|qxh>}_3Sg${yF|`@kvk?Hj34>k zqA~Ix0J8z;d4sqPX6FIdVeET+4n|Incd{}@ssNl7wNA}KHSzjYKFO;2MTnXKMuTip zBuP2Tq@O&@IT~%Xr`~qyTV8+`0xv6uYONaL_C%@H$@r7>PAOCO;^IWBBnay%7VXi$ zMm(WA(hSbx+7S=Q|U9O#c6j&JKH%EoXO5k&hE}a=Pk~= zoiDf&&a%sjfESf=vZqk0thp3(hBzagvA$AyZAx*Hhp+s0<;yE?URibJt}8<{*7QSD z!`XMwzIFES**DIKjEdX6ss&;D`9`1+u6C0UwM z>wkDDE2_b0GFt+yfkD9`w$L!UBRnE9Dmo@Mu3fy-mEcZHN=|9tp<`-VdPb+tT{5$} zX6NK~%j@2wXRqFUJbm*Epk?(h9x!mw;2}eYm6Vp14<9k|ri#i@qsQDl_Liz~Y|-K+ z%hs&l{PdQs+n#y$x#xGh@Zw85y}Mq1WzXLI`wqVP+95V=;;py+i_=PnNy$snH@g*)i?kA^852_*6GjL zg5~p9EM58Nsz)AM$JTCoV&j`{AG?dOckXLF)|UHU*c%LqaKvC#${5q^rio4K)Z+Inn8Tqr|HukMb%-qbpo)SIp81r?;e}!sYc;#yGv* z=&oC3rPCWwG;X4|J$(%*a(X+{O=rsSMoERU+PQS;IH%WAQc;B`PI_mdyBxa9sfwwp ztgMXjvee2-x0jVv+*(J0T9I-T7{(m$~!Dc^@2)#=J_$bgv=JNj;K^CU|+#_^LwD38VgyrMh>S zl%y(W(Ngy~0-6{jiy=68oiS+5-<(%Ya*r$23!Bn*scMmzk1I^~n$u99)9E!A3?vZX z#+_g3wa~XRe6!$Ny4RBC+^?|l^f3Vqc>@ZnoJ*?!d-ONm8;~|=c*QOwFRV=T2Hxtv zH{EMZ8&p~`s9b*-3H= zoK#Y=ivu#4iu|R3E1ETTbh%N?e;=d2ry^34cw32K^hf9WR{?%4Aln7Ag&RXJ@Uq^! zIp+f0LFkKGG`xa&t?qnh73zH@Fpz`)E6I~O|Xgb)jv#CZKJ)y3saW6VseM1^y(ZVaS11&H@0m ziY8zjuHM9su5@p5nl~xcn*_{D0h09xZun8pJ+7PExpYLu)ekYl>E8Cu@Z{m%l#X8R z=q$k3q4jXvzUr9f%oe>#O=DhJ$8W3>e|vPx!uJSTQrO$wZC6L`K(Ep;2K2z6s|pA- zu3Ne{JuM@mXSz4zI&U%a6Of}5fXBj&R1D@v`KUoiQ&< z$#QgMKCNsMC;hmZRuN0p$&^%3HPP*r3&u^v;*|=<#o)fG5-S1O#-U-5 zLwCP%-D2FRryqKci>M1#=vAQw5CnVyOj5ln=2WG!C^rsSl0@zJ1o4Y;yDD31#O!6# zc${cMP4dGgY{om2g9+Em&-&D$k)DW;s}b}5kmnuY=F3~w^p?;#*U z_~Hkk7r5XCs%8Ll^*;8*Y6LZFMlAmj{}^-n|Id(xphIi5r@LE>tJTE0Dt$faMML(3 zt~ZU+MewDL_m3~w41i01~+`+^Q|dzd#JdGgb|op322*c1VJ z&VC@{erObeFkr5Df9k8croxwxwmScAvi@MT<@H>)}K zc={r8PY`#Md!o3bthc6lyEbR7rY|DvBymSsYs4L8y)Dg~-JG?SzKE>1i#y7Chq$Ax zlhabYrdz#oV#&QkzSD{FLUVu=9Sk9*5F+hFbp#}OBg+8m?bLI(QHlK_bC*H=tmkf7 z!Y$h+(_@t$?=~9Z8hh^M^gPSvvL(4}u0qMFCGz!JjXL7e^M%TB)Gxs{@Fm{~`A|kH z?L0BmW+@QOT7Yc;xtz(eLoQ5o+d`DERPL5tylYNYX1K#{a3>`5={vh}hxU)5#r+2l z>DPZ4KPX?i^v=K`CH?!Cmx#LMZPM?eZXpDb6u6}BflV-;_45>1Es`lXBv3XolW|m#L1L;b zLH6gB0o-i17ARbj0wusLzFk}_%EUxRMMj|OVYcRfk!aH8K$Br^O4+V37gCm-MajXl z@c2wF57JJS>@NAeWar>ZJSI>3ohOy-DQPU(S<=|VF6CX4tF^DTYh(EqO51ttcD_v; zMQOYC6*grsxT#l`C@F?e=7c_+&U$&e+qojAc1%i)i;a#7G+QLaL_L@DnIcQFBGq85 zoJpKCK)Doi5X1^?QFfbMwWo5s!RT;jC#Ph$;}N!$44&OJCpS9_nv5|y#TLvO^P{T{hM)Ra zDgL-)9_KUS`@A%7>F%)Y&lm^o>uuH6#tqoAp!*=Vb~r}*GH-Aa&$SLjr=Z0ShX%1q zeIHf_J8S?QFs_+{yip|;p7uacl^NAB$R=T5V>GZyF1MH^S+*B2MKP3{xWV8s6vlWu zU!Bz=CQcN)5d)Xj_;&F(DBtAplco56{Z9g}4(8szA%^5LagS zbsw6!oAZe7`3n~0cjs?D^QZOC@;*;I$1nECpFcmp2Y++hlk2y0Pu=rced8x@%Bc!_ zY&B2eDXZ6f{moCG^LKw}{PeN4yaP{q^s%qM{^1||-3HlpX`s-*Wma{iLH!Q!2mm}X z*$huuVx%m~tYcDekizA3j*omDKnVnxax5>5PnMN(l`BeMfdP`S?_L3DoNY6e0&sdB zwVbJ{LoEa-0&8sb0rp~Ug?# z^0De~mVd2XQfBwLvyW$LQQx7Zm;d{AKC5u%;PJDM&p%Q%bwk;D@AIps9k^NBeftUR ztCzJitIEnhB^tI+-o_^jIuPk`U|_sd!e~JPa8FBL)|b9m_WFv)3zRF<4oZVjE|7(K zf`JvR6pyXEFg#4MrG|xs=4KfrhdngHoh+4YTz!1m+On_3m3GU zKkwjgQ(e7KS8j7%)CZz+Os|WFNJe)~Xm(dAB`Z8s%H6p7{iSQxE;~+@Y5&r?Z-12^ zyYL%7`Pxfb7t}RSs#WX;J8WVJp7=m(fW>SA6~o%)fvgX@i5E1qAQmJAgTf?5sA0wc zo)VUn3kvmA2R<)WTi@``w#SZtqt&_jy&Vj8?V&qP#cA)}&dao&xAWY%Q+MzObQn~z zFO@FJ5#UvlCjm4;m4<+PDx9etHZVz2OPMOEMS`S-7#yh_6wC&S?{L}N{6}pXe`F6| zsok|lnzfrq|8A{TueT5A*e2|A8d#hs8e`%-AD@g5@xht1qR>!)ImsZq0cgId^MfxI zC45tVKs(KYzSZj}=7*($(h|%e)jiK} z)a9V2v!6>Yb+5iiCE5*8^3>yKH$w0_Sr#p09ZC`mjf^>1VPaxp0`a;K$&KEGgl1)i za`9;sPn5jh8ZR{dcKNr)roh>Y7tfiqc=2rMv^HORgg?OV;`8}b?LqAk?Gu>36wr=j zZqzi<=Q{M+iauLdv?s!3RA8ASh!dj~U5^aG*j;X0*W4g(OyOCw^}H#f;Pn}N=UcM( zxe1ZoH$KM8F!oX4fq9@aF)ZEFF^F?1Do~O+SgQ>7fv?SkMJyJ;Br>TzG4BpMoA;J< z(qK&K%>^+C;=$bEQt}#IeAcs*GiTm5{E10(@B8|p4=(m!^SmbQ-OXn|zw&|N3DbI) zZk#molRXo5zxJn#7BL>|t|;l~M>6Z<>6yS4)x~86OF)tX(F-dOO3laoOI!vAP!vJ7 z0BGQdAJA@BVqyovSmJ2yK&cd00&%sh%p7zxm1k!;{oTz0MOUOPYrJ0VZ`u#PK6~?r zRXesHcxUcBKK8zu<#o4Bf0tX%{H|0l`?J#&{?e+C&kZ}7k@>)ad#1ep%h>8pg9LQLqW z+vc{pvU!#*%Y}Jz8;o3;eDqw?L}}BxquNM|DYmEf81JJU=6zm~-)=1CQ{S4CKep*- z0k3-iFNia+#TIxx(GE#wb~Auw0tZVH1xAium!sDXr7$WoJ}xpb3X3Sz?K0UxrCpg34&q00mJjI|L`O*# zlk83q9BQoe>XgBQC!TMxSUc^Q{?6yxmCv8}b`IBO&7VDc@Ph+4NK@rewzt9?weL$S zFP!{Z`|WY=y0~f81CRE-tH+AN)Njya%xy2oh6a}Cae+3{>cVqfmPP+{Q4p^UHk*Q# zMs(7FAxQa6Ci&N zC@GP%#Lh{bW1_4U7S6*BG(!+IRe{#vvLvJl9xRivLipVY%$X+`9CnCtf@Mp^AO52K z^1>?Z;+H>amzHc=H0@Hq)pO>pT(Br^!QDJ?;(ckuC*C_@w)*btPkpg)jQMWcSo3U%R}!X8O$P(nWcJ-IvLICXDD>R?sQ?o}nWq(0C-;2~~12r;*r|!JIQlq1s?V^&RlW0y8FsD3(5$0hapx}PT%m=3A|JqJrtmWF_N$)!L{NiMop zr6ShLk*eh*jlJX}a-Wx9*6!L3-I>PKx*rA^{RlHtM|hQVrpYazZ0y9h@J_tqh!#0Z zD?>j*u6!v^7Q82!<#}>~0HZ*3M8dKF@j`EE{F4IwA<LHfR`mkl5P&>ECJvg_t z$7WFnZZs$m$djS5U@Om}Sh!My82~3RC~P#Q#%M6!1afRDhY|vEY_SM!IM@Q=Jk4JK zgSK$lGWx~^Nl*{&-7_yY$(@uWR*=wG#Hva0FCGXP;SsXKE+~VP=uS{12i90-uEXGV zG6*4wS(!>G$NR8cBBh2yqn^Hf*xhz(mq$lE{p#;02miS^yk^+V%QfxUPqd@kcn(iE z^Ycgl4LM}|S-#@(DPI2S<;H!7L#=&^A6zMYx$=hv!;6Ow{pjVta2^w>b&7oIgU!!# zdAV2n^WU}4wPT~Uj^r!(tz6}g|9y}4vi9tEJn1Lf4#F9UKGcEgL11Dq>+DIl63D>6 z6yTEr;Y5o#n9Qr+u4^x%$gOWgCTkN!g*b<4C#W14noU8dg;Z$8du zfzF=5`iNvX9+(f99Bu|aSs??|6>L3{N2*{NK9MuWH}hR- z<|B+5T<-LjhA-=H-Z}P#Pqo*z?a%U_pPW53a^N$HrhTSe(SFq$lH!i{)cGse84DwWp=P%cqHkpbfbZZ3M9Po+QkX0{af>C4MWCs`>@d zW)+1Rf_fs7+}LGPN6d@b1@jWkx_fd1K`BAGHf?%m&OKmYdi-3zpn za#T}7Y9e34tNA#-vf`aG?b9pT1?{^yKFbF`HDAEb>50QANhYl%F~eE_+##i=8E!O6 zNT6iS%Tn`yZW{a3Ptum3r8P~^t($g8BQXv!AKZ)jWTxxdRE=1TVg(6Z8}h5|@K2-` z!MZq6tKmD4-^x-viO?)Db3!tJ%!k@4Xh9R2noS^!R&G^-Q^R!LpN(4V2GjWb;l1Db z`4g=s>Rre0>XJ)y&;H==hZ=`^gIK&LHVF1Dn1Xmd31Zd);;I;!-4>>6Cfq27m6OX| zFdW5c=e6t=Km9a*9ACymw0Ya4b<>;9V2J(hoytGfdcW?kUx`8es=#cR1xRL>%335n zxU>jKk4Ecq9R5kVUEO;*0!B{(Bf}PywX;s3<>0`OeriYtmrBWKXe}@qRe%Dt15MeP z-A+>wW;2IFY;=b@NDJUuoaUlyXfE{3JgvfHJH<=+Is-Un+1CMzNgJRX)qei5DG!a_ zqb$2LQ2KZ>ADeW!mw(RZqkWsu=|LGlI&08o@$Jy6$VLUXesxT{psu>J|}KmJekUFITIL!YhnUG-yaqxNU* z73~Qygh9L?pLluer+@q8RQ)IQr=>G^cQ-J*7Jm!08Csq8i}oG2a~nVxu6+;S2^yp< z!B{OUjOiiJi(yRz7OSHdg=hy$lpW&h0)|4`L z{|j|bZ<8C(T_ChLtA#)K@B{Z#TeGySV!XkSH9C4yFoh7=3E;Q;n-g+Lv)GuJ=n^JX zSbsQX_WI+0|4lwtJES$F+z<#CwY3Aa#k~06KtiX*7Qn#-BLnzmC|4Qv4U7wR>q?q@ zVh+t#YqQzxFgqNs&_rTd&7g?l0yK^g6&>c@ZO^XT^7Q7P_!B$^E9EQxg!Z$xMGm_E zzWeWJ8q>62-TT+SX+PcFG)pSRTyQoK{K*PBm`JvR2++Yu16UKO0y1>C@5O z9d%=fU2(Tk&4tlfFeVa4ga*@2Qmoq7zyH2@;uqr{S$zMS$F_3i^hX~KKC8wqBQ zOQl4ANYvNqAdw5Af)Hq3(t)3}GG!3bcgJZf1LgMs-+PF41zJkxIDH$#KN{q*F`GLq zQ4LMypj`@PTu`y_EN2u~do0ubwGRON=;!S_Iozrmhi>_GK6f_CI~ymw@&cbAZ=^Qx z4|@AYi_dT9D z_*iGuX=Thv^dOd@-;p6InN9M^meN8i!y`iR!VXeEq7zI+vMT`l6J+kq4WnxgE(U|v z_;Hhrh@*dG#GVA7nOel0K6@ZG7SQ6C*zA zE01j4HuHy-XJk@@MAU5Zm(sY6pwKl~1&eiMuJL>XWpyc&X`p*BE}Dg_zfE@>UL%X~M1nuy|A=OhMk0nx;|Bu}LWgvh z)`8bk?1y&HaLIdVlBfgbls~djh5<=_l$>Xp{^2)KqK+)I4Jz(yo0^tKfI8?af&1Hz zK-;kMy0SP!!=GrWYt#+ie;H6dPKr=ELFX|LE~x@Pfk*)I?dXx(7N`_ z;^*Gfp4N^_5%RN*mD1iOSW_SyG-`+C=~s%;hX@ZvLbS0C!yXD<4!w}4H!hK9YKIX` zgpSrKr{ofY3v-gamv*(VJ_dPHpk-OH9Q9tnIv(S(5TI*GHW^pxF{7xNneDU@0QAmw zVdXfa-9;aF=CT4MiiK_^~B48)xzFPnjDN-2Buyos|i-EKwklj3!-49$AOJRmf(y{ zj!PzWHVJkIn+4)$vnH35leen>Qf5vs4&4@p5qV4}Q^}UOPw&&X^7@3D5u1t! zkNVp!AJ;csdT`?-+a9l|yLEu~PtWf(8G6*-mYJ}3%u~-GnXyoNYNYVQkPY22;UpJpDW1o#O z`$rn>uyYn0ZI5@vhhn2iY;mY8jE7msv=u6h;VEt-NuyAvvT`C|fAraYLZmY%zWM&c zkM0gh^`19LmOGz#WRCRUsyXwNYVh&@0);*K_T-&Y5DLx8zyfUc2C#u^4xVQLjR5Y!AU9j9OuG)ZFrAV!~)^wwpt!ws|PzboYF z(kj1#y`-!2V`_C|)Tb6hudMV$+X0)HsIYi@ye%X+DA0<1D3yisP)w5QQzav^l8MK; zQ{0A>Ozaeky+O>B6nEm=^B;aX&1!4d-yz_xjjI+&53jm^(L;8ghE0JG-sw*>i};#< zHLQB((9`=|C%x|;*ngPtkKmJsIkIB`z?Nu(6cLIElJfn?1*5pGdi!RIU9cp^aV&c1;xu70kja(7rDd9?o#8?vGz;D-o5)@yZ_$aHw`Npz=Pzc8mr`|rW6;y^;(DBu@fecI7U=e zvnxXZ%T)No7qA^V=7e!hbkk@`uz-BUa@bb#V?6W}mXm#H0660=h* zkZ&ADvTPe56_UlbhcI?y`v!(!pPjpT$2mgm#Opgc*p#LAf1G!Br(XSvM&ADAN1Y}`Ytc*Yf8*e!<-2d4dF$;HKe%;L^=(SoJh!_# z@AB?fwF6ySKqNQ(MEl5-E?kkzrz0O&cEEx-@ImzIuN=;`S^0& z^IqeG=8kYiuv{Yczq@+6C{SKuhl2$VW?CwS@+IlNq7DqFqkBPxko(0HC^N z;M+URBIx10FE1>-)u03O26;oV+~cs2WJn5C5Za+^8C9&4-~tnNerei$WV@X&6NfGM zdbvCa%^840!CbD%3eEWwrlqk%ib5-GNIg{nlT6d@2vd}50TPjoC( z1~*hyKRoyRewQ`lrQ6t*@{lgOr@#Hm`Ek`t=1M!}&e`>src+AUs$nB{mW?@fyr~mC zdwv&&s>4OO2V)ImQ}wY%!I6lD3Vf5{UqU_gp|@|G(Rv1mNZ01@v}=Az1(CzIOng;T zR_@bB1_Ib-k?14Sm&jvFX(XBZ@8plr67in!^$MA|RLB<}F6V|9 zLBun(_q9vfJU*Atev9A)*$MP^jewK0MRxL;+(baznD`9r2C z>y*zk?vWpKBjCgN^XPJM#fv+GCQn?v4#8CiFVS`7OUv?2?fE@o(A;>O@3j2Gj{60qN z<1N=VM6ydDd<5d#={|X3HmftxX)>??9st=z$jth(2#N5?F#uOC#26bGjN2fMT{~~# z+6NXKIsR?KiJE8nnxc<1nB>5k?a#lMbbQaTSG9!)Asz(bugj2%RsVXEf08yn`WgRP zk%{Mqu*db$T0pv>g~I<1Y!+WgC8aOmu2zr@EG3$FT1u=O!m|*o#cp!TQWBU!puIZB zwM&U%Ikr>*ID~Kp!42{??5iO>MC=^vk_6EPK`o?H{WBsmb5^``et*0*cb8IaIc?p) zrse4(Mm8ct4Wa$NU1ML}Z@auy*M!*Rc z)D!yS^|D|yg2}MZsJ^!_;6Y6k)#xK2@(&2WY#inW6M*%uSv@2<0>I88fn46>vUYjp z?swn*p=RpZWeux_R2+L>`nYN2+_}3xlu|D5q`u>yQjET1J$vGa`U+|+!$=K%O(x@X z01F5Uv%#JPgEWjlS!4y`e5*F*_b<9zP3B%-T+&7Wn=z!NcN&T7* zba}7a>@$)}A2U>Z$iy^e*q_WW5GmN{&c}pd@IK={>`yjeFGPr#W&_k_Z3VYBYTTkN z=Zm$A+D}k3FG|@`oHmEgZ~C(7eZE;6FJKB9IZ)sO)=Ds(w4iQ4bOBVb&XpP;lp#+I z$DG>aLU%$~7#ZGdE`o1w4){tw?+0@A`y$I`GI#!3(^BSX9}gXvUAUvD0|vKZ(TvYzjv}bJxtVe5fxMRlTWoY{b_9}smH?&vD%NqYIb!z%mb~K%lvR27~d$u+~9i=g) z!)EjyY(}v(pP@DY45np3OyOi`$L5xL69%K(+vP%AjLl)Qk@nKnl}*S9@e@jy12V1y ztO*O>0ZPDgwTp}ApE@;d(z$ch)4zG2#~*lo^vyhX)0(|%d6`!KPKq`0UG0;y;nF^7 z!}Fpakl*5^6>ucd>;+@mC)Yi^E zH+srHj?A4id!BvMYH1%IG=>{yEpS*<-r*g}%GJFac4}Wt9RB)N%?Tl@qiHY0q2yZVZaU$FM_DvElKVVVinTL`T#y|%mz;nkDx_PTeu0y zDam|b=ImY*9?zdqF~73wobI=+>N{unTxn0wUa#K~os`?V`=P1v?p*2zd|iOVJC(6Q zZy?JfL4lLyQD>x*-w_`MUzecWq;H|U!#lII^V~IPVDaF=#l=IUg^eb)+rXj21{4h! zG;kaE!$sKrW7!gqEhIovmQIHKz8O ze1cZQcoIO~@mARQT2-YEg91u?M`isXIYRA;6v&sPyRpL~G1TwAE;bVc=;YHgmu)(6 z?A^a?UO&Iz>YCNdA6+_V@l8MWP~SWj&m%8syq$B$7PZ&G9)}LUxw~Bw!3iq0G7>&c zajd_m5cCUECGjwbC2~G&HwIedGHtWyf*tmO;FCxif1nDULsAIw9Wrx)56AI1Gnu&r zCxk)|mIJiI1(??hTqq0JC+&XomBCx?JI+^V)ALKD3zvTxKlb3kFV%O;_Vz!0;f1}U zA51@Sq}_r$_rJi|!N2PBdk@%PjItG$lN7?V05ioxu;>sgxT72u5oQDK$@vygJWph( z#0l{*2wJ;>aYx97iS5&pLHfeF=BDIEVCo}sBaHAfGe#IwNEtV#l-{&T2C*%5l<$Ce!0}8!lYf zQ1`g>JFSma^u;Lj2J{5@O=N~#pmcieH_nr+=%YA9a~i+aiW!@n*X@RbA~~gGeroypd8-pTZpnHP}3^_?_mQg#T!NF<&FeRrMO0KOW*vUIbNX}#&A{HHp%64E95(wLHqUW*RmnW23`t!fyu7mb6s;j)ywY^_%0k@Sjma9d-#Dn2CURsFIbL zNPhmp$x5Cx_1-&X=RS}z{obReK6`8F!+mQT7aikc-=p-Vw&lYU+Lj};pW}(!cksk# zpVLl1yIuRo3yS4WkF43;&apY`zdrxlfA?FNtDO{Ov@P!))wX?jf{%K8hjwQB^W62^ zcAm6-oAw#e_B`yutWnhm4 zTsGq`?cXQCqp;A^H-P8>9J}DfElVcs4xoFg9<&9Cp^}-+!UPKhHkpj&z-NcCFsn;) zGGg&;_CzNPL(Tj8s@+H-XrNgXyYvTWD>W1i96VrH0pGCUhmYSF^%^(q+;aIJe~7oT z)UR)G-kj%qYt#8CZJWIKVeRN2Auhji$zWFuhW%K<|85UZF8B$ZyfxpNd}!IyLvK7>v7ur^^}vDEHO0j>%Dlx#-dMWq zwVT#g_N$rHe{i*ssU=p0$?2ke0lFsq5kb-*ra{Ms4;r>>B)C=>48~FuHyQ(tg;uLI z*cuFXe&Q0)XlVNqT!J)8H-}R}>wp<;ntW1Pzned<-G-nUO%qPD*q=qj%Qnav;p8Q3 z1?B+@fOX&o&}$*zW2YDoMHB`CmE0-%PI0#1;nnZ&Y6#{oXt9%lHau;NmattnJY?r()L31=GqOpF0mA1!AR3dD0fN>!$d@c3`-0mW7!{lJ!1_ za0{Z_SoJN@7Cy-_SSn0%yAs^(N$7_pw2QUaw@9d3%wk@4#T67hDSEMd!R!_vUR$x zlbjC0+p6$^|J85<&~5Az-1K3mX=~a_rp(aau~`3YZcoSSXA~6zJb#{VYt*&=m6@<(2a{g|L|0Ph$WKCMLO;C?pcXv<*Tx34@POn*JKQ$n$k`z|SuSPf zlGm5?9{%_DKmArJ)EW(Q|20p}3cYk0t`s^P7fN}2r%ZnJw5|o;C-`EE64_*@FN*@umt-^5&^@k0|db30JY#TR)HzKkF z;Y~ufblduXV;NJDvLyQfS+#YVQNg30MNu|sbZA=TohMP3#Cm}Tp8yXg8Azu~cu3;4 z*jXmJ%6-*toLdmLn|tVQc@;vJ@oq1&mDMe+tevjrrtGq zGO8@O9^W(b6f<@{RQ;m3v<=%y*xk-2X}z?%?L1ohdONR{BDB(Rd<-8uRx62axkdNE zyWl`$=%VfoNnk(rWFaZ+D`^|T5t7;LZ<)==zLv){?PKMh66^!ZMmQfy#&C|v;`{)! zWP*s!ObYpD^HLdBPV$U`eULAuVih2I%78e^&56w4H&ri}kiM z^tR{gZGTE_-z{%J+k-s=sBHs}g}f5OB^5ivM)=pl!9p@1AXqeRYH1wELVGWqCnv?n zMMsk1&)29qCKYW$EjHAs@6vd4^){ggVBBBJYnt}i4D22_ksR{GWOFO;$^)#?+!EmC zW;G#9GMQm=G#EgBVjw|f!{TBxm`$UDjgkRWff=Mx%xdN3fkAp_ES7+B77zdf47n>~ zsZqCLJbBkC2crPN&T0)TXMus>?bj_^=}8KKWS5tl**QJ6WBcSpSA0l#NI31$>%pP| zv>_x~0AF&onesa5{iGMd^8x4Jz(W}y*ib{981@c`*I{8*09AEI7Bc=NCpz1qh%cyu zG*sbbLZ*iZ9e+VhNns6Zh0fBlvg-SL-*Nk>?PX=3eQ@I2jw7dy?fp}W<)BaPx{~qZ z2MryYoBZ;W*Pk0Ot!C8Val_KNr`eoXzALLLz7#9 zF(^)~T^)|SuWGZF^+TKR;n3T}CME*&CDkw*p)jqQGW(jMc}hug#m7WB!df+fQTfi( zBb+d|X~V$Y89ABt^Aw;36+8?eotlnH_NE4@$K_nUdA5i|@x>(Y4bnW|Iv;u8V=HkO*mf|rHu{%XiqsA zH`M%5R%mt-Z=XUK;0Oz{g3?DxQKo2GKZnssBi1SDI=Dw~+xu4PKFoYyPj3f2pA9rI zMp~anZuDFCt{=e>7#J8H2xF`GXLbqPx=|Z5*igNVu%Q3j+IaiQzt9FWvB8`+Gh=(_hbfL&*w++S;FmZDMjZ<}K>8(i55OgnADdR>0IBa72;l}sXIlTzwiA&O zNH!0lC?_)Dx}1n~lHdkTL;&GVV@0^r)YYr`AwC)bPyf1blxJzjpOQim^t4`^D@{En z&D9obThS4-HsF{xN?%{z#qK3q-x~(f_OUzReDxUPNIf#>e0|PT&!?A!;cE zpCk7620c!SN(vKQHno9;;GwNxag4!jpQsv^D5^EWUS=}jY#lhxk+D{n@yS#yv=X=^ zMn|PVHiKsDjE{@Th|VCW1hmuFs~$U}<7=xnYT5f}12_kH8VnPZ{i>=7=TJ4OqJM4^ zC<|xvd5{vMtcTuVcp2hvdsxGB&BFc#rGUSy9hk$5`G7gvK3+6i+ov6zBYn*K&D9R@ zezUc`+WtAbAF_br%(}7%@hy$uelf5E^zd{GwFP5f@$DjTI)Y3=OISepkUKrtQt#7t z%)X8#cWf`Lxd`;pw+krbN8d(}yQXj$1Q2H$!C?%L^w6JA){b2<{vb#2&pR7OJu=~l zR?@V0+_FzjHEtOy4H~n|9|cspWbC7F@mUlIR5owS@^`dHzj(NDXHRbDwr}RkWj(a- zv0g-chL2wD5%j8?4~uhktcVG3!8QV~S_{t^e-sDlk^pTOTp`0^!(t;N;JzE`4ofl# zx#~uB&tO05bweuE_ZYE4{+H^0n=M1#y*)kJMLAlq*`#B$kZ_?XwBVcQd3;!WY)o_C z&8_;b^PSdksb%X?zc{JFk8MKA)NA$4DCZqg+^)Eo2!{_IdYu54aIVqr)mM<}ZV?e%$5VyVek z1-i&co1>^el%sIg-tJPl}%q> z&`zj(e?6-?9#}qiHiiM458`?x`0{3v<($r#g3CWAzi=*mcJwbWK9I$nUWcO>x`Bkc z0;e1d3z&m#O!E7UZuM69y;Bw)x5y|!af%AIAFg@@D~}b*Tv~^eNF2pMvATYRE1tK* zDMZk?{JT5Jx+jg_#P z<>|_*!^gK{U5R)IgNtO+QN&vdG1mrGuz|4#PjKf{$!v1KSZIebNxNGFp&TnWn-r57 ze&$!lN|;R8PxI@U1rTEqFkxwNkfBhH?yXC=4WDRR+9I4|^g1vTA_^gwnarkI)S#Fl zIov4v;@Xm!fVlSU+r@F-zDxTq={N>BE~Q-xObxLVh7lSFc1AMM^cy+p$+52(d(C6;YtaD$BT@%} z@IAWc<#x^N+$kfieXkC^t{R$6m*e!YHC#2e+TR%a=e1+&+B`Pji0H&bQ#s5IZ5Dr^ z7?RaLBz@NyEW7QZy?$A%7>-_pe|~fPMbQvSf&R3Bw3*^uTaZ>ht^3|RyX9ndPV0CT z09wthVbfLPe+O#$^Vg1_#-K-tnVBWPY#9yF%%lXgn&IZ|Tm=IU*%9P3*=S9p%W|!=)U2-#XJEgl3Asv>Gn2-<{ zN!tN^aC8f85z{6Sd7n_wPADByBKDB=o#b5F{tyvw)e;s^x#kPSJCnx;Z zgnR$_mkUkZEZn{Sg^|xsS$?Wu?BP|K@+fg%?eR!Ecsr z>(piAM(x+H=4##&g!fFIGH2|bjT=|Ztuh$KNw#In9$E`W{UW8U=5vvdp2 zs)5Y`{?-2YJ%fSb{MyD@k(V_IIoP@)a}ElTImcJx2AL~8?c(Ah!X+Muh{gn1|HES= zVnc$g)MJO_2#D5s>h=3Pqe}GI-R}QIeSRAlvB4A4-W?Bn(ba&?2!Q1XP&2fGw9yz; z0DEYgh&C)l9nz`7-bAIy-sA)I4RTj{oIX%@i0hD?bS<#005;(=#n-8Vj<>>(TF|lO z9*e)n#G~lsB65Qe5uH$Zjrzf=K@i#6c9-0;1Y&e(Wxn#2yFp&y1z|;2m-JLJ`Cg3| z)K&EL%Bv90|D@xx(B|G0>#jf}r>v5_K9iP?#8FT+K*Mm(2G$PPW=kMc42kQodXX*y zt5?g5N>6~QlGO`VI#uXNn_xqF2G36mLFBcWvhuHT@| z3LOVpjj~q5Xjxx<<|AM&gZ~+AabE>Zhi*y(tm%lp=2rHRIRXuk2?f;)Jey;1i9M$- zo(wB!B+sXF2I1|EeK-sEK=Hz0geK(Ik7&yYo*Rh!4q@&DCXRiJ$W0c0hbg(?!W%JE z7On*Fd;=pupw17M&ujnWhR^tj1O*gcTp2nTQv z900aK+d1Z9>~-BEAj2R1)M9Ki8qMV-rwCa2!+d=E1HL$pPR&tI|6wstR@)LPS@l{q zbc5h2Ph_~GeG2Vy#Kpq8*)hDMh^7*TKHvJsyfpK&GMztQsa5aw8RK+hbHmIBtCQIN_~in6lRqFhx+igm9g4= z32{-v+@g0Pk<5p_03^_h8$rT#JyYXVpa=pe+!5|D0Sj0g{jkt=20@SY`8bBn$pVk3 zm4Q)JjfkZpc5&UAh>Ymip?$L3g|oRe)f9|ou@_)_&^xg;9*dQ*A}*cKxKx3 zWRqDP9`B4rN7_SamkGsX8;+b72Mo6I6rpGW{{it;ILvT;A5Sk&VP4My{}l%j@75YU z{fqnb8Q5R)--!NHU)hhiz-7X|nc%l?O1ga$9(H8kgaxD7zS$y#`5dIdBG>|+;q#V>5wzuKU=Tqp$nhtI9%XF~CjSG-{CcSk55v$ay zfPSupXveRY=@KIfNst)ZL^oZN89&+NafF9+9v&Ya9}^9ej)TISLM>!|A^LoMIFRLW z88V#P8yoTe0Z7~s4hHr%(4}FYD>hPWSn3GT!9s#3;L?H-L`Yg;gty45ht$_**X@jLMvjO$J-|;F zmoYP=^`2alS1bn3(>jt|6dl>T7%*zF7T_PJ3~VJkju8}L26}(5Cm0LCpoU;O5y3_Z z*=1>(QlPQp;5q{x2M1z|fHXJ-=;u>_Hnc>g!RuSN)*w5>^xPXsuO&s*PfOPxwAqTPotm4RzHsFRT0@j%%fM}*2ee6l#V-5UJ z{bv#Q1#J=QhOl^X76IOqtc^WZV+_vWv$J^itH;s~f?FK108F|Alb!&kYcRr*1*?sY z#Ul%j9r`^*mV-SAUo@Q)q+gX2jM-iwO8NX=t}aC0Z^BPTR1fo>?wKr5i2`Qectg#Q z!bZo-_-C1-K{A`$x?VBiJSa-R&0UyHVBDwm5E|}?jdlR#g#SaLDlRje{44YXTev70tTR~^On2pi+eFT`x^e8uq>T$!PPf^WE zC6sof(Qhn+B#jU?j`LP@MLE4Wml(QkQNxI@pC8I{YDfGaXnM!ash!&=CpaUaLxluU zbQeXES?Q3Q6oX3~O$5=13}<-Wa@tLE=sz5=ae_A4%+$@=H_H}i7aFv0dFXGmKFFW{ z`x(xf+66pTSG}WZ_)C}j&tJV_{(@C2=P6NB76hB@jDvep$5*|n{r2tL ztvhfgPJ6f1=e0LqKlsM$hdx-gY|*2bFm2k*E6dwQ`Zr_>A1w=nw=FWtKR%Q*elQx;0VlcY#W1B9-p341Z-!|#K&9C?2N}t2ZsR6f78WQ#PZBq{G zXMgc3rC#n~*aU-ZICCMszFA2H)gA_nCRJ5t{b9Kj``oQuAMwLDBEk@AsoZ1!9d|r9 zcXG|*g*`Jm^}Ic!r+Tn@?wsmd=iFbNnU|MYO97c2(s8}4sTYA1fC>VU4H9VbO&E`^ zL1I*#!MhA6P~nINh0dU&qxlmuK>v(xqJ`}woIsU@2xC*n(xC$rN@MS{&aX}_8#*9i zSj-&jL&_<4s(bpf)%3aOaWsiGTYgi6k!aoWvl;&f@5=Z)@=j?X;PS`6(@`dm;qM$e zB>IAK#{amSv87y;e3(yH=?puZ?g398#`9raX#V*Y)QuCN>9Du3lpOrFh-6H%+N*PR zc#`D9;pIGf+7*Uv3yjxak3p}8P>Y_o`t=xazc4y9PCtg7PYlkUy`v~z-5Y*V`-Qvy ziaP$!f9FJ^e#qp5Zop}_fFMrApdmqC!H~#^fS;rZwTFgMlw3|2hT~4shvnw`v*(~c z-)Uv~_`Z|t-{*Gi@5fsW6a1m2{y<;-G*qe?&e~`N$M%Kd=p3rwAbyQS)h~Ry816UR zn?3sl{5XsHls;@R`rxktD~Y9QzsnsUcTo(M+vB7YJy18vS~$(Gc?k4tFM12U-+S@5 zusC019c?Z3J5i#XF>`Gw|aK0hhVMf}-+7Dq6D!F{t9F1q*LMN-4k zM^`Obyml3>R-Ex~Fmd`lmGO4vF*k5zz37dJwS?HabHV zKko$s4Z4(%11uE6N%{>FP$$9J#m|@60^m%I2oX9%)-3{W#jlrScg;lrlJv=(H?({C z@`H1GreN&7M(-@M}#1>V!aov58$M z3kTC7GhwBPBj`Z*MB-osO7N&)De%=x$KF(PG zup~XaE}3Wka%}VPIz`*Qqb@x+WrKFC_xruL>C%Rzq`q~RdAo{N;R=975F?#a*9aOF z$zaLBF)TQMfLs=Z!yYXRsT3j_xw8aVOgJB$`M)z9Y;TG*!Bh&+;wTD$*NRX+ItUK2 z&0Kazkl-5wK)Y?ZZkf+q{hrj}xHS0B24%&m-LHPMMll?g&PgTn<~4bx_?cRTbh7Dt zDZHr@-#oAB3xYZRDWy0Z#ea?hWJ}>uBVA*s>*?&vqNG&BX znoevH{qZ@}fHnFL(nEgng9-j4_1b3lkf5fRAyE9=e2^joliV;?i*xpDaG~{$^S*1w z`G0kG?LkppXZ*X5eE|DFR{|- z9LGA=G7fF0W}(JfV{Dz;R%23a(pXJf>)1ro)N003{%{=W?>qOdvOYSQ?49p^-#Pa? z=brETopblzbI&<YU?GnH!aD0HFea|ULd`7H z)6rIOZde5iliI~(XnkowP9V(-*j}E(#_$S(xHEiOJ}@IRU;}#GG#gB-f^7)TqUYEK z+<#RYE&#JT8VJ$pHVn|pu*-He8RfSpnJ{0CaT5n@PaM#(E9AFN%6uDtZ4c<#?GI&) zN>dm>E0)@TtriTIF{9&EtzdT*=)8M&q`E|>yv^ccDCMb|Nq+XL)@e? zPcg@nh_MMW9`%| zvuYj*7{o(Jf}FsJr$dz?4^|Q>rFjn>R-U2RE|9lcA2}&FPgouG6pL+QJh;}zxt-%@ z8bs%HWxcluGPivxZr^hk-yZjpee!=P#mpM?-iNW<0{p?62a%>DCLeUoxQ=N*q~q_p zV;_p+FPn}8oq=`k$hUCef}lp?QpV(=P0D)OWEf8c>TYT`eu6avZ&AH;mp0*>ZZ)7O zY9m$QSiS6|Y4RSLB^M)23WX!C4zv%n2viHo0<8uu25}lbUd#G&8BK#+4{Bzv9Hekl z0ks>dP#tH{X+s2c8U9YE)it0BgfCDRZnRI!t3XX7O@<`I*V1WIBb_#SLDkfSZ|4Xu zjx|%0x`mPqpVLtlqwGz)$pWsbCt>S8s*w9=AD0=tSgoccrG4bSdJ=P0`%w1#)UOPq zT=zlysTnQNsro3!5J~;=B-$rW8rh=m5puujF!gi1`VXPs&uJ7N(tkpYN(N=&*a3AG zdd{~|B)V(fv_n~YV#(rv&?@}4c zQiEgl?0b$=Y2===f>wyQo0yAy6M4cG_@Uo0g;ue@r4zvRCM{4bz|Ti>jeRs3ln*L} z?@NW>+4ql;se0rAVvkTrymtf&dPT#b`pgUga=jF`5JxL%?IJ*$HfrR`#Q9`Drees#?Q&1FLZOW12CJ67Zi-1}8b0%%K{g z-2BVcw?))LS20}tqP$q{mJiCmlkY3pN|n;AY*r2_*RU@3EcK9j&EPil8jcy0jq8kl z;|=2jQ;w;^w9o7{_n6-gi4Um`SsQX7J9S+`q{Sub0MY>~E!wgtA$cGcctKN{{0-y8nfn1f?3MaU5|BYGnCja7F8FuKk8m|W^`wCU-b1DTTD$%OU#j&yD@iTlVf{hug6V|>xt`&cf{An zUrSh&urZ-8;n#_i6KfN9B%Z;7V>L+|lZKPCldF=~B_B$@lp?2;r*x;>cFc5iJB~O$ zPEAgoo7$6lCM`a#I&DMRVA?fjsMGDNcW!pRlTPWm>2>Lw(~qZL&5$!1GkP;lW!%n; z&Gcq&$g*X9KRZ7A(75n%z2k;+cIA9Le(LzWZyqdF=}GoX^wfH~J^MYU zJhw{{OR7uSN(QmLTXLgR#x}XMzjSzlWx^{Hu9vlyeOfjouGV)jZr4ENAep*p3$>xH zx#>UL4GjFp(EGUGkkk;!Eg(&nC>!oY$w@z&YiM+yZ$8EXjjS!IlIx zMqAq|Y-X=^3g56*D}<%rLR>pFV;}5G_7mg5T3z6cNZ~+Q_7dmT35i3j(<*$+{^~${ zgC71S{J_}xpwkL(2JrB~k|+K9bnF=QPM|jt^Sugajo9*WhG2BKrZDdLqRy;<=9f*^ z30t|Yuz%S1%U~H>#bxF^R{+;)VGY+OpU`x`PWF{nPdcH;o|=w)8c-fB6r6@@?&J8n zaE8KXmitj&`NGy^uyJ`%Iedtz#*^O+szke=k9{6m3g`J`eR#aaynqrnq7HCt;a0|V ztq`4@8oE`&J_q7G;+P9)6eI76&?!TV)*g!k_n{-r$mwanJGhpKrB%fU1Iz=)y(`Ag z;`(AizmyF#dc$#ri@=+Iek&D?exO*2qj-!?N~9#L5txE=rBWK6cGJ<@pGjGijehkW~5+ZKO@~HocB3>So%7 zciKO|b*WD>(02NWUZp*l^=qP?l9{&BZ}2}Ig7=+2L2u>|4bvg|8J(lw(-HW43H74Z zoQIds(mQm4-lg~G5A;uX?*qC>f2221`#z`Lbcy~%AEIXbi~dd9&_myf?sTq)ZFCTb ztwKHH`nej&eH-oLGg^ylX&1dr>uDVwrytUHXal`M-=$l)b2&kOCO-|(TXdQJMpy8W zmN3k`v7&RH*ZUuX*+XM7T`Nk8mSSiSb4!oWFX#*%r8nuf_&55g6icV*S9DT}lj5ZW z+94(4%OS~9isX<|jmwsIt!ybWt!`^AEG+bDe0rhI^>Bqt3s)5D+@td{<}M`ExyT1$ zp${(f!QJ|Ckq+S!JzT2u2|5qtH(d)C>G>8Fg*LY?Tivm=slnHx9dgaoxJT!uZnbiC zM>|JW>gAbPQ7Fm-F3JNg$^-5;3$tA=*X-kTwx(`Cl6Ecpr5ROwiNh~By?({H(jQal zaNw|Q-fX{d{-Qd+JHem5u)f)`{rNh-oYCNyDwjAL{j$?Lh-or8gBBxpk=QL9RI@`W zYrKONvngl5D0v6crLFVo{N-Eg28@b#Ad^GKRpOv{^S1D~G_uLB?i?_nj!X02Xu+Mr F{{Vm_4C4R* literal 0 HcmV?d00001 diff --git a/magento/setup/pub/fonts/opensans/semibold/opensans-600.woff b/magento/setup/pub/fonts/opensans/semibold/opensans-600.woff new file mode 100644 index 0000000000000000000000000000000000000000..28d6adee03b8d2301e06680fce413eb94887b57e GIT binary patch literal 22908 zcmZsB1B@tL(B;^+J#TE=wr$%s-q^Nn8*gmew(XgnZ~ttvo9ykJ)UDH1b*sCR+v)0Z zlM@vM00j6Q8r}fN|H%yI|Iz=O|Gz_2R9OZ90I=+r#rY3Ldd16P!Xl!-+~BW{_X`3* z8~_k8c{!zD?hpU~q!0iAGKa0N^mcy52AJ z^CuHRjcg3;e>v-4|11CiAfQ$|>mDOlXM*225WhC`zu=~H1PeE{H?#TW*nih}|CRBP z(4GQj22Q`eaLm6p|JnWr1T$+7(_fAo06>ru0Kn2-jDGEueq#f!{9?CGW!lij z!2Ne!<=tODg8u-F1q5hoU}FLRpz^B%UjF8o=l+;$Y;Wh}3;>||s{_9L#ser0xn8n& zH2L*a|GifLasS~#nCQ~Y#PBy~jbB>;u>W8VrBM4T0e=B7$x|@%pB$4u_xVpwEn$Sa zuN&zb>+A0V8$yC1=o{*T^t)fW)Unby({_Xd_Nst zu@ya++s#_dUc6tHwX75&vG*PxJAMy1Yu%MzwMgF-2ujRRkRnK1eNLs+s(<=dW^i%0%hn z!!KkBgPkw`!czW%O7U3_!m4uWIT8#~s6Q2^tU^l2IafI6NZy20d;r;%Gxo~4c*?-W z1&i`jmUzofy+vu}p|0N}uLEfj4((h;;YMXgZ4khA4{|_+5&(zpK|CVc0qighazmdG zKnL05(caoZ(DsvJgdny7722Z?>*LhKpKxyaXWD1BOYDm^=^AH7!iE!R)M4*T^gN6$BgL8uvnQ#?o=M7h24?_C`8jrz@c zbj4o{3C&UC|2j|&HxRrsTpDkq#x*nmlL^;B=5Xe+wvTT_hofgF9t7AyFxg?m1ck+z zOEH&c`YMXCpr2^eVrz#kRtGv9Ei3$8vcUDm4j89*nZW7tCDALKQBA6XJS{Etr9<%k zq*U*N^pNeLWQF*CqAO?c7t<=A&nHs;9Js0QlX@K_Yse4D7v_r!MTcO)vS3Z^vVl+K zS1t+c2%3FFT$uEP<4ko~1*n<_(Fm_YQRHl3a$#^`wjxqZwPiQs_lwPfa*aN;(HXXX zgS-2Me46dy7#ko=4}fmN_KCEC4A29q>7&&2V?+(GSa!g%?f%)++}zvfYFuOm{kx?V z&WNT$9pR3PtHM>`s(e+puF%YDS?u}B{p0tbtW#mVe^YBo1hkSoF$=?nLT z^Um?uczQDXO9=6W`tn-ERB<#Mk7f}6H)(P-KbjrSPZpvIRfVg@(bQ;aFgKYSFGv=l zid03brvCpE|HnlZF8lM0)!Dk~j&4V&Jbd6Xo@8zk47yIU$PMu+wsnKvZq;T3R(L?u?{j0U%^_sasWidB(VKg^#KVd{e zB{fi+mAtudR3RTusnIEDcPisrsfzuG^0M-0o7rKbJ5RN{F!hPHMKrU%dA-23yFj)| z5nsR7va_x6i9xkc*Qavj30Jk$h_l8M^K0}Bf0h6-l(~vkXPDJWxX?5Ar_E@QE2jA( z#rJpxy)>*WQC(BD7s&_i<4`UpM7!m8kNTfI%rMMwRA1l0;Q`VhPO^r2+(2G}PIAh0 zc0z)B%&1OZAF#sU^#@;E-w2YP{_XvPoE`$??E^@nj(k*kIBW7z7z_>pI!fc8Cq@8K z6pW{S2B>)>LJ&$2(0~@0DVQ9XUkIE2dgvYtFml`rl=wS<3L~RC5I_MU7V7U_`d<#F z;RX@<`X>4Y*+Z6-|NfD~=cmBTo5>Fe*Cni(DI8yFgT{QLK~9UwrM5fC5%9EJ&l z8ub%~2nS{N1nw1r3QutCIw~%CIn^#_5>ye zMhbQbhWBHM6obR`YJC5IXO2KG_5zeqLDWPF2=EIC3V>BiAc>$8%cCFs)c)ZA@ICtN z|MdU#{9t_de0?1Eje(2d;dtBc_HBcA;#qsv-S-88+rUTQsqgTW+$KDcE*_Bpi?V{X zsfzv~=nJj^z+k4XvcAO0(%$6m^8N%06znG|Fx*EdVX_f(<>h*_H6ovskm1p5Xdv($*+3l< zqX9Dn19NtyzjCxlU$wfFmIZEjvdk-PX_@W&I{Jj|cD>!zoVd3;M>d1c@=iAkI#g$8xOWOB%x z8x5wxptqnLawXKkfv5)2DWY~h;==#X=sl)rI(a1KtA2?|4Nl2fU?mf~na-?i)$YcO zG!ibB19ph!RK9m4NM0IIJmU?=?$|r3Pv|4C9aY_@ut0836dto?<4Tg!o_0;HLas`@ zb3~{trJP|ReGCsW)x8?efm?y%;Fp{0maRbs^U#!5`+h(9 zLYw!-#?O5KeqTbNz1}LVP~fwHVzLgZq->6!PkEI`hw`%&PKPsE9G-LCpskJUX0g?ByLaZQ zx24H+9#TEb7LycuM?Zfs8$5k)2lvy$=F+L|lq#Pr0AHrB2mnTI1&)-qye3Ofy>huf zf$#5txz8~nv!v*g!@%rAH}laEn}~el#l6KoL9?QxDV*XGw3){9sTCpZ@>SSXoP2&5 z=5l1L)f~c5)E`-JK_%f4)8cx7PO7519XW6L=8bf3ykak8KC#RL;~GpM;}I6RqD&zP z-<(uXXJF_F^p8{5$vQp2sjuA_1?CE4-e;ubwc3givf2movk(wuOAbp;f z(ROJ2T%15$M+jch&|M}+TR?AFxIXkl1ej66Rnil8Y}`LjJD=tiog&AM?^$G1QE91Pr!H{8pae82ft@PZ7>kMSJ z{l)j^f$ztuc9q1rSH)$zym5tNDLBDU@KpHd4-sOtvnQhXNzMif$6n_py2{Z)&IV~j zZvr~$cT4}yc1?MBG*2tAAK%Dv{Tnx{9D|I3MO}yr6`PJ{jXJNSy(Ht!IC`DRTKI!# zLJ>cA4|p-iKTTos=Yq-Lv`PR7B7U6t53c&UF ztivN-zSdn0_+qxW+>(af4EqA^)Zq?bh1%dQuL{$;bdspl(_O4#td8nE#mU2Gu91IN znCS@u2^^MaYml3jxh4qCONh-=&2B+9BrR>HrlcXDW81dKuMHBWLWNT+NR%vvQ6WGj zw_z(%Tnm6uv2pUTpQoZRQ2of+V126=Wh4C?Ky%iZnZVS{IbJj#et*S!1lQh)^;rL zVe>y51ErhvaPBPp#cteoQG@MBFJpQY(|$pD|z^*eABQb;gFiBp(-VlUq#2#!8=cCLyX4o zU=V-^k1f6bi9r~q9Ab67)o!QWM=X?$h6Pry+@S66^l6s0RuY?v3W(ORh(|+V?OO?E z7r^!PU#Al^*U+GuPmifa`P)OiUBlS^j*fmjd;16cl|>=_EvL(aVR(2+4Mq<`4rBh| zdsMUD_dO=}kIrGa9CgU_U9ZpZMzh`z@UATa4_a8^?_)3SXUU*@*m+`@vv`>ja2yMU z1d{mYo>2(Qq8NWa)N>HYqt%o`cS7F;l2j^!i9HcY0F2%V@r}yT+JhTr4gVo3#v^8Jf(F6SS7EX`{=D)YUT+lcU_c zQ70aN#9+KI$hP2+d;(?vye#8H=Q(u4S}E=m1_BdnI^3v({%{_IaBTs}I~yt#F|IP2 z2}F~Zld{F5rq1rOChM>J!bsH`?bquFmnN#TJv*(Jh8T3(x=*#1f0^Djy6maF9yNI> z#P8Y&A}n@2Jann1hr%1>eqZ-)_&W8Da|*neAIUDYeyB0pub45t&p;OuPOwER4N5Kv z5D8e~aIGO4lYbTs$vY8bp%A1${R`0qh|Eb0kDaLCXkZv|c=;^L_)PkP)Y0(Anhe3(IjZ;A^I}EC+W?eW?KhaUH;!){kczTMu80uvrKr4j#<__`nG=6``*#uKmwu-dLj4o#~W8A*^%6 zYT`-EKLwB@;VElOr^%1g+DB;pITey&YlRQcgnfp*DPT)}W-u`(;29BsnKet&zeFYB z)tQD<2m(5HbtMM-MtU@8TUiZOQ`8QDImTby-s8|V8ZYhbvgi`i4aV>Oc?~}6YrqTr zqt-oUE_=gZ*+~kYGM&EJ?d*L+%)8B~|9R!xdyeQ9Goa}*%)Tfwkbg!w4i#RUF#;gD z9}$X*(O)qvQ$RovnqWfEhNIom?oZQ7VoJ&wM~YSx$)a)tS+Z7h)}=QH6ZE~KV&Lv^ z;eE>4FzQB2ee9|mACK3>hf(X|jfd4U4#va3sCySTX)kQ*Qos00wC)7M2w#J>a3-Nx zw{c(dYoElITzsXacK3yGpZ=9G{&g9}=Uu#23D>+vDB%!6nPSEScw-bY5yWHFv^;xq zIB4j`(6wwMN-83XR6$y2)bjxOv|?pCjtg3x-o0~iYva0X>Q@_{g>qeV*ai<$48ABQ zD^scvYmmqnj~{1Sla@QwQ%KbJu;cG6C~qo-A!UVzt>Wrl3m2UnA#G}Q#vT+NtUwy` zZ49zbU+6NNf7lIF@#J)W?3w}O+PuCKisHWxOlmN(KKsa@kA&1CDufy#VtkYtoXBMb zjIvzfqyN0RU(Ju$R;%+-V&smplr*<3tO!-)@yLD?E^F6CD+(bkJ&;uE}EUZyys_X zejL27$qA?D`K{EZmuv8AdsA`n<)wa~yS;Ppm_Ksrj&CGMy`Jq3D}bHNd53$&kCDYY zQ@FZ}#-reLU$6wcAucg*3tndsjH1U{x{$o zXgad)w`}rjky#iL9Uz>V9LMIpad)?WfuyQMxM5C?7mSGpQ7j?`%~&2~S-et0Ltl0o zf)*hem1PpZ>FhXrn&Lej(C98Y=ox2_a=Fk|>#gf*$gTUT`qnso+v9tQ#(0gITrItX z`Uq!vMT&h6@Q{BXjaub6rm@4@p(;vM{QJm=*^WD)uMrvOEch~e@O1i38xcH}C|E@9 zEa;?|M9G>yW!5@?Z4W(ZV_ajTWsdR{Qf=szlzoZ#%naM>9dUu6Eo3>!(l6fW5C0;r zN|HW8+DDyG0D?PrjPRE(crV;tB04&>7*B@FTy#MK@1lF41kb=@xGU9OmnpXXwX5i< zYf4F!LiU;so2h^KrpWf)*_-jFQ+NlxnCe;z=M3*Qw6H{YigYM%Cc>L?VpC4uxIh`C zxvMeVYqn)|uFd`F-+0LW_z)uLLUle468a7mAJJZkgOi_TziS;!9n_y34o>fnXS=mn zzT9p%S}xil)?(A*KEbj;hdSp&EtAVcs!O1cKZvGSk4jLWUy4BCVWck-RBf3CH2ZH2 z@*NJ;bHGPuT{y+JBP9%cpZsj!;%dwW)>}<~V+e-5>u5-pj~5^q%)_H+{hD!K142bW zYNU;q>OgZ_6QcOBL{pN^a{%AH**C;#XR~Cc{w&(6){Vz&z->LB>`}`uG56TJ->~_9 z#;J_-T)m5ExLZ8)^+NaOlk9gPl5oT!7$ms+f~y^#_o1S zj|CzCf7Lx)|H3eHH6oU2NtB1GRBlQ$F&i*O#wNfw<@4QHghlU`({;8W;9-Cqex-eZ znlFJ{X$?=)Me7q|nej|+S$Ef7wt#?f-qc9==$-0sIEWM+>JMGFA6g<#50@0e$HK1!Gn-pW6akOtvDD2&+V?Za9Xl8KHcj#=-bw6@rMSHkqPlC5%ozQ zYX-MX0e-kl86LE#AK_?a|IKUTVzSRDEoD}lB>S(y{&ZNFenOeGiJ9NqQF(Z7te16P z5O}OL(Ay&T4Lont^Y%xlwC?+f%9s9F{*3LX+R0}pikl#kw)P=axrG|fp)G#i(CN(D+DOwU<$fsE zMfCjgFeDuxJaW;KH!RUKL0gY7#uT?S`Qbj+p;53x|C-akNIJyzH%!>`_>PO$G%hxlELMZOO=*-$I5_Tk!-+4YKD%0vU`W z4)@lD+imXKtB{Ju0iA*liqy#HL)BgL3LVbPIn;&z&vz&EcGRftO>SyMr_Uzut*+|< z*gM5n(cN32-1egYzJ>6?G3E{p4^1*8);+|2L7iAx>wxq)%VW!y?aEV2dZ**3UmRV- z&8lO|BUAuW6_irkixSifg)iYLtCgatL0V;0unGVM(YJTr4e0A4pn zqdJ=*^Bo3IMPK?eUr9pt@4~Tfn1VUr) zU+-Pl_;NWJK4BQ6oHJd z?J=rsUP|JPXj1g1914%mWu@KD&+c|vmCcFtqT@?q?9zN_>e6(4W(*RwgG{P8dec*TP-afUpl>YL#BfouBYt=gzl#2ZT|p;@)^H% zyehQdF%bH&oTO!>S5E&EXUHrfegn7gnbmRvgLyS+);~W_}I<-q6{1zme^XY@8 zn`-OH5}}w61@}teBW}!NGqH~zZW9gE*#=;FCE!v8WCN7K@ICOFsbxE?;P@X(f{2xu zBBN6b6@iy)HgM365N^84h|OmYhwqgJ6ZR4ywz2T0@K_fTu0$J!c*H%`dI{G$Eq01W z`T6X`X`3vzfl5<-?Q$owYZMvo=co1;zI4lGmdk0FPP4Cu_Q!Y=`01Y@WKMn(VSy9A znNw&gUmNx3$(~X-j~F{IubFG$!8|#(O=2=AeuKP!A-cgjD;;1?7WyD^!?NX^ZF96a z!>&VOBVr+;ceqZ03&HwOrO;c|!nY7Vfp%%ZlZR&@&WJ{r%)-oBhB9O0C1k@tCYxb4 z*w?xUaOh_PvZoM#f|+x5K24uO|2X5skax)$1c3?dPw>``)C@Mi{S}jB4tFfqrMBjV_f_UIffa^$as^ zy+p*4pK)T#W$z?RyPFPFUh4bFf5_uLY;Ic&G4jv|`q=T*U*Ua*<9e#SIoaH3SL^K| zzW&?~nroO)8y@2L56D@50`;|%q* z=F_^(VolPCY+{T{+osUIsI6qwwrn^iJ^)K^Y3be|0##kE;c&fK>jT{V@qC4QN|hQ= zo7dKsXQtkv5=Id`K(#vDwz^hnU*I~)6y(&*N5o_v%Ww(5iq=14@` zSp1$aPsX3 zf&0Hw`bF1-I|OCDk8*y?2VibYZDTZ4%+J-qtxp8XV|%#<;-wVJgDT^2iz!LlK5^Rv z=1H_qalB3Xmhw4E{Wc83kDB9IK7fk`w_R5R0C4x{(;xe>G#^vA+Pa3uqPT&1 zl@&5JcRGO|KlreMJ0hz5kUrb=DIqrPo-i*u{nh*liH{lFp;H-1IfjZ77{P?`!8274 zDoGo+MseETIJ7ixzO|AgRas1SM?y~UxL+N6>Q78Q(hi|m(u(dbUrv5cxLXc~Dy(*N z9pH$sr5Dk}sb8K5yqEO6*Xemx;+w~!@k^X7Xv#XlYVz{Tjj!-yui%<$m9&!H2O|+x z5btdLI%pIbXbOx;+e>oVG?GQy0V&{da0>iH!G6(DoKOXWWA*XskmD#kYrTnFTz+HF zC$3~#Uv%RtDN4&*R2k1>CZT^eCmgV1eIFDD#|9oa=T76>Yo{;Tv`$>QJat30>*6Thwu@JGjCnrLcK+Yz1lM?{x)tE4*` zw?zq2v>u1d$&!S_l_Kj9fy?Kt)rtPrl%+b@ zRisRfd1gzAxyDPxf9AnlgA0Tbho*NH1`$g9x*lHrS2!1ZWxP6ioCc~E77Gue2zlQJ zO+3HHstS;0AyESPx5ckFu3WJl={gYZrXb5oSCQ&i8SCnX>il(#`SjB~;*aNqRiRyE z^q9LN<)YA;MQ}OfZ-K`pNk+?vNzzZE+At=Tz>?>3v0}U|6C=9I;lSm(*0?#R!zfrP z@ZHOIPB>T-+b1-J8IS9bg}{zc?ang8M`_aewth%-{5W!WtTv2zw5u0zDJW_Bn`;wm zBR;3Rlbg!!P}kef$i|kOGmfbf``xT96`wq~8oD2`^-rm}kh}>XbqLo1vvG5#Mg? zy+^yXQ?FN|pfkenO*WA6%JflZ&AKkI%0;%%`$>^bEmH{b3!%j~Q^P*}#>{&TN#t@Z zQ|J}OqVJ8QCv!-vHo(XvoP?knl`Ix#iO&o|J>@<+ZXjK~glODXZtmLt7w~+NFML#D zc4z`!=A>Q5xVNfRYFk~N?o#4-&j&YElg%>HZoshx8YCLT=~Oe3affD{l1#<5Vr!Bs zhtu;@vJu4zu`YB?sZv;Tj(Hkl7;R82Y;FL;4}dBFh{X~PcLeIgt)*e%FH-znR#hO_ z0B=6h%#HXUj4jqyeujBQPw%B#3t0(W8e3I4T7Bg^(!kq1V77qE<8{?bHGOik<+GDy zT&wpYcT9+Empl^ICNT4z57kQ{4#oxx1{;GD3jWw&y4Q=pnlUgPU^e?Np)W{E(zfUU zOJ*DvI1~nV)~#(eAajmaTX|dLTOFfLodC*dT!@eXbmxQK?7!v;JELn>z1d zs_c|{)81-)>(BFIMu+c2Wh$NT=bQkv?RQV8(74>+8y+vtFeag(;n11&h=mW&VdDO^H5~M zxlQX(hCH#vAnQ=RxChUC)Nz69!VUNyZubLVF$2gRh)h z-=RzO!hGk1H}#c+Bg@oKYzune{+u`o+fy*Zt#Cw}Y3vNs#pf;5WTm22=+4JG6Au8z z&}R+gUWGSHR)A21A*O~h8@sB_>O_!3oy(%XoZ<-M=nI;RcB0aix;&bM`Ha0_GmcfV z!mvTv2R&kF@d+(t)104xo9%Pc03C0#>%Wz&QL@RA_q=@Tf|K#x_g9ESVr~C?d}8a- z@vQjnw~_jtHg`@G4JG1z8u{u`7^&;1zGZMsC~eqH#$+b(F_*rMNzkdnXuYp8ed$@I zDy1gp=3e(6^*G>upzh3`JPWj*h^RQOztJb?6f=i4?&5S`Q)HQiNN})uAZiEVa;F0r zmz^%`Sr`F*A+j9!vy&+8Ld&SXMsysaf;e`f^a*~_$fqq7i>J?R>}=$spKb^JOwygk zaIxM=25Cldl4lepdNY#HLl}{aEh*v)kszOv4g8z%Fee35?NbycUUhU(n3}qt<)vXE zoHjsqVVXm*LCaW~#i=o^4(o?*_dH6PknlkKqqs?XVqCfwB%-Q#mGp6wapYIF(DVVH z`}r6xhJU8C!2SafBy7( za5KaEe&Z|kb=ih7z}n-KX5;&V5#{Lw&872$gH&ipNIq0)a!d?du z34}B&O}8au_QWpr2%r^{`Sy%&T;Gs~3)WQ3`btC?m5X~~hco`Yo4HAW1~rX)Fzz?c@L#G_<xzP1X@)^Z~Ur;hR5LS5viu>5WYVTE$V0Is~`4E}}w zX2Z%QEQ{!-3se=1xhBh$JzZDv0hmlm+)}HS0ZZ2rSJi~pv^{&#Sk;F`RY** zgV{}AgDe#APWn9d_00TSloL>B-Jqu$OA`0f;}TM{n+xR8_M;kx$QJGf&&Pg|x?ni% z+qW$i9>)i<=`02}%eV72Cm8%(*FtOu9l9HQX~CdOh_3hqNluu8t$zDVtqvNPx7eZ~ z-deJyjp@@Ch~w+0(Ofr8<5te*q6f*)n0A*LJvH9Cs^{X?lCApA8`!O37wm1Tx7Rnh zaXpw0mI0Qx;kDRjU&qtHbq^;;JM)vw_41J_Rn>XDWUGV!TZL(pz7XuhnA=R^XSzYI_78~llzsyZg1C%@?vJ)Z{G8c=goPHPw zFXuZRoU`BS@DXBh2f`*!Qj8OZP7&6%BZt#KrHFf8Pj!3)k%ukehmT|v_%^G_SlcER zPy6`|McG{7nb=R}ej;zT3XmHMs~47bgLin#P=1t<#Wk)=ku&tBb zb$C*(3|^x5ZJOQ-5GNd}MX5at+L5IO=j%k2mwvke;#EP{6jI|7(=5CPxvCWG4{^fl`fCtYqUVK1{Ail)ShIT zA8*2YC)KNETsD@Ft3B0B z%#kxX?G&m=oHj$N$7RT>U|*hJa^BF zYJ1u11L$e}1#uSI51@1<$j}aRmM^P_T1IDUrl!4!1TOkWKt3=OL}M8-+snW}t6Uo2 z@RsTA`7;do`cTzWV38_A`jStyh8{KpOm!%j#sWuepi56x4rj?2YA{<`@E$H!J|hHb zq&QVFE*@P$ej;347`6m;w1>z^k0zzg0SO(sIFVeuDxhJR-8H=$ z;ZFyJ+iv@P`CAiMZq7(gG%4f&iR+@XMRC3K{JEWJ(#jWx()qu`3=390$v@L@KPE*S%qiyqlQat zDK**WeY?JPBQ}k*Hy@2hz1khxDX8dJGqIZg8k!dx`gf68=Nejd#% zGSW4@a8lv4FT(OQN`KS1zOTu%Pb94dHHnga0Sg@jCS>1gDP>;@; zROuoa$tK*PzIqu7TBEXPN>fZ+OgnO-=CriV9}=ChJbAF{?}4Ui@%*}FJ-rb_r#eh` zf6|~kZAXis)$5Q8S%S{n}jRpq!?8+iP10f)4^ZdLeMPogR9{IqDL`GQj0|j<6HyN4^+}8%J(4NA3ks8vHy&asQ!!Rr5!Xtuj3c zjIy}&9BPUrE-NU@0*FOnO!DChD5K^$TLhKjfpB(gri>fwPauESPYEE)ryHJ#c-+6P zm|4KuF%VRi@9J1q5eHp=JelHZJ*u4eFD1Ez6y5fwUmzb{MHFO?unQg9=lCn%rr=_3 zZ*NcSVc>@ROk;PeFRB@`Vdhrsg+J-E4yLGj_pva-huDcoRR%LY8O5#Tr9()E(k{Q{crPBj$8tJ8Mtn&pRts@8iTKT93eHna|t<1f_jiI z9kMvMW;r&6N$18$=CJ%A){~3WnFE{oRs3aBSd$qe`B0(zo2B_F~;AGGS4jNmoL1p@ciry$;Cpfm?;mQv{17C1d*Gpz^uDx z+AZ&Z3rz8_S}kR_```!DRD&Z(rW~@a;Kk-7EdwVSn9`ike&?Yd$505u9gu@Z$=Lyo z78I$26IBD~gConN`EAPGWJA}HWX4U$~N=RVJx(k6_{1B-a+R^n_uLEn{yVEv5up8GvUv!z7ctc%U zwL%hYj(4kNYal+xz`@bbTf1swZhB3&$#1n^$@x887tTj7czbO5Ep&30V~sfzgNSWY(oe7>lSg5ovHRxUY0!C z{A)iv^$}uIzg1-ad`#lnJYBNO0urY78Z`e&m|8N1?JG-`($hwWxdR?p%P5$02TG}o z$<9yVExdIwjTzdo8c2f$c|a{{w9uiwhK(yrMO7!h6~=t8Xi3RI4aHXmrWNO88_f>u za-yT67w4lkN5RgHlzO?f_IG?=_NYBAWu^NrwcMTC&p%_2L!hqGYi|pD=@*Y z_(kw4i4t%#S&L7?UoelVRa4Vs{JM`u~z)B$}4aWIG(F)apibP~PsMYP7wK_R2nE zwrp{IoI+!_H`vNQh6`3crn3}uHvQ!FzmwJ;W&l5LIXLUhz@{h8Hh2gr$arQymODTA z9=vl~y>--HusH1h1r0!7k3Q@qDJgoc;HH+2O~Bz)k94DbAykCkJdyXT4E4XzYD$R< z5j04lv1Do!jL9B2M=Fu;K$#|5Gfph2JxQiXBZ|=IAQ%+<^vx?03@mtT35m7Z=9=@Y z6Ga&H3wo081N#~>W?I^Vt!X=bT}M`m?SqlDSfwUG%+^?S*5Gmx%$Sjw@B@+Dvch<| zH`rp=$V8q6fzoiAeE&2N*!jwgzVR!|mOdwpZKhy++e3>OBNSJb8?c7%8=>9?Hzk_~#~w#)6>;+Wq(rcbs8=)oR!bB@WHnWWpb}Od4q;)T2t^8bBAV;O`ZOc(pN)?Y zSVgw#H}Yi)qtnK8&MKYAUbZ-Kz(3Zs%m^-SdY0>@FSJ zUw?1a4Q=p$3&Zl~uEzg{X8g^>5@xnkqHAW7!%Wuzrwt7PJ)6=0-J#dOL`S4okLw|# z_k|!X>TbD;q?0bhPv!@lkroQnjP}mM-SK!(71_WfEer?-S_+XXtvszu%XyKU-o2)l zYr&fqGl^Ly=AmJ{C=8#ixc;*h0atd{yxgw-Y=7sD-n2B2BQ-5GH9UqN2Na+|<40Kh zkcd~G@TMKRM=#GzP1jG7{rah~CT=&`gzbD-PufJVry1@e8 z-OrDBZt~)jMPm*ud*;;(n;(39!TQIgO?TIs;pBbL>-oQ$)WHYKHh1p2em(o?%h_z( zu>F~-lP1@W*|C28ve{!*bsV)VTJ(pNy02cvoV;(0?|l{D`+j;(1}5q`88fd0vf%DJ zL6y?I36etMTjgXVs;bi1kPb6dCBrqnrn_}c2A`yoTK#*EikyrujVHDFwOu9^qG`0A zlM($>x=t3bmgu(n1wvK^B7G@TQ|%D!dDC@jM+<1ktr}D}_wT7H@84_PXJxd7@uMrA zYO(047GuP992~iPN4zY{6!s2v0a&4HWj}rQ%Cxtb(?iudMXWgDlKG{U1=gGsitJ=ocR$g>e z$eS^o4t@@2fdCN&`?UE|C7wM^ zE}vun0`=36ZZ`FP=F-UbMwAX;JpHSYd)NH&$JKSK=dWD2az6F5Z`gYfb>=GwpCZ4u zVb#1DJ+hV;ls-D=p2ch~`)2m4O;4@exKqfr=ygILj`KjhpiZgo#d!$XuU7RPV-bCCfe05gP(CECd9|O+DEq+-Bcpc zXUKnTh~6sG?E{Kh)lMTBr!$+E-+9H)RjPxb?A1+F{2t+}Gk2{XsR)F--R=~3N_48% z$CG#0g<<*>4ntzh|4ta*v=UOYD>X4zq+4_#(s=sNXh1^gy&e>vYo!|7fDwUUc->xy zfWws142K>wgurp+3gP#7h9npjMJwl8_&V#yxZ7v8OZR$`lM>_I9b!801)6h>`Wg*w z)~K-)GE$dzkA5+u3co?+vE}!%(($G>1%Y0H;%+^QfdJ1pR$e6Xo2kM4Ce`zs5*7JPDI~wy`bL1Z`Au(ge$yzEHu9RPBJ!Lm zqKEMDn!yXo9s}p)$EWsvWXOWXQ$ASG^X8TFXpV=~=8u3Fy`!+(q*3>+2QzOfESNa@ zt~FQ4g5k7t#v8k4mNk9s5ql{5j11fKl+a5fb;;dD$eEoTWV!-Q9!%LUc4h zbaHfZd>p>z;%!cLOR~Ys*QNu{JT4-f5()1A4^ZMa_~A`tmxf)QgcxyPsgoho!W~bf zOA8&iA_+mu+?o#UTMrO~xc&&?+qN2^Q=(;r`D#k&zAYa`)i$IsUyBrOL5kGq)a0ZP zVuT4@E@*-Jtt~BTG6?xdCqcS_c&H;Af{mp${ux26fB$jaO*Y`a`f4y}CDj%}V4_qB=Njk=e%gW^T9FE|KHrj`pXLq~|Z1@UW3 zvM&2Khmqz{#B6R!)KvuR(XNCz7qXlve@OF0g}JjbL2bS`v!(FHXzcde(zW=;_o^nb z*V!{L5(=h`k-9g%PUD--(7PI0+jHOzPG)i`n<`xcqyC-${hCO+Xi zG-!k6Dw0StNf)w&-}z$J;;2ZM>0NHTtH(>s=--&-3JlscEtmk~J-kRYOYkzDj?GUA z)b)qR^`6IIIjcR8P958K$?DQBJvAi;W2mSI-rdDJ$*la6n+(;Hs$X;y%@b!N^tKxa zsWA2FIWy%c_SK@f>_P+k8tgyMe6O(Xm(xI+lER)?SG8sA@E0!kuUo#PZtk+BbL7~` z3&P;v4>=DWgnaZ+q9AMh*n{lnuV-)C;>+6K&PxkkJGg)E>-+b;w`kG)$4RhOOWqq& z57yH-Z6tavhJGw4E<5LCqsARL&BuBeN80Un&66e0=Dv_mN@p;Rw32SSc>K-Fb9G%7 zE>SA_GXO+;Q5Y{_tl@8xaTUA<9LHE4P99CBXQ-MtFW>KpcDtm0v+lV4fv5HtfLw4u zJ~`md+i#40^Nz^}^t-=cto*UmL){?m1NQ`yT7p#6+CvRTP$K=kS6A|CMqG--mU`6P zb=SkQCsi+)*RxaSo_BWYsqC$qU0Zcq?Soa>-MVGh_yukaxE50`;wB?ih>WHXHO0-% zp@mU$XC2ghi{-f{dD3eCRTl@9}$7%oZIIU$| ztaJdTi976)0`Xwnk=XL}E%>)aG+yxU$jGTKSWXw!l8}te88C{UT)w{KNToa2az;;$r(7n^E9Y z&{y!aUSWZM=JSPVU&FR85A&ZNf5iS9V|*cb$)MYRp@y2 zZ^66&OWOQ2c=r`25!vK-~av^ zy0o$Wb!k+~_t!+Bgny{)B^F}iy-pDzOZ+=bXrZdKe1{3IE8`|we0_;6%qG6Qgx?|S z6^*yz+e`9t{c0r84{Kj%_rv17wd|0Zo3@f(+O};rEowTtecZ(A{FBD_1flOfPdQA| z$t{6VX+Xk!xW!TE!Pvwplm*b}a1C5x0!h>RfUU?|q9)$S&qRXX-33HsKN3Wa(H^Pa zd7{V?Nr&`sy?Gw}0?oxe1iOCseJaWD=H+DM`SI_3B3e47HTgmFkM>f^YvMG8Inf6I#|d> zJUyeV5IQP`XL6#%cfs(IMNzP)Up|X2nkcrmm=u}clA-^b6q`(@7!#s_q_y+n;wWp3 zXuv@==mp8^=8kW?=s@;+C77}N9h!NR4t_=G>IW-i^#DCXhs~MOw2dauU?b`A zrf+F_uEQJO$xu+8S+ulhZB+>MS5mS-9T zH5nn-kMW~mQTTAJ$Mp;1&FE14=5zc86`$A3v!Xt|gx0|GfvfNwD)8JiXj?~wBU0dL zLYGeyE?>NOM+F%=L|>SJ zgDKU(LA$3l4pA9o0LOvvnQ{zq`9a@==(GqbOTI`NDJLQPk%=1B_f32dan%RL-gV)p zPf~dV|F%8cjmXI6-%Z>%LkPpeD2LH%-0@;;VMl$O8H`~O5F`hxv zr;!e^J-X%Pbm`owV}~rB1hoap66F=S5>A)#*QLu)L6^7nU2*7iNs2Vd7({7Q-)He| zcqUp!F3ro z{?oQAp!6ME+?A033m?_Kvj6~i+GAj3U|?XBoaK38uVy^I%~u9_4h9f7dsU(nM*l1S zC&Ipty_kWKfrEhwBnkj(>@I}*bJeFSP4jm5Hi>hLUAY(La+r1AruM4NkpV{ z5TQc|p+k^26`}3W)+KX?4xOZh4neYnQlyj;g6X-}v{-TYI4}3V|K-2uqM)!W#0=Ma+vl)W?L+#c4QbL^^pWXZA=kY;UNMUha4NU1n`ZX?9C2c%BcNS@4+ zC*&bXkLr1|Uo9eG&LAbD`Xxes3}rVBxGA*VNz~kLXv-E^;qOnVc?xY+A;n?Qjc`4W zwqHQoOOgy~(z{e!E1@WRh`2xSM*4t%fC;L|3GZ6RifW;5W~Rm^gNQB<2Xf*(mKJ9p zAke=!*MKxoQe8x)ifMNWfm%XcEe-eN(0&L05dyO=9lJj;J-W*NGZgd;W?5@W3h?$Z zB^w9}@25W_si!e78_ucvO*LMQyyy23NsWA)GW ziA}rKMV!o=yU>TgT}H+D?Y!stUF7rx^Q&UjYvCTbLl)@$g7y6d{LJveWMOl-f~pMr z%;GimE!A;P5&N6NbvW0K&4pQ9#b)u7+2-h*@%;w;FxG4qjsIZ=ALxIBYUs)rl>X&# z9rHiy*n0CSCJUPx)n@quHUAa&o4G!sBTZ+W+SBjoLzTIWR6PZpuVncWe5Yg4IKS{_*OptgaX(!nvxkO4qDnaUjbd+?9^b+X7unU`=`G^8{ZX$ojg(EO&=r}aeJ zPJ4#-7acF1CY?Px-*h!}TXetZndw#N?a_Ouuccq4f59Nc;D%wG;VmOIqb8#hM)!;- zn5dcfn6#MeGWmiXnlhORn97-2nTDBGna(lYXZp@e#>~eo&ukMAo-uo7&IE)u<}1v< zS@2jiSUj@KvwUIs1po$4m9GE*0RR91?*K#q1pq(*1pop7dH{z2ZU6uQGywAe1ONee z+MQF&E(B2!Jw5Fik6SRZLHx&aSJB# zqPP`9*0AC>q^(KC?YOhH6?b6NdR5$o=~P;AH}+DyihGD36!&7w9#Gte0efF@Kl{VS;Onc$qde-d5=C zV1YQIkJ)`;t>G9h)~O4L9Bfj5jJlu@Raz8iQ(@E%o=Z3-_US!Gn?QVu+#}j&D1YH` zFi)1U;tA&J{n4*6gKddh*BT6yD{Svv?@XB{rk|pfWj9@or8h#Klt6{&Xm%h~Q zh}8wZ1<^*5qhX6Bzhq`*i57^)%q}?}vX)3}i`;{cdDK}+bANxHotb(}?JUN*&Sbf~ zZ}bk-*A-Ny<$wKR)_NjUh0^;HZId~;!dYc^@={GGl_d3_eyJm-o$1sZd3@R>r$!(1 za=*_v%Lv}Dd4F=bl5>f-l?Ki_HF>PCk4yaTH@Rn&v-v%Ie=$2e7x)HDCb7OXPqe1G zRjJS6nv%OLv&+fuVdmq1%)J4Vo4dAn+HKHPY}0WN!13>GUE8_4<4*tow(Ewsti|1( z!B&B>jgA7t39f;V@CLzNfZ!VR0SIovN#GfW2jCUD^~W3c^2uFtm%Ag1miXhv%m3m# zNR&hqje!`9m@pGd9PuQOND|4UkV+cqWROV~+2oK*9{ChdND;-9P)aLW(}uRRqdgty zNGCeeg|2j?I~Fu_tk|$qhJ$h{=s{0<(VIT>r5{dQ^rsRx9tJRwK@4UHLm9?!Mlh05 zjAjgD8OL}gFp)`2W(rf8#&l*dlPWQAkhQGiD!ci>dbYELJsjqc#ITvStYMcJ#l$u- zvymITmss|4gkSvRHwQSzU2b!nSEM^H!EM+;%xX6B1vVv8t<_q7r#4Ap6 zip#v_9d9H~;w3>6B}tMcMN%bA(j`MOB}=k7%^A*fft#G=9JkoOQOV&N*SR9Ok|+6W zl>#Z0A}N*qGq^*+`sT!~_VKtP`-Ih%R;A6{a<;DP ze*u0BreOd}xB$pfSg`>Cj#;?~00;nMAg}==M6d%RaIhCeARtS)01i=0um)3FSgr#ump{<1pq_<0a34L G2><}8D24q1 literal 0 HcmV?d00001 diff --git a/magento/setup/pub/fonts/opensans/semibold/opensans-600.woff2 b/magento/setup/pub/fonts/opensans/semibold/opensans-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8399be251bf44f9e323f3850ffa63bbde6e21177 GIT binary patch literal 17980 zcmV(@K-Rx^Pew8T0RR9107g6j6951J0GcoW07cCJ0U4SA00000000000000000000 z0000#Mn+Uk92y`SlO7y_C7Of|NjXIQsk(~xON+O z_JIRWpjj2AJ#{dTlwpvWgWfX+XU2?*G)G-7n-dF`=ziE^HWdOMS_$k)0$SXs-1;c- z3v@<-j=)v)+-nafVL>+Q?𝔱N9|wjuwmCI< z(dgtMTzm3OGTHq{TmS$?Xk2?j)e(9^a=ncY@Z0Qt_@sr^-%8R-uoxCP=hiBqV1qJa z5$Tm{&vQ{_E;3x^+4rTbGV_`Lf62963+OT4mPBwOIyBV;h?+HCtGQhEyaCYv0R92* z)A>0gFwE>4FNkekpNdMLl~&*W_x%YD*f7n?7qk!RFx6Bs2|_dg^J?;(6M6Kx-CT&C zs7-DRE0Z^RoQ#RFO$}qZ#^_@@FWZIley-h}Yb$kCw~QcriDWO$J@Qm3yd+E?oNz#L zkpvQ%Kq41NBz3x#QHDYFIFDViU$R1o(>!^~vXfuK=qDfrq{RhDgKb&BIG%(c7GmI| zHOZd&b9;}^t91y|R;eY+Fo263UVRXKWV2uXl3$>^T0(A^yfy0YWw52YtIE@rN8%Mw zpSI64Pz zwRUF#Sd^nEyP#D$(J|E$FY~foU3*1;?_vJzEOvHwK`jC)03koX~M_Pju$2VR@9 ztVIflF~%^4F{bEW-G5xietT-ojmUe1jUWTg5XR>nW3InkUqtnD3&tnX;)f~h`f()$ zz^nVOegoj8<6evfcXDJ<>Zx>oL# z_R1@TbzF3|BhTbd{!!Z7>)}x>80|*?QHiQrS0hTjb^XYwoJAjv#!EK!&UcaX+8+1C zmcneZhnDMgoQa{>#{YOWN=`?gmTT=b$@oY(TEw@6tWMr!R6tRY=x@hnlT7Rx7J(;6 zkAnU;hOyq2ao#QBk;p_rl_OW)x0{n{HMdJgq*E8B?$pC9z54VUHHK~6gsC*`XUv-W zzZG6hDx#3~B$F@HB6s+$*U=trvg-{RHa&tx>Th$;GZR8>`nW@mc-n4XEvl39p&fDC#2*38u0ERe`bL6svn@{HAq zyZ1z%i$fuLLu#)~CYA%+utAs8iNGYM1rpZ)}D zJv98P(VDE;GvwXU2`~P0mMsA*eMSHP9Zyv1a~bvyg&4O(r#>R8-z*@RvnQAY=a^7H zPlh2ZTnPs^_JF5)MZ8`9I=oDVS9bmBHfnbrLZ>cF-KmFIdiCiyY7E=B2~%}CH&bU} zZhzjpPp{Aed5EFs?mm@;iX%WAnwi%r2iPrp%P*v3tmO4BxD)|};732b}` zi>dHo2h6!G>|-$S>KH$BtDIwwnFM}HF*Eb$I5+?R00000@L_JF{lGXRAU-VQ(^vLG z;j80~QB*li?`ZUO=p zYv}NvoQY6;rVx=ZM}&BmWKuawm%+t=)v}wcrn?+@C*nE6Acr zA}sNzNPk-?&T9XWS!W};ZBaAJ4!dOAv#hkQndh*h@*Q6uRiB9z|IHf zNkK9Dkxb2`2{TpEZ3JS4#j=!b7uX0LkbJ#2AOF`lkv$zq+ylFzkgx#@FwXykF!G|I zbe0?C)<#@vIpsvTQJ$19#iybv88wosqc&{pc@IDG|Nm*!QdSO8ZWq*I%7JnjH44SO zAOC;qulrJGboI;$wfuSar+;^IcV%~RcVTyScWQTJw`aFyH+MH~*X+fb$^qX2>3w#& zry)%2=cOLmGq?Wz0?Z>zZQW!#n=h_9hyol&agt_vQId)>E@a)bT|bP|R`G6sIG)bV zFD|dHZ*K4IA0E};f^|079tL-CL^wISAW>)x))nXG?&0a>eHriL>*o*1%_}G@uW4#; z>*(ra_Vlv)`UeMwhOdr|vM0u8rf273pubG5z1y(rNcl6P4l`CWz?HWk-syFBqT|{7 zF0I0Es_XG*>;{l?s+U(DJbe1>(c?+L;>kDruU`Mp0i-^84xkoMifJXK40>f1prWC% zerat3buIA1?TGw;J0c-CRyeRoB}~h!YE4UYx*ygz(DeSh9!ZUJik|*)iiOBV^$k&`;lEV@2yxQ>#L81zJg(D?(qB^TRgL{)oL!}lf zcP)ks;bTh9I0u4OH3o9han1o6G%H9Sj$bu{8;P(;T6ErL*aYY>Dv3I3(M5H}jT4=O z{}@YEtJxw!O)&SG`%*UCu$7bLZeQYkdR85AdYmc(Bw%qef+j36z}U1?!UVkH!2h}| z4UYg5BGa9ghcFMy%m6f2OL+uYW6!*3w!Yqu7;(=9XAXS4a%f3@>VUZoGkdOpjmDTK zY-a)-d`^(yaA_y}BWf|z)sPZ#(*s=SKPlZi>yI)66BgBJU_$kl1Wd5JlUmU_-@|OQ z(|{?KH`DTVi{bo>#d^zTXfWljGF|<{Hqw<0q{w4y@2HEw9n(-tZlp$G!97+^xgihWhhg!UrnM8co|Kj6NIU9}sVZ z5BLI~f=>keAkB-zi)q74Qyuuyg1x(Ez@N*F*ugK{+Yg7|Bj8lCw1)$sXGEq1VG1+V z4uTE~A0gQN#xmunclNRc>NX)EnDtK%d|W^}ybOe(yV(aqdxDUMz5VdfXtHx(o#uhp z1v7cE{{Pwx4oU~~4LFS>AE|C%vydVHu!Hn(WP3?6C&%?8llp3=K)B7VF7pfWDiO_z z7&V2uCf=rBIy-mfRF+is@0zucPk~EehgU;b-BW)OiOVskE z#k-`oCP7v<$22n&!8zpLi5YKEq8gZOuu=wL_#kl?)&XMN4dcSjiM%tPjfHYRptn2SLkJqUx&re2-BJd`UISL%H`2F<=Wf1$ttVVWAfO-u7x z^ZHCejXPc0K{4Lz?THd~oD@pXY$uCr#24dIx!MsNfyA!KNoXKG3__A%GT?s~q^Yo* zHFcV+1Ze7#A*2lUd0Yxc;O+-X6$v4Y6AhLQ0wJRoxMy;RgfM^;U*`mgHO(1*fJO}QyI&Q!dcB4heA9&K-;1$D@xnSkg>jnZssYo z%tbQ9>H%5D-&Jd~g$aE{WK~RB#XHh!T3)ox4b2rQ@OAW@b~%yhJ7WqaE1dhZu>ww- z<8;C;C%(b1eG!}Onls=_9$o8t?jnWdb5)QeW@lg2Y=ab8vzgMXru}YSSCOX5l$gYp zLeVwFvPK1@Ur3!h2O&3YAgMr>=6F@t)fP?kD0Q}i6OzdyEj6)oNi?X0`m`bHz8cO6 zkAWk{okHTo0AWFxYvjj;A>ATFj;0_l%GIP#zVgELRL(@4vg>LjD;CZnR>wMS2~I{N zigEXrj{PXguIMY+-Lw+y^r?cfOfQu0oX*dmr%8X1g z=TVZiXnDc(lDNNWS9*I2wa=ag<CnH`Tzm7V=cq|l~n z%CCxvx47HFt#Y7kCNB4mWyV00AC_RU_IS{QM)I}~9_|@I*PF1d&P$U0x-uUEj8&T64Q#_mQhsJ1Gvq}6ydyV| zg!o1gneFV(BL@tb9@DjpNuW>JIZ5V*t-q`)NE$tgQEI93!@YJ1j|EGOG?}2lk)uKb z%e4OSV>pJ<*4#W|a&qEK0KV_Z-O-&f1(d^40`7Uy>0i?HXPB|p8YcF z8+&NKq$=t5x(SIM@AjUyD>Fz$pB+=#AMNzYvp4Y8aeEfLKfchzi434A#)RFv{jQP+ z+or zTjEOI(*MItdaViVN%Kn)P-iTcOktX@qLHWxMR{BF@r22wBy0X&jgCaalS#m-P-#Cq zJF>u`j3>*2H%Zko64D-VFg@E*y9Np=Y{?Xt#zSucM#)pUiMqlrD5*I4`@q%W;)+x5 zdI^tc!sA@8Dg7qeC7!n{pOvde?WLub7?y6O#L1$&YIj@h?dqL9y)8ZKD4=knyB(xL zxXR{HB^uON%a|sS7KM7O29no&0)ea{f_nr`seR>F)-rBPeE6pqdV zHQq3A>D<*rb?*7747Onx*9s?aE8ANntna8z;{~5#bYV8;uXB`Y77%o_Jx9OMRT#om zNJaPYh2`&bebq`hI3vmn!|X8?-eO&yI4--w4i}U^?-a*3s1e)b&G@NbM%n#*%Y4~U zg|y^~hi?ICbDTi3QitaZ?+Beb39V(&pn`G)Mr(3l`C2E}^n~~4$R!VW)IG5S`WY5g za~8j9(Aoc-Uekj^vu2@>M=G?g>Uyj3g14zZb3y5jpR~-j-3M#xiRM-#|0si=!2AF8yT$5MkWtIWMYj@H?b|)$#5Oq<879P z9wLMa^~as?E(=%4Q^h%@8c*afJswJemP8xWLeT4)c~ldB3=*MVa6dtV{v?Di&%Whm zP!jj+xk<6z4=#kUz5i-m{D-~xEef&*-) zwD#2ph}RfGJ(g|VaXsGJv>VG`)Zt8>nKS7TKMCCPMIVGSw`!G;bmL)oqC<+8(U6eC zm>E8u2paM6`O99V4REc;91`Fpss$hh_fi_Yo+(cpN)g6D(fNR1!=i*A*Xx~ooobPP z(@-*Sq!&@BQ9ZRL>;EHQF|`720Qx}F{FnTJ_!s%CS+H=E7rBkjhytW_78JmXY_9gn z^H&FoNxI+Iz}AIFj9(c3B;DmzS~+s#aPQlWvmZ=p`x!a!qGv8Xr%8WJ zBlKR<$}gJQ+NN2{tXwZ{&rsG@6mqJ1rcjh&XSy=1@(@^7UuIV9 zC>NCt3>0F{Bw;pvMD3`6TN|9}JXEiKl&wGQ46VRW^;gMRDb#ir(3jaJs>$PvMV_;`Loiej>DETJjvyQ_X8_Uqvs=MfL7-a|**RLmZ#IC*-T&rK zW1h(N*0HOMJJajZk8V*qb>-}IXmc8wG+gj80 z{`n@PvHS2$;Q30^a%;*ZRf@G~$zsLZ&b{Uu=HZJ?XdR0qQGQl$jJ+hEqsfW}X%Oq^ zxfqC7l%18EGaPvtb<&kHo*kB%a>WLj+fq%l0f~o!e{sQm0$}S+#9acbO(ep90O(VtvebH zN1!Ei_Sir^_H&>#Th^xRNybs_?~lJSVkt*azdrpUeXdm}{>#ft=eck`oqzu~NaRu$ z;%wJZ>$;frme74W$5vjq+ z*jlYno4EFka>3hQ4npj2K~^DqkcP2K%WHcRtE}jilj&>)D>HnUs2-@D@r>)B_kR$- z$k(~cJ(T7xU9aZO;sX9Geu0EpsD;ty@%c+CS5$*UZH7mAO-CWbRuIxb9L_I}w2&66 z$0L6I*_ZQg0fNt$?N_C%{P~(nu4iNtOVXT3P=^?^;+h3(0LXjq`0SUqb6>^I7h}%m z%}<9~UJ6rtaiz0~V<)dae9yPNpP0W?kH|sB4o5ftnBi4rg)-tYvgt_#G$kj;c!y#V zPZPTX2}%vX8K|SN)`42d1_22!IAQ?UCfP|dDTPK>;1t$hzpr|b|GVyo_)Hw z2M~GQx?i0!pdVpkc2j9a3Oy~kwb<9wwl2-n`aH&(sw)rr<_#?#pj@>w`4F?=%gKLNWrK zlkm17aMx(hE55B@Cspj=R?L4Zd-FXA^#qSA5w4fvmcD4sL(A%NIKl;P<3$I9Ay6ja zuU?mU9=1`!k?~kbn2?ThiL+Px)UB)6zvGr-LLMd~eN(n26nS~Oske}uC}iF<9qhD! z2m~7epMCJ`xP|+!Z=?tFy=WXZ}I%JX1+Q5w)>j`v$$$@2j(tBG~;1d^8 z;oWw_?Z)4hnz;11`p9Om-qGLdoO4{ludE;7`$2fcYrW9NR_@fWH(fZhv3t9-c-)!; zu*1O6E#M$5II5`y@Ud6$l;mH-ggIwbSz^k+%^D@mww&k}HZE*CT^xA#ESM;pw+G<@ zP&Zyq{y9bM^SNTDkbHuFB|T_w#~r&ij2`)4RP|qZbm7|siejp^sjCX$V|iQohy4;i zxV5=`q!!m$E?4$Mb%2%ZCRWOFpu6Q~eV4gT$&NI|?rKp|mS+d~JS8hlhN zKtjzX>yCGN_<$OB^Z4yfsi6PfRK@E(3l1uTAp-Kl!h$FW`@jObMS{p9yZiSZN{S2L zx4rk^v9vP0{P&*v7wMW|thiG`?8UNy*0eOsRM56zl%l%(K}bf72+Fm#qcm4=wk7*+_U4ajZUuuwRXY&^xSZ7 zOj_)s^E#^iM%g&e`J1N zCG?no-=SG!`=#i)Al{iL^N)_qBwclOq#6YCgKmjKMP3)Y6SWxvOgeukLN|UY%!7GP zeUpsD#oz#MKAoHw%=P!-;NCcXM)kFVXC1FwJjv*zwlX%4*Tv&>mzI>xwQKLYwQQ}9 z{bOt%0Qi5FLjXWj3s5k>MT^hedS#!Dp?ll@cIOI;rxk3NsmfU9(&aI|F%=_SNOE4X zj5_F%t^VzmAGYGEcI2@UIq+qzT7hg;E1cBM9&GLX)6c`2%z_=n4Vhq zbbRmJA74G-YtE{pXZscN{ma)9KyY+NQ8e!oZoE|&6+6(nc{{#JOpQDQ;FsdWT{_V! zEg0R_Fi%hK;yTXTB8@UKvR0>4lY%9G@q#2|#MHS53!(Ni6(;^?GN$NLw8lc`Yj5ah z3>77B>>o<_KlO2Jix4l#uKY0jKV{-#>8YBwx>*LLjceE0TX}h%7AW=pV~a`;^5hn%iS@##X{4+apjYWtTpvpL{=WQu%pIc z@RjkI+4SU#7Q=1|NEAFE5H8{+dxOcI0hXN&HtFRo-vBcaT9EVhs=kZkv-RaO;BD1c z@0u$JS+sch*XAC&mUcMXOE^$iSIp?E)!W(xp(^E|zlwZx`oeUiH=JNzG!mTT!;ei1 z4T}!ic^nax5JCuzXC)qXXAv@DDriGDRXHrJbfNF5a0_iD%RR2F@_ac5!#Vbb*xEoX zdrJ^=TU$%$kCw6_C(KTE%0?Vk#k#|J-8(YKTUydzjWG>I?Q{+loq7B)Nh;t?)|Iq_ z11BAPH@Pb*KgPW;;dIC%`KA-{Gl#BU;9w?HN`*pP25?vYVfw{%(8J#GYoqJeZgE&7 zzjQ)DCTlo*kP|8k25+d|nL?LwTnxQ38g^ScM1Q8LlLgm%trd!Ts$|eX!{`WLM%8CBZ7o$uSWwno<3x+$BNLinpBF`n^ znH5>Ae${K#s}-4)_35;w>1+EMA|f2YjnED!sJnn%>GDCUKD?)K!aqPbq-|QWf&hDT z`musx@xXYwHL)kN@{*8Yz)*a(@h7u3PT$jKIo8`tp52cqYTqNx{8i^1a?6wGZyHvY z`&|%2BM!u=FatkWn`OR1n!8z?rcI9<&$T+V6^A@vd@~y{L*ZOekkOOw zSKu`2p0K&PzJ2E%ixiR>edbo`!XYN5L*5p1e2;9>da8si0E?Y{{ZIH)J_w_tPv>z& z+o+v15k4DJ#zjg7VLr}L(cY9S;pf2pXWldIxZCV@H8za|M2O)}=_-ekRE$QWL7bw{ zujwDMpur{AKv1kvbeW(#2C%Ew%MnWy$klGxtNW`|v6tnc>Ea+Zg|KDWu3QY!EQB$D zUxbB6r8|H>^e-AJPYE8*BYWYE8XlHCV#g+n)SRLW=z8R9`e@UhAf-A_Pwf7l=)J#p zJJ*)QJFwn8-k-5N}+4+yWePLy*8kqtc!(k*J|LZcW~>B?AOrlI))b$~~FeBU22c64-h z{5k(O#la4Ng~Odt3Km1}lT2y6$67b8E3eD^{JWua?F_4_t(td|x!p9wG_ zn1;wzasw5pt8Olhq7h@Q_QY#Xj^_3iv%RfINR6W#BFjZecuLH~Oy3M(=G7h86eVcQ5&iq?YPmYOTDhZ_N6xhhbqdwH1>e6JkJ8Ijesp?Naa37A@&d|< z3|C`dYO)_QCcQh)23)dfjn_?Mgfn?j=qXb2*W&}86i>xGiQC0kk>>VV%Ff&YEhu{Oy! z-HiKVWN2ln|MXW#-{`Jj^yn6Pd3a-*QHIjprZ~Nn)rTMN+<)@z1TD`FO21-g)T+I) zj>m6qZQ$28@ms5lp7rwMQ8o$(ds8vG1sG?uz#T+Pc^kI%U>k!@i6PcrWozYA1s>@|jI zKyCxk;&jI&Ib*w&UJY?+^Xm)t2H>*J-;c`*t`373KU*fu$I!8%MJ}Ga>iokX=&i5> zrwSI!TL9oE9hM*2O#NG~54V2&;C=M#ne9dD?R)kohD?v}9ieqp0p8AVR}(iPi|wqr z=#G@~^Z`jaOaZtFq!+=d_i&Gvy~&ihA_bNllPX#Gx3DMCAr{Qt(>>quchEYfjq?=jS2}vR|X@~{4M+uF5&oa zFQy?{6+QAKa_7eWT#v)0SX@Y~Cmvzphtzxz`HC~c_a`dW+CEYTpx$ykUHMHdn615K zMwi-<+BS1y)HY?O85LPs*&6BT8LHu49fUHnh>Ym6jWW`lHznoQP~PL((I?~j8~R-> z5*lzLBU3AljoWs1>6tJ)_;nFPxPvW>m=3qId3)3O?>NieD@Wn;i}3y>)61#%i&d`I zp*^#Ty#orD*8Wt#MCO6oF@9!+_l_mOFU9wr$)KwkZ_~mD$o|YsO)d2d9V7)_dwr4a z)=mD#eE4!wNc6?M|8u5$Gm1#{#J-O6u)BMXPE;#BPg_q#<)s`Sh_{8Ck9st$^Iq@H zTm*EzqE*Lcq1wXMJ;fmj9+Kt?u?e*|a5RLt>cewT(WIR4E5#hfB4FpuOCBce@bL4& zSG}I*eV_Y|PfYVEj%^lqq8&QjwQlMJek!g@u6uR;i|L#38z+%o6TQgCmK(u38&&i$ z!a5S4zJOPllRZ3FYXox^jh_0WJk5H?qf?S5bI(CM*LRnX*%C^uQNy}iTxDRTOY z=D0SOuXjcB>Yf9M$DcOcg3=W>6tjkXiC#SuuHTW`Q!t zD9M_&D&2|7r3udZl$%jftY#4OhzJi2BM?%Zn&jqIEkk)NBNrCrO!UWQ2;|I&2vRyB zI5RymG&hYJtT&;hJ)svCuEjp9Lw%%%0y?WX0D)+QIN~W9nL$uTe-hx`k@9gFr*g8Z z)cz2r2a2tr*XAzIDUD5B0PG(#H}>e5Bqmr69Ls|In~s!E+p+fyZW4uAwkpbZl>a>E zgDOxS7;L3WvTQFX?;P|?Yix0#Bm-{o?+;2>llyE%&hF7q?tR01DFS^~Jm)_BH+cF` zlK4?RN9NEdCB#%}X+d62c}hx7smz}*>?aM_ry}w{IS#@<-0s%%BIo!2$_D4K7r>ot z*}Ff+4lNAjlM1b8^fN3*{P_aKA>i_dI=V-Hi$|DBJsWio6pc>T)aF5qG)gKhw#nuL zpEOQr{-~+Vmr~_|&Zw(W{i&<;d85%CJ5`IogRAk;B2@3hOA}ukkiF+hCf)ep*|)B5 zmEO1F!uiEbb;59D18MH^uD9xL`_KaxZ&SRM9!Hlk!Gpz{;PrmsZHY&v9Tsna<{x1> z;z=F0W_P!B2kT_<;|=QSYU`e^ugbAc>f%2M9TW9)ArfKf7VxHea?<`Nl+Do_ts8x( zn9+9&8J$jQbU@b`m8p1}9Z-lh6?4E%esre$(?GkkcI=T+)*f~C9|zVUE%V^KO*$=5 zD%>6)ys>AXwR5@2r-njW;&hIls~F?$Ir^WLa)0>{I&G47{~~*_0O0xv}V_+tM9AEN|F&aJrWf z3>)ZR*rwp|jQHCr%2Q}Cd&J@`kpZd;*Uol}*_q3f0R8YicUM4Unk~S7a1#s_d6`+2 z7=&$?P#Drn6!A_eYdt`dkA}#WZi`GD+<~%hA44NSqGHdefk)kJZUu%6+{3A95orkvqm<;F!rl zVyF|>y2tZ^oH@7)YtuSotx&wYM*{r)wvD9AZ=$UOrTMXSKNZ#{`sCM?FaCe1 zyxj#V1HdEXbdO{MX4{~?9q{L?sLHS{n9c3w`G!LZfEOv5C0 z&Ip7!0@x9=IS#vZ0D{Fv{(MgU`>t9P1WNo4Acsas8?4A|2ooh>-YI9K2q{O{r;hzlm9!7RGt&=k)`3A{IZgVR3byVldV6%2p|q>b0ie8{-Z z_64$HPM}D&L-Ua&F$N;Gk;Ua#-KX!yp>0TEZ>r6GHB~nZfX9F@+`tDY=+_exM}R30 zXKTz2`Mm1DDw3+3bgh;QH*toa2{1o|I{%yYoA|ymh@r<3IuXPPDUO8V;cj^?{N+|u z3WDq*z{kgo5)b!%GII)$cuer1;KO7`00+qJn(qt8PMmZPFgulS1~aAQY`i960NCR2 zj>hE0BN5wAd{EYpOJtvvg1*z1zze)2*4gr72obyv>XD@>&loZ+#~D_)@hc*H zzz&a*yC9LvZay=JqfoF2GWHoW42eF?^XmUI>GH;V zxz7^2!8LdB6CoDNf{oHrw%3F)ZJbS}9@FmYs!U`mOOb)a$yUv`^G>3<(qEHSNYer0 ziP((@D!8hfibSrXN!|>6N7Mk+TM>9d=NA32`E(J~ zlO=e_gM)a9!*lI%(LiXEsn;DdCqsx+sCA?VN*l`7@JOL>t}XXV-E=SB(1I{;nu$ET zuV*mm5J2jJ|`5RDYKC!N&zgfbVw|gPP1hY>;p#k&3Gt=&Xza2@)riNPbNEs z&r28s?3nT*haHuDNO7`BY_NWZ?|a~piKB?-Sh6WNdG=lRni!K{cmnb!ttqddsl`8= zo(x$)J@80PBkI#B`~x6+a3FrsAeyVYa2oo|CK=!VbAx4Vwo+1<4|b|4AT9y&Z>}~1 zG_=hemS%2fzNVV`-0bR*Oz@0QQe{NaN;|(HlY_dz0_1m&kdX+!scRx;+?=)wS9qUm zc{qOy+%d`DfdmryV8gbs3izsdb zn)#E$i{FTPi>C#MlVJ#-zS#NlNv-fa{y5BrUlXHT9qux~5(kmp2)uxVa?6JhM=eua zeJ1u%mpCx62y`iP%$F9z+ViNfUcE}l==Mga=XvS+EM)xGBRccqJrUs-hyeaBj%!6o&DNUB3 z4_p1|Ypl$uIm&MM(@7b5Xd(gLB#+caDf`Ol0p#pNsH)AG4vWlg2SD5{^o*bIB6W^e5JAYvGz3!6#aU@EEO=3wS1?exmjcy?i*GN5JAU<)n#*<-P-1)|A2kSg!wL!fa*- zfC(mR3(}+X4uFm&sJFdm%y`r!L{MHd(FOqm2qm1A@+=x$U@tw=6c#5$BDgkvgL6)E z^$-sFdE^1y?GCeLP+u2>lB--9(q~*u?0R5aMl8*V5l47D-KO-Z9d=uQ0obu&PXOff zEJ<1Esw-QCv+uApdW;Ytp5BB(x)mKk4q(TddL1GzXi&exUn2H11k){a!lspE&Rq6L zWYvaul9Wv(_@vjCok8s@0j;HOFLZ``K;h4_mjYb!?*zaY*f}i&ug}NFM=#SwL@GSW z7$jRWmnGwt2n-JGaYooI`i0oqkG2}m6 zO~;G8W;gx1C}D1R(Aw&<`%47o$a)LHFW26{U=t}mJpgWf7u5HCtXJ_IB-l4tDWjfO zEO{iDcN<&18|_i997bxQd~z!d0-2HN3QoX+pIfcJ3B*F`HFBx*F6wmwrk31CiG(oq2@f z!*f)Q8^Ik5bowedujV%k1N(%mn(CPV5%;`;!Y5iwqsXPKQdnUr+ob+{sB1|92t*b5 z^EtQlrDBkwjW*k&$8^EDGKf^1$Sg;tlvz29C=0dKsUJvfuXPDE;iV!ymC1LDG1jwd zipAd?^bjx7+$fVE7mAcpOfRTrg@y8=mhtv*{){|mNm_FUw#2e=6{MfZR?56Rf7(Dh!Fj4`su2pT9p{9j0Mb$)$7FKRjm z0EycxwpQ@bt?+EL>B1<#OYEPzK;jNyiNncJNSW?{P1oE~5sV>xXnK0J;S4S`9ALd! z|2bW=!k4J!nxR_Xi)zwQ{W*9&vAH#vS_+OiJ)FGNxj74z=f?qh9vCv57?tYp{jGNL z1$y34V?`<6lL%$}-i(y3=|Y9KW>Tc_Fetk**%!Uz7i^~w*i2q$iPx-=+l0!52Fh;9 zIT~uVI&PBEDWsk=opM-)5oYPS$-rc?xI%Nr40mqVUEC|>r81q)24=HOx0Q1xTVLnf zZ^!*K^ldFD@xwkQsDqMEfpCu6SxyzuoHU|tYA~T4e0EH1wnutvs!I5w|C|g)j2T_( ziHu7ll@~Q*+G>|ww<+XuV_k?hQw?)u*+KKl;_Dyvoqx}lXy%#ONz98Sg;-_a22|NQ zf0|%qssAyEus7;3zUD|Pv%yhYj3cvk%Rb=^$EqTev?GHW*7HNI_3_PCqB0dZ8WUTC z{9?U5Q<5bZ)d>A4#9m1hWvR+f`f8sF16bR+;JTe5kTvo|1xw|r;qC+hDYu5ULl0)4 ztPM^j3teoND=}g6-7A^7zBgIOHgYe#0g=hSR=e_uOx=0C=1lk$EyFss1(9H$%O$!B z4DZ}l=io7NyPCXjj_FC%!{{3+*^@;^j(uUdSfZ6B%C*`kh_QK6e;utG|1GwjWy$PZ zX64edl36JC)h((qUt2m$$;LyUWvm45E1ge-ceh=YWn$k`Tx`Z*7l7$LY5g-~Cu6R= zYaeYCAD+7+64#wtD>2LPMaN4C5`;$1{$(`lLjOcB8cMb@($%TbItN--L%Ct=?m`7pWN8wiHfRm! z!+`T>J3HrU!zB;D6oPRvr7O26%rT+B$5(fnulX^JT}~vMeNydQYH_JiPA?QGM~JO? zT){&|L3oLgn%($ds*joV&UasrU+K6fl30-<*`{0S8tc}fi}6C$C?8(|%zkq7^-JEe z_>QQn9(ZPa`4EM3wOYa;>$l{W0)C!D;QMSlWe2+4hReoM3yS@oayi4n>a2Ix#gV>5 z9Fps6rLV_2IMVGQ!K>A(^H8yJ94&c<(WYRxY>KO=;SCD!-Z(9?2ovK^LPvEgPTM&m z*Svp3oB#sJR<2l-wPQvITdsq64nw%*(pPk`(HqkOn89-vb3?SISW%>VngP5vK7`Z> zlWZ8x5rZ-s3ez`;<=bTDcq^yIaEPw)`Jg{3yHAidc1;{Ye__;J!ap%e-O_xcZNXyS z;){}2y*59)1CCVdd~fJKGmA_PX8C~raF3gcSv&+;fSXp2!tN&c1Wvs~ZS^u}-YyP? z9F=ghx)%4gEOg%apfQb`a&l8P`UUVb_@Hwa^Y^2_$I;pKKW+P2ZdvfMYLqXi)!~=4 zX0aRSJ#T5Vpe(>G70Y=CpLSO!`?QX5 z7L#FNGD$4n8f%MwtKU9QmAgETvI!{pNI#F~y)3`FHrI-&YsM{n!t= z`j{HJN$W-?s6MIhmQBDGy=&Z@(dFV(O24une_gAfX+$-GuWk(Y8^-V&ucjzKqX&E( zjYtg<$>G_aLk(Rk*P%JuZ3iIxEKk+A!XFRkXNSw<@QdPt7ZOOQmmuWlT9G znT2Ps?3$Tb+=^BOBL#H2twxFSDOti*xi6y7;6-;aV|sjIm`AzqcKnRknr-pB<$X9h zyZ)V%Su9y_TV&-*k`NPRX*PH12b>y0rc1(TmuI7{ zEDyD%^R@$vt9zZI;UUmB2vj5NX%jV51f2D5|+CcC^T*}Y8jL$#>b4AE1f z2s6uFHWnJzpG2C+?k}PLm0LbUZA(PoJqvCwk$C_nUL^#ON^AO8~MIA zqnMCIXSXeB5zLO+BI>*C*^wSw1J4<0b231PQKG0icjW=5V1i6f@MqAjPYN$Wo$I4@ zS*mZrC2T-bc7M;gL=6moJ@eS$CLyEC@sWy3B9L!0G|-Clr3uOt0rcF0giJ7(22xuM z75Y*N`5BufQZDu;CH7kP*aBOf(Jq@gEn=cM8-eDqtkmjL-f|4)VnR8)k<|Jlr*O+p4DagH${--X!&4FXezb3mv9@{31^x^j1m zZAXnF6IAe3*!8!7ju|ODN`T?W&zndYspjY5x-7h>!$KM@eT!{}fMDiEl*zf=d2-5H zz{-=to^tc;C&S~eR=75P za~>3f?8u8vL@Ft{qo)6?6g*QsWjGME24ZJSj3X(zHK~sCexzw4ZKt&qWF`(SaGv7z zrh-{aP~X~z8*bRj17o{E;%Yb=Jer?+Rw?QfT290uP55NfL_m0uM)RbRR^h6YUYC#F z^!s7o)~t&ASEYToZDDwk*K&McPOl=+2=*CEIwBe!Ry})aI9$r=DPL{Mz?MGjnB;GF zld%UwEm1GeFgS;i88^jrJFl*C6N}T};%H|D+7uU3J)A&TL=bHE7M*c*EERn3X1RnMSghIh9 zKqm&zF*5b+?Z8&KBO?bjVETGKuIW$|svfszQ;fSkV0)eV=HxpU`9)~Iv8l!_30Gfy z-=Vcha?p^nl#C!eYk>a+W%4G$72TKif-5oDD5Fk_mFO5Wh|5;o$osCjMS5X8@7sHz z7u}W;Zg`8os+e8*6ldS?h)8kt{u))x+?yH>JRFOI#<-U)?SwQG=RWyOqLwU6qVFf2fhVu!(U63zSNlv#fMj ziO}YKB!R#<|JQLPL6d$l-=ELZBDg0)s4Dyz89W)eXkHsj(N`s6*~Bq0I`a}9=C^M_ z=@uSq>Lh{9q*suG1&Okt{CU@})x0|4(1 z%VKdC(kPqymsXiR!u=@HrYhb>dMf7w^LcLQK!nHYLZCS!#G*x#U)Sd+dnTLqeN<|k z0TTx7`Jkyze|=~Ok`7+>@MC1;g$8DHy=c6)MV5y3)k%RZ695}0O9@h`7mv-cN--8{ zHe(0fmRyYx+*|kRjE8WBi)0`G;kf$xw_oKi7P0@i&j9}}Pp^`u;cd#M1E+QNANB+S z`2R&8X52S~=InnQ)6XBJpKJz58z`s9jlxW=W2`- z?_SiX;w7OhmR`gatnPSCRw&TlXb37meyARe(B*w8mex`|rX|i>>SM*#hhKDKmuET*GudPr$CN|8NLKBIWLaD(Uz}+^IW24bR?okD=`0TTA)@C)A#cxjSsQ{LX1D`>#W-(eDsr!PPJoC^k;ul-Y=w&2bmSM?wwZ z7}+AI(m3(YHB~QIwonQqCnhPF9aMRWmu(UTN6wiG&5M^AlSVjvot zOjiXV@d4R$RZCnz2SIWGS3%_?;GIdRr@gmYxcRdM-XY~v?go}>}Pty|WS!j!b zdN%yyd%X!Fi)XzlhLs`6%(koE9QoC%p2wMikVLwz^9I-~j?g1VfHRw=DIT20hc zC|O&it`en0wHl4|3aHFSS&N8>fN-_dV3ah~1C^?vMvJ+7QI`u$}sYFwWFPI_A!EGLX1CO)1nJ*fDWf^^Np^7y1l9Y$8kC;k)oj{#N z=Ae%oLQb#p0S`47t5iYZ2v<8Hxn5YG+u>y_`I6KKy`+{!9fCHiZ;@!;1e8r?cqrYI zmg1{0w;}^Rg$zxbFoy+rELpK;!5;rv zA(Lh2zFbO-@>v0(Lf;TW0S*60GSVnTL1K+5raGv_Gt*=ig0=(0(%5(}vGQR~+0tW!=q<2j9s&N*+hQg1DE#U+=OdFhpz zbhOH4uzQu2s@1BIp@*hk9i!1+Xwallv$4k5W0mp7nP8%RukCZy7F+Fi&288JKZpDe z&J)d?upoG08CGE(HenlfVQ-u5cG>NO9dpGgIpGqn;TG;eg~w2O zU1Lp|kX3(!RuD~gwN8?NKJ+Gwz$UhZiBU{MMZqStiELt<#1>`?w?)_@WmeWCuTTJs z6>>FKm)7gmsv<+#bZt?p9tMdK5;El`eRZOz@UnJlG9K7OHnCgs;>%4|9_Pj`|3^0_ zHR@0PtFj`!AZ!M+AM8?ktzYxoW%B-0;)_H4U(3lKG&}xgS2;LK*vvT5r5H_@&XG-* zJo?p@+?x4W{>pMRrq=BZecOEDm$zqM!c=_A|KBAecCSI?|NJ+z?>3iuin#rGUIhRE D#(2$m literal 0 HcmV?d00001 diff --git a/magento/setup/pub/images/favicon/favicon-16x16.png b/magento/setup/pub/images/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6bffc73b131c3bbde7f0a9d631ba0841bbf3af GIT binary patch literal 281 zcmV+!0p|XRP)}Wm|1WD zWzdD=Heg`U1X`X%Fuw*JxD&%Gih_kMNyyB9nXyq1JR4TQU<4Q5F?`b$)qH0zs!t4t zNMNH_F>e^pfqQ45axqQIKQ?e*7}#JSIbH3C1~uryAUzEVpNbu(Xq0_qAX%F%6Jb$q fnRISKe_rPYSee%`)Jem>00000NkvXXu0mjfy{>C( literal 0 HcmV?d00001 diff --git a/magento/setup/pub/images/favicon/favicon-32x32.png b/magento/setup/pub/images/favicon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a72d9d7d3421cb130361b9e2ae9c1220e74b9023 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyegQrqu0ENCAJVm{g{p7vKLa#b zvLwhanBmqr@gu^YzdLf9vM8lqUHy7`aEI38(%t$;BTJ_M6&s?egk->6z&HUxs_xA#b;k{S(`3ICivrYyZk$we4T1 z^pZK>4=mAN*1NK&`hbSdvP4hi(go@V4*m9f@-2mBx55e53Dds4xqsxd_Jco`YyTg} zXEa`%@Q!h9LO{_sF@vp>nwLy6nDgvZIK!Vs^->qK&WA8uzg5D$=}+bB+Dm)3->&DL XprF*35LB}l=r;yWS3j3^P6$>+m%-zko>*}>z*Dr5deeke)V8phck}Q2no8Jbk{3Ly)_2;`wvimCqTq`F3R5rNZ zv(TKSE>-f`^54!DGEt(NPW-WGU~F6Q?*AcP!+wsnr`JbSe(sI@d@w~m_oDoymv7%r zEK2{E$)CCXwg268*0bO9H-;VO+)?@W`@@3P*CzINx5+QwU_0yQ>a+SYYD5af*T0>5 zOYVALN3GxgJf>(Lof}C?7KS}X7;@_DxOfug?8q`zV%}jezx4eHh8S_v-ye=K>~}f3 z>vt-{ftu{gCo>&ISQ#$Hy;J^dq^2x;`0G7;F~)|2wN0;2lsek8Uf6b@WiG=>m&Z(R zp09q%`62LkR%AoT%z2C_4bL#BY+r1waC4ms`-VIhfe(?lwc^=dbZ%mpb!9%wiUuw; z)UmrlLgAa_lq)|N0`Bs(SMzL;Wt?Jqvth{^POi;94pB2$Q@!LA4COVpXfu@DXAfd# zIJ5GnLl9$weAAz(_zw&VQi2s2e%yMo^{*QXgQTLvt|~k6@_DRFijE1}@;ChY%;@g8 z`r`wWTbnc4k=#g3s%O#vsy(+(J zZ||HIZV3;Co^VrGs@V3N>fRUr67ms#ms}T4$8@NCNuV9_1>sMD_8$o7LeC@NqJVGb zOpmV52yY5sP%c>eAG~{XS^LYnrY`+M*NX!F`Sr0M-dp=Cdd73^pAl#ut6$ds=M&r> zzNYmbe&Hr;PaY8;<1g$#_m_#QB%G2j#1?&A`_J&tZ%_R81#DPc$t53_C*(Bwgnz`( z%DJZ;-Q*lT(4HK*DUdVRIAq7mLv-OMzMuzb`HN1<;N@LGBeeKaIrgxNeQV?E8gNi- zdALMvE05p)hI4yeVb!@uA3JyNUL5!Taqh#X&SjZ%JIllRv}K;@2(JjtPlF#5&m4a0 z2eEle_(}LmAPyC0vFRPa#>m#^lDh&i0FQUwz&UBi23!s%BSK$?TGOuqI_UZSe=b`-@s!!P+p}-5eM$gD&`cbC8?0L+-jThR! zE==OLOn=$)N%rXZ&p@VTSxZs$75m)kWlgAaHq zaBcl9lWMynz+1|W*)wT=kq3w7fihc@o=aC*ZeV{Lmr1&&eJ1^u8)2SB^Kx1{W$oZq zApeL-?fJpipZ7QNd~Y?+x0mz0*BT<*%6GHum&aN5ZC3ZU`!LJ$Jo`G&TfL2bYkPIC zz0=-a-EVDnbLWQov4u_9=A1%Dr0xx2d`|JKZjRt5?k)&x!f(Qt!plPI2u#mpLO$9# z(gR)pE7;hhA6r6aCIbsAB` z_mqYAU#)fQ|C{_d-uJIX^B>dCdi{Uc|L}h8zi0aUjVk^#_L&Pg1B=yPX#Q&oVox7C zudTvA@2Fcs2R*T$o-N#evnyNvS>h!BITsq78A=v7H+{%C`v0ADUG;URu2qkmO1)om zmIbGUvzSny>cGdE5L;jBuD|3pZO~WPH-)xmxtD(Okvg6#P*A+k%b3n1l;r zLA}CyGmGD}l}_SwR|wBDM5`M|u&dQ~A&T8={ix>f9gpu@h|%usqtqL9#iwU)iFtq)7MHlUdMO8uJp(DJm$kR zlAI#9I=-DnU&E6CU+`9CjE8-*9G~iMMDyyOe6Kq;$fpOwEn%)XK5d`mN0qTbjBJiw zXpYa&kJQ*WmK>jIcK3YPK(06Ww>#I`g97Z-ftuMWD5xc v>c^hz?mP9X?^bu5`k8OGdrP@wZ)vlQ+;MIdx$j&TIfn6Qyc*AZAm-eEQM3He literal 0 HcmV?d00001 diff --git a/magento/setup/pub/images/magento-logo.svg b/magento/setup/pub/images/magento-logo.svg new file mode 100644 index 0000000..e4f6278 --- /dev/null +++ b/magento/setup/pub/images/magento-logo.svg @@ -0,0 +1 @@ +Magento-an-Adobe-Company-logo-horizontal diff --git a/magento/setup/pub/scripts/main.js b/magento/setup/pub/scripts/main.js new file mode 100644 index 0000000..559ea54 --- /dev/null +++ b/magento/setup/pub/scripts/main.js @@ -0,0 +1,10 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +function showSection(section) { + document.querySelectorAll('section').forEach(function (element) { + element.style.display = element.getAttribute('data-section') === section ? null : 'none'; + }) +} diff --git a/magento/setup/pub/styles/setup.css b/magento/setup/pub/styles/setup.css new file mode 100644 index 0000000..7b156dd --- /dev/null +++ b/magento/setup/pub/styles/setup.css @@ -0,0 +1,6 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +.abs-action-delete,.abs-icon,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.extensions-information .list .extension-delete,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.validation-symbol:after{color:#e22626;content:'*';font-weight:400;margin-left:3px}.abs-modal-overlay,.modals-overlay{background:rgba(0,0,0,.35);bottom:0;left:0;position:fixed;right:0;top:0}.abs-action-delete>span,.abs-visually-hidden,.action-multicheck-wrap .action-multicheck-toggle>span,.admin__actions-switch-checkbox,.admin__control-fields .admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label)>.admin__field-label,.admin__field-tooltip .admin__field-tooltip-action span,.customize-your-store .customize-your-store-default .legend,.extensions-information .list .extension-delete>span,.form-el-checkbox,.form-el-radio,.selectmenu .action-delete>span,.selectmenu .action-edit>span,.selectmenu .action-save>span,.selectmenu-toggle span,.tooltip .help a span,.tooltip .help span span,[class*=admin__control-grouped]>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.abs-visually-hidden-reset,.admin__field-group-columns>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label[class]{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.abs-clearfix:after,.abs-clearfix:before,.action-multicheck-wrap:after,.action-multicheck-wrap:before,.actions-split:after,.actions-split:before,.admin__control-table-pagination:after,.admin__control-table-pagination:before,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:before,.admin__data-grid-filters-footer:after,.admin__data-grid-filters-footer:before,.admin__data-grid-filters:after,.admin__data-grid-filters:before,.admin__data-grid-header-row:after,.admin__data-grid-header-row:before,.admin__field-complex:after,.admin__field-complex:before,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .magento-message .insert-title-inner:before,.modal-slide .main-col .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:before,.page-actions._fixed:after,.page-actions._fixed:before,.page-content:after,.page-content:before,.page-header-actions:after,.page-header-actions:before,.page-main-actions:not(._hidden):after,.page-main-actions:not(._hidden):before{content:'';display:table}.abs-clearfix:after,.action-multicheck-wrap:after,.actions-split:after,.admin__control-table-pagination:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-filters-footer:after,.admin__data-grid-filters:after,.admin__data-grid-header-row:after,.admin__field-complex:after,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:after,.page-actions._fixed:after,.page-content:after,.page-header-actions:after,.page-main-actions:not(._hidden):after{clear:both}.abs-list-reset-styles{margin:0;padding:0;list-style:none}.abs-draggable-handle,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle,.admin__control-table .draggable-handle,.data-grid .data-grid-draggable-row-cell .draggable-handle{cursor:-webkit-grab;cursor:move;font-size:0;margin-top:-4px;padding:0 1rem 0 0;vertical-align:middle;display:inline-block;text-decoration:none}.abs-draggable-handle:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:before,.admin__control-table .draggable-handle:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:before{-webkit-font-smoothing:antialiased;font-size:1.8rem;line-height:inherit;color:#9e9e9e;content:'\e617';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.abs-draggable-handle:hover:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:hover:before,.admin__control-table .draggable-handle:hover:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:hover:before{color:#858585}.abs-config-scope-label,.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]:before{bottom:-1.3rem;color:gray;content:attr(data-config-scope);font-size:1.1rem;font-weight:400;min-width:15rem;position:absolute;right:0;text-transform:lowercase}.abs-word-wrap,.admin__field:not(.admin__field-option)>.admin__field-label{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box}*,:after,:before{box-sizing:inherit}:focus{box-shadow:none;outline:0}._keyfocus :focus{box-shadow:0 0 0 1px #008bdb}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}embed,img,object,video{max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/light/opensans-300.eot);src:url(../fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../fonts/opensans/light/opensans-300.woff) format('woff'),url(../fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/regular/opensans-400.eot);src:url(../fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../fonts/opensans/regular/opensans-400.woff) format('woff'),url(../fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/semibold/opensans-600.eot);src:url(../fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/bold/opensans-700.eot);src:url(../fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../fonts/opensans/bold/opensans-700.woff) format('woff'),url(../fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#333;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.36;font-size:1.4rem}h1{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2.8rem}h2{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2rem}h3{margin:0 0 2rem;color:#41362f;font-weight:600;line-height:1.2;font-size:1.7rem}h4,h5,h6{font-weight:600;margin-top:0}p{margin:0 0 1em}small{font-size:1.2rem}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}dl,ol,ul{padding-left:0}nav ol,nav ul{list-style:none;margin:0;padding:0}html{height:100%}body{background-color:#fff;min-height:100%;min-width:102.4rem}.page-wrapper{background-color:#fff;display:inline-block;margin-left:-4px;vertical-align:top;width:calc(100% - 8.8rem)}.page-content{padding-bottom:3rem;padding-left:3rem;padding-right:3rem}.notices-wrapper{margin:0 3rem}.notices-wrapper .messages{margin-bottom:0}.row{margin-left:0;margin-right:0}.row:after{clear:both;content:'';display:table}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:0;padding-right:0;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.row-gutter{margin-left:-1.5rem;margin-right:-1.5rem}.row-gutter>[class*=col-]{padding-left:1.5rem;padding-right:1.5rem}.abs-clearer:after,.extension-manager-content:after,.extension-manager-title:after,.form-row:after,.header:after,.nav:after,body:after{clear:both;content:'';display:table}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:Icons;src:url(../fonts/icons/icons.eot);src:url(../fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../fonts/icons/icons.woff2) format('woff2'),url(../fonts/icons/icons.woff) format('woff'),url(../fonts/icons/icons.ttf) format('truetype'),url(../fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}.icon-failed:before,.icon-success:before,[class*=icon-]:after{font-family:Icons}.icon-success{color:#79a22e}.icon-success:before{content:'\e62d'}.icon-failed{color:#e22626}.icon-failed:before{content:'\e632'}.icon-success-thick:after{content:'\e62d'}.icon-collapse:after{content:'\e615'}.icon-failed-thick:after{content:'\e632'}.icon-expand:after{content:'\e616'}.icon-warning:after{content:'\e623'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.5em;left:0;position:absolute;right:0;top:.45em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e62d'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e632'}dl,ol,ul{margin-top:0}.list{padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success,.list-item-warning{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{left:-.1em;position:absolute}.list-item-success:before{color:#79a22e}.list-item-failed:before{color:#e22626}.list-item-warning:before{color:#ef672f}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .9em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-medium{font-size:1.4rem;padding:.5em 1.5em .6em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:active,.btn-link:focus,.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:focus,.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1);color:#fff}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active,.btn-secondary:focus{background-color:#574e48;color:#fff}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary[disabled]:active{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:focus:after,.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:focus:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:focus:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:focus:after,.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:focus:after,.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:focus:after,.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}.form-row.form-row-text{padding-top:.6rem}.form-row.form-row-text .action-sign-out{font-size:1.2rem;margin-left:1rem}.form-note{font-size:1.2rem;font-weight:600;margin-top:1rem}.form-el-dummy{display:none}.fieldset{border:0;margin:0;min-width:0;padding:0}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-el-input:required{box-shadow:none}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;padding:.43em .55em .5em 0;vertical-align:top}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{font-size:1.25em;font-weight:600;margin-bottom:2.5em;padding-top:1.5em}.form-legend{border-top:1px solid #ccc;width:100%}.form-legend-light{font-size:1em;margin-bottom:1.5em}.form-legend-expand{cursor:pointer;transition:opacity .2s linear}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e615'}.form-legend-expand:after{content:'\e616';font-family:Icons;font-size:1.15em;font-weight:400;margin-left:.5em;vertical-align:sub}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{background-color:#fff;border-color:#adadad;border-radius:2px;font-size:1.2rem;height:1.6rem;line-height:1.2;width:1.6rem}.form-el-checkbox:checked+.form-label::before{content:'\e62d';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.8rem;width:1.8rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative;z-index:0}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-select-label .form-el-select::-ms-expand{display:none}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{border:1px solid #adadad;height:45.2rem;margin:0 0 1.5rem;overflow:auto;position:relative}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fffbbb;border:1px solid #ee7d7d;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.8rem 1rem .9rem}.check-result-message{margin-left:.5em;min-height:3.68rem;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}body:not([class]){min-width:0}.container{display:block;margin:0 auto 4rem;max-width:110rem;padding:0}.abs-action-delete,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.extensions-information .list .extension-delete,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.text-stretch{margin-bottom:1.5em}.page-title-jumbo{font-size:4rem;font-weight:300;letter-spacing:-.05em;margin-bottom:2.9rem}.page-title-jumbo-success:before{color:#79a22e;content:'\e62d';font-size:3.9rem;margin-left:-.3rem;margin-right:2.4rem}.list{margin-bottom:3rem}.list-dot .list-item{display:list-item;list-style-position:inside;margin-bottom:1.2rem}.list-title{color:#333;font-size:1.4rem;font-weight:700;letter-spacing:.025em;margin-bottom:1.2rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{font-family:Icons;font-size:1.6rem;top:0}.list-item-success:before{content:'\e62d';font-size:1.6rem}.list-item-failed:before{content:'\e632';font-size:1.4rem;left:.1rem;top:.2rem}.list-item-warning:before{content:'\e623';font-size:1.3rem;left:.2rem}.form-wrap{margin-bottom:3.6rem;padding-top:2.1rem}.form-el-label-horizontal{display:inline-block;font-size:1.3rem;font-weight:600;letter-spacing:.025em;margin-bottom:.4rem;margin-left:.4rem}.app-updater{min-width:768px}body._has-modal{height:100%;overflow:hidden;width:100%}.modals-overlay{z-index:899}.modal-popup,.modal-slide{bottom:0;min-width:0;position:fixed;right:0;top:0;visibility:hidden}.modal-popup._show,.modal-slide._show{visibility:visible}.modal-popup._show .modal-inner-wrap,.modal-slide._show .modal-inner-wrap{-ms-transform:translate(0,0);transform:translate(0,0)}.modal-popup .modal-inner-wrap,.modal-slide .modal-inner-wrap{background-color:#fff;box-shadow:0 0 12px 2px rgba(0,0,0,.35);opacity:1;pointer-events:auto}.modal-slide{left:14.8rem;z-index:900}.modal-slide._show .modal-inner-wrap{-ms-transform:translateX(0);transform:translateX(0)}.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto}.modal-slide._inner-scroll .modal-inner-wrap{overflow-y:visible;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.modal-slide._inner-scroll .modal-footer,.modal-slide._inner-scroll .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-slide._inner-scroll .modal-content{overflow-y:auto}.modal-slide._inner-scroll .modal-footer{margin-top:auto}.modal-slide .modal-content,.modal-slide .modal-footer,.modal-slide .modal-header{padding:0 2.6rem 2.6rem}.modal-slide .modal-header{padding-bottom:2.1rem;padding-top:2.1rem}.modal-popup{z-index:900;left:0;overflow-y:auto}.modal-popup._show .modal-inner-wrap{-ms-transform:translateY(0);transform:translateY(0)}.modal-popup .modal-inner-wrap{margin:5rem auto;width:75%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;box-sizing:border-box;height:auto;left:0;position:absolute;right:0;-ms-transform:translateY(-200%);transform:translateY(-200%);transition-duration:.2s;transition-property:transform,visibility;transition-timing-function:ease}.modal-popup._inner-scroll{overflow-y:visible}.ie10 .modal-popup._inner-scroll,.ie9 .modal-popup._inner-scroll{overflow-y:auto}.modal-popup._inner-scroll .modal-inner-wrap{max-height:90%}.ie10 .modal-popup._inner-scroll .modal-inner-wrap,.ie9 .modal-popup._inner-scroll .modal-inner-wrap{max-height:none}.modal-popup._inner-scroll .modal-content{overflow-y:auto}.modal-popup .modal-content,.modal-popup .modal-footer,.modal-popup .modal-header{padding-left:3rem;padding-right:3rem}.modal-popup .modal-footer,.modal-popup .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-popup .modal-header{padding-bottom:1.2rem;padding-top:3rem}.modal-popup .modal-footer{margin-top:auto;padding-bottom:3rem}.modal-popup .modal-footer-actions{text-align:right}.admin__action-dropdown-wrap{display:inline-block;position:relative}.admin__action-dropdown-wrap .admin__action-dropdown-text:after{left:-6px;right:0}.admin__action-dropdown-wrap .admin__action-dropdown-menu{left:auto;right:0}.admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__action-dropdown-wrap.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin__action-dropdown-wrap._active .admin__action-dropdown-text:after,.admin__action-dropdown-wrap.active .admin__action-dropdown-text:after{background-color:#fff;content:'';height:6px;position:absolute;top:100%}.admin__action-dropdown-wrap._active .admin__action-dropdown-menu,.admin__action-dropdown-wrap.active .admin__action-dropdown-menu{display:block}.admin__action-dropdown-wrap._disabled .admin__action-dropdown{cursor:default}.admin__action-dropdown-wrap._disabled:hover .admin__action-dropdown{color:#333}.admin__action-dropdown{background-color:#fff;border:1px solid transparent;border-bottom:none;border-radius:0;box-shadow:none;color:#333;display:inline-block;font-size:1.3rem;font-weight:400;letter-spacing:-.025em;padding:.7rem 3.3rem .8rem 1.5rem;position:relative;vertical-align:baseline;z-index:2}.admin__action-dropdown._active:after,.admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .admin__action-dropdown:after,.active .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin__action-dropdown:focus,.admin__action-dropdown:hover{background-color:#fff;color:#000;text-decoration:none}.admin__action-dropdown:after{right:1.5rem}.admin__action-dropdown:before{margin-right:1rem}.admin__action-dropdown-menu{background-color:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;line-height:1.36;margin-top:-1px;min-width:120%;padding:.5rem 1rem;position:absolute;top:100%;transition:all .15s ease;z-index:1}.admin__action-dropdown-menu>li{display:block}.admin__action-dropdown-menu>li>a{color:#333;display:block;text-decoration:none;padding:.6rem .5rem}.selectmenu{display:inline-block;position:relative;text-align:left;z-index:1}.selectmenu._active{border-color:#007bdb;z-index:500}.selectmenu .action-delete,.selectmenu .action-edit,.selectmenu .action-save{background-color:transparent;border-color:transparent;box-shadow:none;padding:0 1rem}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover,.selectmenu .action-save:hover{background-color:transparent;border-color:transparent;box-shadow:none}.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before{content:'\e630'}.selectmenu .action-delete,.selectmenu .action-edit{border:0 solid #fff;border-left-width:1px;bottom:0;position:absolute;right:0;top:0;z-index:1}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover{border:0 solid #fff;border-left-width:1px}.selectmenu .action-save:before{content:'\e625'}.selectmenu .action-edit:before{content:'\e631'}.selectmenu-value{display:inline-block}.selectmenu-value input[type=text]{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:0;display:inline;margin:0;width:6rem}body._keyfocus .selectmenu-value input[type=text]:focus{box-shadow:none}.selectmenu-toggle{padding-right:3rem;background:0 0;border-width:0;bottom:0;float:right;position:absolute;right:0;top:0;width:0}.selectmenu-toggle._active:after,.selectmenu-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.1rem;top:50%;transition:all .2s linear;width:0}._active .selectmenu-toggle:after,.active .selectmenu-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:hover:after{border-color:#000 transparent transparent}.selectmenu-toggle:active,.selectmenu-toggle:focus,.selectmenu-toggle:hover{background:0 0}.selectmenu._active .selectmenu-toggle:before{border-color:#007bdb}body._keyfocus .selectmenu-toggle:focus{box-shadow:none}.selectmenu-toggle:before{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';display:block;position:absolute;right:0;top:0;width:3.2rem}.selectmenu-items{background:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;float:left;left:-1px;margin-top:3px;max-width:20rem;min-width:calc(100% + 2px);position:absolute;top:100%}.selectmenu-items._active{display:block}.selectmenu-items ul{float:left;list-style-type:none;margin:0;min-width:100%;padding:0}.selectmenu-items li{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row;transition:background .2s linear}.selectmenu-items li:hover{background:#e3e3e3}.selectmenu-items li:last-child .selectmenu-item-action,.selectmenu-items li:last-child .selectmenu-item-action:visited{color:#008bdb;text-decoration:none}.selectmenu-items li:last-child .selectmenu-item-action:hover{color:#0fa7ff;text-decoration:underline}.selectmenu-items li:last-child .selectmenu-item-action:active{color:#ff5501;text-decoration:underline}.selectmenu-item{position:relative;width:100%;z-index:1}li._edit>.selectmenu-item{display:none}.selectmenu-item-edit{display:none;padding:.3rem 4rem .3rem .4rem;position:relative;white-space:nowrap;z-index:1}li:last-child .selectmenu-item-edit{padding-right:.4rem}.selectmenu-item-edit .admin__control-text{margin:0;width:5.4rem}li._edit .selectmenu-item-edit{display:block}.selectmenu-item-action{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:0 0;border:0;color:#333;display:block;font-size:1.4rem;font-weight:400;min-width:100%;padding:1rem 6rem 1rem 1.5rem;text-align:left;transition:background .2s linear;width:5rem}.selectmenu-item-action:focus,.selectmenu-item-action:hover{background:#e3e3e3}.abs-actions-split-xl .action-default,.page-actions .actions-split .action-default{margin-right:4rem}.abs-actions-split-xl .action-toggle,.page-actions .actions-split .action-toggle{padding-right:4rem}.abs-actions-split-xl .action-toggle:after,.page-actions .actions-split .action-toggle:after{border-width:.9rem .6rem 0;margin-top:-.3rem;right:1.4rem}.actions-split{position:relative;z-index:400}.actions-split._active,.actions-split.active,.actions-split:hover{box-shadow:0 0 0 1px #007bdb}.actions-split._active .action-toggle.action-primary,.actions-split._active .action-toggle.primary,.actions-split.active .action-toggle.action-primary,.actions-split.active .action-toggle.primary{background-color:#ba4000;border-color:#ba4000}.actions-split._active .dropdown-menu,.actions-split.active .dropdown-menu{opacity:1;visibility:visible;display:block}.actions-split .action-default,.actions-split .action-toggle{float:left;margin:0}.actions-split .action-default._active,.actions-split .action-default.active,.actions-split .action-default:hover,.actions-split .action-toggle._active,.actions-split .action-toggle.active,.actions-split .action-toggle:hover{box-shadow:none}.actions-split .action-default{margin-right:3.2rem;min-width:9.3rem}.actions-split .action-toggle{padding-right:3.2rem;border-left-color:rgba(0,0,0,.2);bottom:0;padding-left:0;position:absolute;right:0;top:0}.actions-split .action-toggle._active:after,.actions-split .action-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .actions-split .action-toggle:after,.active .actions-split .action-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:hover:after{border-color:#000 transparent transparent}.actions-split .action-toggle.action-primary:after,.actions-split .action-toggle.action-secondary:after,.actions-split .action-toggle.primary:after,.actions-split .action-toggle.secondary:after{border-color:#fff transparent transparent}.actions-split .action-toggle>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-select-wrap{display:inline-block;position:relative}.action-select-wrap .action-select{padding-right:3.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#fff;font-weight:400;text-align:left}.action-select-wrap .action-select._active:after,.action-select-wrap .action-select.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .action-select-wrap .action-select:after,.active .action-select-wrap .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:hover:after{border-color:#000 transparent transparent}.action-select-wrap .action-select:hover,.action-select-wrap .action-select:hover:before{border-color:#878787}.action-select-wrap .action-select:before{background-color:#e3e3e3;border:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:3.2rem}.action-select-wrap .action-select._active{border-color:#007bdb}.action-select-wrap .action-select._active:before{border-color:#007bdb #007bdb #007bdb #adadad}.action-select-wrap .action-select[disabled]{color:#333}.action-select-wrap .action-select[disabled]:after{border-color:#333 transparent transparent}.action-select-wrap._active{z-index:500}.action-select-wrap._active .action-select,.action-select-wrap._active .action-select:before{border-color:#007bdb}.action-select-wrap._active .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .abs-action-menu .action-submenu,.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu,.action-select-wrap .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:45rem;overflow-y:auto}.action-select-wrap .abs-action-menu .action-submenu ._disabled:hover,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .action-menu ._disabled:hover,.action-select-wrap .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled:hover{background:#fff}.action-select-wrap .abs-action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .action-menu ._disabled .action-menu-item,.action-select-wrap .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled .action-menu-item{cursor:default;opacity:.5}.action-select-wrap .action-menu-items{left:0;position:absolute;right:0;top:100%}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu{min-width:100%;position:static}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{position:absolute}.action-multicheck-wrap{display:inline-block;height:1.6rem;padding-top:1px;position:relative;width:3.1rem;z-index:200}.action-multicheck-wrap:hover .action-multicheck-toggle,.action-multicheck-wrap:hover .admin__control-checkbox+label:before{border-color:#878787}.action-multicheck-wrap._active .action-multicheck-toggle,.action-multicheck-wrap._active .admin__control-checkbox+label:before{border-color:#007bdb}.action-multicheck-wrap._active .abs-action-menu .action-submenu,.action-multicheck-wrap._active .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .action-menu,.action-multicheck-wrap._active .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu .action-submenu{opacity:1;visibility:visible;display:block}.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{background-color:#fff}.action-multicheck-wrap._disabled .action-multicheck-toggle,.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{border-color:#adadad;opacity:1}.action-multicheck-wrap .action-multicheck-toggle,.action-multicheck-wrap .admin__control-checkbox,.action-multicheck-wrap .admin__control-checkbox+label{float:left}.action-multicheck-wrap .action-multicheck-toggle{border-radius:0 1px 1px 0;height:1.6rem;margin-left:-1px;padding:0;position:relative;transition:border-color .1s linear;width:1.6rem}.action-multicheck-wrap .action-multicheck-toggle._active:after,.action-multicheck-wrap .action-multicheck-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .action-multicheck-wrap .action-multicheck-toggle:after,.active .action-multicheck-wrap .action-multicheck-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:hover:after{border-color:#000 transparent transparent}.action-multicheck-wrap .action-multicheck-toggle:focus{border-color:#007bdb}.action-multicheck-wrap .action-multicheck-toggle:after{right:.3rem}.action-multicheck-wrap .abs-action-menu .action-submenu,.action-multicheck-wrap .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap .action-menu,.action-multicheck-wrap .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:-1.1rem;margin-top:1px;right:auto;text-align:left}.action-multicheck-wrap .action-menu-item{white-space:nowrap}.admin__action-multiselect-wrap{display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.admin__action-multiselect-wrap.action-select-wrap:focus{box-shadow:none}.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .action-menu,.admin__action-multiselect-wrap.action-select-wrap .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:none;overflow-y:inherit}.admin__action-multiselect-wrap .action-menu-item{transition:background-color .1s linear}.admin__action-multiselect-wrap .action-menu-item._selected{background-color:#e0f6fe}.admin__action-multiselect-wrap .action-menu-item._hover{background-color:#e3e3e3}.admin__action-multiselect-wrap .action-menu-item._unclickable{cursor:default}.admin__action-multiselect-wrap .admin__action-multiselect{border:1px solid #adadad;cursor:pointer;display:block;min-height:3.2rem;padding-right:3.6rem;white-space:normal}.admin__action-multiselect-wrap .admin__action-multiselect:after{bottom:1.25rem;top:auto}.admin__action-multiselect-wrap .admin__action-multiselect:before{height:3.3rem;top:auto}.admin__control-table-wrapper .admin__action-multiselect-wrap{position:static}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect{position:relative}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect:before{right:-1px;top:-1px}.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:34rem;right:auto;top:auto;z-index:1}.admin__action-multiselect-wrap .admin__action-multiselect-item-path{color:#a79d95;font-size:1.2rem;font-weight:400;padding-left:1rem}.admin__action-multiselect-actions-wrap{border-top:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;text-align:center}.admin__action-multiselect-actions-wrap .action-default{font-size:1.3rem;min-width:13rem}.admin__action-multiselect-text{padding:.6rem 1rem}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{text-align:left}.admin__action-multiselect-label{cursor:pointer;position:relative;z-index:1}.admin__action-multiselect-label:before{margin-right:.5rem}._unclickable .admin__action-multiselect-label{cursor:default;font-weight:700}.admin__action-multiselect-search-wrap{border-bottom:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;position:relative}.admin__action-multiselect-search{padding-right:3rem;width:100%}.admin__action-multiselect-search-label{display:block;font-size:1.5rem;height:1em;overflow:hidden;position:absolute;right:2.2rem;top:1.7rem;width:1em}.admin__action-multiselect-search-label:before{content:'\e60c'}.admin__action-multiselect-search-count{color:#a79d95;margin-top:1rem}.admin__action-multiselect-menu-inner{margin-bottom:0;max-height:46rem;overflow-y:auto}.admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{list-style:none;max-height:none;overflow:hidden;padding-left:2.2rem}.admin__action-multiselect-menu-inner ._hidden{display:none}.admin__action-multiselect-crumb{background-color:#f5f5f5;border:1px solid #a79d95;border-radius:1px;display:inline-block;font-size:1.2rem;margin:.3rem -4px .3rem .3rem;padding:.3rem 2.4rem .4rem 1rem;position:relative;transition:border-color .1s linear}.admin__action-multiselect-crumb:hover{border-color:#908379}.admin__action-multiselect-crumb .action-close{bottom:0;font-size:.5em;position:absolute;right:0;top:0;width:2rem}.admin__action-multiselect-crumb .action-close:hover{color:#000}.admin__action-multiselect-crumb .action-close:active,.admin__action-multiselect-crumb .action-close:focus{background-color:transparent}.admin__action-multiselect-crumb .action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__action-multiselect-tree .abs-action-menu .action-submenu,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .action-menu,.admin__action-multiselect-tree .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu{min-width:34.7rem}.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item{margin-top:.1rem}.admin__action-multiselect-tree .action-menu-item{margin-left:4.2rem;position:relative}.admin__action-multiselect-tree .action-menu-item._expended:before{border-left:1px dashed #a79d95;bottom:0;content:'';left:-1rem;position:absolute;top:1rem;width:1px}.admin__action-multiselect-tree .action-menu-item._expended .admin__action-multiselect-dropdown:before{content:'\e615'}.admin__action-multiselect-tree .action-menu-item._with-checkbox .admin__action-multiselect-label{padding-left:2.6rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{padding-left:3.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner:before{left:4.3rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:last-child:before{height:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after,.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{content:'';left:0;position:absolute}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after{border-top:1px dashed #a79d95;height:1px;top:2.1rem;width:5.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{border-left:1px dashed #a79d95;height:100%;top:0;width:1px}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._parent:after{width:4.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root{margin-left:-1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:after{left:3.2rem;width:2.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:before{left:3.2rem;top:1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root._parent:after{display:none}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:first-child:before{top:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:last-child:before{height:1rem}.admin__action-multiselect-tree .admin__action-multiselect-label{line-height:2.2rem;vertical-align:middle;word-break:break-all}.admin__action-multiselect-tree .admin__action-multiselect-label:before{left:0;position:absolute;top:.4rem}.admin__action-multiselect-dropdown{border-radius:50%;height:2.2rem;left:-2.2rem;position:absolute;top:1rem;width:2.2rem;z-index:1}.admin__action-multiselect-dropdown:before{background:#fff;color:#a79d95;content:'\e616';font-size:2.2rem}.admin__actions-switch{display:inline-block;position:relative;vertical-align:middle}.admin__field-control .admin__actions-switch{line-height:3.2rem}.admin__actions-switch+.admin__field-service{min-width:34rem}._disabled .admin__actions-switch-checkbox+.admin__actions-switch-label,.admin__actions-switch-checkbox.disabled+.admin__actions-switch-label{cursor:not-allowed;opacity:.5;pointer-events:none}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:before{left:15px}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:after{background:#79a22e}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label .admin__actions-switch-text:before{content:attr(data-text-on)}.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:after,.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:before{border-color:#007bdb}._error .admin__actions-switch-checkbox+.admin__actions-switch-label:after,._error .admin__actions-switch-checkbox+.admin__actions-switch-label:before{border-color:#e22626}.admin__actions-switch-label{cursor:pointer;display:inline-block;height:22px;line-height:22px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.admin__actions-switch-label:after,.admin__actions-switch-label:before{left:0;position:absolute;right:auto;top:0}.admin__actions-switch-label:before{background:#fff;border:1px solid #aaa6a0;border-radius:100%;content:'';display:block;height:22px;transition:left .2s ease-in 0s;width:22px;z-index:1}.admin__actions-switch-label:after{background:#e3e3e3;border:1px solid #aaa6a0;border-radius:12px;content:'';display:block;height:22px;transition:background .2s ease-in 0s;vertical-align:middle;width:37px;z-index:0}.admin__actions-switch-text:before{content:attr(data-text-off);padding-left:47px;white-space:nowrap}.abs-action-delete,.abs-action-reset,.action-close,.admin__field-fallback-reset,.extensions-information .list .extension-delete,.notifications-close,.search-global-field._active .search-global-action{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0}.abs-action-delete:hover,.abs-action-reset:hover,.action-close:hover,.admin__field-fallback-reset:hover,.extensions-information .list .extension-delete:hover,.notifications-close:hover,.search-global-field._active .search-global-action:hover{background-color:transparent;border:none;box-shadow:none}.abs-action-default,.abs-action-pattern,.abs-action-primary,.abs-action-quaternary,.abs-action-secondary,.abs-action-tertiary,.action-default,.action-primary,.action-quaternary,.action-secondary,.action-tertiary,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions>button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary,button,button.primary,button.secondary,button.tertiary{border:1px solid;border-radius:0;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:1.36;padding:.6rem 1em;text-align:center;vertical-align:baseline}.abs-action-default.disabled,.abs-action-default[disabled],.abs-action-pattern.disabled,.abs-action-pattern[disabled],.abs-action-primary.disabled,.abs-action-primary[disabled],.abs-action-quaternary.disabled,.abs-action-quaternary[disabled],.abs-action-secondary.disabled,.abs-action-secondary[disabled],.abs-action-tertiary.disabled,.abs-action-tertiary[disabled],.action-default.disabled,.action-default[disabled],.action-primary.disabled,.action-primary[disabled],.action-quaternary.disabled,.action-quaternary[disabled],.action-secondary.disabled,.action-secondary[disabled],.action-tertiary.disabled,.action-tertiary[disabled],.modal-popup .modal-footer .action-primary.disabled,.modal-popup .modal-footer .action-primary[disabled],.modal-popup .modal-footer .action-secondary.disabled,.modal-popup .modal-footer .action-secondary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.action-secondary.disabled,.page-actions .page-actions-buttons>button.action-secondary[disabled],.page-actions .page-actions-buttons>button.disabled,.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions .page-actions-buttons>button[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.action-secondary.disabled,.page-actions>button.action-secondary[disabled],.page-actions>button.disabled,.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],.page-actions>button[disabled],button.disabled,button.primary.disabled,button.primary[disabled],button.secondary.disabled,button.secondary[disabled],button.tertiary.disabled,button.tertiary[disabled],button[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-l,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary{font-size:1.6rem;letter-spacing:.025em;padding-bottom:.6875em;padding-top:.6875em}.abs-action-delete,.extensions-information .list .extension-delete{display:inline-block;font-size:1.6rem;margin-left:1.2rem;padding-top:.7rem;text-decoration:none;vertical-align:middle}.abs-action-delete:after,.extensions-information .list .extension-delete:after{color:#666;content:'\e630'}.abs-action-delete:hover:after,.extensions-information .list .extension-delete:hover:after{color:#35302c}.abs-action-button-as-link,.action-advanced,.data-grid .action-delete{line-height:1.36;padding:0;color:#008bdb;text-decoration:none;background:0 0;border:0;display:inline;font-weight:400;border-radius:0}.abs-action-button-as-link:visited,.action-advanced:visited,.data-grid .action-delete:visited{color:#008bdb;text-decoration:none}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{text-decoration:underline}.abs-action-button-as-link:active,.action-advanced:active,.data-grid .action-delete:active{color:#ff5501;text-decoration:underline}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{color:#0fa7ff}.abs-action-button-as-link:active,.abs-action-button-as-link:focus,.abs-action-button-as-link:hover,.action-advanced:active,.action-advanced:focus,.action-advanced:hover,.data-grid .action-delete:active,.data-grid .action-delete:focus,.data-grid .action-delete:hover{background:0 0;border:0}.abs-action-button-as-link.disabled,.abs-action-button-as-link[disabled],.action-advanced.disabled,.action-advanced[disabled],.data-grid .action-delete.disabled,.data-grid .action-delete[disabled],fieldset[disabled] .abs-action-button-as-link,fieldset[disabled] .action-advanced,fieldset[disabled] .data-grid .action-delete{color:#008bdb;opacity:.5;cursor:default;pointer-events:none;text-decoration:underline}.abs-action-button-as-link:active,.abs-action-button-as-link:not(:focus),.action-advanced:active,.action-advanced:not(:focus),.data-grid .action-delete:active,.data-grid .action-delete:not(:focus){box-shadow:none}.abs-action-button-as-link:focus,.action-advanced:focus,.data-grid .action-delete:focus{color:#0fa7ff}.abs-action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.abs-action-default:active,.abs-action-default:focus,.abs-action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.abs-action-primary,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary,button.primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.abs-action-primary:active,.abs-action-primary:focus,.abs-action-primary:hover,.page-actions .page-actions-buttons>button.action-primary:active,.page-actions .page-actions-buttons>button.action-primary:focus,.page-actions .page-actions-buttons>button.action-primary:hover,.page-actions .page-actions-buttons>button.primary:active,.page-actions .page-actions-buttons>button.primary:focus,.page-actions .page-actions-buttons>button.primary:hover,.page-actions>button.action-primary:active,.page-actions>button.action-primary:focus,.page-actions>button.action-primary:hover,.page-actions>button.primary:active,.page-actions>button.primary:focus,.page-actions>button.primary:hover,button.primary:active,button.primary:focus,button.primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-primary.disabled,.abs-action-primary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],button.primary.disabled,button.primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-secondary,.modal-popup .modal-footer .action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions>button.action-secondary,button.secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.abs-action-secondary:active,.abs-action-secondary:focus,.abs-action-secondary:hover,.modal-popup .modal-footer .action-primary:active,.modal-popup .modal-footer .action-primary:focus,.modal-popup .modal-footer .action-primary:hover,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions .page-actions-buttons>button.action-secondary:focus,.page-actions .page-actions-buttons>button.action-secondary:hover,.page-actions>button.action-secondary:active,.page-actions>button.action-secondary:focus,.page-actions>button.action-secondary:hover,button.secondary:active,button.secondary:focus,button.secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-secondary:active,.modal-popup .modal-footer .action-primary:active,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions>button.action-secondary:active,button.secondary:active{background-color:#35302c}.abs-action-tertiary,.modal-popup .modal-footer .action-secondary,button.tertiary{background-color:transparent;border-color:transparent;text-shadow:none;color:#008bdb}.abs-action-tertiary:active,.abs-action-tertiary:focus,.abs-action-tertiary:hover,.modal-popup .modal-footer .action-secondary:active,.modal-popup .modal-footer .action-secondary:focus,.modal-popup .modal-footer .action-secondary:hover,button.tertiary:active,button.tertiary:focus,button.tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#0fa7ff;text-decoration:underline}.abs-action-quaternary,.page-actions .page-actions-buttons>button,.page-actions>button{background-color:transparent;border-color:transparent;text-shadow:none;color:#333}.abs-action-quaternary:active,.abs-action-quaternary:focus,.abs-action-quaternary:hover,.page-actions .page-actions-buttons>button:active,.page-actions .page-actions-buttons>button:focus,.page-actions .page-actions-buttons>button:hover,.page-actions>button:active,.page-actions>button:focus,.page-actions>button:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#1a1a1a}.abs-action-menu,.actions-split .abs-action-menu .action-submenu,.actions-split .abs-action-menu .action-submenu .action-submenu,.actions-split .action-menu,.actions-split .action-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.actions-split .dropdown-menu{text-align:left;background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu._active,.actions-split .abs-action-menu .action-submenu .action-submenu._active,.actions-split .abs-action-menu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .action-menu._active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .actions-split .dropdown-menu .action-submenu._active,.actions-split .dropdown-menu._active{display:block}.abs-action-menu>li,.actions-split .abs-action-menu .action-submenu .action-submenu>li,.actions-split .abs-action-menu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .action-menu>li,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .actions-split .dropdown-menu .action-submenu>li,.actions-split .dropdown-menu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu>li>a:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .abs-action-menu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .action-menu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu>li>a:hover{text-decoration:none}.abs-action-menu>li._visible,.abs-action-menu>li:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu .action-submenu>li:hover,.actions-split .abs-action-menu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .action-menu>li._visible,.actions-split .action-menu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu>li:hover,.actions-split .dropdown-menu>li._visible,.actions-split .dropdown-menu>li:hover{background-color:#e3e3e3}.abs-action-menu>li:active,.actions-split .abs-action-menu .action-submenu .action-submenu>li:active,.actions-split .abs-action-menu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .action-menu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu>li:active,.actions-split .dropdown-menu>li:active{background-color:#cacaca}.abs-action-menu>li._parent,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent,.actions-split .abs-action-menu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .action-menu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent,.actions-split .dropdown-menu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-menu-item,.abs-action-menu .item,.actions-split .abs-action-menu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .item,.actions-split .abs-action-menu .action-submenu .item,.actions-split .action-menu .action-menu-item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .item,.actions-split .action-menu .item,.actions-split .actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .actions-split .dropdown-menu .action-submenu .item,.actions-split .dropdown-menu .action-menu-item,.actions-split .dropdown-menu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu a.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .abs-action-menu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .action-menu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu a.action-menu-item{color:#333}.abs-action-menu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.abs-action-wrap-triangle{position:relative}.abs-action-wrap-triangle .action-default{width:100%}.abs-action-wrap-triangle .action-default:after,.abs-action-wrap-triangle .action-default:before{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.abs-action-wrap-triangle .action-default:active,.abs-action-wrap-triangle .action-default:focus,.abs-action-wrap-triangle .action-default:hover{box-shadow:none}._keyfocus .abs-action-wrap-triangle .action-default:focus{box-shadow:0 0 0 1px #007bdb}.ie10 .abs-action-wrap-triangle .action-default.disabled,.ie10 .abs-action-wrap-triangle .action-default[disabled],.ie9 .abs-action-wrap-triangle .action-default.disabled,.ie9 .abs-action-wrap-triangle .action-default[disabled]{background-color:#fcfcfc;opacity:1;text-shadow:none}.abs-action-wrap-triangle-right{display:inline-block;padding-right:1.6rem;position:relative}.abs-action-wrap-triangle-right .action-default:after,.abs-action-wrap-triangle-right .action-default:before{border-color:transparent transparent transparent #e3e3e3;border-width:1.7rem 0 1.6rem 1.7rem;left:100%;margin-left:-1.7rem}.abs-action-wrap-triangle-right .action-default:before{border-left-color:#949494;right:-1px}.abs-action-wrap-triangle-right .action-default:active:after,.abs-action-wrap-triangle-right .action-default:focus:after,.abs-action-wrap-triangle-right .action-default:hover:after{border-left-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-right .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-right .action-default[disabled]:after{border-color:transparent transparent transparent #fcfcfc}.abs-action-wrap-triangle-right .action-primary:after{border-color:transparent transparent transparent #eb5202}.abs-action-wrap-triangle-right .action-primary:active:after,.abs-action-wrap-triangle-right .action-primary:focus:after,.abs-action-wrap-triangle-right .action-primary:hover:after{border-left-color:#ba4000}.abs-action-wrap-triangle-left{display:inline-block;padding-left:1.6rem}.abs-action-wrap-triangle-left .action-default{text-indent:-.85rem}.abs-action-wrap-triangle-left .action-default:after,.abs-action-wrap-triangle-left .action-default:before{border-color:transparent #e3e3e3 transparent transparent;border-width:1.7rem 1.7rem 1.6rem 0;margin-right:-1.7rem;right:100%}.abs-action-wrap-triangle-left .action-default:before{border-right-color:#949494;left:-1px}.abs-action-wrap-triangle-left .action-default:active:after,.abs-action-wrap-triangle-left .action-default:focus:after,.abs-action-wrap-triangle-left .action-default:hover:after{border-right-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-left .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-left .action-default[disabled]:after{border-color:transparent #fcfcfc transparent transparent}.abs-action-wrap-triangle-left .action-primary:after{border-color:transparent #eb5202 transparent transparent}.abs-action-wrap-triangle-left .action-primary:active:after,.abs-action-wrap-triangle-left .action-primary:focus:after,.abs-action-wrap-triangle-left .action-primary:hover:after{border-right-color:#ba4000}.action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.action-default:active,.action-default:focus,.action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.action-primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.action-primary:active,.action-primary:focus,.action-primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-primary.disabled,.action-primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.action-secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.action-secondary:active,.action-secondary:focus,.action-secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-secondary:active{background-color:#35302c}.action-quaternary,.action-tertiary{background-color:transparent;border-color:transparent;text-shadow:none}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover,.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none}.action-tertiary{color:#008bdb}.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{color:#0fa7ff;text-decoration:underline}.action-quaternary{color:#333}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover{color:#1a1a1a}.action-close>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.action-close:before{content:'\e62f';transition:color .1s linear}.action-close:hover{cursor:pointer;text-decoration:none}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu .action-submenu .action-submenu._active,.abs-action-menu .action-submenu._active,.action-menu .action-submenu._active,.action-menu._active,.actions-split .action-menu .action-submenu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .dropdown-menu .action-submenu._active{display:block}.abs-action-menu .action-submenu .action-submenu>li,.abs-action-menu .action-submenu>li,.action-menu .action-submenu>li,.action-menu>li,.actions-split .action-menu .action-submenu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .dropdown-menu .action-submenu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu .action-submenu .action-submenu>li>a:hover,.abs-action-menu .action-submenu>li>a:hover,.action-menu .action-submenu>li>a:hover,.action-menu>li>a:hover,.actions-split .action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu>li>a:hover{text-decoration:none}.abs-action-menu .action-submenu .action-submenu>li._visible,.abs-action-menu .action-submenu .action-submenu>li:hover,.abs-action-menu .action-submenu>li._visible,.abs-action-menu .action-submenu>li:hover,.action-menu .action-submenu>li._visible,.action-menu .action-submenu>li:hover,.action-menu>li._visible,.action-menu>li:hover,.actions-split .action-menu .action-submenu .action-submenu>li._visible,.actions-split .action-menu .action-submenu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu>li:hover{background-color:#e3e3e3}.abs-action-menu .action-submenu .action-submenu>li:active,.abs-action-menu .action-submenu>li:active,.action-menu .action-submenu>li:active,.action-menu>li:active,.actions-split .action-menu .action-submenu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu>li:active{background-color:#cacaca}.abs-action-menu .action-submenu .action-submenu>li._parent,.abs-action-menu .action-submenu>li._parent,.action-menu .action-submenu>li._parent,.action-menu>li._parent,.actions-split .action-menu .action-submenu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.abs-action-menu .action-submenu>li._parent>.action-menu-item,.action-menu .action-submenu>li._parent>.action-menu-item,.action-menu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .item,.abs-action-menu .action-submenu .item,.action-menu .action-menu-item,.action-menu .action-submenu .action-menu-item,.action-menu .action-submenu .item,.action-menu .item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .item,.actions-split .action-menu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu .action-submenu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu .action-submenu,.ie9 .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .action-menu .action-submenu,.ie9 .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu .action-submenu .action-submenu a.action-menu-item,.abs-action-menu .action-submenu a.action-menu-item,.action-menu .action-submenu a.action-menu-item,.action-menu a.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu a.action-menu-item{color:#333}.abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.abs-action-menu .action-submenu a.action-menu-item:focus,.action-menu .action-submenu a.action-menu-item:focus,.action-menu a.action-menu-item:focus,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.messages .message:last-child{margin:0 0 2rem}.message{background:#fffbbb;border:none;border-radius:0;color:#333;font-size:1.4rem;margin:0 0 1px;padding:1.8rem 4rem 1.8rem 5.5rem;position:relative;text-shadow:none}.message:before{background:0 0;border:0;color:#007bdb;content:'\e61a';font-family:Icons;font-size:1.9rem;font-style:normal;font-weight:400;height:auto;left:1.9rem;line-height:inherit;margin-top:-1.3rem;position:absolute;speak:none;text-shadow:none;top:50%;width:auto}.message-notice:before{color:#007bdb;content:'\e61a'}.message-warning:before{color:#eb5202;content:'\e623'}.message-error{background:#fcc}.message-error:before{color:#e22626;content:'\e632';font-size:1.5rem;left:2.2rem;margin-top:-1rem}.message-success:before{color:#79a22e;content:'\e62d'}.message-spinner:before{display:none}.message-spinner .spinner{font-size:2.5rem;left:1.5rem;position:absolute;top:1.5rem}.message-in-rating-edit{margin-left:1.8rem;margin-right:1.8rem}.modal-popup .action-close,.modal-slide .action-close{color:#736963;position:absolute;right:0;top:0;z-index:1}.modal-popup .action-close:active,.modal-slide .action-close:active{-ms-transform:none;transform:none}.modal-popup .action-close:active:before,.modal-slide .action-close:active:before{font-size:1.8rem}.modal-popup .action-close:hover:before,.modal-slide .action-close:hover:before{color:#58504b}.modal-popup .action-close:before,.modal-slide .action-close:before{font-size:2rem}.modal-popup .action-close:focus,.modal-slide .action-close:focus{background-color:transparent}.modal-popup.prompt .prompt-message{padding:2rem 0}.modal-popup.prompt .prompt-message input{width:100%}.modal-popup.confirm .modal-inner-wrap .message,.modal-popup.prompt .modal-inner-wrap .message{background:#fff}.modal-popup.modal-system-messages .modal-inner-wrap{background:#fffbbb}.modal-popup._image-box .modal-inner-wrap{margin:5rem auto;max-width:78rem;position:static}.modal-popup._image-box .thumbnail-preview{padding-bottom:3rem;text-align:center}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image-block{border:1px solid #ccc;margin:0 auto 2rem;max-width:58rem;padding:2rem}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image{max-height:54rem}.modal-popup .modal-title{font-size:2.4rem;margin-right:6.4rem}.modal-popup .modal-footer{padding-top:2.6rem;text-align:right}.modal-popup .action-close{padding:3rem}.modal-popup .action-close:active,.modal-popup .action-close:focus{background:0 0;padding-right:3.1rem;padding-top:3.1rem}.modal-slide .modal-content-new-attribute{-webkit-overflow-scrolling:touch;overflow:auto;padding-bottom:0}.modal-slide .modal-content-new-attribute iframe{margin-bottom:-2.5rem}.modal-slide .modal-title{font-size:2.1rem;margin-right:5.7rem}.modal-slide .action-close{padding:2.1rem 2.6rem}.modal-slide .action-close:active{padding-right:2.7rem;padding-top:2.2rem}.modal-slide .page-main-actions{margin-bottom:.6rem;margin-top:2.1rem}.modal-slide .magento-message{padding:0 3rem 3rem;position:relative}.modal-slide .magento-message .insert-title-inner,.modal-slide .main-col .insert-title-inner{border-bottom:1px solid #adadad;margin:0 0 2rem;padding-bottom:.5rem}.modal-slide .magento-message .insert-actions,.modal-slide .main-col .insert-actions{float:right}.modal-slide .magento-message .title,.modal-slide .main-col .title{font-size:1.6rem;padding-top:.5rem}.modal-slide .main-col,.modal-slide .side-col{float:left;padding-bottom:0}.modal-slide .main-col:after,.modal-slide .side-col:after{display:none}.modal-slide .side-col{width:20%}.modal-slide .main-col{padding-right:0;width:80%}.modal-slide .content-footer .form-buttons{float:right}.modal-title{font-weight:400;margin-bottom:0;min-height:1em}.modal-title span{font-size:1.4rem;font-style:italic;margin-left:1rem}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}.spinner>span:nth-child(1){animation-delay:.27s;-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){animation-delay:.36s;-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){animation-delay:.45s;-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){animation-delay:.54s;-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){animation-delay:.63s;-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){animation-delay:.72s;-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){animation-delay:.81s;-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){animation-delay:.9;-ms-transform:rotate(0deg);transform:rotate(0deg)}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span{-ms-transform:scale(0.4);transform:scale(0.4);animation-name:fade;animation-duration:.72s;animation-iteration-count:infinite;animation-direction:linear;background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.popup-loading{background:rgba(255,255,255,.8);border-color:#ef672f;color:#ef672f;font-size:14px;font-weight:700;left:50%;margin-left:-100px;padding:100px 0 10px;position:fixed;text-align:center;top:40%;width:200px;z-index:1003}.popup-loading:after{background-image:url(../images/loader-1.gif);content:'';height:64px;left:50%;margin:-32px 0 0 -32px;position:absolute;top:40%;width:64px;z-index:2}.loading-mask,.loading-old{background:rgba(255,255,255,.4);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2003}.loading-mask img,.loading-old img{display:none}.loading-mask p,.loading-old p{margin-top:118px}.loading-mask .loader,.loading-old .loader{background:url(../images/loader-1.gif) 50% 30% no-repeat #f7f3eb;border-radius:5px;bottom:0;color:#575757;font-size:14px;font-weight:700;height:160px;left:0;margin:auto;opacity:.95;position:absolute;right:0;text-align:center;top:0;width:160px}.admin-user{float:right;line-height:1.36;margin-left:.3rem;z-index:490}.admin-user._active .admin__action-dropdown,.admin-user.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin-user .admin__action-dropdown{height:3.3rem;padding:.7rem 2.8rem .4rem 4rem}.admin-user .admin__action-dropdown._active:after,.admin-user .admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:after{border-color:#777 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.3rem;top:50%;transition:all .2s linear;width:0}._active .admin-user .admin__action-dropdown:after,.active .admin-user .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin-user .admin__action-dropdown:before{color:#777;content:'\e600';font-size:2rem;left:1.1rem;margin-top:-1.1rem;position:absolute;top:50%}.admin-user .admin__action-dropdown:hover:before{color:#333}.admin-user .admin__action-dropdown-menu{min-width:20rem;padding-left:1rem;padding-right:1rem}.admin-user .admin__action-dropdown-menu>li>a{padding-left:.5em;padding-right:1.8rem;transition:background-color .1s linear;white-space:nowrap}.admin-user .admin__action-dropdown-menu>li>a:hover{background-color:#e0f6fe;color:#333}.admin-user .admin__action-dropdown-menu>li>a:active{background-color:#c7effd;bottom:-1px;position:relative}.admin-user .admin__action-dropdown-menu .admin-user-name{text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:20rem;overflow:hidden;vertical-align:top}.admin-user-account-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:11.2rem}.search-global{float:right;margin-right:-.3rem;position:relative;z-index:480}.search-global-field{min-width:5rem}.search-global-field._active .search-global-input{background-color:#fff;border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);padding-right:4rem;width:25rem}.search-global-field._active .search-global-action{display:block;height:3.3rem;position:absolute;right:0;text-indent:-100%;top:0;width:5rem;z-index:3}.search-global-field .autocomplete-results{height:3.3rem;position:absolute;right:0;top:0;width:25rem}.search-global-field .search-global-menu{border:1px solid #007bdb;border-top-color:transparent;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin-top:-2px;padding:0;position:absolute;right:0;top:100%;z-index:2}.search-global-field .search-global-menu:after{background-color:#fff;content:'';height:5px;left:0;position:absolute;right:0;top:-5px}.search-global-field .search-global-menu>li{background-color:#fff;border-top:1px solid #ddd;display:block;font-size:1.2rem;padding:.75rem 1.4rem .55rem}.search-global-field .search-global-menu>li._active{background-color:#e0f6fe}.search-global-field .search-global-menu .title{display:block;font-size:1.4rem}.search-global-field .search-global-menu .type{color:#1a1a1a;display:block}.search-global-label{cursor:pointer;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;z-index:2}.search-global-label:active{-ms-transform:scale(0.9);transform:scale(0.9)}.search-global-label:hover:before{color:#000}.search-global-label:before{color:#777;content:'\e60c';font-size:2rem}.search-global-input{background-color:transparent;border:1px solid transparent;font-size:1.4rem;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;transition:all .1s linear,width .3s linear;width:5rem;z-index:1}.search-global-action{display:none}.notifications-wrapper{float:right;line-height:1;position:relative}.notifications-wrapper.active{z-index:500}.notifications-wrapper.active .notifications-action{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.notifications-wrapper.active .notifications-action:after{background-color:#fff;border:none;content:'';display:block;height:6px;left:-6px;margin-top:0;position:absolute;right:0;top:100%;width:auto}.notifications-wrapper .admin__action-dropdown-menu{padding:1rem 0 0;width:32rem}.notifications-action{color:#777;height:3.3rem;padding:.75rem 2rem .65rem}.notifications-action:after{display:none}.notifications-action:before{content:'\e607';font-size:1.9rem;margin-right:0}.notifications-action:active:before{position:relative;top:1px}.notifications-action .notifications-counter{background-color:#e22626;border-radius:1em;color:#fff;display:inline-block;font-size:1.1rem;font-weight:700;left:50%;margin-left:.3em;margin-top:-1.1em;padding:.3em .5em;position:absolute;top:50%}.notifications-entry{line-height:1.36;padding:.6rem 2rem .8rem;position:relative;transition:background-color .1s linear}.notifications-entry:hover{background-color:#e0f6fe}.notifications-entry.notifications-entry-last{margin:0 2rem;padding:.3rem 0 1.3rem;text-align:center}.notifications-entry.notifications-entry-last:hover{background-color:transparent}.notifications-entry+.notifications-entry-last{border-top:1px solid #ddd;padding-bottom:.6rem}.notifications-entry ._cutted{cursor:pointer}.notifications-entry ._cutted .notifications-entry-description-start:after{content:'...'}.notifications-entry-title{color:#ef672f;display:block;font-size:1.1rem;font-weight:700;margin-bottom:.7rem;margin-right:1em}.notifications-entry-description{color:#333;font-size:1.1rem;margin-bottom:.8rem}.notifications-entry-description-end{display:none}.notifications-entry-description-end._show{display:inline}.notifications-entry-time{color:#777;font-size:1.1rem}.notifications-close{line-height:1;padding:1rem;position:absolute;right:0;top:.6rem}.notifications-close:before{color:#ccc;content:'\e620';transition:color .1s linear}.notifications-close:hover:before{color:#b3b3b3}.notifications-close:active{-ms-transform:scale(0.95);transform:scale(0.95)}.page-header-actions{padding-top:1.1rem}.page-header-hgroup{padding-right:1.5rem}.page-title{color:#333;font-size:2.8rem}.page-header{padding:1.5rem 3rem}.menu-wrapper{display:inline-block;position:relative;width:8.8rem;z-index:700}.menu-wrapper:before{background-color:#373330;bottom:0;content:'';left:0;position:fixed;top:0;width:8.8rem;z-index:699}.menu-wrapper._fixed{left:0;position:fixed;top:0}.menu-wrapper._fixed~.page-wrapper{margin-left:8.8rem}.menu-wrapper .logo{display:block;height:8.8rem;padding:2.4rem 0 2.2rem;position:relative;text-align:center;z-index:700}._keyfocus .menu-wrapper .logo:focus{background-color:#4a4542;box-shadow:none}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a{background-color:#373330}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a:after{display:none}.menu-wrapper .logo:hover .logo-img{-webkit-filter:brightness(1.1);filter:brightness(1.1)}.menu-wrapper .logo:active .logo-img{-ms-transform:scale(0.95);transform:scale(0.95)}.menu-wrapper .logo .logo-img{height:4.2rem;transition:-webkit-filter .2s linear,filter .2s linear,transform .1s linear;width:3.5rem}.abs-menu-separator,.admin__menu .item-partners>a:after,.admin__menu .level-0:first-child>a:after{background-color:#736963;content:'';display:block;height:1px;left:0;margin-left:16%;position:absolute;top:0;width:68%}.admin__menu li{display:block}.admin__menu .level-0:first-child>a{position:relative}.admin__menu .level-0._active>a,.admin__menu .level-0:hover>a{color:#f7f3eb}.admin__menu .level-0._active>a{background-color:#524d49}.admin__menu .level-0:hover>a{background-color:#4a4542}.admin__menu .level-0>a{color:#aaa6a0;display:block;font-size:1rem;letter-spacing:.025em;min-height:6.2rem;padding:1.2rem .5rem .5rem;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;transition:background-color .1s linear;word-wrap:break-word;z-index:700}.admin__menu .level-0>a:focus{box-shadow:none}.admin__menu .level-0>a:before{content:'\e63a';display:block;font-size:2.2rem;height:2.2rem}.admin__menu .level-0>.submenu{background-color:#4a4542;box-shadow:0 0 3px #000;left:100%;min-height:calc(8.8rem + 2rem + 100%);padding:2rem 0 0;position:absolute;top:0;-ms-transform:translateX(-100%);transform:translateX(-100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;visibility:hidden;z-index:697}.ie10 .admin__menu .level-0>.submenu,.ie11 .admin__menu .level-0>.submenu{height:100%}.admin__menu .level-0._show>.submenu{-ms-transform:translateX(0);transform:translateX(0);visibility:visible;z-index:698}.admin__menu .level-1{margin-left:1.5rem;margin-right:1.5rem}.admin__menu [class*=level-]:not(.level-0) a{display:block;padding:1.25rem 1.5rem}.admin__menu [class*=level-]:not(.level-0) a:hover{background-color:#403934}.admin__menu [class*=level-]:not(.level-0) a:active{background-color:#322c29;padding-bottom:1.15rem;padding-top:1.35rem}.admin__menu .submenu li{min-width:23.8rem}.admin__menu .submenu a{color:#fcfcfc;transition:background-color .1s linear}.admin__menu .submenu a:focus,.admin__menu .submenu a:hover{box-shadow:none;text-decoration:none}._keyfocus .admin__menu .submenu a:focus{background-color:#403934}._keyfocus .admin__menu .submenu a:active{background-color:#322c29}.admin__menu .submenu .parent{margin-bottom:4.5rem}.admin__menu .submenu .parent .submenu-group-title{color:#a79d95;display:block;font-size:1.6rem;font-weight:600;margin-bottom:.7rem;padding:1.25rem 1.5rem;pointer-events:none}.admin__menu .submenu .column{display:table-cell}.admin__menu .submenu-title{color:#fff;display:block;font-size:2.2rem;font-weight:600;margin-bottom:4.2rem;margin-left:3rem;margin-right:5.8rem}.admin__menu .submenu-sub-title{color:#fff;display:block;font-size:1.2rem;margin:-3.8rem 5.8rem 3.8rem 3rem}.admin__menu .action-close{padding:2.4rem 2.8rem;position:absolute;right:0;top:0}.admin__menu .action-close:before{color:#a79d95;font-size:1.7rem}.admin__menu .action-close:hover:before{color:#fff}.admin__menu .item-dashboard>a:before{content:'\e604';font-size:1.8rem;padding-top:.4rem}.admin__menu .item-sales>a:before{content:'\e60b'}.admin__menu .item-catalog>a:before{content:'\e608'}.admin__menu .item-customer>a:before{content:'\e603';font-size:2.6rem;position:relative;top:-.4rem}.admin__menu .item-marketing>a:before{content:'\e609';font-size:2rem;padding-top:.2rem}.admin__menu .item-content>a:before{content:'\e602';font-size:2.4rem;position:relative;top:-.2rem}.admin__menu .item-report>a:before{content:'\e60a'}.admin__menu .item-stores>a:before{content:'\e60d';font-size:1.9rem;padding-top:.3rem}.admin__menu .item-system>a:before{content:'\e610'}.admin__menu .item-partners._active>a:after,.admin__menu .item-system._current+.item-partners>a:after{display:none}.admin__menu .item-partners>a{padding-bottom:1rem}.admin__menu .item-partners>a:before{content:'\e612'}.admin__menu .level-0>.submenu>ul>.level-1:only-of-type>.submenu-group-title,.admin__menu .submenu .column:only-of-type .submenu-group-title{display:none}.admin__menu-overlay{bottom:0;left:0;position:fixed;right:0;top:0;z-index:697}.store-switcher{color:#333;float:left;font-size:1.3rem;margin-top:.7rem}.store-switcher .admin__action-dropdown{background-color:#f8f8f8;margin-left:.5em}.store-switcher .dropdown{display:inline-block;position:relative}.store-switcher .dropdown:after,.store-switcher .dropdown:before{content:'';display:table}.store-switcher .dropdown:after{clear:both}.store-switcher .dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e607';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle:active:after,.store-switcher .dropdown .action.toggle:hover:after{color:#333}.store-switcher .dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle.active:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e618';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle.active:active:after,.store-switcher .dropdown .action.toggle.active:hover:after{color:#333}.store-switcher .dropdown .dropdown-menu{margin:4px 0 0;padding:0;list-style:none;background:#fff;border:1px solid #aaa6a0;min-width:19.5rem;z-index:100;box-sizing:border-box;display:none;position:absolute;top:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.store-switcher .dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .dropdown.active{overflow:visible}.store-switcher .dropdown.active .dropdown-menu{display:block}.store-switcher .dropdown-menu{left:0;margin-top:.5em;max-height:250px;overflow-y:auto;padding-top:.25em}.store-switcher .dropdown-menu li{border:0;cursor:default}.store-switcher .dropdown-menu li:hover{cursor:default}.store-switcher .dropdown-menu li a,.store-switcher .dropdown-menu li span{color:#333;display:block;padding:.5rem 1.3rem}.store-switcher .dropdown-menu li a{text-decoration:none}.store-switcher .dropdown-menu li a:hover{background:#e9e9e9}.store-switcher .dropdown-menu li span{color:#adadad;cursor:default}.store-switcher .dropdown-menu li.current span{background:#eee;color:#333}.store-switcher .dropdown-menu .store-switcher-store a,.store-switcher .dropdown-menu .store-switcher-store span{padding-left:2.6rem}.store-switcher .dropdown-menu .store-switcher-store-view a,.store-switcher .dropdown-menu .store-switcher-store-view span{padding-left:3.9rem}.store-switcher .dropdown-menu .dropdown-toolbar{border-top:1px solid #ebebeb;margin-top:1rem}.store-switcher .dropdown-menu .dropdown-toolbar a:before{content:'\e610';margin-right:.25em;position:relative;top:1px}.store-switcher-label{font-weight:700}.store-switcher-alt{display:inline-block;position:relative}.store-switcher-alt.active .dropdown-menu{display:block}.store-switcher-alt .dropdown-menu{margin-top:2px;white-space:nowrap}.store-switcher-alt .dropdown-menu ul{list-style:none;margin:0;padding:0}.store-switcher-alt strong{color:#a79d95;display:block;font-size:14px;font-weight:500;line-height:1.333;padding:5px 10px}.store-switcher-alt .store-selected{color:#676056;cursor:pointer;font-size:12px;font-weight:400;line-height:1.333}.store-switcher-alt .store-selected:after{-webkit-font-smoothing:antialiased;color:#afadac;content:'\e02c';font-style:normal;font-weight:400;margin:0 0 0 3px;speak:none;vertical-align:text-top}.store-switcher-alt .store-switcher-store,.store-switcher-alt .store-switcher-website{padding:0}.store-switcher-alt .store-switcher-store:hover,.store-switcher-alt .store-switcher-website:hover{background:0 0}.store-switcher-alt .manage-stores,.store-switcher-alt .store-switcher-all,.store-switcher-alt .store-switcher-store-view{padding:0}.store-switcher-alt .manage-stores>a,.store-switcher-alt .store-switcher-all>a{color:#676056;display:block;font-size:12px;padding:8px 15px;text-decoration:none}.store-switcher-website{margin:5px 0 0}.store-switcher-website>strong{padding-left:13px}.store-switcher-store{margin:1px 0 0}.store-switcher-store>strong{padding-left:20px}.store-switcher-store>ul{margin-top:1px}.store-switcher-store-view:first-child{border-top:1px solid #e5e5e5}.store-switcher-store-view>a{color:#333;display:block;font-size:13px;padding:5px 15px 5px 24px;text-decoration:none}.store-view:not(.store-switcher){float:left}.store-view .store-switcher-label{display:inline-block;margin-top:1rem}.tooltip{margin-left:.5em}.tooltip .help a,.tooltip .help span{cursor:pointer;display:inline-block;height:22px;position:relative;vertical-align:middle;width:22px;z-index:2}.tooltip .help a:before,.tooltip .help span:before{color:#333;content:'\e633';font-size:1.7rem}.tooltip .help a:hover{text-decoration:none}.tooltip .tooltip-content{background:#000;border-radius:3px;color:#fff;display:none;margin-left:-19px;margin-top:10px;max-width:200px;padding:4px 8px;position:absolute;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{border-bottom:5px solid #000;border-left:5px solid transparent;border-right:5px solid transparent;content:'';height:0;left:20px;opacity:.8;position:absolute;top:-5px;width:0}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}.page-actions._fixed,.page-main-actions:not(._hidden){background:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;padding:1.5rem}.page-main-actions{margin:0 0 3rem}.page-main-actions._hidden .store-switcher{display:none}.page-main-actions._hidden .page-actions-placeholder{min-height:50px}.page-actions{float:right}.page-main-actions .page-actions._fixed{left:8.8rem;position:fixed;right:0;top:0;z-index:501}.page-main-actions .page-actions._fixed .page-actions-inner:before{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;content:attr(data-title);float:left;font-size:2.8rem;margin-top:.3rem;max-width:50%}.page-actions .page-actions-buttons>button,.page-actions>button{float:right;margin-left:1.3rem}.page-actions .page-actions-buttons>button.action-back,.page-actions .page-actions-buttons>button.back,.page-actions>button.action-back,.page-actions>button.back{float:left;-ms-flex-order:-1;order:-1}.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before{content:'\e626';margin-right:.5em;position:relative;top:1px}.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary{-ms-flex-order:2;order:2}.page-actions .page-actions-buttons>button.save:not(.primary),.page-actions>button.save:not(.primary){-ms-flex-order:1;order:1}.page-actions .page-actions-buttons>button.delete,.page-actions>button.delete{-ms-flex-order:-1;order:-1}.page-actions .actions-split{float:right;margin-left:1.3rem;-ms-flex-order:2;order:2}.page-actions .actions-split .dropdown-menu .item{display:block}.page-actions-buttons{float:right;-ms-flex-pack:end;justify-content:flex-end;display:-ms-flexbox;display:flex}.customer-index-edit .page-actions-buttons{background-color:transparent}.admin__page-nav{background:#f1f1f1;border:1px solid #e3e3e3}.admin__page-nav._collapsed:first-child{border-bottom:none}.admin__page-nav._collapsed._show{border-bottom:1px solid #e3e3e3}.admin__page-nav._collapsed._show ._collapsible{background:#f1f1f1}.admin__page-nav._collapsed._show ._collapsible:after{content:'\e62b'}.admin__page-nav._collapsed._show ._collapsible+.admin__page-nav-items{display:block}.admin__page-nav._collapsed._hide .admin__page-nav-title-messages,.admin__page-nav._collapsed._hide .admin__page-nav-title-messages ._active{display:inline-block}.admin__page-nav+._collapsed{border-bottom:none;border-top:none}.admin__page-nav-title{border-bottom:1px solid #e3e3e3;color:#303030;display:block;font-size:1.4rem;line-height:1.2;margin:0 0 -1px;padding:1.8rem 1.5rem;position:relative;text-transform:uppercase}.admin__page-nav-title._collapsible{background:#fff;cursor:pointer;margin:0;padding-right:3.5rem;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-title._collapsible+.admin__page-nav-items{display:none;margin-top:-1px}.admin__page-nav-title._collapsible:after{content:'\e628';font-size:1.3rem;font-weight:700;position:absolute;right:1.8rem;top:2rem}.admin__page-nav-title._collapsible:hover{background:#f1f1f1}.admin__page-nav-title._collapsible:last-child{margin:0 0 -1px}.admin__page-nav-title strong{font-weight:700}.admin__page-nav-title .admin__page-nav-title-messages{display:none}.admin__page-nav-items{list-style-type:none;margin:0;padding:1rem 0 1.3rem}.admin__page-nav-item{border-left:3px solid transparent;margin-left:.7rem;padding:0;position:relative;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-item:hover{border-color:#e4e4e4}.admin__page-nav-item:hover .admin__page-nav-link{background:#e4e4e4;color:#303030;text-decoration:none}.admin__page-nav-item._active,.admin__page-nav-item.ui-state-active{border-color:#eb5202}.admin__page-nav-item._active .admin__page-nav-link,.admin__page-nav-item.ui-state-active .admin__page-nav-link{background:#fff;border-color:#e3e3e3;border-right:1px solid #fff;color:#303030;margin-right:-1px;font-weight:600}.admin__page-nav-item._loading:before,.admin__page-nav-item.ui-tabs-loading:before{display:none}.admin__page-nav-item._loading .admin__page-nav-item-message-loader,.admin__page-nav-item.ui-tabs-loading .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-link{border:1px solid transparent;border-width:1px 0;color:#303030;display:block;font-weight:500;line-height:1.2;margin:0 0 -1px;padding:2rem 4rem 2rem 1rem;transition:border-color .1s ease-out,background-color .1s ease-out;word-wrap:break-word}.admin__page-nav-item-messages{display:inline-block}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-size:1.4rem;font-weight:400;left:-1rem;line-height:1.36;padding:1.5rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after,.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf;margin-top:1px}.admin__page-nav-item-message-loader{display:none;margin-top:-1rem;position:absolute;right:0;top:50%}.admin__page-nav-item-message-loader .spinner{font-size:2rem;margin-right:1.5rem}._loading>.admin__page-nav-item-messages .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-item-message{position:relative}.admin__page-nav-item-message:hover{z-index:500}.admin__page-nav-item-message:hover .admin__page-nav-item-message-tooltip{display:block}.admin__page-nav-item-message._changed,.admin__page-nav-item-message._error{display:none}.admin__page-nav-item-message .admin__page-nav-item-message-icon{display:inline-block;font-size:1.4rem;padding-left:.8em;vertical-align:baseline}.admin__page-nav-item-message .admin__page-nav-item-message-icon:after{color:#666;content:'\e631'}._changed:not(._error)>.admin__page-nav-item-messages ._changed{display:inline-block}._error .admin__page-nav-item-message-icon:after{color:#eb5202;content:'\e623'}._error>.admin__page-nav-item-messages ._error{display:inline-block}._error>.admin__page-nav-item-messages ._error .spinner{font-size:2rem;margin-right:1.5rem}._error .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;left:-1rem;line-height:1.36;padding:2rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}._error .admin__page-nav-item-message-tooltip:after,._error .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}._error .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}._error .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf}.admin__data-grid-wrap-static .data-grid{box-sizing:border-box}.admin__data-grid-wrap-static .data-grid thead{color:#333}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td{background-color:#f5f5f5}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td._dragging{background-color:rgba(245,245,245,.95)}.admin__data-grid-wrap-static .data-grid ul{margin-left:1rem;padding-left:1rem}.admin__data-grid-wrap-static .admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-wrap-static .admin__data-grid-loading-mask .grid-loader{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-filters-actions-wrap{float:right}.data-grid-search-control-wrap{float:left;max-width:45.5rem;position:relative;width:35%}.data-grid-search-control-wrap :-ms-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-webkit-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-moz-placeholder{font-style:italic}.data-grid-search-control-wrap .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:.6rem 2rem .2rem;position:absolute;right:0;top:1px}.data-grid-search-control-wrap .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.data-grid-search-control-wrap .action-submit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.data-grid-search-control-wrap .action-submit:hover:before{color:#1a1a1a}._keyfocus .data-grid-search-control-wrap .action-submit:focus{box-shadow:0 0 0 1px #008bdb}.data-grid-search-control-wrap .action-submit:before{content:'\e60c';font-size:2rem;transition:color .1s linear}.data-grid-search-control-wrap .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.data-grid-search-control-wrap .abs-action-menu .action-submenu,.data-grid-search-control-wrap .abs-action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .action-menu,.data-grid-search-control-wrap .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:19.25rem;overflow-y:auto;z-index:398}.data-grid-search-control-wrap .action-menu-item._selected{background-color:#e0f6fe}.data-grid-search-control-wrap .data-grid-search-label{display:none}.data-grid-search-control{padding-right:6rem;width:100%}.data-grid-filters-action-wrap{float:left;padding-left:2rem}.data-grid-filters-action-wrap .action-default{font-size:1.3rem;margin-bottom:1rem;padding-left:1.7rem;padding-right:2.1rem;padding-top:.7rem}.data-grid-filters-action-wrap .action-default._active{background-color:#fff;border-bottom-color:#fff;border-right-color:#ccc;font-weight:600;margin:-.1rem 0 0;padding-bottom:1.6rem;padding-top:.8rem;position:relative;z-index:281}.data-grid-filters-action-wrap .action-default._active:after{background-color:#eb5202;bottom:100%;content:'';height:3px;left:-1px;position:absolute;right:-1px}.data-grid-filters-action-wrap .action-default:before{color:#333;content:'\e605';font-size:1.8rem;margin-right:.4rem;position:relative;top:-1px;vertical-align:top}.data-grid-filters-action-wrap .filters-active{display:none}.admin__action-grid-select .admin__control-select{margin:-.5rem .5rem 0 0;padding-bottom:.6rem;padding-top:.6rem}.admin__data-grid-filters-wrap{opacity:0;visibility:hidden;clear:both;font-size:1.3rem;transition:opacity .3s ease}.admin__data-grid-filters-wrap._show{opacity:1;visibility:visible;border-bottom:1px solid #ccc;border-top:1px solid #ccc;margin-bottom:.7rem;padding:3.6rem 0 3rem;position:relative;top:-1px;z-index:280}.admin__data-grid-filters-wrap._show .admin__data-grid-filters,.admin__data-grid-filters-wrap._show .admin__data-grid-filters-footer{display:block}.admin__data-grid-filters-wrap .admin__form-field-label,.admin__data-grid-filters-wrap .admin__form-field-legend{display:block;font-weight:700;margin:0 0 .3rem;text-align:left}.admin__data-grid-filters-wrap .admin__form-field{display:inline-block;margin-bottom:2em;margin-left:0;padding-left:2rem;padding-right:2rem;vertical-align:top;width:calc(100% / 4 - 4px)}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field{display:block;float:none;margin-bottom:1.5rem;padding-left:0;padding-right:0;width:auto}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field:last-child{margin-bottom:0}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-label{border:1px solid transparent;float:left;font-weight:400;line-height:1.36;margin-bottom:0;padding-bottom:.6rem;padding-right:1em;padding-top:.6rem;width:25%}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-control{margin-left:25%}.admin__data-grid-filters-wrap .admin__action-multiselect,.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text,.admin__data-grid-filters-wrap .admin__form-field-label{font-size:1.3rem}.admin__data-grid-filters-wrap .admin__control-select{height:3.2rem;padding-top:.5rem}.admin__data-grid-filters-wrap .admin__action-multiselect:before{height:3.2rem;width:3.2rem}.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text._has-datepicker{width:100%}.admin__data-grid-filters{display:none;margin-left:-2rem;margin-right:-2rem}.admin__filters-legend{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-filters-footer{display:none;font-size:1.4rem}.admin__data-grid-filters-footer .admin__footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-filters-footer .admin__footer-secondary-actions{float:left;width:50%}.admin__data-grid-filters-current{border-bottom:.1rem solid #ccc;border-top:.1rem solid #ccc;display:none;font-size:1.3rem;margin-bottom:.9rem;padding-bottom:.8rem;padding-top:1.1rem;width:100%}.admin__data-grid-filters-current._show{display:table;position:relative;top:-1px;z-index:3}.admin__data-grid-filters-current._show+.admin__data-grid-filters-wrap._show{margin-top:-1rem}.admin__current-filters-actions-wrap,.admin__current-filters-list-wrap,.admin__current-filters-title-wrap{display:table-cell;vertical-align:top}.admin__current-filters-title{margin-right:1em;white-space:nowrap}.admin__current-filters-list-wrap{width:100%}.admin__current-filters-list{margin-bottom:0}.admin__current-filters-list>li{display:inline-block;font-weight:600;margin:0 1rem .5rem;padding-right:2.6rem;position:relative}.admin__current-filters-list .action-remove{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0;line-height:1;position:absolute;right:0;top:1px}.admin__current-filters-list .action-remove:hover{background-color:transparent;border:none;box-shadow:none}.admin__current-filters-list .action-remove:hover:before{color:#949494}.admin__current-filters-list .action-remove:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__current-filters-list .action-remove:before{color:#adadad;content:'\e620';font-size:1.6rem;transition:color .1s linear}.admin__current-filters-list .action-remove>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__current-filters-actions-wrap .action-clear{border:none;padding-bottom:0;padding-top:0;white-space:nowrap}.admin__data-grid-pager-wrap{float:right;text-align:right}.admin__data-grid-pager{display:inline-block;margin-left:3rem}.admin__data-grid-pager .admin__control-text::-webkit-inner-spin-button,.admin__data-grid-pager .admin__control-text::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.admin__data-grid-pager .admin__control-text{-moz-appearance:textfield;text-align:center;width:4.4rem}.action-next,.action-previous{width:4.4rem}.action-next:before,.action-previous:before{font-weight:700}.action-next>span,.action-previous>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-previous{margin-right:2.5rem;text-indent:-.25em}.action-previous:before{content:'\e629'}.action-next{margin-left:1.5rem;text-indent:.1em}.action-next:before{content:'\e62a'}.admin__data-grid-action-bookmarks{opacity:.98}.admin__data-grid-action-bookmarks .admin__action-dropdown-text:after{left:0;right:-6px}.admin__data-grid-action-bookmarks._active{z-index:290}.admin__data-grid-action-bookmarks .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:15rem;min-width:4.9rem;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown:before{content:'\e60f'}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu{font-size:1.3rem;left:0;padding:1rem 0;right:auto}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li{padding:0 5rem 0 0;position:relative;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action){transition:background-color .1s linear}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action):hover{background-color:#e3e3e3}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item{max-width:23rem;min-width:18rem;white-space:normal;word-break:break-all}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit{display:none;padding-bottom:1rem;padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit .action-dropdown-menu-item-actions{padding-bottom:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action{padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action+.action-dropdown-menu-item-last{padding-top:.5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a{color:#008bdb;text-decoration:none;display:inline-block;padding-left:1.1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a:hover{color:#0fa7ff;text-decoration:underline}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-last{padding-bottom:0}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item{display:none}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item-edit{display:block}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._active .action-dropdown-menu-link{font-weight:600}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{font-size:1.3rem;min-width:15rem;width:calc(100% - 4rem)}.ie9 .admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{width:15rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-actions{border-left:1px solid #fff;bottom:0;position:absolute;right:0;top:0;width:5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-link{color:#333;display:block;text-decoration:none;padding:1rem 1rem 1rem 2.1rem}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit,.admin__data-grid-action-bookmarks .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;vertical-align:top}.admin__data-grid-action-bookmarks .action-delete:hover,.admin__data-grid-action-bookmarks .action-edit:hover,.admin__data-grid-action-bookmarks .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before{font-size:1.7rem}.admin__data-grid-action-bookmarks .action-delete>span,.admin__data-grid-action-bookmarks .action-edit>span,.admin__data-grid-action-bookmarks .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit{padding:.6rem 1.4rem}.admin__data-grid-action-bookmarks .action-delete:active,.admin__data-grid-action-bookmarks .action-edit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__data-grid-action-bookmarks .action-submit{padding:.6rem 1rem .6rem .8rem}.admin__data-grid-action-bookmarks .action-submit:active{position:relative;right:-1px}.admin__data-grid-action-bookmarks .action-submit:before{content:'\e625'}.admin__data-grid-action-bookmarks .action-delete:before{content:'\e630'}.admin__data-grid-action-bookmarks .action-edit{padding-top:.8rem}.admin__data-grid-action-bookmarks .action-edit:before{content:'\e631'}.admin__data-grid-action-columns._active{opacity:.98;z-index:290}.admin__data-grid-action-columns .admin__action-dropdown:before{content:'\e610';font-size:1.8rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-columns-menu{color:#303030;font-size:1.3rem;overflow:hidden;padding:2.2rem 3.5rem 1rem;z-index:1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-header{border-bottom:1px solid #d1d1d1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-content{width:49.2rem}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-footer{border-top:1px solid #d1d1d1;padding-top:2.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content{max-height:22.85rem;overflow-y:auto;padding-top:1.5rem;position:relative;width:47.4rem}.admin__data-grid-action-columns-menu .admin__field-option{float:left;height:1.9rem;margin-bottom:1.5rem;padding:0 1rem 0 0;width:15.8rem}.admin__data-grid-action-columns-menu .admin__field-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-header{padding-bottom:1.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-footer{padding:1rem 0 2rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-secondary-actions{float:left;margin-left:-1em}.admin__data-grid-action-export._active{opacity:.98;z-index:290}.admin__data-grid-action-export .admin__action-dropdown:before{content:'\e635';font-size:1.7rem;left:.3rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-export-menu{padding-left:2rem;padding-right:2rem;padding-top:1rem}.admin__data-grid-action-export-menu .admin__action-dropdown-footer-main-actions{padding-bottom:2rem;padding-top:2.5rem;white-space:nowrap}.sticky-header{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:8.8rem;margin-top:-1px;padding:.5rem 3rem 0;position:fixed;right:0;top:77px;z-index:398}.sticky-header .admin__data-grid-wrap{margin-bottom:0;overflow-x:visible;padding-bottom:0}.sticky-header .admin__data-grid-header-row{position:relative;text-align:right}.sticky-header .admin__data-grid-header-row:last-child{margin:0}.sticky-header .admin__data-grid-actions-wrap,.sticky-header .admin__data-grid-filters-wrap,.sticky-header .admin__data-grid-pager-wrap,.sticky-header .data-grid-filters-actions-wrap,.sticky-header .data-grid-search-control-wrap{display:inline-block;float:none;vertical-align:top}.sticky-header .action-select-wrap{float:left;margin-right:1.5rem;width:16.66666667%}.sticky-header .admin__control-support-text{float:left}.sticky-header .data-grid-search-control-wrap{margin:-.5rem 0 0 1.1rem;width:auto}.sticky-header .data-grid-search-control-wrap .data-grid-search-label{box-sizing:border-box;cursor:pointer;display:block;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;position:relative;text-align:center}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before{color:#333;content:'\e60c';font-size:2rem;transition:color .1s linear}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:hover:before{color:#000}.sticky-header .data-grid-search-control-wrap .data-grid-search-label span{display:none}.sticky-header .data-grid-filters-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-left:0;position:relative}.sticky-header .data-grid-filters-actions-wrap .action-default{background-color:transparent;border:1px solid transparent;box-sizing:border-box;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;text-align:center;transition:all .15s ease}.sticky-header .data-grid-filters-actions-wrap .action-default span{display:none}.sticky-header .data-grid-filters-actions-wrap .action-default:before{margin:0}.sticky-header .data-grid-filters-actions-wrap .action-default._active{background-color:#fff;border-color:#adadad #adadad #fff;box-shadow:1px 1px 5px rgba(0,0,0,.5);z-index:210}.sticky-header .data-grid-filters-actions-wrap .action-default._active:after{background-color:#fff;content:'';height:6px;left:-2px;position:absolute;right:-6px;top:100%}.sticky-header .data-grid-filters-action-wrap{padding:0}.sticky-header .admin__data-grid-filters-wrap{background-color:#fff;border:1px solid #adadad;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:0;padding-left:3.5rem;padding-right:3.5rem;position:absolute;top:100%;width:100%;z-index:209}.sticky-header .admin__data-grid-filters-current+.admin__data-grid-filters-wrap._show{margin-top:-6px}.sticky-header .filters-active{background-color:#e04f00;border-radius:10px;color:#fff;display:block;font-size:1.4rem;font-weight:700;padding:.1rem .7rem;position:absolute;right:-7px;top:0;z-index:211}.sticky-header .filters-active:empty{padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-right:.3rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown{background-color:transparent;box-sizing:border-box;min-width:3.8rem;padding-left:.6rem;padding-right:.6rem;text-align:center}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:0;min-width:0;overflow:hidden}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:before{margin:0}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap{margin-right:1.1rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after,.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:after{display:none}.sticky-header .admin__data-grid-actions-wrap ._active .admin__action-dropdown{background-color:#fff}.sticky-header .admin__data-grid-action-bookmarks .admin__action-dropdown:before{position:relative;top:-3px}.sticky-header .admin__data-grid-filters-current{border-bottom:0;border-top:0;margin-bottom:0;padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-pager .admin__control-text,.sticky-header .admin__data-grid-pager-wrap .admin__control-support-text,.sticky-header .data-grid-search-control-wrap .action-submit,.sticky-header .data-grid-search-control-wrap .data-grid-search-control{display:none}.sticky-header .action-next{margin:0}.sticky-header .data-grid{margin-bottom:-1px}.data-grid-cap-left,.data-grid-cap-right{background-color:#f8f8f8;bottom:-2px;position:absolute;top:6rem;width:3rem;z-index:201}.data-grid-cap-left{left:0}.admin__data-grid-header{font-size:1.4rem}.admin__data-grid-header-row+.admin__data-grid-header-row{margin-top:1.1rem}.admin__data-grid-header-row:last-child{margin-bottom:0}.admin__data-grid-header-row .action-select-wrap{display:block}.admin__data-grid-header-row .action-select{width:100%}.admin__data-grid-actions-wrap{float:right;margin-left:1.1rem;margin-top:-.5rem;text-align:right}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap{position:relative;text-align:left;vertical-align:middle}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._hide+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:first-child:after{display:none}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown-menu{border-color:#adadad}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after{border-left:1px solid #ccc;content:'';height:3.2rem;left:0;position:absolute;top:.5rem;z-index:3}.admin__data-grid-actions-wrap .admin__action-dropdown{padding-bottom:1.7rem;padding-top:1.2rem}.admin__data-grid-actions-wrap .admin__action-dropdown:after{margin-top:-.4rem}.admin__data-grid-outer-wrap{min-height:8rem;position:relative}.admin__data-grid-wrap{margin-bottom:2rem;max-width:100%;overflow-x:auto;padding-bottom:1rem;padding-top:2rem}.admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-loading-mask .spinner{font-size:4rem;left:50%;margin-left:-2rem;margin-top:-2rem;position:absolute;top:50%}.ie9 .admin__data-grid-loading-mask .spinner{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-cell-content{display:inline-block;overflow:hidden;width:100%}body._in-resize{cursor:col-resize;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body._in-resize *,body._in-resize .data-grid-th,body._in-resize .data-grid-th._draggable,body._in-resize .data-grid-th._sortable{cursor:col-resize!important}._layout-fixed{table-layout:fixed}.data-grid{border:none;font-size:1.3rem;margin-bottom:0;width:100%}.data-grid:not(._dragging-copy) ._odd-row td._dragging{background-color:#d0d0d0}.data-grid:not(._dragging-copy) ._dragging{background-color:#d9d9d9;color:rgba(48,48,48,.95)}.data-grid:not(._dragging-copy) ._dragging a{color:rgba(0,139,219,.95)}.data-grid:not(._dragging-copy) ._dragging a:hover{color:rgba(15,167,255,.95)}.data-grid._dragged{outline:#007bdb solid 1px}.data-grid thead{background-color:transparent}.data-grid tfoot th{padding:1rem}.data-grid tr._odd-row td{background-color:#f5f5f5}.data-grid tr._odd-row td._update-status-active{background:#89e1ff}.data-grid tr._odd-row td._update-status-upcoming{background:#b7ee63}.data-grid tr:hover td._update-status-active,.data-grid tr:hover td._update-status-upcoming{background-color:#e5f7fe}.data-grid tr.data-grid-tr-no-data td{font-size:1.6rem;padding:3rem;text-align:center}.data-grid tr.data-grid-tr-no-data:hover td{background-color:#fff;cursor:default}.data-grid tr:active td{background-color:#e0f6fe}.data-grid tr:hover td{background-color:#e5f7fe}.data-grid tr._dragged td{background:#d0d0d0}.data-grid tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.data-grid tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.data-grid tr:not(.data-grid-editable-row):last-child td{border-bottom:.1rem solid #d6d6d6}.data-grid tr ._clickable,.data-grid tr._clickable{cursor:pointer}.data-grid tr._disabled{pointer-events:none}.data-grid td,.data-grid th{font-size:1.3rem;line-height:1.36;transition:background-color .1s linear;vertical-align:top}.data-grid td._resizing,.data-grid th._resizing{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid td._hidden,.data-grid th._hidden{display:none}.data-grid td._fit,.data-grid th._fit{width:1%}.data-grid td{background-color:#fff;border-left:.1rem dashed #d6d6d6;border-right:.1rem dashed #d6d6d6;color:#303030;padding:1rem}.data-grid td:first-child{border-left-style:solid}.data-grid td:last-child{border-right-style:solid}.data-grid td .action-select-wrap{position:static}.data-grid td .action-select{color:#008bdb;text-decoration:none;background-color:transparent;border:none;font-size:1.3rem;padding:0 3rem 0 0;position:relative}.data-grid td .action-select:hover{color:#0fa7ff;text-decoration:underline}.data-grid td .action-select:hover:after{border-color:#0fa7ff transparent transparent}.data-grid td .action-select:after{border-color:#008bdb transparent transparent;margin:.6rem 0 0 .7rem;right:auto;top:auto}.data-grid td .action-select:before{display:none}.data-grid td .abs-action-menu .action-submenu,.data-grid td .abs-action-menu .action-submenu .action-submenu,.data-grid td .action-menu,.data-grid td .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:10rem;right:0;text-align:left;top:auto;z-index:1}.data-grid td._update-status-active{background:#bceeff}.data-grid td._update-status-upcoming{background:#ccf391}.data-grid th{background-color:#514943;border:.1rem solid #8a837f;border-left-color:transparent;color:#fff;font-weight:600;padding:0;text-align:left}.data-grid th:first-child{border-left-color:#8a837f}.data-grid th._dragover-left{box-shadow:inset 3px 0 0 0 #fff;z-index:2}.data-grid th._dragover-right{box-shadow:inset -3px 0 0 0 #fff}.data-grid .shadow-div{cursor:col-resize;height:100%;margin-right:-5px;position:absolute;right:0;top:0;width:10px}.data-grid .data-grid-th{background-clip:padding-box;color:#fff;padding:1rem;position:relative;vertical-align:middle}.data-grid .data-grid-th._resize-visible .shadow-div{cursor:auto;display:none}.data-grid .data-grid-th._draggable{cursor:grab}.data-grid .data-grid-th._sortable{cursor:pointer;transition:background-color .1s linear;z-index:1}.data-grid .data-grid-th._sortable:focus,.data-grid .data-grid-th._sortable:hover{background-color:#5f564f}.data-grid .data-grid-th._sortable:active{padding-bottom:.9rem;padding-top:1.1rem}.data-grid .data-grid-th.required>span:after{color:#f38a5e;content:'*';margin-left:.3rem}.data-grid .data-grid-checkbox-cell{overflow:hidden;padding:0;vertical-align:top;width:5.2rem}.data-grid .data-grid-checkbox-cell:hover{cursor:default}.data-grid .data-grid-thumbnail-cell{text-align:center;width:7rem}.data-grid .data-grid-thumbnail-cell img{border:1px solid #d6d6d6;width:5rem}.data-grid .data-grid-multicheck-cell{padding:1rem 1rem .9rem;text-align:center;vertical-align:middle}.data-grid .data-grid-onoff-cell{text-align:center;width:12rem}.data-grid .data-grid-actions-cell{padding-left:2rem;padding-right:2rem;text-align:center;width:1%}.data-grid._hidden{display:none}.data-grid._dragging-copy{box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;opacity:.95;position:fixed;top:0;z-index:1000}.data-grid._dragging-copy .data-grid-th{border:1px solid #007bdb;border-bottom:none}.data-grid._dragging-copy .data-grid-th,.data-grid._dragging-copy .data-grid-th._sortable{cursor:grabbing}.data-grid._dragging-copy tr:last-child td{border-bottom:1px solid #007bdb}.data-grid._dragging-copy td{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:rgba(255,251,230,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td,.data-grid._dragging-copy._in-edit .data-grid-editable-row:hover td{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:after,.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{left:0;right:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:only-child{border-left:1px solid #007bdb;border-right:1px solid #007bdb;left:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-select,.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-text{opacity:.5}.data-grid .data-grid-controls-row td{padding-top:1.6rem}.data-grid .data-grid-controls-row td.data-grid-checkbox-cell{padding-top:.6rem}.data-grid .data-grid-controls-row td [class*=admin__control-],.data-grid .data-grid-controls-row td button{margin-top:-1.7rem}.data-grid._in-edit tr:hover td{background-color:#e6e6e6}.data-grid._in-edit ._odd-row.data-grid-editable-row td,.data-grid._in-edit ._odd-row.data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit ._odd-row td,.data-grid._in-edit ._odd-row:hover td{background-color:#dcdcdc}.data-grid._in-edit .data-grid-editable-row-actions td,.data-grid._in-edit .data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid._in-edit td{background-color:#e6e6e6;pointer-events:none}.data-grid._in-edit .data-grid-checkbox-cell{pointer-events:auto}.data-grid._in-edit .data-grid-editable-row{border:.1rem solid #adadad;border-bottom-color:#c2c2c2}.data-grid._in-edit .data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit .data-grid-editable-row td{background-color:#fff;border-bottom-color:#fff;border-left-style:hidden;border-right-style:hidden;border-top-color:#fff;pointer-events:auto;vertical-align:middle}.data-grid._in-edit .data-grid-editable-row td:first-child{border-left-color:#adadad;border-left-style:solid}.data-grid._in-edit .data-grid-editable-row td:first-child:after,.data-grid._in-edit .data-grid-editable-row td:first-child:before{left:0}.data-grid._in-edit .data-grid-editable-row td:last-child{border-right-color:#adadad;border-right-style:solid;left:-.1rem}.data-grid._in-edit .data-grid-editable-row td:last-child:after,.data-grid._in-edit .data-grid-editable-row td:last-child:before{right:0}.data-grid._in-edit .data-grid-editable-row .admin__control-select,.data-grid._in-edit .data-grid-editable-row .admin__control-text{width:100%}.data-grid._in-edit .data-grid-bulk-edit-panel td{vertical-align:bottom}.data-grid .data-grid-editable-row td{border-left-color:#fff;border-left-style:solid;position:relative;z-index:1}.data-grid .data-grid-editable-row td:after{bottom:0;box-shadow:0 5px 5px rgba(0,0,0,.25);content:'';height:.9rem;left:0;margin-top:-1rem;position:absolute;right:0}.data-grid .data-grid-editable-row td:before{background-color:#fff;bottom:0;content:'';height:1rem;left:-10px;position:absolute;right:-10px;z-index:1}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td,.data-grid .data-grid-editable-row.data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:first-child{border-left-color:#fff;border-right-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:last-child{left:0}.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:#fffbe6}.data-grid .data-grid-editable-row-actions{left:50%;margin-left:-12.5rem;margin-top:-2px;position:absolute;text-align:center}.data-grid .data-grid-editable-row-actions td{width:25rem}.data-grid .data-grid-editable-row-actions [class*=action-]{min-width:9rem}.data-grid .data-grid-draggable-row-cell{width:1%}.data-grid .data-grid-draggable-row-cell .draggable-handle{padding:0}.data-grid-th._sortable._ascend,.data-grid-th._sortable._descend{padding-right:2.7rem}.data-grid-th._sortable._ascend:before,.data-grid-th._sortable._descend:before{margin-top:-1em;position:absolute;right:1rem;top:50%}.data-grid-th._sortable._ascend:before{content:'\2193'}.data-grid-th._sortable._descend:before{content:'\2191'}.data-grid-checkbox-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:right}.data-grid-checkbox-cell-inner:hover{cursor:pointer}.data-grid-state-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:center}.data-grid-state-cell-inner>span{display:inline-block;font-style:italic;padding:.6rem 0}.data-grid-row-parent._active>td .data-grid-checkbox-cell-inner:before{content:'\e62b'}.data-grid-row-parent>td .data-grid-checkbox-cell-inner{padding-left:3.7rem;position:relative}.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before{content:'\e628';font-size:1rem;font-weight:700;left:1.35rem;position:absolute;top:1.6rem}.data-grid-th._col-xs{width:1%}.data-grid-info-panel{box-shadow:0 0 5px rgba(0,0,0,.5);margin:2rem .1rem -2rem}.data-grid-info-panel .messages{overflow:hidden}.data-grid-info-panel .messages .message{margin:1rem}.data-grid-info-panel .messages .message:last-child{margin-bottom:1rem}.data-grid-info-panel-actions{padding:1rem;text-align:right}.data-grid-editable-row .admin__field-control{position:relative}.data-grid-editable-row .admin__field-control._error:after{border-color:transparent #ee7d7d transparent transparent;border-style:solid;border-width:0 12px 12px 0;content:'';position:absolute;right:0;top:0}.data-grid-editable-row .admin__field-control._error .admin__control-text{border-color:#ee7d7d}.data-grid-editable-row .admin__field-control._focus:after{display:none}.data-grid-editable-row .admin__field-error{bottom:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin:0 auto 1.5rem;max-width:32rem;position:absolute;right:0}.data-grid-editable-row .admin__field-error:after,.data-grid-editable-row .admin__field-error:before{border-style:solid;content:'';left:50%;position:absolute;top:100%}.data-grid-editable-row .admin__field-error:after{border-color:#fffbbb transparent transparent;border-width:10px 10px 0;margin-left:-10px;z-index:1}.data-grid-editable-row .admin__field-error:before{border-color:#ee7d7d transparent transparent;border-width:11px 12px 0;margin-left:-12px}.data-grid-bulk-edit-panel .admin__field-label-vertical{display:block;font-size:1.2rem;margin-bottom:.5rem;text-align:left}.data-grid-row-changed{cursor:default;display:block;opacity:.5;position:relative;width:100%;z-index:1}.data-grid-row-changed:after{content:'\e631';display:inline-block}.data-grid-row-changed .data-grid-row-changed-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:100%;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;line-height:1.36;margin-bottom:1.5rem;padding:1rem;position:absolute;right:-1rem;text-transform:none;width:27rem;word-break:normal;z-index:2}.data-grid-row-changed._changed{opacity:1;z-index:3}.data-grid-row-changed._changed:hover .data-grid-row-changed-tooltip{display:block}.data-grid-row-changed._changed:hover:before{background:#f1f1f1;border:1px solid #f1f1f1;bottom:100%;box-shadow:4px 4px 3px -1px rgba(0,0,0,.15);content:'';display:block;height:1.6rem;left:50%;margin:0 0 .7rem -.8rem;position:absolute;-ms-transform:rotate(45deg);transform:rotate(45deg);width:1.6rem;z-index:3}.ie9 .data-grid-row-changed._changed:hover:before{display:none}.admin__data-grid-outer-wrap .data-grid-checkbox-cell{overflow:hidden}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner{position:relative}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner:before{bottom:0;content:'';height:500%;left:0;position:absolute;right:0;top:0}.admin__data-grid-wrap-static .data-grid-checkbox-cell:hover{cursor:pointer}.admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:1.1rem 1.8rem .9rem;padding:0}.adminhtml-cms-hierarchy-index .admin__data-grid-wrap-static .data-grid-actions-cell:first-child{padding:0}.adminhtml-export-index .admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:0;padding:1.1rem 1.8rem 1.9rem}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before,.admin__control-file-label:before,.admin__control-multiselect,.admin__control-select,.admin__control-text,.admin__control-textarea,.selectmenu{-webkit-appearance:none;background-color:#fff;border:1px solid #adadad;border-radius:1px;box-shadow:none;color:#303030;font-size:1.4rem;font-weight:400;height:auto;line-height:1.36;padding:.6rem 1rem;transition:border-color .1s linear;vertical-align:baseline;width:auto}.admin__control-addon [class*=admin__control-][class]:hover~[class*=admin__addon-]:last-child:before,.admin__control-multiselect:hover,.admin__control-select:hover,.admin__control-text:hover,.admin__control-textarea:hover,.selectmenu:hover,.selectmenu:hover .selectmenu-toggle:before{border-color:#878787}.admin__control-addon [class*=admin__control-][class]:focus~[class*=admin__addon-]:last-child:before,.admin__control-file:active+.admin__control-file-label:before,.admin__control-file:focus+.admin__control-file-label:before,.admin__control-multiselect:focus,.admin__control-select:focus,.admin__control-text:focus,.admin__control-textarea:focus,.selectmenu._focus,.selectmenu._focus .selectmenu-toggle:before{border-color:#007bdb;box-shadow:none;outline:0}.admin__control-addon [class*=admin__control-][class][disabled]~[class*=admin__addon-]:last-child:before,.admin__control-file[disabled]+.admin__control-file-label:before,.admin__control-multiselect[disabled],.admin__control-select[disabled],.admin__control-text[disabled],.admin__control-textarea[disabled]{background-color:#e9e9e9;border-color:#adadad;color:#303030;cursor:not-allowed;opacity:.5}.admin__field-row[class]>.admin__field-control,.admin__fieldset>.admin__field.admin__field-wide[class]>.admin__field-control{clear:left;float:none;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label{display:block;line-height:1.4rem;margin-bottom:.86rem;margin-top:-.14rem;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label:before,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label:before{display:none}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span{padding-left:1.5rem}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span:after{left:0;margin-left:30px}.admin__legend{font-size:1.8rem;font-weight:600;margin-bottom:3rem}.admin__control-checkbox,.admin__control-radio{cursor:pointer;opacity:.01;overflow:hidden;position:absolute;vertical-align:top}.admin__control-checkbox:after,.admin__control-radio:after{display:none}.admin__control-checkbox+label,.admin__control-radio+label{cursor:pointer;display:inline-block}.admin__control-checkbox+label:before,.admin__control-radio+label:before{background-color:#fff;border:1px solid #adadad;color:transparent;float:left;height:1.6rem;text-align:center;vertical-align:top;width:1.6rem}.admin__control-checkbox+.admin__field-label,.admin__control-radio+.admin__field-label{padding-left:2.6rem}.admin__control-checkbox+.admin__field-label:before,.admin__control-radio+.admin__field-label:before{margin:1px 1rem 0 -2.6rem}.admin__control-checkbox:checked+label:before,.admin__control-radio:checked+label:before{color:#514943}.admin__control-checkbox.disabled+label,.admin__control-checkbox[disabled]+label,.admin__control-radio.disabled+label,.admin__control-radio[disabled]+label{color:#303030;cursor:default;opacity:.5}.admin__control-checkbox.disabled+label:before,.admin__control-checkbox[disabled]+label:before,.admin__control-radio.disabled+label:before,.admin__control-radio[disabled]+label:before{background-color:#e9e9e9;border-color:#adadad;cursor:default}._keyfocus .admin__control-checkbox:not(.disabled):focus+label:before,._keyfocus .admin__control-checkbox:not([disabled]):focus+label:before,._keyfocus .admin__control-radio:not(.disabled):focus+label:before,._keyfocus .admin__control-radio:not([disabled]):focus+label:before{border-color:#007bdb}.admin__control-checkbox:not(.disabled):hover+label:before,.admin__control-checkbox:not([disabled]):hover+label:before,.admin__control-radio:not(.disabled):hover+label:before,.admin__control-radio:not([disabled]):hover+label:before{border-color:#878787}.admin__control-radio+label:before{border-radius:1.6rem;content:'';transition:border-color .1s linear,color .1s ease-in}.admin__control-radio.admin__control-radio+label:before{line-height:140%}.admin__control-radio:checked+label{position:relative}.admin__control-radio:checked+label:after{background-color:#514943;border-radius:50%;content:'';height:10px;left:3px;position:absolute;top:4px;width:10px}.admin__control-radio:checked:not(.disabled):hover,.admin__control-radio:checked:not(.disabled):hover+label,.admin__control-radio:checked:not([disabled]):hover,.admin__control-radio:checked:not([disabled]):hover+label{cursor:default}.admin__control-radio:checked:not(.disabled):hover+label:before,.admin__control-radio:checked:not([disabled]):hover+label:before{border-color:#adadad}.admin__control-checkbox+label:before{border-radius:1px;content:'';font-size:0;transition:font-size .1s ease-out,color .1s ease-out,border-color .1s linear}.admin__control-checkbox:checked+label:before{content:'\e62d';font-size:1.1rem;line-height:125%}.admin__control-checkbox:not(:checked)._indeterminate+label:before,.admin__control-checkbox:not(:checked):indeterminate+label:before{color:#514943;content:'-';font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700}input[type=checkbox].admin__control-checkbox,input[type=radio].admin__control-checkbox{margin:0;position:absolute}.admin__control-text{min-width:4rem}.admin__control-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#adadad,#adadad);background-position:calc(100% - 12px) -34px,100%,calc(100% - 3.2rem) 0;background-size:auto,3.2rem 100%,1px 100%;background-repeat:no-repeat;max-width:100%;min-width:8.5rem;padding-bottom:.5rem;padding-right:4.4rem;padding-top:.5rem;transition:border-color .1s linear}.admin__control-select:hover{border-color:#878787;cursor:pointer}.admin__control-select:focus{background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#007bdb,#007bdb);background-position:calc(100% - 12px) 13px,100%,calc(100% - 3.2rem) 0;border-color:#007bdb}.admin__control-select::-ms-expand{display:none}.ie9 .admin__control-select{background-image:none;padding-right:1rem}option:empty{display:none}.admin__control-multiselect{height:auto;max-width:100%;min-width:15rem;overflow:auto;padding:0;resize:both}.admin__control-multiselect optgroup,.admin__control-multiselect option{padding:.5rem 1rem}.admin__control-file-wrapper{display:inline-block;padding:.5rem 1rem;position:relative;z-index:1}.admin__control-file-label:before{content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__control-file{background:0 0;border:0;padding-top:.7rem;position:relative;width:auto;z-index:1}.admin__control-support-text{border:1px solid transparent;display:inline-block;font-size:1.4rem;line-height:1.36;padding-bottom:.6rem;padding-top:.6rem}.admin__control-support-text+[class*=admin__control-],[class*=admin__control-]+.admin__control-support-text{margin-left:.7rem}.admin__control-service{float:left;margin:.8rem 0 0 3rem}.admin__control-textarea{height:8.48rem;line-height:1.18;padding-top:.8rem;resize:vertical}.admin__control-addon{-ms-flex-direction:row;flex-direction:row;display:inline-flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;position:relative;width:100%;z-index:1}.admin__control-addon>[class*=admin__addon-],.admin__control-addon>[class*=admin__control-]{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;z-index:1}.admin__control-addon .admin__control-select{width:auto}.admin__control-addon .admin__control-text{margin:.1rem;padding:.5rem .9rem;width:100%}.admin__control-addon [class*=admin__control-][class]{appearence:none;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-order:1;order:1;-ms-flex-negative:1;flex-shrink:1;background-color:transparent;border-color:transparent;box-shadow:none;vertical-align:top}.admin__control-addon [class*=admin__control-][class]+[class*=admin__control-]{border-left-color:#adadad}.admin__control-addon [class*=admin__control-][class] :focus{box-shadow:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child{padding-left:1rem;position:static!important;z-index:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child>*{position:relative;vertical-align:top;z-index:1}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:empty{padding:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before{bottom:0;box-sizing:border-box;content:'';left:0;position:absolute;top:0;width:100%;z-index:-1}.admin__addon-prefix,.admin__addon-suffix{border:0;box-sizing:border-box;color:#858585;display:inline-block;font-size:1.4rem;font-weight:400;height:3.2rem;line-height:3.2rem;padding:0}.admin__addon-suffix{-ms-flex-order:3;order:3}.admin__addon-suffix:last-child{padding-right:1rem}.admin__addon-prefix{-ms-flex-order:0;order:0}.ie9 .admin__control-addon:after{clear:both;content:'';display:block;height:0;overflow:hidden}.ie9 .admin__addon{min-width:0;overflow:hidden;text-align:right;white-space:nowrap;width:auto}.ie9 .admin__addon [class*=admin__control-]{display:inline}.ie9 .admin__addon-prefix{float:left}.ie9 .admin__addon-suffix{float:right}.admin__control-collapsible{width:100%}.admin__control-collapsible ._dragged .admin__collapsible-block-wrapper .admin__collapsible-title{background:#d0d0d0}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before,.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{background:#008bdb;content:'';display:block;height:3px;left:0;position:absolute;right:0}.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{top:-3px}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before{bottom:-3px}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper{border:0;margin:0;position:relative}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper .fieldset-wrapper-title{background:#f8f8f8;border:2px solid #ccc}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title{font-size:1.4rem;font-weight:400;line-height:1;padding:1.6rem 4rem 1.6rem 3.8rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title:before{left:1rem;right:auto;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding:0;position:absolute;right:1rem;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before{content:'\e630';font-size:2rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete>span{display:none}.admin__control-collapsible .admin__collapsible-content{background-color:#fff;margin-bottom:1rem}.admin__control-collapsible .admin__collapsible-content>.fieldset-wrapper{border:1px solid #ccc;margin-top:-1px;padding:1rem}.admin__control-collapsible .admin__collapsible-content .admin__fieldset{padding:0}.admin__control-collapsible .admin__collapsible-content .admin__field:last-child{margin-bottom:0}.admin__control-table-wrapper{max-width:100%;overflow-x:auto;overflow-y:hidden}.admin__control-table{width:100%}.admin__control-table thead{background-color:transparent}.admin__control-table tbody td{vertical-align:top}.admin__control-table tfoot th{padding-bottom:1.3rem}.admin__control-table tfoot th.validation{padding-bottom:0;padding-top:0}.admin__control-table tfoot td{border-top:1px solid #fff}.admin__control-table tfoot .admin__control-table-pagination{float:right;padding-bottom:0}.admin__control-table tfoot .action-previous{margin-right:.5rem}.admin__control-table tfoot .action-next{margin-left:.9rem}.admin__control-table tr:last-child td{border-bottom:none}.admin__control-table tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.admin__control-table tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.admin__control-table tr._dragged td,.admin__control-table tr._dragged th{background:#d0d0d0}.admin__control-table td,.admin__control-table th{background-color:#efefef;border:0;border-bottom:1px solid #fff;padding:1.3rem 1rem 1.3rem 0;text-align:left;vertical-align:top}.admin__control-table td:first-child,.admin__control-table th:first-child{padding-left:1rem}.admin__control-table td>.admin__control-select,.admin__control-table td>.admin__control-text,.admin__control-table th>.admin__control-select,.admin__control-table th>.admin__control-text{width:100%}.admin__control-table td._hidden,.admin__control-table th._hidden{display:none}.admin__control-table td._fit,.admin__control-table th._fit{width:1px}.admin__control-table th{color:#303030;font-size:1.4rem;font-weight:600;vertical-align:bottom}.admin__control-table th._required span:after{color:#eb5202;content:'*'}.admin__control-table .control-table-actions-th{white-space:nowrap}.admin__control-table .control-table-actions-cell{padding-top:1.8rem;text-align:center;width:1%}.admin__control-table .control-table-options-th{text-align:center;width:10rem}.admin__control-table .control-table-options-cell{text-align:center}.admin__control-table .control-table-text{line-height:3.2rem}.admin__control-table .col-draggable{padding-top:2.2rem;width:1%}.admin__control-table .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.admin__control-table .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-table .action-delete:before{content:'\e630';font-size:2rem}.admin__control-table .action-delete>span{display:none}.admin__control-table .draggable-handle{padding:0}.admin__control-table._dragged{outline:#007bdb solid 1px}.admin__control-table-action{background-color:#efefef;border-top:1px solid #fff;padding:1.3rem 1rem}.admin__dynamic-rows._dragged{opacity:.95;position:absolute;z-index:999}.admin__dynamic-rows.admin__control-table .admin__control-fields>.admin__field{border:0;padding:0}.admin__dynamic-rows td>.admin__field{border:0;margin:0;padding:0}.admin__control-table-pagination{padding-bottom:1rem}.admin__control-table-pagination .admin__data-grid-pager{float:right}.admin__field-tooltip{display:inline-block;margin-top:.5rem;max-width:45px;overflow:visible;vertical-align:top;width:0}.admin__field-tooltip:hover{position:relative;z-index:500}.admin__field-option .admin__field-tooltip{margin-top:.5rem}.admin__field-tooltip .admin__field-tooltip-action{margin-left:2rem;position:relative;z-index:2;display:inline-block;text-decoration:none}.admin__field-tooltip .admin__field-tooltip-action:before{-webkit-font-smoothing:antialiased;font-size:2.2rem;line-height:1;color:#514943;content:'\e633';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.admin__field-tooltip .admin__control-text:focus+.admin__field-tooltip-content,.admin__field-tooltip:hover .admin__field-tooltip-content{display:block}.admin__field-tooltip .admin__field-tooltip-content{bottom:3.8rem;display:none;right:-2.3rem}.admin__field-tooltip .admin__field-tooltip-content:after,.admin__field-tooltip .admin__field-tooltip-content:before{border:1.6rem solid transparent;height:0;width:0;border-top-color:#afadac;content:'';display:block;position:absolute;right:2rem;top:100%;z-index:3}.admin__field-tooltip .admin__field-tooltip-content:after{border-top-color:#fffbbb;margin-top:-1px;z-index:4}.abs-admin__field-tooltip-content,.admin__field-tooltip .admin__field-tooltip-content{box-shadow:0 2px 8px 0 rgba(0,0,0,.3);background:#fffbbb;border:1px solid #afadac;border-radius:1px;padding:1.5rem 2.5rem;position:absolute;width:32rem;z-index:1}.admin__field-fallback-reset{font-size:1.25rem;white-space:nowrap;width:30px}.admin__field-fallback-reset>span{margin-left:.5rem;position:relative}.admin__field-fallback-reset:active{-ms-transform:scale(0.98);transform:scale(0.98)}.admin__field-fallback-reset:before{transition:color .1s linear;content:'\e642';font-size:1.3rem;margin-left:.5rem}.admin__field-fallback-reset:hover{cursor:pointer;text-decoration:none}.admin__field-fallback-reset:focus{background:0 0}.abs-field-size-x-small,.abs-field-sizes.admin__field-x-small>.admin__field-control,.admin__field.admin__field-x-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-x-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-x-small>.admin__field-control{width:8rem}.abs-field-size-small,.abs-field-sizes.admin__field-small>.admin__field-control,.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control,.admin__field.admin__field-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-small>.admin__field-control{width:15rem}.abs-field-size-medium,.abs-field-sizes.admin__field-medium>.admin__field-control,.admin__field.admin__field-medium>.admin__field-control,.admin__fieldset>.admin__field.admin__field-medium>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-medium>.admin__field-control{width:34rem}.abs-field-size-large,.abs-field-sizes.admin__field-large>.admin__field-control,.admin__field.admin__field-large>.admin__field-control,.admin__fieldset>.admin__field.admin__field-large>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-large>.admin__field-control{width:64rem}.abs-field-no-label,.admin__field-group-additional,.admin__field-no-label,.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-control{margin-left:calc((100%) * .25 + 30px)}.admin__fieldset{border:0;margin:0;min-width:0;padding:0}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title{padding-left:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title strong{font-size:1.7rem;font-weight:600}.admin__fieldset .fieldset-wrapper.admin__fieldset-section .admin__fieldset-wrapper-content>.admin__fieldset{padding-top:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section:last-child .admin__fieldset-wrapper-content>.admin__fieldset{padding-bottom:0}.admin__fieldset>.admin__field{border:0;margin:0 0 0 -30px;padding:0}.admin__fieldset>.admin__field:after{clear:both;content:'';display:table}.admin__fieldset>.admin__field>.admin__field-control{width:calc((100%) * .5 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-label{display:none}.admin__fieldset>.admin__field+.admin__field._empty._no-header{margin-top:-3rem}.admin__fieldset-product-websites{position:relative;z-index:300}.admin__fieldset-note{margin-bottom:2rem}.admin__form-field{border:0;margin:0;padding:0}.admin__field-control .admin__control-text,.admin__field-control .admin__control-textarea,.admin__form-field-control .admin__control-text,.admin__form-field-control .admin__control-textarea{width:100%}.admin__field-label{color:#303030;cursor:pointer;margin:0;text-align:right}.admin__field-label+br{display:none}.admin__field:not(.admin__field-option)>.admin__field-label{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:3.2rem;padding:0;white-space:nowrap}.admin__field:not(.admin__field-option)>.admin__field-label:before{opacity:0;visibility:hidden;content:'.';margin-left:-7px;overflow:hidden}.admin__field:not(.admin__field-option)>.admin__field-label span{display:inline-block;line-height:1.2;vertical-align:middle;white-space:normal}.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]{position:relative}._required>.admin__field-label>span:after,.required>.admin__field-label>span:after{color:#eb5202;content:'*';display:inline-block;font-size:1.6rem;font-weight:500;line-height:1;margin-left:10px;margin-top:.2rem;position:absolute;z-index:1}._disabled>.admin__field-label{color:#999;cursor:default}.admin__field{margin-bottom:0}.admin__field+.admin__field{margin-top:1.5rem}.admin__field:not(.admin__field-option)~.admin__field-option{margin-top:.5rem}.admin__field.admin__field-option~.admin__field-option{margin-top:.9rem}.admin__field~.admin__field-option:last-child{margin-bottom:.8rem}.admin__fieldset>.admin__field{margin-bottom:3rem;position:relative}.admin__field legend.admin__field-label{opacity:0}.admin__field[data-config-scope]:before{color:gray;content:attr(data-config-scope);display:inline-block;font-size:1.2rem;left:calc((100%) * .75 - 30px);line-height:3.2rem;margin-left:60px;position:absolute;width:calc((100%) * .25 - 30px)}.admin__field-control .admin__field[data-config-scope]:nth-child(n+2):before{content:''}.admin__field._error .admin__field-control [class*=admin__addon-]:before,.admin__field._error .admin__field-control [class*=admin__control-] [class*=admin__addon-]:before,.admin__field._error .admin__field-control>[class*=admin__control-]{border-color:#e22626}.admin__field._disabled,.admin__field._disabled:hover{box-shadow:inherit;cursor:inherit;opacity:1;outline:inherit}.admin__field._hidden{display:none}.admin__field-control+.admin__field-control{margin-top:1.5rem}.admin__field-control._with-tooltip>.admin__control-addon,.admin__field-control._with-tooltip>.admin__control-select,.admin__field-control._with-tooltip>.admin__control-text,.admin__field-control._with-tooltip>.admin__control-textarea,.admin__field-control._with-tooltip>.admin__field-option{max-width:calc(100% - 45px - 4px)}.admin__field-control._with-tooltip .admin__field-tooltip{width:auto}.admin__field-control._with-tooltip .admin__field-option{display:inline-block}.admin__field-control._with-reset>.admin__control-addon,.admin__field-control._with-reset>.admin__control-text,.admin__field-control._with-reset>.admin__control-textarea{width:calc(100% - 30px - .5rem - 4px)}.admin__field-control._with-reset .admin__field-fallback-reset{margin-left:.5rem;margin-top:1rem;vertical-align:top}.admin__field-control._with-reset._with-tooltip>.admin__control-addon,.admin__field-control._with-reset._with-tooltip>.admin__control-text,.admin__field-control._with-reset._with-tooltip>.admin__control-textarea{width:calc(100% - 30px - .5rem - 45px - 8px)}.admin__fieldset>.admin__field-collapsible{margin-bottom:0}.admin__fieldset>.admin__field-collapsible .admin__field-control{border-top:1px solid #ccc;display:block;font-size:1.7rem;font-weight:700;padding:1.7rem 0;width:calc(97%)}.admin__fieldset>.admin__field-collapsible .admin__field-option{padding-top:0}.admin__field-collapsible+div{margin-top:2.5rem}.admin__field-collapsible .admin__control-radio+label:before{height:1.8rem;width:1.8rem}.admin__field-collapsible .admin__control-radio:checked+label:after{left:4px;top:5px}.admin__field-error{background:#fffbbb;border:1px solid #ee7d7d;box-sizing:border-box;color:#555;display:block;font-size:1.2rem;font-weight:400;line-height:1.2;margin:.2rem 0 0;padding:.8rem 1rem .9rem}.admin__field-note{color:#303030;font-size:1.2rem;margin:10px 0 0;padding:0}.admin__additional-info{padding-top:1rem}.admin__field-option{padding-top:.7rem}.admin__field-option .admin__field-label{text-align:left}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2),.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1){display:inline-block}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option{display:inline-block;margin-left:41px;margin-top:0}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option:before,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option:before{background:#cacaca;content:'';display:inline-block;height:20px;margin-left:-20px;position:absolute;width:1px}.admin__field-value{display:inline-block;padding-top:.7rem}.admin__field-service{padding-top:1rem}.admin__control-fields>.admin__field:first-child,[class*=admin__control-grouped]>.admin__field:first-child{position:static}.admin__control-fields>.admin__field:first-child>.admin__field-label,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px;background:#fff;cursor:pointer;left:0;position:absolute;top:0}.admin__control-fields>.admin__field:first-child>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label span:before{display:block}.admin__control-fields>.admin__field._disabled>.admin__field-label,[class*=admin__control-grouped]>.admin__field._disabled>.admin__field-label{cursor:default}.admin__control-fields>.admin__field>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field>.admin__field-label span:before{display:none}.admin__control-fields .admin__field-label~.admin__field-control{width:100%}.admin__control-fields .admin__field-option{padding-top:0}[class*=admin__control-grouped]{box-sizing:border-box;display:table;width:100%}[class*=admin__control-grouped]>.admin__field{display:table-cell;vertical-align:top}[class*=admin__control-grouped]>.admin__field>.admin__field-control{float:none;width:100%}[class*=admin__control-grouped]>.admin__field.admin__field-default,[class*=admin__control-grouped]>.admin__field.admin__field-large,[class*=admin__control-grouped]>.admin__field.admin__field-medium,[class*=admin__control-grouped]>.admin__field.admin__field-small,[class*=admin__control-grouped]>.admin__field.admin__field-x-small{width:1px}[class*=admin__control-grouped]>.admin__field.admin__field-default+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-large+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-medium+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-small+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-x-small+.admin__field:last-child{width:auto}[class*=admin__control-grouped]>.admin__field:nth-child(n+2){padding-left:20px}.admin__control-group-equal{table-layout:fixed}.admin__control-group-equal>.admin__field{width:50%}.admin__field-control-group{margin-top:.8rem}.admin__field-control-group>.admin__field{padding:0}.admin__control-grouped-date>.admin__field-date{white-space:nowrap;width:1px}.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control{float:left;position:relative}.admin__control-grouped-date>.admin__field-date+.admin__field:last-child{width:auto}.admin__control-grouped-date>.admin__field-date+.admin__field-date>.admin__field-label{float:left;padding-right:20px}.admin__control-grouped-date .ui-datepicker-trigger{left:100%;top:0}.admin__field-group-columns.admin__field-control.admin__control-grouped{width:calc((100%) * 1 - 30px);float:left;margin-left:30px}.admin__field-group-columns>.admin__field:first-child>.admin__field-label{float:none;margin:0;opacity:1;position:static;text-align:left}.admin__field-group-columns .admin__control-select{width:100%}.admin__field-group-additional{clear:both}.admin__field-group-additional .action-advanced{margin-top:1rem}.admin__field-group-additional .action-secondary{width:100%}.admin__field-group-show-label{white-space:nowrap}.admin__field-group-show-label>.admin__field-control,.admin__field-group-show-label>.admin__field-label{display:inline-block;vertical-align:top}.admin__field-group-show-label>.admin__field-label{margin-right:20px}.admin__field-complex{margin:1rem 0 3rem;padding-left:1rem}.admin__field:not(._hidden)+.admin__field-complex{margin-top:3rem}.admin__field-complex .admin__field-complex-title{clear:both;color:#303030;font-size:1.7rem;font-weight:600;letter-spacing:.025em;margin-bottom:1rem}.admin__field-complex .admin__field-complex-elements{float:right;max-width:40%}.admin__field-complex .admin__field-complex-elements button{margin-left:1rem}.admin__field-complex .admin__field-complex-content{max-width:60%;overflow:hidden}.admin__field-complex .admin__field-complex-text{margin-left:-1rem}.admin__field-complex+.admin__field._empty._no-header{margin-top:-3rem}.admin__legend{float:left;position:static;width:100%}.admin__legend+br{clear:left;display:block;height:0;overflow:hidden}.message{margin-bottom:3rem}.message-icon-top:before{margin-top:0;top:1.8rem}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;margin-bottom:3rem;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav .btn-group .btn-wrap .btn,.nav-bar-outer-actions .btn-wrap .btn{padding-left:.5rem;padding-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:1rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before,.nav-bar>li.ui-state-disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after,.nav-bar>li.ui-state-active~li:after{display:none}.nav-bar>li.active~li a:after,.nav-bar>li.ui-state-active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a,.nav-bar>li.ui-state-active a{color:#000}.nav-bar>li.active a:hover,.nav-bar>li.ui-state-active a:hover{cursor:default}.nav-bar>li.active a:after,.nav-bar>li.ui-state-active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:1.5rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:1.5rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.3rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.3rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip p:last-child{margin-bottom:0}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:31rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;clear:left;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{animation:progress-bar-stripes 2s linear infinite}.progress-bar-text-description{margin-bottom:1.6rem}.progress-bar-text-progress{text-align:right}.page-columns .page-inner-sidebar{margin:0 0 3rem}.page-header{margin-bottom:2.7rem;padding-bottom:2rem;position:relative}.page-header:before{border-bottom:1px solid #e3e3e3;bottom:0;content:'';display:block;height:1px;left:3rem;position:absolute;right:3rem}.container .page-header:before{content:normal}.page-header .message{margin-bottom:1.8rem}.page-header .message+.message{margin-top:-1.5rem}.page-header .admin__action-dropdown,.page-header .search-global-input{transition:none}.container .page-header{margin-bottom:0}.page-title-wrapper{margin-top:1.1rem}.container .page-title-wrapper{background:url(../../pub/images/logo.svg) no-repeat;min-height:41px;padding:4px 0 0 45px}.admin__menu .level-0:first-child>a{margin-top:1.6rem}.admin__menu .level-0:first-child>a:after{top:-1.6rem}.admin__menu .level-0:first-child._active>a:after{display:block}.admin__menu .level-0>a{padding-bottom:1.3rem;padding-top:1.3rem}.admin__menu .level-0>a:before{margin-bottom:.7rem}.admin__menu .item-home>a:before{content:'\e611';font-size:2.3rem;padding-top:-.1rem}.admin__menu .item-component>a:before{content:'\e612'}.admin__menu .item-extension>a:before{content:'\e612'}.admin__menu .item-module>a:before{content:'\e647'}.admin__menu .item-upgrade>a:before{content:'\e614'}.admin__menu .item-system-config>a:before{content:'\e610'}.admin__menu .item-tools>a:before{content:'\e613'}.modal-sub-title{font-size:1.7rem;font-weight:600}.modal-connect-signin .modal-inner-wrap{max-width:80rem}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{-webkit-overflow-scrolling:touch;bottom:0;box-sizing:border-box;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:999}.ngdialog *,.ngdialog:after,.ngdialog:before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation *{animation:none!important}.ngdialog.ngdialog-closing .ngdialog-content,.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-animation:ngdialog-fadeout .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadeout .5s}.ngdialog-overlay{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s;background:rgba(0,0,0,.4);bottom:0;left:0;position:fixed;right:0;top:0}.ngdialog-content{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s}body.ngdialog-open{overflow:hidden}.component-indicator{border-radius:50%;cursor:help;display:inline-block;height:16px;text-align:center;vertical-align:middle;width:16px}.component-indicator::after,.component-indicator::before{background:#fff;display:block;opacity:0;position:absolute;transition:opacity .2s linear .1s;visibility:hidden}.component-indicator::before{border:1px solid #adadad;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.4);content:attr(data-label);font-size:1.2rem;margin:30px 0 0 -10px;min-width:50px;padding:4px 5px}.component-indicator::after{border-color:#999;border-style:solid;border-width:1px 0 0 1px;box-shadow:-1px -1px 1px rgba(0,0,0,.1);content:'';height:10px;margin:9px 0 0 5px;-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.component-indicator:hover::after,.component-indicator:hover::before{opacity:1;transition:opacity .2s linear;visibility:visible}.component-indicator span{display:block;height:16px;overflow:hidden;width:16px}.component-indicator span:before{content:'';display:block;font-family:Icons;font-size:16px;height:100%;line-height:16px;width:100%}.component-indicator._on{background:#79a22e}.component-indicator._off{background:#e22626}.component-indicator._off span:before{background:#fff;height:4px;margin:6px auto 20px;width:12px}.component-indicator._info{background:0 0}.component-indicator._info span{width:21px}.component-indicator._info span:before{color:#008bdb;content:'\e648';font-family:Icons;font-size:16px}.component-indicator._tooltip{background:0 0;margin:0 0 8px 5px}.component-indicator._tooltip a{width:21px}.component-indicator._tooltip a:hover{text-decoration:none}.component-indicator._tooltip a:before{color:#514943;content:'\e633';font-family:Icons;font-size:16px}.col-manager-item-name .data-grid-data{padding-left:5px}.col-manager-item-name .ng-hide+.data-grid-data{padding-left:24px}.col-manager-item-name ._hide-dependencies,.col-manager-item-name ._show-dependencies{cursor:pointer;padding-left:24px;position:relative}.col-manager-item-name ._hide-dependencies:before,.col-manager-item-name ._show-dependencies:before{display:block;font-family:Icons;font-size:12px;left:0;position:absolute;top:1px}.col-manager-item-name ._show-dependencies:before{content:'\e62b'}.col-manager-item-name ._hide-dependencies:before{content:'\e628'}.col-manager-item-name ._no-dependencies{padding-left:24px}.product-modules-block{font-size:1.2rem;padding:15px 0 0}.col-manager-item-name .product-modules-block{padding-left:1rem}.product-modules-descriprion,.product-modules-title{font-weight:700;margin:0 0 7px}.product-modules-list{font-size:1.1rem;list-style:none;margin:0}.col-manager-item-name .product-modules-list{margin-left:15px}.col-manager-item-name .product-modules-list li{padding:0 0 0 15px;position:relative}.product-modules-list li{margin:0 0 .5rem}.product-modules-list .component-indicator{height:10px;left:0;position:absolute;top:3px;width:10px}.module-summary{white-space:nowrap}.module-summary-title{font-size:2.1rem;margin-right:1rem}.app-updater .nav{display:block;margin-bottom:3.1rem;margin-top:-2.8rem}.app-updater .nav-bar-outer-actions{margin-top:1rem;padding-right:0}.app-updater .nav-bar-outer-actions .btn-wrap-cancel{margin-right:2.6rem}.main{padding-bottom:2rem;padding-top:3rem}.menu-wrapper .logo-static{pointer-events:none}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;line-height:1.4;margin:2.5rem 0 3.5rem 5rem}.page-title{margin-bottom:1rem}.page-sub-title{font-size:2rem}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.spinner.side{float:left;font-size:2.4rem;margin-left:2rem;margin-top:-5px}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit,.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.readiness-check-item{margin-bottom:4rem;min-height:2.5rem}.readiness-check-item .spinner{float:left;font-size:2.5rem;margin:-.4rem 0 0 1.7rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:5.7rem}.readiness-check-content{margin-left:5.7rem;margin-right:22rem;position:relative}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.readiness-check-side{left:100%;padding-left:2.4rem;position:absolute;top:0;width:22rem}.readiness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:1.7rem;margin-top:.3rem}.extensions-information{margin-bottom:5rem}.extensions-information h3{font-size:1.4rem;margin-bottom:1.3rem}.extensions-information .message{margin-bottom:2.5rem}.extensions-information .message:before{margin-top:0;top:1.8rem}.extensions-information .extensions-container{padding:0 2rem}.extensions-information .list{margin-bottom:1rem}.extensions-information .list select{cursor:pointer}.extensions-information .list select:disabled{background:#ccc;cursor:default}.extensions-information .list .extension-delete{font-size:1.7rem;padding-top:0}.delete-modal-wrap{padding:0 4% 4rem}.delete-modal-wrap h3{font-size:3.4rem;display:inline-block;font-weight:300;margin:0 0 2rem;padding:.9rem 0 0;vertical-align:top}.delete-modal-wrap .actions{padding:3rem 0 0}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.customize-your-store .message-error:before{margin-top:0;top:1.8rem}.customize-your-store .message-error a{color:#333;text-decoration:underline}.customize-your-store .message-error .form-label:before{background:#fff}.customize-your-store .customize-database-clean p{margin-top:2.5rem}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;height:20rem;margin:1rem 0 2rem;overflow-y:auto;padding:1.5rem 2rem 2rem;resize:vertical}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}.install-database-clean{margin-top:4rem}.install-database-clean .btn{margin-right:1rem}.page-sub-title{margin-bottom:2.1rem;margin-top:3rem}.multiselect-custom{max-width:71.1rem}.content-install{margin-top:3.7rem}.home-page-inner-wrap{margin:0 auto;max-width:91rem}.setup-home-title{margin-bottom:3.9rem;padding-top:1.8rem;text-align:center}.setup-home-item{background-color:#fafafa;border:1px solid #ccc;color:#333;display:block;margin-bottom:2rem;margin-left:1.3rem;margin-right:1.3rem;min-height:30rem;padding:2rem;text-align:center}.setup-home-item:hover{border-color:#8c8c8c;color:#333;text-decoration:none;transition:border-color .1s linear}.setup-home-item:active{-ms-transform:scale(0.99);transform:scale(0.99)}.setup-home-item:before{display:block;font-size:7rem;margin-bottom:3.3rem;margin-top:4rem}.setup-home-item-component:before,.setup-home-item-extension:before{content:'\e612'}.setup-home-item-module:before{content:'\e647'}.setup-home-item-upgrade:before{content:'\e614'}.setup-home-item-configuration:before{content:'\e610'}.setup-home-item-title{display:block;font-size:1.8rem;letter-spacing:.025em;margin-bottom:1rem}.setup-home-item-description{display:block}.extension-manager-wrap{border:1px solid #bbb;margin:0 0 4rem}.extension-manager-account{font-size:2.1rem;display:inline-block;font-weight:400}.extension-manager-title{font-size:3.2rem;background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;color:#41362f;font-weight:600;line-height:1.2;padding:2rem}.extension-manager-content{padding:2.5rem 2rem 2rem}.extension-manager-items{list-style:none;margin:0;text-align:center}.extension-manager-items .btn{border:1px solid #adadad;display:block;margin:1rem auto 0}.extension-manager-items .item-title{font-size:2.1rem;display:inline-block;text-align:left}.extension-manager-items .item-number{font-size:4.1rem;display:inline-block;line-height:.8;margin:0 5px 1.5rem 0;vertical-align:top}.extension-manager-items .item-date{font-size:2.6rem;margin-top:1px}.extension-manager-items .item-date-title{font-size:1.5rem}.extension-manager-items .item-install{margin:0 0 2rem}.sync-login-wrap{padding:0 10% 4rem}.sync-login-wrap .legend{font-size:2.6rem;color:#eb5202;float:left;font-weight:300;line-height:1.2;margin:-1rem 0 2.5rem;position:static;width:100%}.sync-login-wrap .legend._hidden{display:none}.sync-login-wrap .login-header{font-size:3.4rem;font-weight:300;margin:0 0 2rem}.sync-login-wrap .login-header span{display:inline-block;padding:.9rem 0 0;vertical-align:top}.sync-login-wrap h4{font-size:1.4rem;margin:0 0 2rem}.sync-login-wrap .sync-login-steps{margin:0 0 2rem 1.5rem}.sync-login-wrap .sync-login-steps li{padding:0 0 0 1rem}.sync-login-wrap .form-row .form-label{display:inline-block}.sync-login-wrap .form-row .form-label.required{padding-left:1.5rem}.sync-login-wrap .form-row .form-label.required:after{left:0;position:absolute;right:auto}.sync-login-wrap .form-row{max-width:28rem}.sync-login-wrap .form-actions{display:table;margin-top:-1.3rem}.sync-login-wrap .form-actions .links{display:table-header-group}.sync-login-wrap .form-actions .actions{padding:3rem 0 0}@media all and (max-width:1047px){.admin__menu .submenu li{min-width:19.8rem}.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}.app-updater .nav{padding-bottom:1.7rem}.app-updater .nav-bar-outer-actions{margin-top:2rem}}@media all and (min-width:768px){.page-layout-admin-2columns-left .page-columns{margin-left:-30px}.page-layout-admin-2columns-left .page-columns:after{clear:both;content:'';display:table}.page-layout-admin-2columns-left .page-columns .main-col{width:calc((100%) * .75 - 30px);float:right}.page-layout-admin-2columns-left .page-columns .side-col{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}.page-columns{margin-left:-30px}.page-columns:after{clear:both;content:'';display:table}.page-columns .page-inner-content{width:calc((100%) * .75 - 30px);float:right}.page-columns .page-inner-sidebar{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.abs-clearer-mobile:after,.nav-bar:after{clear:both;content:'';display:table}.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.readiness-check-side{padding:2rem 0;position:static}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}} diff --git a/magento/setup/src/.htaccess b/magento/setup/src/.htaccess new file mode 100644 index 0000000..707c26b --- /dev/null +++ b/magento/setup/src/.htaccess @@ -0,0 +1,8 @@ + + order allow,deny + deny from all + += 2.4> + Require all denied + + diff --git a/magento/setup/src/Magento/Setup/Application.php b/magento/setup/src/Magento/Setup/Application.php new file mode 100644 index 0000000..f24395d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Application.php @@ -0,0 +1,86 @@ +configureServiceManager($serviceManager); + $serviceManager->setService('ApplicationConfig', $configuration); + + $serviceManager->get('ModuleManager')->loadModules(); + + // load specific services + if (!empty($configuration['required_services'])) { + $this->loadServices($serviceManager, $configuration['required_services']); + } + + $listeners = $this->getListeners($serviceManager, $configuration); + $application = new LaminasApplication( + $serviceManager, + $serviceManager->get('EventManager'), + $serviceManager->get('Request'), + $serviceManager->get('Response') + ); + $application->bootstrap($listeners); + return $application; + } + + /** + * Uses \Laminas\ServiceManager\ServiceManager::get method to load different kind of services. + * Some services cannot be loaded via configuration like \Laminas\ServiceManager\Di\DiAbstractServiceFactory and + * should be initialized via corresponding factory. + * + * @param ServiceManager $serviceManager + * @param array $services + * @return void + */ + private function loadServices(ServiceManager $serviceManager, array $services) + { + foreach ($services as $serviceName) { + $serviceManager->get($serviceName); + } + } + + /** + * Gets list of application listeners. + * + * @param ServiceManager $serviceManager + * @param array $configuration + * @return array + */ + private function getListeners(ServiceManager $serviceManager, array $configuration) + { + $appConfigListeners = isset($configuration['listeners']) ? $configuration['listeners'] : []; + $config = $serviceManager->get('config'); + $serviceConfigListeners = isset($config['listeners']) ? $config['listeners'] : []; + + return array_unique(array_merge($serviceConfigListeners, $appConfigListeners)); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/AbstractDependenciesCommand.php b/magento/setup/src/Magento/Setup/Console/Command/AbstractDependenciesCommand.php new file mode 100644 index 0000000..2c91d2d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/AbstractDependenciesCommand.php @@ -0,0 +1,112 @@ +objectManager = $objectManagerProvider->get(); + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setDefinition( + [ + new InputOption( + self::INPUT_KEY_OUTPUT, + 'o', + InputOption::VALUE_REQUIRED, + 'Report filename', + $this->getDefaultOutputFilename() + ) + ] + ); + parent::configure(); + } + + /** + * Build dependencies report + * + * @param string $outputPath + * @return void + */ + abstract protected function buildReport($outputPath); + + /** + * Get the default output report filename + * + * @return string + */ + abstract protected function getDefaultOutputFilename(); + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + try { + /** @var \Magento\Framework\Component\ComponentRegistrar $componentRegistrar */ + $componentRegistrar = $this->objectManager->get(\Magento\Framework\Component\ComponentRegistrar::class); + /** @var \Magento\Framework\Component\DirSearch $dirSearch */ + $dirSearch = $this->objectManager->get(\Magento\Framework\Component\DirSearch::class); + /** @var \Magento\Framework\View\Design\Theme\ThemePackageList $themePackageList */ + $themePackageList = $this->objectManager->get(\Magento\Framework\View\Design\Theme\ThemePackageList::class); + Files::setInstance(new Files($componentRegistrar, $dirSearch, $themePackageList)); + $this->buildReport($input->getOption(self::INPUT_KEY_OUTPUT)); + $output->writeln('Report successfully processed.'); + } catch (\Exception $e) { + $output->writeln( + 'Please check the path you provided. Dependencies report generator failed with error: ' . + $e->getMessage() . '' + ); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/AbstractModuleCommand.php b/magento/setup/src/Magento/Setup/Console/Command/AbstractModuleCommand.php new file mode 100644 index 0000000..51c4114 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/AbstractModuleCommand.php @@ -0,0 +1,102 @@ +objectManager = $objectManagerProvider->get(); + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->addArgument( + self::INPUT_KEY_MODULES, + InputArgument::IS_ARRAY | ($this->isModuleRequired() ? InputArgument::REQUIRED : InputArgument::OPTIONAL), + 'Name of the module' + ); + $this->addOption( + self::INPUT_KEY_CLEAR_STATIC_CONTENT, + 'c', + InputOption::VALUE_NONE, + 'Clear generated static view files. Necessary, if the module(s) have static view files' + ); + + parent::configure(); + } + + /** + * Returns if module argument is required + * + * @return bool + */ + abstract protected function isModuleRequired(); + + /** + * Cleanup after updated modules status + * + * @param InputInterface $input + * @param OutputInterface $output + * @return void + */ + protected function cleanup(InputInterface $input, OutputInterface $output) + { + /** @var \Magento\Framework\App\Cache $cache */ + $cache = $this->objectManager->get(\Magento\Framework\App\Cache::class); + $cache->clean(); + $output->writeln('Cache cleared successfully.'); + /** @var \Magento\Framework\App\State\CleanupFiles $cleanupFiles */ + $cleanupFiles = $this->objectManager->get(\Magento\Framework\App\State\CleanupFiles::class); + $cleanupFiles->clearCodeGeneratedClasses(); + $output->writeln( + "Generated classes cleared successfully. Please run the 'setup:di:compile' command to " + . 'generate classes.' + ); + if ($input->getOption(self::INPUT_KEY_CLEAR_STATIC_CONTENT)) { + $cleanupFiles->clearMaterializedViewFiles(); + $output->writeln('Generated static view files cleared successfully.'); + } else { + $output->writeln( + "Info: Some modules might require static view files to be cleared. To do this, run '" + . $this->getName() . "' with the --" . self::INPUT_KEY_CLEAR_STATIC_CONTENT + . ' option to clear them.' + ); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/AbstractModuleManageCommand.php b/magento/setup/src/Magento/Setup/Console/Command/AbstractModuleManageCommand.php new file mode 100644 index 0000000..5d7eedf --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/AbstractModuleManageCommand.php @@ -0,0 +1,206 @@ +addOption( + self::INPUT_KEY_FORCE, + 'f', + InputOption::VALUE_NONE, + 'Bypass dependencies check' + ); + $this->addOption( + self::INPUT_KEY_ALL, + null, + InputOption::VALUE_NONE, + ($this->isEnable() ? 'Enable' : 'Disable') . ' all modules' + ); + + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function isModuleRequired() + { + return false; + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $isEnable = $this->isEnable(); + if ($input->getOption(self::INPUT_KEY_ALL)) { + /** @var \Magento\Framework\Module\FullModuleList $fullModulesList */ + $fullModulesList = $this->objectManager->get(\Magento\Framework\Module\FullModuleList::class); + $modules = $fullModulesList->getNames(); + } else { + $modules = $input->getArgument(self::INPUT_KEY_MODULES); + } + $messages = $this->validate($modules); + if (!empty($messages)) { + $output->writeln(implode(PHP_EOL, $messages)); + // we must have an exit code higher than zero to indicate something was wrong + return Cli::RETURN_FAILURE; + } + try { + $modulesToChange = $this->getStatus()->getModulesToChange($isEnable, $modules); + } catch (\LogicException $e) { + $output->writeln('' . $e->getMessage() . ''); + // we must have an exit code higher than zero to indicate something was wrong + return Cli::RETURN_FAILURE; + } + if (!empty($modulesToChange)) { + $force = $input->getOption(self::INPUT_KEY_FORCE); + if (!$force) { + $constraints = $this->getStatus()->checkConstraints($isEnable, $modulesToChange); + if ($constraints) { + $output->writeln( + "Unable to change status of modules because of the following constraints:" + ); + $output->writeln('' . implode("\n", $constraints) . ''); + // we must have an exit code higher than zero to indicate something was wrong + return Cli::RETURN_FAILURE; + } + } + $this->setIsEnabled($isEnable, $modulesToChange, $output); + $this->cleanup($input, $output); + $this->getGeneratedFiles()->requestRegeneration(); + if ($force) { + $output->writeln( + 'Alert: You used the --force option.' + . ' As a result, modules might not function properly.' + ); + } + } else { + $output->writeln('No modules were changed.'); + } + return Cli::RETURN_SUCCESS; + } + + /** + * Enable/disable modules + * + * @param bool $isEnable + * @param string[] $modulesToChange + * @param OutputInterface $output + * @return void + */ + private function setIsEnabled($isEnable, $modulesToChange, $output) + { + $this->getStatus()->setIsEnabled($isEnable, $modulesToChange); + if ($isEnable) { + $output->writeln('The following modules have been enabled:'); + $output->writeln('- ' . implode("\n- ", $modulesToChange) . ''); + $output->writeln(''); + if ($this->getDeploymentConfig()->isAvailable()) { + $output->writeln( + 'To make sure that the enabled modules are properly registered,' + . " run 'setup:upgrade'." + ); + } + } else { + $output->writeln('The following modules have been disabled:'); + $output->writeln('- ' . implode("\n- ", $modulesToChange) . ''); + $output->writeln(''); + } + } + + /** + * Get module status + * + * @return Status + */ + private function getStatus() + { + return $this->objectManager->get(Status::class); + } + + /** + * Validate list of modules and return error messages + * + * @param string[] $modules + * @return string[] + */ + protected function validate(array $modules) + { + $messages = []; + if (empty($modules)) { + $messages[] = 'No modules specified. Specify a space-separated list of modules' . + ' or use the --all option'; + } + return $messages; + } + + /** + * Is it "enable" or "disable" command + * + * @return bool + */ + abstract protected function isEnable(); + + /** + * Get deployment config + * + * @return DeploymentConfig + * @deprecated 2.0.6 + */ + private function getDeploymentConfig() + { + if (!($this->deploymentConfig instanceof DeploymentConfig)) { + return $this->objectManager->get(DeploymentConfig::class); + } + return $this->deploymentConfig; + } + + /** + * Get deployment config + * + * @return GeneratedFiles + * @deprecated 2.1.0 + */ + private function getGeneratedFiles() + { + if (!($this->generatedFiles instanceof GeneratedFiles)) { + return $this->objectManager->get(GeneratedFiles::class); + } + return $this->generatedFiles; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/AbstractSetupCommand.php b/magento/setup/src/Magento/Setup/Console/Command/AbstractSetupCommand.php new file mode 100644 index 0000000..4215d56 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/AbstractSetupCommand.php @@ -0,0 +1,34 @@ +addOption( + InitParamListener::BOOTSTRAP_PARAM, + null, + InputOption::VALUE_REQUIRED, + 'Add to any command to customize Magento initialization parameters' . PHP_EOL . + 'For example: "MAGE_MODE=developer&MAGE_DIRS[base][path]' . + '=/var/www/example.com&MAGE_DIRS[cache][path]=/var/tmp/cache"' + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/AdminUserCreateCommand.php b/magento/setup/src/Magento/Setup/Console/Command/AdminUserCreateCommand.php new file mode 100644 index 0000000..8e64aae --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/AdminUserCreateCommand.php @@ -0,0 +1,246 @@ +installerFactory = $installerFactory; + $this->validationRules = $validationRules; + parent::__construct(); + } + + /** + * Initialization of the command + * + * @return void + */ + protected function configure() + { + $this->setName('admin:user:create') + ->setDescription('Creates an administrator') + ->setDefinition($this->getOptionsList()); + parent::configure(); + } + + /** + * Creation admin user in interaction mode. + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * @param \Symfony\Component\Console\Output\OutputInterface $output + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function interact(InputInterface $input, OutputInterface $output) + { + /** @var \Symfony\Component\Console\Helper\QuestionHelper $questionHelper */ + $questionHelper = $this->getHelper('question'); + + if (!$input->getOption(AdminAccount::KEY_USER)) { + $question = new Question('Admin user: ', ''); + $this->addNotEmptyValidator($question); + + $input->setOption( + AdminAccount::KEY_USER, + $questionHelper->ask($input, $output, $question) + ); + } + + if (!$input->getOption(AdminAccount::KEY_PASSWORD)) { + $question = new Question('Admin password: ', ''); + $question->setHidden(true); + + $question->setValidator(function ($value) { + $user = new \Magento\Framework\DataObject(); + $user->setPassword($value); + + $validator = new \Magento\Framework\Validator\DataObject(); + $this->validationRules->addPasswordRules($validator); + + $validator->isValid($user); + foreach ($validator->getMessages() as $message) { + throw new ValidationException(__($message)); + } + + return $value; + }); + + $input->setOption( + AdminAccount::KEY_PASSWORD, + $questionHelper->ask($input, $output, $question) + ); + } + + if (!$input->getOption(AdminAccount::KEY_EMAIL)) { + $question = new Question('Admin email: ', ''); + $this->addNotEmptyValidator($question); + + $input->setOption( + AdminAccount::KEY_EMAIL, + $questionHelper->ask($input, $output, $question) + ); + } + + if (!$input->getOption(AdminAccount::KEY_FIRST_NAME)) { + $question = new Question('Admin first name: ', ''); + $this->addNotEmptyValidator($question); + + $input->setOption( + AdminAccount::KEY_FIRST_NAME, + $questionHelper->ask($input, $output, $question) + ); + } + + if (!$input->getOption(AdminAccount::KEY_LAST_NAME)) { + $question = new Question('Admin last name: ', ''); + $this->addNotEmptyValidator($question); + + $input->setOption( + AdminAccount::KEY_LAST_NAME, + $questionHelper->ask($input, $output, $question) + ); + } + } + + /** + * Add not empty validator. + * + * @param \Symfony\Component\Console\Question\Question $question + * @return void + */ + private function addNotEmptyValidator(Question $question) + { + $question->setValidator(function ($value) { + if (trim($value) == '') { + throw new ValidationException(__('The value cannot be empty')); + } + + return $value; + }); + } + + /** + * @inheritdoc + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $errors = $this->validate($input); + if ($errors) { + $output->writeln('' . implode('' . PHP_EOL . '', $errors) . ''); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + $installer = $this->installerFactory->create(new ConsoleLogger($output)); + $installer->installAdminUser($input->getOptions()); + $output->writeln( + 'Created Magento administrator user named ' . $input->getOption(AdminAccount::KEY_USER) . '' + ); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } + + /** + * Get list of arguments for the command + * + * @param int $mode The mode of options. + * @return InputOption[] + */ + public function getOptionsList($mode = InputOption::VALUE_REQUIRED) + { + $requiredStr = ($mode === InputOption::VALUE_REQUIRED ? '(Required) ' : ''); + + return [ + new InputOption( + AdminAccount::KEY_USER, + null, + $mode, + $requiredStr . 'Admin user' + ), + new InputOption( + AdminAccount::KEY_PASSWORD, + null, + $mode, + $requiredStr . 'Admin password' + ), + new InputOption( + AdminAccount::KEY_EMAIL, + null, + $mode, + $requiredStr . 'Admin email' + ), + new InputOption( + AdminAccount::KEY_FIRST_NAME, + null, + $mode, + $requiredStr . 'Admin first name' + ), + new InputOption( + AdminAccount::KEY_LAST_NAME, + null, + $mode, + $requiredStr . 'Admin last name' + ), + ]; + } + + /** + * Check if all admin options are provided + * + * @param InputInterface $input + * @return string[] + */ + public function validate(InputInterface $input) + { + $errors = []; + $user = new \Magento\Framework\DataObject(); + $user->setFirstname($input->getOption(AdminAccount::KEY_FIRST_NAME)) + ->setLastname($input->getOption(AdminAccount::KEY_LAST_NAME)) + ->setUsername($input->getOption(AdminAccount::KEY_USER)) + ->setEmail($input->getOption(AdminAccount::KEY_EMAIL)) + ->setPassword( + $input->getOption(AdminAccount::KEY_PASSWORD) === null + ? '' : $input->getOption(AdminAccount::KEY_PASSWORD) + ); + + $validator = new \Magento\Framework\Validator\DataObject(); + $this->validationRules->addUserInfoRules($validator); + $this->validationRules->addPasswordRules($validator); + + if (!$validator->isValid($user)) { + $errors = array_merge($errors, $validator->getMessages()); + } + + return $errors; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/BackupCommand.php b/magento/setup/src/Magento/Setup/Console/Command/BackupCommand.php new file mode 100644 index 0000000..841e766 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/BackupCommand.php @@ -0,0 +1,177 @@ +objectManager = $objectManagerProvider->get(); + $this->backupRollbackFactory = $this->objectManager->get(\Magento\Framework\Setup\BackupRollbackFactory::class); + $this->deploymentConfig = $deploymentConfig; + $this->maintenanceModeEnabler = + $maintenanceModeEnabler ?: $this->objectManager->get(MaintenanceModeEnabler::class); + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $options = [ + new InputOption( + self::INPUT_KEY_CODE, + null, + InputOption::VALUE_NONE, + 'Take code and configuration files backup (excluding temporary files)' + ), + new InputOption( + self::INPUT_KEY_MEDIA, + null, + InputOption::VALUE_NONE, + 'Take media backup' + ), + new InputOption( + self::INPUT_KEY_DB, + null, + InputOption::VALUE_NONE, + 'Take complete database backup' + ), + ]; + $this->setName('setup:backup') + ->setDescription('Takes backup of Magento Application code base, media and database') + ->setDefinition($options); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable() + && ($input->getOption(self::INPUT_KEY_MEDIA) || $input->getOption(self::INPUT_KEY_DB))) { + $output->writeln("No information is available: the Magento application is not installed."); + // We need exit code higher than 0 here as an indication + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + $returnValue = $this->maintenanceModeEnabler->executeInMaintenanceMode( + function () use ($input, $output) { + try { + $inputOptionProvided = false; + $time = time(); + $backupHandler = $this->backupRollbackFactory->create($output); + if ($input->getOption(self::INPUT_KEY_CODE)) { + $backupHandler->codeBackup($time); + $inputOptionProvided = true; + } + if ($input->getOption(self::INPUT_KEY_MEDIA)) { + $backupHandler->codeBackup($time, Factory::TYPE_MEDIA); + $inputOptionProvided = true; + } + if ($input->getOption(self::INPUT_KEY_DB)) { + $this->setAreaCode(); + $backupHandler->dbBackup($time); + $inputOptionProvided = true; + } + if (!$inputOptionProvided) { + throw new \InvalidArgumentException( + 'Not enough information provided to take backup.' + ); + } + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } catch (\Exception $e) { + $output->writeln('' . $e->getMessage() . ''); + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + }, + $output, + false + ); + + return $returnValue; + } + + /** + * Sets area code to start a session for database backup and rollback + * + * @return void + */ + private function setAreaCode() + { + $areaCode = 'adminhtml'; + /** @var \Magento\Framework\App\State $appState */ + $appState = $this->objectManager->get(\Magento\Framework\App\State::class); + $appState->setAreaCode($areaCode); + /** @var \Magento\Framework\ObjectManager\ConfigLoaderInterface $configLoader */ + $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class); + $this->objectManager->configure($configLoader->load($areaCode)); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/ConfigSetCommand.php b/magento/setup/src/Magento/Setup/Console/Command/ConfigSetCommand.php new file mode 100644 index 0000000..9380a7b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/ConfigSetCommand.php @@ -0,0 +1,154 @@ +configModel = $configModel; + $this->moduleList = $moduleList; + $this->deploymentConfig = $deploymentConfig; + parent::__construct(); + } + + /** + * Initialization of the command + * + * @return void + */ + protected function configure() + { + $options = $this->configModel->getAvailableOptions(); + + $this->setName('setup:config:set') + ->setDescription('Creates or modifies the deployment configuration') + ->setDefinition($options); + + parent::configure(); + } + + /** + * @inheritdoc + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $inputOptions = $input->getOptions(); + $optionCollection = $this->configModel->getAvailableOptions(); + $commandOptions = []; + $optionsWithDefaultValues = []; + + foreach ($optionCollection as $option) { + $commandOptions[$option->getName()] = false; + + $currentValue = $this->deploymentConfig->get($option->getConfigPath()); + $needOverwrite = ($currentValue !== null) && + ($inputOptions[$option->getName()] !== null) && + ($inputOptions[$option->getName()] !== $currentValue); + if ($needOverwrite) { + $dialog = $this->getHelperSet()->get('question'); + $question = new Question( + 'Overwrite the existing configuration for ' . $option->getName() . '?[Y/n]', + 'y' + ); + if (strtolower($dialog->ask($input, $output, $question)) !== 'y') { + $inputOptions[$option->getName()] = null; + } + } + + if ($option->getDefault() === $inputOptions[$option->getName()] + && $inputOptions[$option->getName()] !== null + ) { + $optionsWithDefaultValues[] = $option->getName(); + } + } + + $inputOptions = array_filter( + $inputOptions, + function ($value) { + return $value !== null; + } + ); + + $optionsToChange = array_intersect(array_keys($inputOptions), array_keys($commandOptions)); + $optionsToChange = array_diff($optionsToChange, [ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION]); + + $this->configModel->process($inputOptions); + + $optionsWithDefaultValues = array_diff( + $optionsWithDefaultValues, + [ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION] + ); + + if (count($optionsWithDefaultValues) > 0) { + $defaultValuesMessage = implode(', ', $optionsWithDefaultValues); + $output->writeln( + 'We saved default values for these options: ' . $defaultValuesMessage . '.' + ); + } else { + if (count($optionsToChange) > 0) { + $output->writeln('You saved the new configuration.'); + } else { + $output->writeln('You made no changes to the configuration.'); + } + } + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } + + /** + * @inheritdoc + */ + protected function initialize(InputInterface $input, OutputInterface $output) + { + $inputOptions = $input->getOptions(); + + $errors = $this->configModel->validate($inputOptions); + + if (!empty($errors)) { + foreach ($errors as $error) { + $output->writeln("$error"); + } + throw new \InvalidArgumentException('Parameter validation failed'); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/DbDataUpgradeCommand.php b/magento/setup/src/Magento/Setup/Console/Command/DbDataUpgradeCommand.php new file mode 100644 index 0000000..ae0c2f5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/DbDataUpgradeCommand.php @@ -0,0 +1,72 @@ +installFactory = $installFactory; + $this->deploymentConfig = $deploymentConfig; + parent::__construct(); + } + + /** + * Initialization of the command + * + * @return void + */ + protected function configure() + { + $this->setName('setup:db-data:upgrade')->setDescription('Installs and upgrades data in the DB'); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable()) { + $output->writeln("No information is available: the Magento application is not installed."); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + $installer = $this->installFactory->create(new ConsoleLogger($output)); + $installer->installDataFixtures(); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/DbSchemaUpgradeCommand.php b/magento/setup/src/Magento/Setup/Console/Command/DbSchemaUpgradeCommand.php new file mode 100644 index 0000000..3ef9a44 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/DbSchemaUpgradeCommand.php @@ -0,0 +1,86 @@ +installFactory = $installFactory; + $this->deploymentConfig = $deploymentConfig; + parent::__construct(); + } + + /** + * Initialization of the command. + * + * @return void + */ + protected function configure() + { + $this + ->setName('setup:db-schema:upgrade') + ->setDefinition( + [ + new InputOption( + InstallCommand::CONVERT_OLD_SCRIPTS_KEY, + null, + InputOption::VALUE_OPTIONAL, + 'Allows to convert old scripts (InstallSchema, UpgradeSchema) to db_schema.xml format', + false + ) + ] + ) + ->setDescription('Installs and upgrades the DB schema'); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable()) { + $output->writeln("No information is available: the Magento application is not installed."); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + $installer = $this->installFactory->create(new ConsoleLogger($output)); + $installer->installSchema($input->getOptions()); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/DbStatusCommand.php b/magento/setup/src/Magento/Setup/Console/Command/DbStatusCommand.php new file mode 100644 index 0000000..be18bd5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/DbStatusCommand.php @@ -0,0 +1,112 @@ +objectManagerProvider = $objectManagerProvider; + $this->deploymentConfig = $deploymentConfig; + /** + * As DbStatucCommand is in setup and all validators are part of the framework, we can`t configure + * this command with dependency injection and we need to inject each validator manually + */ + $this->upToDateValidators = [ + $this->objectManagerProvider->get()->get(UpToDateDeclarativeSchema::class), + $this->objectManagerProvider->get()->get(UpToDateSchema::class), + $this->objectManagerProvider->get()->get(UpToDateData::class), + $this->objectManagerProvider->get()->get(OldDbValidator::class), + ]; + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('setup:db:status') + ->setDescription('Checks if DB schema or data requires upgrade'); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable()) { + $output->writeln( + "No information is available: the Magento application is not installed." + ); + return Cli::RETURN_FAILURE; + } + + $outDated = false; + + foreach ($this->upToDateValidators as $validator) { + if (!$validator->isUpToDate()) { + $output->writeln(sprintf('%s', $validator->getNotUpToDateMessage())); + $outDated = true; + } + } + + if ($outDated) { + $output->writeln('Run \'setup:upgrade\' to update your DB schema and data.'); + return self::EXIT_CODE_UPGRADE_REQUIRED; + } + + $output->writeln( + 'All modules are up to date.' + ); + return Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowFrameworkCommand.php b/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowFrameworkCommand.php new file mode 100644 index 0000000..3ea98d7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowFrameworkCommand.php @@ -0,0 +1,80 @@ +registrar = $registrar; + parent::__construct($objectManagerProvider); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setDescription('Shows number of dependencies on Magento framework') + ->setName('info:dependencies:show-framework'); + parent::configure(); + } + + /** + * Return default output filename for framework dependencies report + * + * @return string + */ + protected function getDefaultOutputFilename() + { + return 'framework-dependencies.csv'; + } + + /** + * Build Framework dependencies report + * + * @param string $outputPath + * @return void + */ + protected function buildReport($outputPath) + { + $filePaths = $this->registrar->getPaths(ComponentRegistrar::MODULE); + + $filesForParse = Files::init()->getFiles($filePaths, '*'); + $configFiles = Files::init()->getConfigFiles('module.xml', [], false); + + ServiceLocator::getFrameworkDependenciesReportBuilder()->build( + [ + 'parse' => [ + 'files_for_parse' => $filesForParse, + 'config_files' => $configFiles, + 'declared_namespaces' => Files::init()->getNamespaces(), + ], + 'write' => ['report_filename' => $outputPath], + ] + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowModulesCircularCommand.php b/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowModulesCircularCommand.php new file mode 100644 index 0000000..c9cfdd7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowModulesCircularCommand.php @@ -0,0 +1,55 @@ +setDescription('Shows number of circular dependencies between modules') + ->setName('info:dependencies:show-modules-circular'); + parent::configure(); + } + + /** + * Return default output filename for modules circular dependencies report + * + * @return string + */ + protected function getDefaultOutputFilename() + { + return 'modules-circular-dependencies.csv'; + } + + /** + * Build circular dependencies between modules report + * + * @param string $outputPath + * @return void + */ + protected function buildReport($outputPath) + { + $filesForParse = Files::init()->getComposerFiles(ComponentRegistrar::MODULE, false); + + asort($filesForParse); + ServiceLocator::getCircularDependenciesReportBuilder()->build( + [ + 'parse' => ['files_for_parse' => $filesForParse], + 'write' => ['report_filename' => $outputPath], + ] + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowModulesCommand.php b/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowModulesCommand.php new file mode 100644 index 0000000..13499b5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/DependenciesShowModulesCommand.php @@ -0,0 +1,54 @@ +setDescription('Shows number of dependencies between modules') + ->setName('info:dependencies:show-modules'); + parent::configure(); + } + + /** + * Return default output filename for modules dependencies report + * + * @return string + */ + protected function getDefaultOutputFilename() + { + return 'modules-dependencies.csv'; + } + + /** + * Build circular dependencies between modules report + * + * @param string $outputPath + * @return void + */ + protected function buildReport($outputPath) + { + $filesForParse = Files::init()->getComposerFiles(ComponentRegistrar::MODULE, false); + + ServiceLocator::getDependenciesReportBuilder()->build( + [ + 'parse' => ['files_for_parse' => $filesForParse], + 'write' => ['report_filename' => $outputPath], + ] + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php b/magento/setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php new file mode 100644 index 0000000..1afdd86 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php @@ -0,0 +1,196 @@ +inputValidator = $inputValidator; + $this->consoleLoggerFactory = $consoleLoggerFactory; + $this->options = $options; + $this->objectManager = $objectManagerProvider->get(); + + parent::__construct(); + } + + /** + * @inheritdoc + * @throws \InvalidArgumentException + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function configure() + { + $this->setName('setup:static-content:deploy') + ->setDescription('Deploys static view files') + ->setDefinition($this->options->getOptionsList()); + + parent::configure(); + } + + /** + * @inheritdoc + * @param InputInterface $input + * @param OutputInterface $output + * + * @throws \InvalidArgumentException + * @throws LocalizedException + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $time = microtime(true); + + $this->checkAppMode($input); + $this->inputValidator->validate($input); + + $options = $input->getOptions(); + $languageOption = $options[Options::LANGUAGE] ?: ['all']; + $options[Options::LANGUAGE] = $input->getArgument(Options::LANGUAGES_ARGUMENT) ?: $languageOption; + $refreshOnly = isset($options[Options::REFRESH_CONTENT_VERSION_ONLY]) + && $options[Options::REFRESH_CONTENT_VERSION_ONLY]; + + $verbose = $output->getVerbosity() > 1 ? $output->getVerbosity() : OutputInterface::VERBOSITY_VERBOSE; + + $logger = $this->consoleLoggerFactory->getLogger($output, $verbose); + if (!$refreshOnly) { + $logger->notice(PHP_EOL . "Deploy using {$options[Options::STRATEGY]} strategy"); + } + + $this->mockCache(); + + $exitCode = Cli::RETURN_SUCCESS; + try { + /** @var DeployStaticContent $deployService */ + $deployService = $this->objectManager->create(DeployStaticContent::class, [ + 'logger' => $logger + ]); + $deployService->deploy($options); + } catch (\Throwable $e) { + $logger->error('Error happened during deploy process: ' . $e->getMessage()); + $exitCode = Cli::RETURN_FAILURE; + } + + if (!$refreshOnly) { + $logger->notice(PHP_EOL . "Execution time: " . (microtime(true) - $time)); + } + + return $exitCode; + } + + /** + * Check application mode + * + * @param InputInterface $input + * @throws LocalizedException + */ + private function checkAppMode(InputInterface $input): void + { + if (!$input->getOption(Options::FORCE_RUN) && $this->getAppState()->getMode() !== State::MODE_PRODUCTION) { + throw new LocalizedException( + __( + 'NOTE: Manual static content deployment is not required in "default" and "developer" modes.' + . PHP_EOL . 'In "default" and "developer" modes static contents are being deployed ' + . 'automatically on demand.' + . PHP_EOL . 'If you still want to deploy in these modes, use -f option: ' + . "'bin/magento setup:static-content:deploy -f'" + ) + ); + } + } + + /** + * Mock Cache class with dummy implementation + * + * @return void + */ + private function mockCache() + { + $this->objectManager->configure([ + 'preferences' => [ + Cache::class => DummyCache::class + ] + ]); + } + + /** + * Retrieve application state + * + * @return State + */ + private function getAppState() + { + if (null === $this->appState) { + $this->appState = $this->objectManager->get(State::class); + } + return $this->appState; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/DiCompileCommand.php b/magento/setup/src/Magento/Setup/Console/Command/DiCompileCommand.php new file mode 100644 index 0000000..4c50a3d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/DiCompileCommand.php @@ -0,0 +1,413 @@ +deploymentConfig = $deploymentConfig; + $this->directoryList = $directoryList; + $this->objectManager = $objectManagerProvider->get(); + $this->taskManager = $taskManager; + $this->filesystem = $filesystem; + $this->fileDriver = $fileDriver; + $this->componentRegistrar = $componentRegistrar; + $this->file = $file ?: ObjectManager::getInstance()->get(File::class); + parent::__construct(); + } + + /** + * @inheritdoc + */ + protected function configure() + { + $this->setName(self::NAME) + ->setDescription( + 'Generates DI configuration and all missing classes that can be auto-generated' + ); + parent::configure(); + } + + /** + * Checks that application is installed and DI resources are cleared + * + * @return string[] + */ + private function checkEnvironment() + { + $messages = []; + $config = $this->deploymentConfig->get(ConfigOptionsListConstants::KEY_MODULES); + if (!$config) { + $messages[] = 'You cannot run this command because modules are not enabled. You can enable modules by' + . ' running the \'module:enable --all\' command.'; + } + + return $messages; + } + + /** + * @inheritdoc + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $errors = $this->checkEnvironment(); + if ($errors) { + foreach ($errors as $line) { + $output->writeln($line); + } + // we must have an exit code higher than zero to indicate something was wrong + return Cli::RETURN_FAILURE; + } + + $modulePaths = $this->componentRegistrar->getPaths(ComponentRegistrar::MODULE); + $libraryPaths = $this->componentRegistrar->getPaths(ComponentRegistrar::LIBRARY); + $setupPath = $this->directoryList->getPath(DirectoryList::SETUP); + $generationPath = $this->directoryList->getPath(DirectoryList::GENERATED_CODE); + + $this->objectManager->get(\Magento\Framework\App\Cache::class)->clean(); + $compiledPathsList = [ + 'application' => $modulePaths, + 'library' => $libraryPaths, + 'setup' => $setupPath, + 'generated_helpers' => $generationPath + ]; + + $this->excludedPathsList = [ + 'application' => $this->getExcludedModulePaths($modulePaths), + 'framework' => $this->getExcludedLibraryPaths($libraryPaths), + 'setup' => $this->getExcludedSetupPaths($setupPath), + ]; + $this->configureObjectManager($output); + + $operations = $this->getOperationsConfiguration($compiledPathsList); + + try { + $this->cleanupFilesystem( + [ + DirectoryList::CACHE, + DirectoryList::GENERATED_METADATA, + ] + ); + foreach ($operations as $operationCode => $arguments) { + $this->taskManager->addOperation( + $operationCode, + $arguments + ); + } + + /** @var ProgressBar $progressBar */ + $progressBar = $this->objectManager->create( + \Symfony\Component\Console\Helper\ProgressBar::class, + [ + 'output' => $output, + 'max' => count($operations) + ] + ); + $progressBar->setFormat( + '%message% %current%/%max% [%bar%] %percent:3s%% %elapsed% %memory:6s%' + ); + $output->writeln('Compilation was started.'); + $progressBar->start(); + $progressBar->display(); + + $this->taskManager->process( + function (OperationInterface $operation) use ($progressBar) { + $progressBar->setMessage($operation->getName() . '...'); + $progressBar->display(); + }, + function (OperationInterface $operation) use ($progressBar) { + $progressBar->advance(); + } + ); + + $progressBar->finish(); + $output->writeln(''); + $output->writeln('Generated code and dependency injection configuration successfully.'); + } catch (OperationException $e) { + $output->writeln('' . $e->getMessage() . ''); + // we must have an exit code higher than zero to indicate something was wrong + return Cli::RETURN_FAILURE; + } + return Cli::RETURN_SUCCESS; + } + + /** + * Build list of module path regexps which should be excluded from compilation + * + * @param string[] $modulePaths + * @return string[] + */ + private function getExcludedModulePaths(array $modulePaths) + { + $modulesByBasePath = []; + foreach ($modulePaths as $modulePath) { + $moduleDir = $this->file->getPathInfo($modulePath)['basename']; + $vendorPath = $this->fileDriver->getParentDirectory($modulePath); + $vendorDir = $this->file->getPathInfo($vendorPath)['basename']; + $basePath = $this->fileDriver->getParentDirectory($vendorPath); + $modulesByBasePath[$basePath][$vendorDir][] = $moduleDir; + } + + $basePathsRegExps = []; + foreach ($modulesByBasePath as $basePath => $vendorPaths) { + $vendorPathsRegExps = []; + foreach ($vendorPaths as $vendorDir => $vendorModules) { + $vendorPathsRegExps[] = $vendorDir + . '/(?:' . join('|', $vendorModules) . ')'; + } + $basePathsRegExps[] = preg_quote($basePath, '#') + . '/(?:' . join('|', $vendorPathsRegExps) . ')'; + } + + $excludedModulePaths = [ + '#^(?:' . join('|', $basePathsRegExps) . ')/Test#', + '#^(?:' . join('|', $basePathsRegExps) . ')/tests#', + ]; + return $excludedModulePaths; + } + + /** + * Build list of library path regexps which should be excluded from compilation + * + * @param string[] $libraryPaths + * @return string[] + */ + private function getExcludedLibraryPaths(array $libraryPaths) + { + $libraryPaths = array_map( + function ($libraryPath) { + return preg_quote($libraryPath, '#'); + }, + $libraryPaths + ); + + $excludedLibraryPaths = [ + '#^(?:' . join('|', $libraryPaths) . ')/([\\w]+/)?Test#', + '#^(?:' . join('|', $libraryPaths) . ')/([\\w]+/)?tests#', + ]; + return $excludedLibraryPaths; + } + + /** + * Get excluded setup application paths + * + * @param string $setupPath + * @return string[] + */ + private function getExcludedSetupPaths($setupPath) + { + return [ + '#^(?:' . preg_quote($setupPath, '#') . ')(/[\\w]+)*/Test#' + ]; + } + + /** + * Delete directories by their code from "var" directory + * + * @param array $directoryCodeList + * @return void + */ + private function cleanupFilesystem($directoryCodeList) + { + foreach ($directoryCodeList as $code) { + $this->filesystem->getDirectoryWrite($code)->delete(); + } + } + + /** + * Configure Object Manager + * + * @param OutputInterface $output + * @return void + */ + private function configureObjectManager(OutputInterface $output) + { + $this->objectManager->configure( + [ + 'preferences' => [\Magento\Framework\App\ObjectManager\ConfigWriterInterface::class => + \Magento\Framework\App\ObjectManager\ConfigWriter\Filesystem::class, + ], \Magento\Setup\Module\Di\Compiler\Config\ModificationChain::class => [ + 'arguments' => [ + 'modificationsList' => [ + 'BackslashTrim' => [ + 'instance' => + \Magento\Setup\Module\Di\Compiler\Config\Chain\BackslashTrim::class + ], + 'PreferencesResolving' => [ + 'instance' => + \Magento\Setup\Module\Di\Compiler\Config\Chain\PreferencesResolving::class + ], + 'InterceptorSubstitution' => [ + 'instance' => + \Magento\Setup\Module\Di\Compiler\Config\Chain\InterceptorSubstitution::class + ], + 'InterceptionPreferencesResolving' => [ + 'instance' => \Magento\Setup\Module\Di\Compiler\Config\Chain\PreferencesResolving::class + ], + ] + ] + ], \Magento\Setup\Module\Di\Code\Generator\PluginList::class => [ + 'arguments' => [ + 'cache' => [ + 'instance' => \Magento\Framework\App\Interception\Cache\CompiledConfig::class + ] + ] + ], \Magento\Setup\Module\Di\Code\Reader\ClassesScanner::class => [ + 'arguments' => [ + 'excludePatterns' => $this->excludedPathsList + ] + ], \Magento\Setup\Module\Di\Compiler\Log\Writer\Console::class => [ + 'arguments' => [ + 'output' => $output, + ] + ], + ] + ); + } + + /** + * Returns operations configuration + * + * @param array $compiledPathsList + * @return array + */ + private function getOperationsConfiguration( + array $compiledPathsList + ) { + $excludePatterns = array_merge([], ...array_values($this->excludedPathsList)); + + return [ + OperationFactory::PROXY_GENERATOR => [], + OperationFactory::REPOSITORY_GENERATOR => [ + 'paths' => $compiledPathsList['application'], + ], + OperationFactory::DATA_ATTRIBUTES_GENERATOR => [], + OperationFactory::APPLICATION_CODE_GENERATOR => [ + 'paths' => [ + $compiledPathsList['application'], + $compiledPathsList['library'], + $compiledPathsList['setup'], + $compiledPathsList['generated_helpers'], + ], + 'filePatterns' => ['php' => '/\.php$/'], + 'excludePatterns' => $excludePatterns, + ], + OperationFactory::INTERCEPTION => [ + 'intercepted_paths' => [ + $compiledPathsList['application'], + $compiledPathsList['library'], + $compiledPathsList['generated_helpers'], + ], + 'path_to_store' => $compiledPathsList['generated_helpers'], + ], + OperationFactory::AREA_CONFIG_GENERATOR => [ + $compiledPathsList['application'], + $compiledPathsList['library'], + $compiledPathsList['generated_helpers'], + ], + OperationFactory::INTERCEPTION_CACHE => [ + $compiledPathsList['application'], + $compiledPathsList['library'], + $compiledPathsList['generated_helpers'], + ], + OperationFactory::APPLICATION_ACTION_LIST_GENERATOR => [], + OperationFactory::PLUGIN_LIST_GENERATOR => [], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/GenerateFixturesCommand.php b/magento/setup/src/Magento/Setup/Console/Command/GenerateFixturesCommand.php new file mode 100644 index 0000000..24e3707 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/GenerateFixturesCommand.php @@ -0,0 +1,191 @@ +fixtureModel = $fixtureModel; + parent::__construct(); + } + + /** + * @inheritdoc + */ + protected function configure() + { + $this->setName('setup:performance:generate-fixtures') + ->setDescription('Generates fixtures') + ->setDefinition([ + new InputArgument( + self::PROFILE_ARGUMENT, + InputArgument::REQUIRED, + 'Path to profile configuration file' + ), + new InputOption( + self::SKIP_REINDEX_OPTION, + 's', + InputOption::VALUE_NONE, + 'Skip reindex' + ) + ]); + parent::configure(); + } + + /** + * @inheritdoc + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + try { + $totalStartTime = microtime(true); + + $fixtureModel = $this->fixtureModel; + $fixtureModel->loadConfig($input->getArgument(self::PROFILE_ARGUMENT)); + $fixtureModel->initObjectManager(); + $fixtureModel->loadFixtures(); + + $output->writeln('Generating profile with following params:'); + + foreach ($fixtureModel->getFixtures() as $fixture) { + $fixture->printInfo($output); + } + + /** @var \Magento\Setup\Fixtures\ConfigsApplyFixture $configFixture */ + $configFixture = $fixtureModel + ->getFixtureByName(\Magento\Setup\Fixtures\ConfigsApplyFixture::class); + $configFixture && $this->executeFixture($configFixture, $output); + + /** @var $config \Magento\Indexer\Model\Config */ + $config = $fixtureModel->getObjectManager()->get(\Magento\Indexer\Model\Config::class); + $indexerListIds = $config->getIndexers(); + /** @var $indexerRegistry \Magento\Framework\Indexer\IndexerRegistry */ + $indexerRegistry = $fixtureModel->getObjectManager() + ->create(\Magento\Framework\Indexer\IndexerRegistry::class); + + $indexersState = []; + foreach ($indexerListIds as $indexerId) { + $indexer = $indexerRegistry->get($indexerId['indexer_id']); + $indexersState[$indexerId['indexer_id']] = $indexer->isScheduled(); + $indexer->setScheduled(true); + } + + foreach ($fixtureModel->getFixtures() as $fixture) { + $this->executeFixture($fixture, $output); + } + + $this->clearChangelog(); + + foreach ($indexerListIds as $indexerId) { + /** @var $indexer \Magento\Indexer\Model\Indexer */ + $indexer = $indexerRegistry->get($indexerId['indexer_id']); + $indexer->setScheduled($indexersState[$indexerId['indexer_id']]); + } + + $this->optimizeTables($fixtureModel->getObjectManager(), $output); + + /** @var \Magento\Setup\Fixtures\IndexersStatesApplyFixture $indexerFixture */ + $indexerFixture = $fixtureModel + ->getFixtureByName(\Magento\Setup\Fixtures\IndexersStatesApplyFixture::class); + $indexerFixture && $this->executeFixture($indexerFixture, $output); + + if (!$input->getOption(self::SKIP_REINDEX_OPTION)) { + $fixtureModel->reindex($output); + } + + $totalEndTime = microtime(true); + $totalResultTime = (int) ($totalEndTime - $totalStartTime); + $output->writeln('Total execution time: ' . gmdate('H:i:s', $totalResultTime) . ''); + } catch (\Exception $e) { + $output->writeln('' . $e->getMessage() . ''); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } + + /** + * Clear changelog after generation + * + * @return void + */ + private function clearChangelog() + { + $viewConfig = $this->fixtureModel->getObjectManager()->create(CollectionInterface::class); + + /* @var ResourceConnection $resource */ + $resource = $this->fixtureModel->getObjectManager()->get(ResourceConnection::class); + + foreach ($viewConfig as $view) { + /* @var \Magento\Framework\Mview\ViewInterface $view */ + $changeLogTableName = $resource->getTableName($view->getChangelog()->getName()); + if ($resource->getConnection()->isTableExists($changeLogTableName)) { + $resource->getConnection()->truncateTable($changeLogTableName); + } + } + } + + /** + * Executes fixture and output the execution time. + * + * @param \Magento\Setup\Fixtures\Fixture $fixture + * @param OutputInterface $output + */ + private function executeFixture(\Magento\Setup\Fixtures\Fixture $fixture, OutputInterface $output) + { + $output->write('' . $fixture->getActionTitle() . '... '); + $startTime = microtime(true); + $fixture->execute($output); + $endTime = microtime(true); + $resultTime = (int) ($endTime - $startTime); + $output->writeln(' done in ' . gmdate('H:i:s', $resultTime) . ''); + } + + /** + * Optimize tables after entities generation. + * + * @param \Magento\Framework\ObjectManagerInterface $objectManager + * @param OutputInterface $output + * @return void + */ + private function optimizeTables( + \Magento\Framework\ObjectManagerInterface $objectManager, + OutputInterface $output + ): void { + $connect = $objectManager->get(ResourceConnection::class)->getConnection(); + $output->writeln("Optimize tables"); + foreach ($connect->getTables() as $tableName) { + $connect->query("OPTIMIZE TABLE `$tableName`"); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/I18nCollectPhrasesCommand.php b/magento/setup/src/Magento/Setup/Console/Command/I18nCollectPhrasesCommand.php new file mode 100644 index 0000000..bb8ab4e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/I18nCollectPhrasesCommand.php @@ -0,0 +1,82 @@ +setName('i18n:collect-phrases') + ->setDescription('Discovers phrases in the codebase'); + $this->setDefinition([ + new InputArgument( + self::INPUT_KEY_DIRECTORY, + InputArgument::OPTIONAL, + 'Directory path to parse. Not needed if --magento flag is set' + ), + new InputOption( + self::INPUT_KEY_OUTPUT, + self::SHORTCUT_KEY_OUTPUT, + InputOption::VALUE_REQUIRED, + 'Path (including filename) to an output file. With no file specified, defaults to stdout.' + ), + new InputOption( + self::INPUT_KEY_MAGENTO, + self::SHORTCUT_KEY_MAGENTO, + InputOption::VALUE_NONE, + 'Use the --magento parameter to parse the current Magento codebase.' . + ' Omit the parameter if a directory is specified.' + ), + ]); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $directory = $input->getArgument(self::INPUT_KEY_DIRECTORY); + if ($input->getOption(self::INPUT_KEY_MAGENTO)) { + $directory = BP; + if ($input->getArgument(self::INPUT_KEY_DIRECTORY)) { + throw new \InvalidArgumentException('Directory path is not needed when --magento flag is set.'); + } + } elseif (!$input->getArgument(self::INPUT_KEY_DIRECTORY)) { + throw new \InvalidArgumentException('Directory path is needed when --magento flag is not set.'); + } + $generator = ServiceLocator::getDictionaryGenerator(); + $generator->generate( + $directory, + $input->getOption(self::INPUT_KEY_OUTPUT), + $input->getOption(self::INPUT_KEY_MAGENTO) + ); + $output->writeln('Dictionary successfully processed.'); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/I18nPackCommand.php b/magento/setup/src/Magento/Setup/Console/Command/I18nPackCommand.php new file mode 100644 index 0000000..7c5cc89 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/I18nPackCommand.php @@ -0,0 +1,96 @@ +setName('i18n:pack') + ->setDescription('Saves language package'); + $this->setDefinition([ + new InputArgument( + self::INPUT_KEY_SOURCE, + InputArgument::REQUIRED, + 'Path to source dictionary file with translations' + ), + new InputArgument( + self::INPUT_KEY_LOCALE, + InputArgument::REQUIRED, + 'Target locale for dictionary, for example "de_DE"' + ), + new InputOption( + self::INPUT_KEY_MODE, + 'm', + InputOption::VALUE_REQUIRED, + 'Save mode for dictionary' . PHP_EOL . '- "replace" - replace language pack by new one' . PHP_EOL . + '- "merge" - merge language packages, by default "replace"', + self::MODE_REPLACE + ), + new InputOption( + self::INPUT_KEY_ALLOW_DUPLICATES, + 'd', + InputOption::VALUE_NONE, + 'Use the --allow-duplicates parameter to allow saving duplicates of translate.' . + ' Otherwise omit the parameter.' + ), + ]); + } + + /** + * {@inheritdoc} + * @throws \InvalidArgumentException + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $generator = ServiceLocator::getPackGenerator(); + $mode = $input->getOption(self::INPUT_KEY_MODE); + if ($mode !== self::MODE_MERGE && $mode !== self::MODE_REPLACE) { + throw new \InvalidArgumentException("Possible values for 'mode' option are 'replace' and 'merge'"); + } + $locale = $input->getArgument(self::INPUT_KEY_LOCALE); + $generator->generate( + $input->getArgument(self::INPUT_KEY_SOURCE), + $locale, + $input->getOption(self::INPUT_KEY_MODE), + $input->getOption(self::INPUT_KEY_ALLOW_DUPLICATES) + ); + $output->writeln("Successfully saved $locale language package."); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/InfoAdminUriCommand.php b/magento/setup/src/Magento/Setup/Console/Command/InfoAdminUriCommand.php new file mode 100644 index 0000000..006afc2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/InfoAdminUriCommand.php @@ -0,0 +1,58 @@ +deploymentConfig = $deploymentConfig; + parent::__construct(); + } + + /** + * Initialization of the command + * + * @return void + */ + protected function configure() + { + $this->setName('info:adminuri') + ->setDescription('Displays the Magento Admin URI'); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $output->writeln( + "\nAdmin URI: /" + . $this->deploymentConfig->get(BackendConfigOptionsList::CONFIG_PATH_BACKEND_FRONTNAME) + . "\n" + ); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/InfoBackupsListCommand.php b/magento/setup/src/Magento/Setup/Console/Command/InfoBackupsListCommand.php new file mode 100644 index 0000000..94337dd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/InfoBackupsListCommand.php @@ -0,0 +1,117 @@ +directoryList = $directoryList; + $this->file = $file; + $this->tableHelperFactory = $tableHelperFactory ?: ObjectManager::getInstance()->create(TableFactory::class); + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('info:backups:list') + ->setDescription('Prints list of available backup files'); + + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $backupsDir = $this->directoryList->getPath(DirectoryList::VAR_DIR) + . '/' . BackupRollback::DEFAULT_BACKUP_DIRECTORY; + if ($this->file->isExists($backupsDir)) { + $contents = $this->file->readDirectoryRecursively($backupsDir); + $tempTable = []; + foreach ($contents as $path) { + $partsOfPath = explode('/', str_replace('\\', '/', $path)); + $fileName = $partsOfPath[count($partsOfPath) - 1]; + // if filename starts with '.' skip, e.g. '.git' + if (!(strpos($fileName, '.') === 0)) { + $filenameWithoutExtension = explode('.', $fileName); + // actually first part of $filenameWithoutExtension contains only the filename without extension + // and filename contains the type of backup separated by '_' + $fileNameParts = explode('_', $filenameWithoutExtension[0]); + if (in_array(Factory::TYPE_MEDIA, $fileNameParts)) { + $tempTable[$fileName] = Factory::TYPE_MEDIA; + } elseif (in_array(Factory::TYPE_DB, $fileNameParts)) { + $tempTable[$fileName] = Factory::TYPE_DB; + } elseif (in_array('code', $fileNameParts)) { + $tempTable[$fileName] = 'code'; + } + } + } + if (empty($tempTable)) { + $output->writeln('No backup files found.'); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } + $output->writeln("Showing backup files in $backupsDir."); + /** @var \Symfony\Component\Console\Helper\Table $tableHelper */ + $tableHelper = $this->tableHelperFactory->create(['output' => $output]); + $tableHelper->setHeaders(['Backup Filename', 'Backup Type']); + asort($tempTable); + foreach ($tempTable as $key => $value) { + $tableHelper->addRow([$key, $value]); + } + $tableHelper->render(); + } else { + $output->writeln('No backup files found.'); + } + + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/InfoCurrencyListCommand.php b/magento/setup/src/Magento/Setup/Console/Command/InfoCurrencyListCommand.php new file mode 100644 index 0000000..91cfb5e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/InfoCurrencyListCommand.php @@ -0,0 +1,70 @@ +lists = $lists; + $this->tableHelperFactory = $tableHelperFactory ?: ObjectManager::getInstance()->create(TableFactory::class); + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('info:currency:list') + ->setDescription('Displays the list of available currencies'); + + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $tableHelper = $this->tableHelperFactory->create(['output' => $output]); + $tableHelper->setHeaders(['Currency', 'Code']); + + foreach ($this->lists->getCurrencyList() as $key => $currency) { + $tableHelper->addRow([$currency, $key]); + } + + $tableHelper->render(); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/InfoLanguageListCommand.php b/magento/setup/src/Magento/Setup/Console/Command/InfoLanguageListCommand.php new file mode 100644 index 0000000..8950bd5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/InfoLanguageListCommand.php @@ -0,0 +1,70 @@ +lists = $lists; + $this->tableHelperFactory = $tableHelperFactory ?: ObjectManager::getInstance()->create(TableFactory::class); + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('info:language:list') + ->setDescription('Displays the list of available language locales'); + + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $tableHelper = $this->tableHelperFactory->create(['output' => $output]); + $tableHelper->setHeaders(['Language', 'Code']); + + foreach ($this->lists->getLocaleList() as $key => $locale) { + $tableHelper->addRow([$locale, $key]); + } + + $tableHelper->render(); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/InfoTimezoneListCommand.php b/magento/setup/src/Magento/Setup/Console/Command/InfoTimezoneListCommand.php new file mode 100644 index 0000000..2ff1d22 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/InfoTimezoneListCommand.php @@ -0,0 +1,70 @@ +lists = $lists; + $this->tableHelperFactory = $tableHelperFactory ?: ObjectManager::getInstance()->create(TableFactory::class); + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('info:timezone:list') + ->setDescription('Displays the list of available timezones'); + + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $tableHelper = $this->tableHelperFactory->create(['output' => $output]); + $tableHelper->setHeaders(['Timezone', 'Code']); + + foreach ($this->lists->getTimezoneList() as $key => $timezone) { + $tableHelper->addRow([$timezone, $key]); + } + + $tableHelper->render(); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/InstallCommand.php b/magento/setup/src/Magento/Setup/Console/Command/InstallCommand.php new file mode 100644 index 0000000..1f71604 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/InstallCommand.php @@ -0,0 +1,451 @@ +installerFactory = $installerFactory; + $this->configModel = $configModel; + $this->userConfig = $userConfig; + $this->adminUser = $adminUser; + $this->searchConfigOptionsList = $searchConfigOptionsList; + parent::__construct(); + } + + /** + * @inheritdoc + */ + protected function configure() + { + $inputOptions = $this->configModel->getAvailableOptions(); + $inputOptions = array_merge($inputOptions, $this->userConfig->getOptionsList()); + $inputOptions = array_merge($inputOptions, $this->adminUser->getOptionsList(InputOption::VALUE_OPTIONAL)); + $inputOptions = array_merge($inputOptions, $this->searchConfigOptionsList->getOptionsList()); + $inputOptions = array_merge($inputOptions, [ + new InputOption( + self::INPUT_KEY_CLEANUP_DB, + null, + InputOption::VALUE_NONE, + 'Cleanup the database before installation' + ), + new InputOption( + self::INPUT_KEY_SALES_ORDER_INCREMENT_PREFIX, + null, + InputOption::VALUE_REQUIRED, + 'Sales order number prefix' + ), + new InputOption( + self::INPUT_KEY_USE_SAMPLE_DATA, + null, + InputOption::VALUE_NONE, + 'Use sample data' + ), + new InputOption( + self::INPUT_KEY_ENABLE_MODULES, + null, + InputOption::VALUE_OPTIONAL, + 'List of comma-separated module names. That must be included during installation. ' + . 'Available magic param "all".' + ), + new InputOption( + self::INPUT_KEY_DISABLE_MODULES, + null, + InputOption::VALUE_OPTIONAL, + 'List of comma-separated module names. That must be avoided during installation. ' + . 'Available magic param "all".' + ), + new InputOption( + self::CONVERT_OLD_SCRIPTS_KEY, + null, + InputOption::VALUE_OPTIONAL, + 'Allows to convert old scripts (InstallSchema, UpgradeSchema) to db_schema.xml format', + false + ), + new InputOption( + self::INPUT_KEY_INTERACTIVE_SETUP, + self::INPUT_KEY_INTERACTIVE_SETUP_SHORTCUT, + InputOption::VALUE_NONE, + 'Interactive Magento installation' + ), + new InputOption( + OperationsExecutor::KEY_SAFE_MODE, + null, + InputOption::VALUE_OPTIONAL, + 'Safe installation of Magento with dumps on destructive operations, like column removal' + ), + new InputOption( + OperationsExecutor::KEY_DATA_RESTORE, + null, + InputOption::VALUE_OPTIONAL, + 'Restore removed data from dumps' + ), + new InputOption( + DryRunLogger::INPUT_KEY_DRY_RUN_MODE, + null, + InputOption::VALUE_OPTIONAL, + 'Magento Installation will be run in dry-run mode', + false + ), + ]); + $this->setName('setup:install') + ->setDescription('Installs the Magento application') + ->setDefinition($inputOptions); + parent::configure(); + } + + /** + * @inheritdoc + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $consoleLogger = new ConsoleLogger($output); + $installer = $this->installerFactory->create($consoleLogger); + $isInteractiveSetup = $input->getOption(self::INPUT_KEY_INTERACTIVE_SETUP) ?? false; + $installer->install($isInteractiveSetup ? array_merge($input->getOptions(), $this->interactiveSetupUserInput) : + $input->getOptions()); + + $importConfigCommand = $this->getApplication()->find(ConfigImportCommand::COMMAND_NAME); + $arrayInput = new ArrayInput([]); + $arrayInput->setInteractive($input->isInteractive()); + return $importConfigCommand->run($arrayInput, $output); + } + + /** + * @inheritdoc + */ + protected function initialize(InputInterface $input, OutputInterface $output) + { + $inputOptions = $input->getOptions(); + + if ($inputOptions['interactive']) { + $configOptionsToValidate = $this->interactiveQuestions($input, $output); + } else { + $configOptionsToValidate = []; + foreach ($this->configModel->getAvailableOptions() as $option) { + if (array_key_exists($option->getName(), $inputOptions)) { + $configOptionsToValidate[$option->getName()] = $inputOptions[$option->getName()]; + } + } + } + + if ($inputOptions['interactive']) { + $command = ''; + foreach ($configOptionsToValidate as $key => $value) { + $command .= " --{$key}={$value}"; + } + $output->writeln("Try re-running command: php bin/magento setup:install{$command}"); + $this->interactiveSetupUserInput = $configOptionsToValidate; + } + + $errors = $this->configModel->validate($configOptionsToValidate); + $errors = array_merge($errors, $this->validateAdmin($input)); + $errors = array_merge($errors, $this->validate($input)); + $errors = array_merge($errors, $this->userConfig->validate($input)); + + if (!empty($errors)) { + foreach ($errors as $error) { + $output->writeln("$error"); + } + throw new \InvalidArgumentException('Parameter validation failed'); + } + } + + /** + * Validate sales_order_increment_prefix value + * + * It will save the value which discarding characters after 20th to the database so it should be + * validated in advance. + * + * @param InputInterface $input + * @return string[] Array of error messages + */ + public function validate(InputInterface $input) : array + { + $errors = []; + $value = $input->getOption(self::INPUT_KEY_SALES_ORDER_INCREMENT_PREFIX); + if (preg_match(self::SALES_ORDER_INCREMENT_PREFIX_RULE, (string) $value) != 1) { + $errors[] = 'Validation failed, ' . self::INPUT_KEY_SALES_ORDER_INCREMENT_PREFIX + . ' must be 20 characters or less'; + } + return $errors; + } + + /** + * Runs interactive questions + * + * It will ask users for interactive questionst regarding setup configuration. + * + * @param InputInterface $input + * @param OutputInterface $output + * @return string[] Array of inputs + */ + private function interactiveQuestions(InputInterface $input, OutputInterface $output) : array + { + $helper = $this->getHelper('question'); + $configOptionsToValidate = []; + + foreach ($this->configModel->getAvailableOptions() as $option) { + $configOptionsToValidate[$option->getName()] = $this->askQuestion( + $input, + $output, + $helper, + $option, + true + ); + } + + $output->writeln(""); + + foreach ($this->userConfig->getOptionsList() as $option) { + $configOptionsToValidate[$option->getName()] = $this->askQuestion( + $input, + $output, + $helper, + $option + ); + } + + $output->writeln(""); + + foreach ($this->adminUser->getOptionsList(InputOption::VALUE_OPTIONAL) as $option) { + $configOptionsToValidate[$option->getName()] = $this->askQuestion( + $input, + $output, + $helper, + $option + ); + } + + $output->writeln(""); + + $returnConfigOptionsToValidate = []; + foreach ($configOptionsToValidate as $key => $value) { + if ($value != '') { + $returnConfigOptionsToValidate[$key] = $value; + } + } + + return $returnConfigOptionsToValidate; + } + + /** + * Runs interactive questions + * + * It will ask users for interactive questions regarding setup configuration. + * + * @param InputInterface $input + * @param OutputInterface $output + * @param QuestionHelper $helper + * @param TextConfigOption|FlagConfigOption\SelectConfigOption $option + * @param Boolean $validateInline + * @return string[] Array of inputs + */ + private function askQuestion( + InputInterface $input, + OutputInterface $output, + QuestionHelper $helper, + $option, + $validateInline = false + ) { + if ($option instanceof \Magento\Framework\Setup\Option\SelectConfigOption) { + if ($option->isValueRequired()) { + $question = new ChoiceQuestion( + $option->getDescription() . '? ', + $option->getSelectOptions(), + $option->getDefault() + ); + } else { + $question = new ChoiceQuestion( + $option->getDescription() . ' [optional]? ', + $option->getSelectOptions(), + $option->getDefault() + ); + } + } else { + if ($option->isValueRequired()) { + $question = new Question( + $option->getDescription() . '? ', + $option->getDefault() + ); + } else { + $question = new Question( + $option->getDescription() . ' [optional]? ', + $option->getDefault() + ); + } + } + + $question->setValidator(function ($answer) use ($option, $validateInline) { + + if ($option instanceof \Magento\Framework\Setup\Option\SelectConfigOption) { + //If user doesn't provide an input & default value for question is not set, take first option as input. + $answer = $option->getSelectOptions()[$answer] ?? current($option->getSelectOptions()); + } + + $answer = $answer === null ? '' : (is_string($answer) ? trim($answer) : $answer); + + if ($validateInline) { + $option->validate($answer); + } + + return $answer; + }); + + $value = $helper->ask($input, $output, $question); + + return $value; + } + + /** + * Performs validation of admin options if at least one of them was set. + * + * @param InputInterface $input + * @return array + */ + private function validateAdmin(InputInterface $input): array + { + if ($input->getOption(AdminAccount::KEY_FIRST_NAME) + || $input->getOption(AdminAccount::KEY_LAST_NAME) + || $input->getOption(AdminAccount::KEY_EMAIL) + || $input->getOption(AdminAccount::KEY_USER) + || $input->getOption(AdminAccount::KEY_PASSWORD) + ) { + return $this->adminUser->validate($input); + } + + return []; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/InstallStoreConfigurationCommand.php b/magento/setup/src/Magento/Setup/Console/Command/InstallStoreConfigurationCommand.php new file mode 100644 index 0000000..7eb8aec --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/InstallStoreConfigurationCommand.php @@ -0,0 +1,354 @@ +installerFactory = $installerFactory; + $this->deploymentConfig = $deploymentConfig; + $this->objectManager = $objectManagerProvider->get(); + $this->localeValidator = $localeValidator; + $this->timezoneValidator = $timezoneValidator; + $this->currencyValidator = $currencyValidator; + $this->urlValidator = $urlValidator; + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('setup:store-config:set') + ->setDescription('Installs the store configuration. Deprecated since 2.2.0. Use config:set instead') + ->setDefinition($this->getOptionsList()); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable()) { + $output->writeln( + "Store settings can't be saved because the Magento application is not installed." + ); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + $errors = $this->validate($input); + if ($errors) { + $output->writeln($errors); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + $installer = $this->installerFactory->create(new ConsoleLogger($output)); + $installer->installUserConfig($input->getOptions()); + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } + + /** + * Get list of options for the command + * + * @return InputOption[] + */ + public function getOptionsList() + { + return [ + new InputOption( + StoreConfigurationDataMapper::KEY_BASE_URL, + null, + InputOption::VALUE_REQUIRED, + 'URL the store is supposed to be available at. ' + . 'Deprecated, use config:set with path web/unsecure/base_url' + ), + new InputOption( + StoreConfigurationDataMapper::KEY_LANGUAGE, + null, + InputOption::VALUE_REQUIRED, + 'Default language code. ' + . 'Deprecated, use config:set with path general/locale/code' + ), + new InputOption( + StoreConfigurationDataMapper::KEY_TIMEZONE, + null, + InputOption::VALUE_REQUIRED, + 'Default time zone code. ' + . 'Deprecated, use config:set with path general/locale/timezone' + ), + new InputOption( + StoreConfigurationDataMapper::KEY_CURRENCY, + null, + InputOption::VALUE_REQUIRED, + 'Default currency code. ' + . 'Deprecated, use config:set with path currency/options/base, currency/options/default' + . ' and currency/options/allow' + ), + new InputOption( + StoreConfigurationDataMapper::KEY_USE_SEF_URL, + null, + InputOption::VALUE_REQUIRED, + 'Use rewrites. ' + . 'Deprecated, use config:set with path web/seo/use_rewrites' + ), + new InputOption( + StoreConfigurationDataMapper::KEY_IS_SECURE, + null, + InputOption::VALUE_REQUIRED, + 'Use secure URLs. Enable this option only if SSL is available. ' + . 'Deprecated, use config:set with path web/secure/use_in_frontend' + ), + new InputOption( + StoreConfigurationDataMapper::KEY_BASE_URL_SECURE, + null, + InputOption::VALUE_REQUIRED, + 'Base URL for SSL connection. ' + . 'Deprecated, use config:set with path web/secure/base_url' + ), + new InputOption( + StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN, + null, + InputOption::VALUE_REQUIRED, + 'Run admin interface with SSL. ' + . 'Deprecated, use config:set with path web/secure/use_in_adminhtml' + ), + new InputOption( + StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY, + null, + InputOption::VALUE_REQUIRED, + 'Whether to use a "security key" feature in Magento Admin URLs and forms. ' + . 'Deprecated, use config:set with path admin/security/use_form_key' + ), + ]; + } + + /** + * Check if option values provided by the user are valid + * + * @param InputInterface $input + * @return string[] + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function validate(InputInterface $input) + { + $errors = []; + $errorMsg = ''; + $options = $input->getOptions(); + foreach ($options as $key => $value) { + if (!$value) { + continue; + } + switch ($key) { + case StoreConfigurationDataMapper::KEY_BASE_URL: + if (strcmp($value, '{{base_url}}') == 0) { + break; + } + $errorMsg = $this->validateUrl( + $value, + StoreConfigurationDataMapper::KEY_BASE_URL, + ['http', 'https'] + ); + + break; + case StoreConfigurationDataMapper::KEY_LANGUAGE: + $errorMsg = $this->validateCodes( + $this->localeValidator, + $value, + StoreConfigurationDataMapper::KEY_LANGUAGE + ); + break; + case StoreConfigurationDataMapper::KEY_TIMEZONE: + $errorMsg = $this->validateCodes( + $this->timezoneValidator, + $value, + StoreConfigurationDataMapper::KEY_TIMEZONE + ); + break; + case StoreConfigurationDataMapper::KEY_CURRENCY: + $errorMsg = $this->validateCodes( + $this->currencyValidator, + $value, + StoreConfigurationDataMapper::KEY_CURRENCY + ); + break; + case StoreConfigurationDataMapper::KEY_USE_SEF_URL: + $errorMsg = $this->validateBinaryValue($value, StoreConfigurationDataMapper::KEY_USE_SEF_URL); + break; + case StoreConfigurationDataMapper::KEY_IS_SECURE: + $errorMsg = $this->validateBinaryValue($value, StoreConfigurationDataMapper::KEY_IS_SECURE); + break; + case StoreConfigurationDataMapper::KEY_BASE_URL_SECURE: + $errorMsg = $this->validateUrl( + $value, + StoreConfigurationDataMapper::KEY_BASE_URL_SECURE, + ['https'] + ); + break; + case StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN: + $errorMsg = $this->validateBinaryValue($value, StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN); + break; + case StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY: + $errorMsg = $this->validateBinaryValue( + $value, + StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY + ); + break; + case StoreConfigurationDataMapper::KEY_JS_LOGGING: + $errorMsg = $this->validateBinaryValue( + $value, + StoreConfigurationDataMapper::KEY_JS_LOGGING + ); + break; + } + if ($errorMsg !== '') { + $errors[] = $errorMsg; + } + } + return $errors; + } + + /** + * Validate binary value for a specified key + * + * @param string $value + * @param string $key + * @return string + */ + private function validateBinaryValue($value, $key) + { + $errorMsg = ''; + if ($value !== '0' && $value !== '1') { + $errorMsg = '' . 'Command option \'' . $key . '\': Invalid value. Possible values (0|1).'; + } + return $errorMsg; + } + + /** + * Validate codes for languages, currencies or timezones + * + * @param LocaleValidator|TimezoneValidator|CurrencyValidator $lists + * @param string $code + * @param string $type + * @return string + */ + private function validateCodes($lists, $code, $type) + { + $errorMsg = ''; + if (!$lists->isValid($code)) { + $errorMsg = '' . 'Command option \'' . $type . '\': Invalid value. To see possible values, ' + . "run command 'bin/magento info:" . $type . ':list\'.'; + } + return $errorMsg; + } + + /** + * Validate URL + * + * @param string $url + * @param string $option + * @param array $allowedSchemes + * @return string + */ + private function validateUrl($url, $option, array $allowedSchemes) + { + $errorMsg = ''; + + if (!$this->urlValidator->isValid($url, $allowedSchemes)) { + $errorTemplate = 'Command option \'%s\': Invalid URL \'%s\'.' + . ' Domain Name should contain only letters, digits and hyphen.' + . ' And you should use only following schemes: \'%s\'.'; + $errorMsg = sprintf( + $errorTemplate, + $option, + $url, + implode(', ', $allowedSchemes) + ); + } + + return $errorMsg; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/ModuleConfigStatusCommand.php b/magento/setup/src/Magento/Setup/Console/Command/ModuleConfigStatusCommand.php new file mode 100644 index 0000000..70dbf14 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/ModuleConfigStatusCommand.php @@ -0,0 +1,109 @@ +configReader = $configReader; + $this->installerFactory = $installerFactory; + + parent::__construct(); + } + + /** + * @inheritdoc + */ + protected function configure() + { + $this + ->setName('module:config:status') + ->setDescription( + 'Checks the modules configuration in the \'app/etc/config.php\' file ' + . 'and reports if they are up to date or not' + ); + + parent::configure(); + } + + /** + * @inheritdoc + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + try { + // the config as currently in app/etc/config.php + $currentConfig = $this->configReader->load(ConfigFilePool::APP_CONFIG); + if (!array_key_exists(ConfigOptionsListConstants::KEY_MODULES, $currentConfig)) { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new \Exception('Can\'t find the modules configuration in the \'app/etc/config.php\' file.'); + } + + $currentModuleConfig = $currentConfig[ConfigOptionsListConstants::KEY_MODULES]; + + $installer = $this->installerFactory->create(new ConsoleLogger($output)); + + // the module config as Magento calculated it + $correctModuleConfig = $installer->getModulesConfig(); + + if ($currentModuleConfig !== $correctModuleConfig) { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new \Exception( + 'The modules configuration in the \'app/etc/config.php\' file is outdated. ' + . 'Run \'setup:upgrade\' to fix it.' + ); + } + + $output->writeln( + 'The modules configuration is up to date.' + ); + // phpcs:disable Magento2.Exceptions.ThrowCatch + } catch (\Exception $e) { + $output->writeln('' . $e->getMessage() . ''); + + return Cli::RETURN_FAILURE; + } + + return Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/ModuleDisableCommand.php b/magento/setup/src/Magento/Setup/Console/Command/ModuleDisableCommand.php new file mode 100644 index 0000000..cf3dd32 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/ModuleDisableCommand.php @@ -0,0 +1,32 @@ +setName('module:disable') + ->setDescription('Disables specified modules'); + parent::configure(); + } + + /** + * Disable modules + * + * @return bool + */ + protected function isEnable() + { + return false; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/ModuleEnableCommand.php b/magento/setup/src/Magento/Setup/Console/Command/ModuleEnableCommand.php new file mode 100644 index 0000000..62a514a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/ModuleEnableCommand.php @@ -0,0 +1,32 @@ +setName('module:enable') + ->setDescription('Enables specified modules'); + parent::configure(); + } + + /** + * Enable modules + * + * @return bool + */ + protected function isEnable() + { + return true; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/ModuleStatusCommand.php b/magento/setup/src/Magento/Setup/Console/Command/ModuleStatusCommand.php new file mode 100644 index 0000000..4e5e73f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/ModuleStatusCommand.php @@ -0,0 +1,187 @@ +objectManagerProvider = $objectManagerProvider; + parent::__construct(); + } + + /** + * @inheritdoc + */ + protected function configure() + { + $this->setName('module:status') + ->setDescription('Displays status of modules') + ->addArgument( + 'module-names', + InputArgument::OPTIONAL | InputArgument::IS_ARRAY, + 'Optional module name' + ) + ->addOption('enabled', null, null, 'Print only enabled modules') + ->addOption('disabled', null, null, 'Print only disabled modules'); + parent::configure(); + } + + /** + * @inheritdoc + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $moduleNames = $input->getArgument('module-names'); + if (!empty($moduleNames)) { + foreach ($moduleNames as $moduleName) { + $this->showSpecificModule($moduleName, $output); + } + return Cli::RETURN_SUCCESS; + } + + $onlyEnabled = $input->getOption('enabled'); + if ($onlyEnabled) { + return $this->showEnabledModules($output); + } + + $onlyDisabled = $input->getOption('disabled'); + if ($onlyDisabled) { + return $this->showDisabledModules($output); + } + + $output->writeln('List of enabled modules:'); + $this->showEnabledModules($output); + $output->writeln(''); + + $output->writeln("List of disabled modules:"); + $this->showDisabledModules($output); + $output->writeln(''); + + return Cli::RETURN_SUCCESS; + } + + /** + * Specific module show + * + * @param string $moduleName + * @param OutputInterface $output + * @return int + */ + private function showSpecificModule(string $moduleName, OutputInterface $output): int + { + $allModules = $this->getAllModules(); + if (!in_array($moduleName, $allModules->getNames(), true)) { + $output->writeln($moduleName . ' : Module does not exist'); + return Cli::RETURN_FAILURE; + } + + $enabledModules = $this->getEnabledModules(); + if (in_array($moduleName, $enabledModules->getNames(), true)) { + $output->writeln($moduleName . ' : Module is enabled'); + return Cli::RETURN_FAILURE; + } + + $output->writeln($moduleName . ' : Module is disabled'); + return Cli::RETURN_SUCCESS; + } + + /** + * Enable modules show + * + * @param OutputInterface $output + * @return int + */ + private function showEnabledModules(OutputInterface $output): int + { + $enabledModules = $this->getEnabledModules(); + $enabledModuleNames = $enabledModules->getNames(); + if (count($enabledModuleNames) === 0) { + $output->writeln('None'); + return Cli::RETURN_FAILURE; + } + + $output->writeln(join("\n", $enabledModuleNames)); + + return Cli::RETURN_SUCCESS; + } + + /** + * Disabled modules show + * + * @param OutputInterface $output + * @return int + */ + private function showDisabledModules(OutputInterface $output): int + { + $disabledModuleNames = $this->getDisabledModuleNames(); + if (count($disabledModuleNames) === 0) { + $output->writeln('None'); + return Cli::RETURN_FAILURE; + } + + $output->writeln(join("\n", $disabledModuleNames)); + + return Cli::RETURN_SUCCESS; + } + + /** + * Returns all modules + * + * @return FullModuleList + */ + private function getAllModules(): FullModuleList + { + return $this->objectManagerProvider->get() + ->create(FullModuleList::class); + } + + /** + * Returns enabled modules + * + * @return ModuleList + */ + private function getEnabledModules(): ModuleList + { + return $this->objectManagerProvider->get() + ->create(ModuleList::class); + } + + /** + * Returns disabled module names + * + * @return array + */ + private function getDisabledModuleNames(): array + { + $fullModuleList = $this->getAllModules(); + $enabledModules = $this->getEnabledModules(); + + return array_diff($fullModuleList->getNames(), $enabledModules->getNames()); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php b/magento/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php new file mode 100644 index 0000000..5754bbc --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php @@ -0,0 +1,429 @@ +composer = $composer; + $this->deploymentConfig = $deploymentConfig; + $this->fullModuleList = $fullModuleList; + $this->packageInfo = $this->objectManager->get(\Magento\Framework\Module\PackageInfoFactory::class)->create(); + $this->collector = $collector; + $this->dependencyChecker = $this->objectManager->get(\Magento\Framework\Module\DependencyChecker::class); + $this->backupRollbackFactory = $this->objectManager->get(\Magento\Framework\Setup\BackupRollbackFactory::class); + $this->moduleUninstaller = $moduleUninstaller; + $this->moduleRegistryUninstaller = $moduleRegistryUninstaller; + $this->maintenanceModeEnabler = + $maintenanceModeEnabler ?: $this->objectManager->get(MaintenanceModeEnabler::class); + } + + /** + * @return PatchApplier + */ + private function getPatchApplier() + { + if (!$this->patchApplier) { + $this->patchApplier = $this + ->objectManager->get(PatchApplier::class); + } + + return $this->patchApplier; + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $options = [ + new InputOption( + self::INPUT_KEY_REMOVE_DATA, + 'r', + InputOption::VALUE_NONE, + 'Remove data installed by module(s)' + ), + new InputOption( + self::INPUT_KEY_BACKUP_CODE, + null, + InputOption::VALUE_NONE, + 'Take code and configuration files backup (excluding temporary files)' + ), + new InputOption( + self::INPUT_KEY_BACKUP_MEDIA, + null, + InputOption::VALUE_NONE, + 'Take media backup' + ), + new InputOption( + self::INPUT_KEY_BACKUP_DB, + null, + InputOption::VALUE_NONE, + 'Take complete database backup' + ), + new InputOption( + self::INPUT_KEY_NON_COMPOSER_MODULE, + null, + InputOption::VALUE_NONE, + 'All modules, that will be past here will be non composer based' + ) + ]; + $this->setName('module:uninstall') + ->setDescription('Uninstalls modules installed by composer') + ->setDefinition($options); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function isModuleRequired() + { + return true; + } + + /** + * {@inheritdoc} + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable()) { + $output->writeln( + 'You cannot run this command because the Magento application is not installed.' + ); + // we must have an exit code higher than zero to indicate something was wrong + return Cli::RETURN_FAILURE; + } + + $modules = $input->getArgument(self::INPUT_KEY_MODULES); + + if ($input->getOption(self::INPUT_KEY_NON_COMPOSER_MODULE)) { + foreach ($modules as $moduleName) { + $this->getPatchApplier()->revertDataPatches($moduleName); + } + + return Cli::RETURN_SUCCESS; + } + + // validate modules input + $messages = $this->validate($modules); + if (!empty($messages)) { + $output->writeln($messages); + // we must have an exit code higher than zero to indicate something was wrong + return Cli::RETURN_FAILURE; + } + + // check dependencies + $dependencyMessages = $this->checkDependencies($modules); + if (!empty($dependencyMessages)) { + $output->writeln($dependencyMessages); + // we must have an exit code higher than zero to indicate something was wrong + return Cli::RETURN_FAILURE; + } + + $helper = $this->getHelper('question'); + $question = new ConfirmationQuestion( + 'You are about to remove code and/or database tables. Are you sure?[y/N]', + false + ); + if (!$helper->ask($input, $output, $question) && $input->isInteractive()) { + return Cli::RETURN_FAILURE; + } + + $result = $this->maintenanceModeEnabler->executeInMaintenanceMode( + function () use ($input, $output, $modules, $helper) { + try { + $this->takeBackup($input, $output); + $dbBackupOption = $input->getOption(self::INPUT_KEY_BACKUP_DB); + if ($input->getOption(self::INPUT_KEY_REMOVE_DATA)) { + $this->removeData($modules, $output, $dbBackupOption); + } else { + if (!empty($this->collector->collectUninstall())) { + $question = new ConfirmationQuestion( + 'You are about to remove a module(s) that might have database data. ' + . 'Do you want to remove the data from database?[y/N]', + false + ); + if ($helper->ask($input, $output, $question) || !$input->isInteractive()) { + $this->removeData($modules, $output, $dbBackupOption); + } + } else { + $output->writeln( + 'You are about to remove a module(s) that might have database data. ' + . 'Remove the database data manually after uninstalling, if desired.' + ); + } + } + $this->moduleRegistryUninstaller->removeModulesFromDb($output, $modules); + $this->moduleRegistryUninstaller->removeModulesFromDeploymentConfig($output, $modules); + $this->moduleUninstaller->uninstallCode($output, $modules); + $this->cleanup($input, $output); + + return Cli::RETURN_SUCCESS; + } catch (\Exception $e) { + $output->writeln('' . $e->getMessage() . ''); + $output->writeln('Please disable maintenance mode after you resolved above issues'); + return Cli::RETURN_FAILURE; + } + }, + $output, + true + ); + + return $result; + } + + /** + * Check backup options and take backup appropriately + * + * @param InputInterface $input + * @param OutputInterface $output + * @return void + */ + private function takeBackup(InputInterface $input, OutputInterface $output) + { + $time = time(); + if ($input->getOption(self::INPUT_KEY_BACKUP_CODE)) { + $codeBackup = $this->backupRollbackFactory->create($output); + $codeBackup->codeBackup($time); + } + if ($input->getOption(self::INPUT_KEY_BACKUP_MEDIA)) { + $mediaBackup = $this->backupRollbackFactory->create($output); + $mediaBackup->codeBackup($time, Factory::TYPE_MEDIA); + } + if ($input->getOption(self::INPUT_KEY_BACKUP_DB)) { + $dbBackup = $this->backupRollbackFactory->create($output); + $this->setAreaCode(); + $dbBackup->dbBackup($time); + } + } + + /** + * Invoke remove data routine in each specified module + * + * @param string[] $modules + * @param OutputInterface $output + * @param bool $dbBackupOption + * @return void + */ + private function removeData(array $modules, OutputInterface $output, $dbBackupOption) + { + if (!$dbBackupOption) { + $output->writeln('You are removing data without a database backup.'); + } else { + $output->writeln('Removing data'); + } + $this->moduleUninstaller->uninstallData($output, $modules); + } + + /** + * Validate list of modules against installed composer packages and return error messages + * + * @param string[] $modules + * @return string[] + */ + protected function validate(array $modules) + { + $messages = []; + $unknownPackages = []; + $unknownModules = []; + $installedPackages = $this->composer->getRootRequiredPackages(); + foreach ($modules as $module) { + if (array_search($this->packageInfo->getPackageName($module), $installedPackages) === false) { + $unknownPackages[] = $module; + } + if (!$this->fullModuleList->has($module)) { + $unknownModules[] = $module; + } + } + $unknownPackages = array_diff($unknownPackages, $unknownModules); + if (!empty($unknownPackages)) { + $text = count($unknownPackages) > 1 ? + ' are not installed composer packages' : ' is not an installed composer package'; + $messages[] = '' . implode(', ', $unknownPackages) . $text . ''; + } + if (!empty($unknownModules)) { + $messages[] = 'Unknown module(s): ' . implode(', ', $unknownModules) . ''; + } + return $messages; + } + + /** + * Check for dependencies to modules, return error messages + * + * @param string[] $modules + * @return string[] + */ + private function checkDependencies(array $modules) + { + $messages = []; + $dependencies = $this->dependencyChecker->checkDependenciesWhenDisableModules( + $modules, + $this->fullModuleList->getNames() + ); + foreach ($dependencies as $module => $dependingModules) { + if (!empty($dependingModules)) { + $messages[] = + "Cannot uninstall module '$module' because the following module(s) depend on it:" . + PHP_EOL . "\t" . implode('' . PHP_EOL . "\t", array_keys($dependingModules)) . + ""; + } + } + return $messages; + } + + /** + * Sets area code to start a session for database backup and rollback + * + * @return void + */ + private function setAreaCode() + { + $areaCode = 'adminhtml'; + /** @var \Magento\Framework\App\State $appState */ + $appState = $this->objectManager->get(\Magento\Framework\App\State::class); + $appState->setAreaCode($areaCode); + /** @var \Magento\Framework\ObjectManager\ConfigLoaderInterface $configLoader */ + $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class); + $this->objectManager->configure($configLoader->load($areaCode)); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/RollbackCommand.php b/magento/setup/src/Magento/Setup/Console/Command/RollbackCommand.php new file mode 100644 index 0000000..e114c84 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/RollbackCommand.php @@ -0,0 +1,214 @@ +objectManager = $objectManagerProvider->get(); + $this->backupRollbackFactory = $this->objectManager->get(\Magento\Framework\Setup\BackupRollbackFactory::class); + $this->deploymentConfig = $deploymentConfig; + $this->maintenanceModeEnabler = + $maintenanceModeEnabler ?: $this->objectManager->get(MaintenanceModeEnabler::class); + parent::__construct(); + } + + /** + * @inheritDoc + */ + protected function configure() + { + $options = [ + new InputOption( + self::INPUT_KEY_CODE_BACKUP_FILE, + 'c', + InputOption::VALUE_REQUIRED, + 'Basename of the code backup file in var/backups' + ), + new InputOption( + self::INPUT_KEY_MEDIA_BACKUP_FILE, + 'm', + InputOption::VALUE_REQUIRED, + 'Basename of the media backup file in var/backups' + ), + new InputOption( + self::INPUT_KEY_DB_BACKUP_FILE, + 'd', + InputOption::VALUE_REQUIRED, + 'Basename of the db backup file in var/backups' + ), + ]; + $this->setName('setup:rollback') + ->setDescription('Rolls back Magento Application codebase, media and database') + ->setDefinition($options); + parent::configure(); + } + + /** + * @inheritDoc + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (!$this->deploymentConfig->isAvailable() && ($input->getOption(self::INPUT_KEY_MEDIA_BACKUP_FILE) + || $input->getOption(self::INPUT_KEY_DB_BACKUP_FILE)) + ) { + $output->writeln("No information is available: the Magento application is not installed."); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + + return $this->maintenanceModeEnabler->executeInMaintenanceMode( + function () use ($input, $output) { + try { + $helper = $this->getHelper('question'); + $question = new ConfirmationQuestion( + 'You are about to remove current code and/or database tables. Are you sure?[y/N]', + false + ); + if (!$helper->ask($input, $output, $question) && $input->isInteractive()) { + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + $questionKeep = new ConfirmationQuestion( + 'Do you want to keep the backups?[y/N]', + false + ); + $keepSourceFile = $helper->ask($input, $output, $questionKeep); + + $this->doRollback($input, $output, $keepSourceFile); + $output->writeln('Please set file permission of bin/magento to executable'); + + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } catch (\Exception $e) { + $output->writeln('' . $e->getMessage() . ''); + // we must have an exit code higher than zero to indicate something was wrong + return \Magento\Framework\Console\Cli::RETURN_FAILURE; + } + }, + $output, + false + ); + } + + /** + * Check rollback options and rolls back appropriately + * + * @param InputInterface $input + * @param OutputInterface $output + * @param boolean $keepSourceFile + * @return void + * @throws \InvalidArgumentException + */ + private function doRollback(InputInterface $input, OutputInterface $output, $keepSourceFile) + { + $inputOptionProvided = false; + $rollbackHandler = $this->backupRollbackFactory->create($output); + if ($input->getOption(self::INPUT_KEY_CODE_BACKUP_FILE)) { + $rollbackHandler->codeRollback( + $input->getOption(self::INPUT_KEY_CODE_BACKUP_FILE), + Factory::TYPE_FILESYSTEM, + $keepSourceFile + ); + $inputOptionProvided = true; + } + if ($input->getOption(self::INPUT_KEY_MEDIA_BACKUP_FILE)) { + $rollbackHandler->codeRollback( + $input->getOption(self::INPUT_KEY_MEDIA_BACKUP_FILE), + Factory::TYPE_MEDIA, + $keepSourceFile + ); + $inputOptionProvided = true; + } + if ($input->getOption(self::INPUT_KEY_DB_BACKUP_FILE)) { + $this->setAreaCode(); + $rollbackHandler->dbRollback($input->getOption(self::INPUT_KEY_DB_BACKUP_FILE), $keepSourceFile); + $inputOptionProvided = true; + } + if (!$inputOptionProvided) { + throw new \InvalidArgumentException( + 'Not enough information provided to roll back.' + ); + } + } + + /** + * Sets area code to start a session for database backup and rollback + * + * @return void + */ + private function setAreaCode() + { + $areaCode = 'adminhtml'; + /** @var \Magento\Framework\App\State $appState */ + $appState = $this->objectManager->get(\Magento\Framework\App\State::class); + $appState->setAreaCode($areaCode); + /** @var \Magento\Framework\ObjectManager\ConfigLoaderInterface $configLoader */ + $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class); + $this->objectManager->configure($configLoader->load($areaCode)); + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/UninstallCommand.php b/magento/setup/src/Magento/Setup/Console/Command/UninstallCommand.php new file mode 100644 index 0000000..0163ef3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/UninstallCommand.php @@ -0,0 +1,55 @@ +installerFactory = $installerFactory; + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('setup:uninstall') + ->setDescription('Uninstalls the Magento application'); + parent::configure(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $helper = $this->getHelper('question'); + $question = new ConfirmationQuestion('Are you sure you want to uninstall Magento?[y/N]', false); + + if ($helper->ask($input, $output, $question) || !$input->isInteractive()) { + $installer = $this->installerFactory->create(new ConsoleLogger($output)); + $installer->uninstall(); + } + return \Magento\Framework\Console\Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php b/magento/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php new file mode 100644 index 0000000..75097b3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Command/UpgradeCommand.php @@ -0,0 +1,180 @@ +installerFactory = $installerFactory; + $this->searchConfigFactory = $searchConfigFactory; + $this->deploymentConfig = $deploymentConfig ?: ObjectManager::getInstance()->get(DeploymentConfig::class); + $this->appState = $appState ?: ObjectManager::getInstance()->get(AppState::class); + $this->cache = $cache ?: ObjectManager::getInstance()->get(CacheInterface::class); + parent::__construct(); + } + + /** + * @inheritdoc + */ + protected function configure() + { + $options = [ + new InputOption( + self::INPUT_KEY_KEEP_GENERATED, + null, + InputOption::VALUE_NONE, + 'Prevents generated files from being deleted. ' . PHP_EOL . + 'We discourage using this option except when deploying to production. ' . PHP_EOL . + 'Consult your system integrator or administrator for more information.' + ), + new InputOption( + InstallCommand::CONVERT_OLD_SCRIPTS_KEY, + null, + InputOption::VALUE_OPTIONAL, + 'Allows to convert old scripts (InstallSchema, UpgradeSchema) to db_schema.xml format', + false + ), + new InputOption( + OperationsExecutor::KEY_SAFE_MODE, + null, + InputOption::VALUE_OPTIONAL, + 'Safe installation of Magento with dumps on destructive operations, like column removal' + ), + new InputOption( + OperationsExecutor::KEY_DATA_RESTORE, + null, + InputOption::VALUE_OPTIONAL, + 'Restore removed data from dumps' + ), + new InputOption( + DryRunLogger::INPUT_KEY_DRY_RUN_MODE, + null, + InputOption::VALUE_OPTIONAL, + 'Magento Installation will be run in dry-run mode', + false + ) + ]; + $this->setName('setup:upgrade') + ->setDescription('Upgrades the Magento application, DB data, and schema') + ->setDefinition($options); + parent::configure(); + } + + /** + * @inheritdoc + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + try { + $request = $input->getOptions(); + $keepGenerated = $input->getOption(self::INPUT_KEY_KEEP_GENERATED); + $installer = $this->installerFactory->create(new ConsoleLogger($output)); + $installer->updateModulesSequence($keepGenerated); + $searchConfig = $this->searchConfigFactory->create(); + $this->cache->clean(); + $searchConfig->validateSearchEngine(); + $installer->removeUnusedTriggers(); + $installer->installSchema($request); + $installer->installDataFixtures($request, true); + + if ($this->deploymentConfig->isAvailable()) { + $importConfigCommand = $this->getApplication()->find(ConfigImportCommand::COMMAND_NAME); + $arrayInput = new ArrayInput([]); + $arrayInput->setInteractive($input->isInteractive()); + $result = $importConfigCommand->run($arrayInput, $output); + if ($result === Cli::RETURN_FAILURE) { + throw new RuntimeException( + __('%1 failed. See previous output.', ConfigImportCommand::COMMAND_NAME) + ); + } + } + + if (!$keepGenerated && $this->appState->getMode() === AppState::MODE_PRODUCTION) { + $output->writeln( + 'Please re-run Magento compile command. Use the command "setup:di:compile"' + ); + } + $output->writeln( + "Media files stored outside of 'Media Gallery Allowed' folders" + . " will not be available to the media gallery." + ); + $output->writeln( + 'Please refer to Developer Guide for more details.' + ); + } catch (\Exception $e) { + $output->writeln('' . $e->getMessage() . ''); + return Cli::RETURN_FAILURE; + } + + return Cli::RETURN_SUCCESS; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/CommandList.php b/magento/setup/src/Magento/Setup/Console/CommandList.php new file mode 100644 index 0000000..ae65e82 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/CommandList.php @@ -0,0 +1,97 @@ +serviceManager = $serviceManager; + } + + /** + * Gets list of setup command classes + * + * @return string[] + */ + protected function getCommandsClasses() + { + return [ + \Magento\Setup\Console\Command\AdminUserCreateCommand::class, + \Magento\Setup\Console\Command\BackupCommand::class, + \Magento\Setup\Console\Command\ConfigSetCommand::class, + \Magento\Setup\Console\Command\DbDataUpgradeCommand::class, + \Magento\Setup\Console\Command\DbSchemaUpgradeCommand::class, + \Magento\Setup\Console\Command\DbStatusCommand::class, + \Magento\Setup\Console\Command\DependenciesShowFrameworkCommand::class, + \Magento\Setup\Console\Command\DependenciesShowModulesCircularCommand::class, + \Magento\Setup\Console\Command\DependenciesShowModulesCommand::class, + \Magento\Setup\Console\Command\DiCompileCommand::class, + \Magento\Setup\Console\Command\GenerateFixturesCommand::class, + \Magento\Setup\Console\Command\I18nCollectPhrasesCommand::class, + \Magento\Setup\Console\Command\I18nPackCommand::class, + \Magento\Setup\Console\Command\InfoAdminUriCommand::class, + \Magento\Setup\Console\Command\InfoBackupsListCommand::class, + \Magento\Setup\Console\Command\InfoCurrencyListCommand::class, + \Magento\Setup\Console\Command\InfoLanguageListCommand::class, + \Magento\Setup\Console\Command\InfoTimezoneListCommand::class, + \Magento\Setup\Console\Command\InstallCommand::class, + \Magento\Setup\Console\Command\InstallStoreConfigurationCommand::class, + \Magento\Setup\Console\Command\ModuleEnableCommand::class, + \Magento\Setup\Console\Command\ModuleDisableCommand::class, + \Magento\Setup\Console\Command\ModuleStatusCommand::class, + \Magento\Setup\Console\Command\ModuleUninstallCommand::class, + \Magento\Setup\Console\Command\ModuleConfigStatusCommand::class, + \Magento\Setup\Console\Command\RollbackCommand::class, + \Magento\Setup\Console\Command\UpgradeCommand::class, + \Magento\Setup\Console\Command\UninstallCommand::class, + \Magento\Setup\Console\Command\DeployStaticContentCommand::class + ]; + } + + /** + * Gets list of command instances. + * + * @return \Symfony\Component\Console\Command\Command[] + * @throws \Exception + */ + public function getCommands() + { + $commands = []; + + foreach ($this->getCommandsClasses() as $class) { + if (class_exists($class)) { + $commands[] = $this->serviceManager->get($class); + } else { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new \Exception('Class ' . $class . ' does not exist'); + } + } + + return $commands; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/CompilerPreparation.php b/magento/setup/src/Magento/Setup/Console/CompilerPreparation.php new file mode 100644 index 0000000..539e716 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/CompilerPreparation.php @@ -0,0 +1,157 @@ +serviceManager = $serviceManager; + $this->input = $input; + $this->filesystemDriver = $filesystemDriver; + } + + /** + * Determine whether a CLI command is for compilation, and if so, clear the directory. + * + * @throws GenerationDirectoryAccessException If generation directory is read-only + * @return void + */ + public function handleCompilerEnvironment() + { + if (!$this->shouldInvalidateCompiledDI()) { + return; + } + if (!$this->getGenerationDirectoryAccess()->check()) { + throw new GenerationDirectoryAccessException(); + } + + $mageInitParams = $this->serviceManager->get(InitParamListener::BOOTSTRAP_PARAM); + $mageDirs = isset($mageInitParams[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS]) + ? $mageInitParams[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] + : []; + $directoryList = new DirectoryList(BP, $mageDirs); + $compileDirList = [ + $directoryList->getPath(DirectoryList::GENERATED_CODE), + $directoryList->getPath(DirectoryList::GENERATED_METADATA), + ]; + + foreach ($compileDirList as $compileDir) { + if ($this->filesystemDriver->isExists($compileDir)) { + $this->filesystemDriver->deleteDirectory($compileDir); + } + } + } + + /** + * Retrieves command list with commands which invalidates compiler + * + * @return array + */ + private function getCompilerInvalidationCommands() + { + return [ + DiCompileCommand::NAME, + 'module:disable', + 'module:enable', + 'module:uninstall', + ]; + } + + /** + * Retrieves generation directory access checker. + * + * @return GenerationDirectoryAccess the generation directory access checker + */ + private function getGenerationDirectoryAccess() + { + if (null === $this->generationDirectoryAccess) { + $this->generationDirectoryAccess = new GenerationDirectoryAccess($this->serviceManager); + } + + return $this->generationDirectoryAccess; + } + + /** + * Checks if the command being executed should invalidate compiled DI. + * + * @return bool + */ + private function shouldInvalidateCompiledDI(): bool + { + $compilationCommands = $this->getCompilerInvalidationCommands(); + $cmdName = $this->input->getFirstArgument(); + $isHelpOption = $this->input->hasParameterOption('--help') || $this->input->hasParameterOption('-h'); + $invalidate = false; + if (!$isHelpOption) { + $invalidate = in_array($cmdName, $compilationCommands); + if (!$invalidate) { + // Check if it's an abbreviation of compilation commands. + $expr = preg_replace_callback( + '{([^:]+|)}', + function ($matches) { + return preg_quote($matches[1]) . '[^:]*'; + }, + ($cmdName ?? '') + ); + $commands = preg_grep('{^' . $expr . '$}', $compilationCommands); + if (empty($commands)) { + $commands = preg_grep('{^' . $expr . '$}i', $compilationCommands); + } + if (count($commands) === 1) { + $invalidate = true; + } + } + } + + return $invalidate; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/InputValidationException.php b/magento/setup/src/Magento/Setup/Console/InputValidationException.php new file mode 100644 index 0000000..d4ed5f1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/InputValidationException.php @@ -0,0 +1,17 @@ +input = $input; + $this->bufferedOutput = new BufferedOutput($output->getVerbosity(), false, clone $output->getFormatter()); + // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not. + $currentLength = $this->getTerminalWidth() - (int)(DIRECTORY_SEPARATOR === '\\'); + $this->lineLength = min($currentLength, self::MAX_LINE_LENGTH); + parent::__construct($output); + } + + /** + * Formats a message as a block of text. + * + * @param string|array $messages The message to write in the block + * @param string|null $type The block type (added in [] on first line) + * @param string|null $style The style to apply to the whole block + * @param string $prefix The prefix for the block + * @param bool $padding Whether to add vertical padding + * @return void + */ + public function block( + $messages, + string $type = null, + string $style = null, + string $prefix = ' ', + bool $padding = false + ) { + $messages = is_array($messages) ? array_values($messages) : [$messages]; + $this->autoPrependBlock(); + $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding)); + $this->newLine(); + } + + /** + * @inheritdoc + */ + public function title($message) + { + $this->autoPrependBlock(); + $bar = str_repeat('=', Helper::strlenWithoutDecoration($this->getFormatter(), $message)); + $this->writeln( + [ + sprintf(' %s', OutputFormatter::escapeTrailingBackslash($message)), + sprintf(' %s', $bar), + ] + ); + $this->newLine(); + } + + /** + * @inheritdoc + */ + public function section($message) + { + $this->autoPrependBlock(); + $bar = str_repeat('-', Helper::strlenWithoutDecoration($this->getFormatter(), $message)); + $this->writeln( + [ + sprintf(' %s', OutputFormatter::escapeTrailingBackslash($message)), + sprintf(' %s', $bar), + ] + ); + $this->newLine(); + } + + /** + * @inheritdoc + */ + public function listing(array $elements) + { + $this->autoPrependText(); + $elements = array_map( + function ($element) { + return sprintf(' * %s', $element); + }, + $elements + ); + + $this->writeln($elements); + $this->newLine(); + } + + /** + * @inheritdoc + */ + public function text($message) + { + $this->autoPrependText(); + $messages = is_array($message) ? array_values($message) : [$message]; + foreach ($messages as $singleMessage) { + $this->writeln(sprintf(' %s', $singleMessage)); + } + } + + /** + * Formats a command comment. + * + * @param string|array $message + * @param bool $padding + * @return void + */ + public function comment($message, $padding = false) + { + $this->block($message, null, 'comment', ' ', $padding); + } + + /** + * @inheritdoc + */ + public function success($message, $padding = true) + { + $this->block($message, 'SUCCESS', 'fg=black;bg=green', ' ', $padding); + } + + /** + * @inheritdoc + */ + public function error($message, $padding = true) + { + $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', $padding); + } + + /** + * @inheritdoc + */ + public function warning($message, $padding = true) + { + $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', $padding); + } + + /** + * @inheritdoc + */ + public function note($message, $padding = false) + { + $this->block($message, 'NOTE', 'fg=yellow', ' ', $padding); + } + + /** + * @inheritdoc + */ + public function caution($message, $padding = true) + { + $this->block($message, 'CAUTION', 'fg=black;bg=yellow', ' ! ', $padding); + } + + /** + * @inheritdoc + */ + public function table(array $headers, array $rows) + { + $style = clone Table::getStyleDefinition('symfony-style-guide'); + $style->setCellHeaderFormat('%s'); + + $table = new Table($this); + $table->setHeaders($headers); + $table->setRows($rows); + $table->setStyle($style); + + $table->render(); + $this->newLine(); + } + + /** + * @inheritdoc + * @throws \Symfony\Component\Console\Exception\InvalidArgumentException + */ + public function ask($question, $default = null, $validator = null, $maxAttempts = null) + { + $question = new Question($question, $default); + $question->setValidator($validator); + $question->setMaxAttempts($maxAttempts); + + return $this->askQuestion($question); + } + + /** + * @inheritdoc + * @throws \Symfony\Component\Console\Exception\LogicException + */ + public function askHidden($question, $validator = null) + { + $question = new Question($question); + + $question->setHidden(true); + $question->setValidator($validator); + + return $this->askQuestion($question); + } + + /** + * @inheritdoc + */ + public function confirm($question, $default = true) + { + return $this->askQuestion(new ConfirmationQuestion($question, $default)); + } + + /** + * @inheritdoc + */ + public function choice($question, array $choices, $default = null) + { + if (null !== $default) { + $values = array_flip($choices); + $default = $values[$default]; + } + + return $this->askQuestion(new ChoiceQuestion($question, $choices, $default)); + } + + /** + * @inheritdoc + */ + public function progressStart($max = 0) + { + $this->progressBar = $this->createProgressBar($max); + $this->progressBar->start(); + } + + /** + * @inheritdoc + * @throws \Symfony\Component\Console\Exception\LogicException + * @throws \Symfony\Component\Console\Exception\RuntimeException + */ + public function progressAdvance($step = 1) + { + $this->getProgressBar()->advance($step); + } + + /** + * @inheritdoc + * @throws \Symfony\Component\Console\Exception\RuntimeException + */ + public function progressFinish() + { + $this->getProgressBar()->finish(); + $this->newLine(2); + $this->progressBar = null; + } + + /** + * @inheritdoc + */ + public function createProgressBar($max = 0) + { + $progressBar = parent::createProgressBar($max); + $progressBar->setEmptyBarCharacter(' '); + $progressBar->setProgressCharacter('>'); + $progressBar->setBarCharacter('='); + + return $progressBar; + } + + /** + * Ask user question. + * + * @param Question $question + * + * @return string + */ + public function askQuestion(Question $question) + { + if ($this->input->isInteractive()) { + $this->autoPrependBlock(); + } + + if (!$this->questionHelper) { + $this->questionHelper = new SymfonyQuestionHelper(); + } + + $answer = $this->questionHelper->ask($this->input, $this, $question); + + if ($this->input->isInteractive()) { + $this->newLine(); + $this->bufferedOutput->write(PHP_EOL); + } + + return $answer; + } + + /** + * Ask for an missing argument. + * + * @param string $argument + * @param string $question + * @param string|null $default + * @param callable|null $validator + * @param int|null $maxAttempts + * @param bool $comment + * @param string $commentFormat + * @throws \Symfony\Component\Console\Exception\InvalidArgumentException + */ + public function askForMissingArgument( + string $argument, + string $question, + string $default = null, + callable $validator = null, + int $maxAttempts = null, + bool $comment = null, + string $commentFormat = 'Argument [%s] set to: %s' + ) { + try { + if ($this->input->getArgument($argument) === null) { + $this->input->setArgument($argument, $this->ask($question, $default, $validator, $maxAttempts)); + } + $argumentValue = $this->input->getArgument($argument); + $validated = (is_callable($validator) ? $validator($argumentValue) : $argumentValue); + if ((bool)($comment ?? $this->isDebug())) { + $this->comment(sprintf($commentFormat, $argument, $validated)); + } + } catch (InputValidationException $e) { + $this->error('Validation Error: ' . $e->getMessage()); + $this->askForMissingArgument( + $argument, + $question, + $default, + $validator, + $maxAttempts, + $comment, + $commentFormat + ); + } + } + + /** + * Ask for an missing option. + * + * @param string $option + * @param string $question + * @param string|null $default + * @param callable|null $validator + * @param int|null $maxAttempts + * @param bool $comment + * @param string $commentFormat + * @throws \Symfony\Component\Console\Exception\InvalidArgumentException + */ + public function askForMissingOption( + string $option, + string $question, + string $default = null, + callable $validator = null, + int $maxAttempts = null, + bool $comment = null, + string $commentFormat = 'Option [%s] set to: %s' + ) { + try { + if (null === $this->input->getOption($option)) { + $this->input->setOption($option, $this->ask($question, $default, $validator, $maxAttempts)); + } + $optionValue = $this->input->getOption($option); + $validated = (is_callable($validator) ? $validator($optionValue) : $optionValue); + if ((bool)($comment ?? $this->isDebug())) { + $this->comment(sprintf($commentFormat, $option, $validated)); + } + } catch (InputValidationException $e) { + $this->error('Validation Error: ' . $e->getMessage()); + $this->askForMissingOption( + $option, + $question, + $default, + $validator, + $maxAttempts, + $comment, + $commentFormat + ); + } + } + + /** + * @inheritdoc + */ + public function writeln($messages, $type = self::OUTPUT_NORMAL) + { + parent::writeln($messages, $type); + $this->bufferedOutput->writeln($this->reduceBuffer($messages), $type); + } + + /** + * @inheritdoc + */ + public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) + { + parent::write($messages, $newline, $type); + $this->bufferedOutput->write($this->reduceBuffer($messages), $newline, $type); + } + + /** + * @inheritdoc + */ + public function newLine($count = 1) + { + parent::newLine($count); + $this->bufferedOutput->write(str_repeat(PHP_EOL, $count)); + } + + /** + * Get progress bar instance. + * + * @return ProgressBar + * @throws RuntimeException in case progress bar hasn't been instantiated yet. + */ + private function getProgressBar() + { + if (!$this->progressBar) { + throw new RuntimeException('The ProgressBar is not started.'); + } + + return $this->progressBar; + } + + /** + * Get terminal width. + * + * @return int + */ + private function getTerminalWidth() + { + $terminal = new Terminal(); + $width = $terminal->getWidth(); + + return $width ?: self::MAX_LINE_LENGTH; + } + + /** + * Add empty line before output element in case there were no empty lines before. + * + * @return void + */ + private function autoPrependBlock() + { + $chars = substr($this->bufferedOutput->fetch(), -2); + if (!isset($chars[0])) { + $this->newLine(); //empty history, so we should start with a new line. + } + //Prepend new line for each non LF chars (This means no blank line was output before) + $this->newLine(2 - substr_count($chars, PHP_EOL)); + } + + /** + * Add empty line before text(listing) output element. + * + * @return void + */ + private function autoPrependText() + { + $fetched = $this->bufferedOutput->fetch(); + //Prepend new line if last char isn't EOL: + if (PHP_EOL !== substr($fetched, -1)) { + $this->newLine(); + } + } + + /** + * Reduce buffer. + * + * @param array $messages + * @return array + */ + private function reduceBuffer($messages) + { + // We need to know if the two last chars are PHP_EOL + // Preserve the last 4 chars inserted (PHP_EOL on windows is two chars) in the history buffer + return array_map( + function ($value) { + return substr($value, -4); + }, + array_merge([$this->bufferedOutput->fetch()], (array)$messages) + ); + } + + /** + * Build output in block style. + * + * @param array $messages + * @param string|null $type + * @param string|null $style + * @param string $prefix + * @param bool $padding + * @return array + */ + private function createBlock( + array $messages, + string $type = null, + string $style = null, + string $prefix = ' ', + bool $padding = false + ) { + $indentLength = 0; + $prefixLength = Helper::strlenWithoutDecoration($this->getFormatter(), $prefix); + $lineIndentation = ''; + if (null !== $type) { + $type = sprintf('[%s] ', $type); + $indentLength = strlen($type); + $lineIndentation = str_repeat(' ', $indentLength); + } + $lines = $this->getBlockLines($messages, $prefixLength, $indentLength); + $firstLineIndex = 0; + if ($padding && $this->isDecorated()) { + $firstLineIndex = 1; + array_unshift($lines, ''); + $lines[] = ''; + } + foreach ($lines as $i => &$line) { + if (null !== $type) { + $line = $firstLineIndex === $i ? $type . $line : $lineIndentation . $line; + } + $line = $prefix . $line; + $multiplier = $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line); + $line .= str_repeat(' ', $multiplier); + if ($style) { + $line = sprintf('<%s>%s', $style, $line); + } + } + + return $lines; + } + + /** + * Wrap and add new lines for each element. + * + * @param array $messages + * @param int $prefixLength + * @param int $indentLength + * @return array + */ + private function getBlockLines( + array $messages, + int $prefixLength, + int $indentLength + ) { + $lines = []; + foreach ($messages as $key => $message) { + $message = OutputFormatter::escape($message); + $wordwrap = wordwrap($message, $this->lineLength - $prefixLength - $indentLength, PHP_EOL, true); + $lines[] = explode(PHP_EOL, $wordwrap); + if (count($messages) > 1 && $key < count($messages) - 1) { + $lines[][] = ''; + } + } + $lines = array_merge([], ...$lines); + + return $lines; + } +} diff --git a/magento/setup/src/Magento/Setup/Console/Style/MagentoStyleInterface.php b/magento/setup/src/Magento/Setup/Console/Style/MagentoStyleInterface.php new file mode 100644 index 0000000..a7aba31 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Console/Style/MagentoStyleInterface.php @@ -0,0 +1,17 @@ +get($requestedName); + } +} diff --git a/magento/setup/src/Magento/Setup/Exception.php b/magento/setup/src/Magento/Setup/Exception.php new file mode 100644 index 0000000..56f23cb --- /dev/null +++ b/magento/setup/src/Magento/Setup/Exception.php @@ -0,0 +1,16 @@ + + * {int} + */ +class AdminUsersFixture extends Fixture +{ + /** + * @var int + */ + protected $priority = 5; + + /** + * @var UserFactory + */ + private $userFactory; + + /** + * @var RoleFactory + */ + private $roleFactory; + + /** + * @var UserCollectionFactory + */ + private $userCollectionFactory; + + /** + * @var RulesFactory + */ + private $rulesFactory; + + /** + * @var RootResource + */ + private $rootResource; + + /** + * @param FixtureModel $fixtureModel + * @param UserFactory $userFactory + * @param UserCollectionFactory $userCollectionFactory + * @param RoleFactory $roleFactory + * @param RulesFactory $rulesFactory + * @param RootResource $rootResource + */ + public function __construct( + FixtureModel $fixtureModel, + UserFactory $userFactory, + UserCollectionFactory $userCollectionFactory, + RoleFactory $roleFactory, + RulesFactory $rulesFactory, + RootResource $rootResource + ) { + parent::__construct($fixtureModel); + $this->userFactory = $userFactory; + $this->roleFactory = $roleFactory; + $this->userCollectionFactory = $userCollectionFactory; + $this->rulesFactory = $rulesFactory; + $this->rootResource = $rootResource; + } + + /** + * {@inheritdoc} + */ + public function execute() + { + $adminUsersNumber = $this->fixtureModel->getValue('admin_users', 0); + $adminUsersStartIndex = $this->userCollectionFactory->create()->getSize(); + + if ($adminUsersStartIndex >= $adminUsersNumber) { + return; + } + + $role = $this->createAdministratorRole(); + + for ($i = $adminUsersStartIndex; $i <= $adminUsersNumber; $i++) { + $adminUser = $this->userFactory->create(); + $adminUser->setRoleId($role->getId()) + ->setEmail('admin' . $i . '@example.com') + ->setFirstName('Firstname') + ->setLastName('Lastname') + ->setUserName('admin' . $i) + ->setPassword('123123q') + ->setIsActive(1); + $adminUser->save(); + } + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating admin users'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'admin_users' => 'Admin Users' + ]; + } + + /** + * Create administrator role with all privileges. + * + * @return \Magento\Authorization\Model\Role + */ + private function createAdministratorRole() + { + $role = $this->roleFactory->create(); + $role->setParentId(0) + ->setTreeLevel(1) + ->setSortOrder(1) + ->setRoleType(Group::ROLE_TYPE) + ->setUserId(0) + ->setUserType(UserContextInterface::USER_TYPE_ADMIN) + ->setRoleName('Example Administrator'); + $role->save(); + + /** @var \Magento\Authorization\Model\Rules $rule */ + $rule = $this->rulesFactory->create(); + $rule->setRoleId($role->getId()) + ->setResourceId($this->rootResource->getId()) + ->setPrivilegies(null) + ->setPermission('allow'); + $rule->save(); + + return $role; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/AttributeSetFixture.php b/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/AttributeSetFixture.php new file mode 100644 index 0000000..b73c666 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/AttributeSetFixture.php @@ -0,0 +1,171 @@ +attributeRepository = $attributeRepository; + $this->attributeManagement = $attributeManagement; + $this->attributeFactory = $attributeFactory; + $this->optionFactory = $optionFactory; + $this->attributeSetFactory = $attributeSetFactory; + $this->attributeGroupFactory = $attributeGroupFactory; + $this->attributeSetManagement = $attributeSetManagement; + $this->attributeGroupRepository = $attributeGroupRepository; + } + + /** + * Create Attribute Set based on raw data. + * + * @param array $attributeSetData + * @param int $sortOrder + * @return array + */ + public function createAttributeSet(array $attributeSetData, $sortOrder = 3) + { + /** @var \Magento\Eav\Api\Data\AttributeSetInterface $attributeSet */ + $attributeSet = $this->attributeSetFactory->create(); + $attributeSet->setAttributeSetName($attributeSetData['name']); + $attributeSet->setEntityTypeId(ProductAttributeInterface::ENTITY_TYPE_CODE); + + try { + $attributeSet = $this->attributeSetManagement->create($attributeSet, 4); + } catch (\Exception $e) { + return $this->getFormattedAttributeSetData($attributeSetData); + } + $attributeSetId = $attributeSet->getAttributeSetId(); + + /** @var \Magento\Eav\Api\Data\AttributeGroupInterface $attributeGroup */ + $attributeGroup = $this->attributeGroupFactory->create(); + $attributeGroup->setAttributeGroupName($attributeSet->getAttributeSetName() . ' - Group'); + $attributeGroup->setAttributeSetId($attributeSetId); + $this->attributeGroupRepository->save($attributeGroup); + $attributeGroupId = $attributeGroup->getAttributeGroupId(); + + $attributesData = array_key_exists(0, $attributeSetData['attributes']['attribute']) + ? $attributeSetData['attributes']['attribute'] : [$attributeSetData['attributes']['attribute']]; + foreach ($attributesData as $attributeData) { + //Create Attribute + $optionsData = array_key_exists(0, $attributeData['options']['option']) + ? $attributeData['options']['option'] : [$attributeData['options']['option']]; + $options = []; + foreach ($optionsData as $optionData) { + $option = $this->optionFactory->create(['data' => $optionData]); + $options[] = $option; + } + + /** @var ProductAttributeInterface $attribute */ + $attribute = $this->attributeFactory->create(['data' => $attributeData]); + $attribute->setOptions($options); + $attribute->setNote('auto'); + + $productAttribute = $this->attributeRepository->save($attribute); + $attributeId = $productAttribute->getAttributeId(); + + //Associate Attribute to Attribute Set + $this->attributeManagement->assign($attributeSetId, $attributeGroupId, $attributeId, $sortOrder); + } + + return $this->getFormattedAttributeSetData($attributeSetData); + } + + /** + * Return formatted attribute set data + * + * @param array $attributeSetData + * @return array + */ + private function getFormattedAttributeSetData($attributeSetData) + { + $attributesData = array_key_exists(0, $attributeSetData['attributes']['attribute']) + ? $attributeSetData['attributes']['attribute'] : [$attributeSetData['attributes']['attribute']]; + $attributes = []; + foreach ($attributesData as $attributeData) { + $optionsData = array_key_exists(0, $attributeData['options']['option']) + ? $attributeData['options']['option'] : [$attributeData['options']['option']]; + $optionsData = array_map(function ($option) { + return $option['label']; + }, $optionsData); + $attributes[] = [ + 'name' => $attributeData['attribute_code'], + 'values' => $optionsData + ]; + } + + return [ + 'name' => $attributeSetData['name'], + 'attributes' => $attributes + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/Pattern.php b/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/Pattern.php new file mode 100644 index 0000000..2947bd3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/Pattern.php @@ -0,0 +1,99 @@ + 1, + 'is_visible_on_front' => 1, + 'is_visible_in_advanced_search' => 0, + 'attribute_code' => 'attribute_', + 'backend_type' => '', + 'is_searchable' => 0, + 'is_filterable' => 0, + 'is_filterable_in_search' => 0, + 'frontend_label' => 'Attribute ', + 'frontend_input' => 'select', + ]; + + /** + * Generate Data for Fixture to create an Attribute Set with specified pattern. + * + * @param string $name + * @param int $attributesPerSet + * @param int $optionsPerAttribute + * @param callable $attributePattern callback in f($index, $attributeData) format + * @return array + */ + public function generateAttributeSet( + $name, + $attributesPerSet, + $optionsPerAttribute, + $attributePattern = null + ) { + $attributeSet = [ + 'name' => $name, + 'attributes' => [] + ]; + for ($index = 1; $index <= $attributesPerSet; $index++) { + $attributeData = $this->generateAttribute( + $index, + is_array($optionsPerAttribute) ? $optionsPerAttribute[$index - 1] : $optionsPerAttribute + ); + if (is_callable($attributePattern)) { + $attributeData = $attributePattern($index, $attributeData); + } + $attributeSet['attributes']['attribute'][] = $attributeData; + } + + return $attributeSet; + } + + /** + * Generate Attributes for Set. + * + * @param int $index + * @param int $optionsPerAttribute + * @return array + */ + private function generateAttribute($index, $optionsPerAttribute) + { + $attribute = $this->attributePattern; // copy pattern + $attribute['attribute_code'] = $attribute['attribute_code'] . $index; + $attribute['frontend_label'] = $attribute['frontend_label'] . $index; + $attribute['options'] = ['option' => $this->generateOptions($optionsPerAttribute)]; + $attribute['default_value'] = $attribute['options']['option'][0]['value']; + return $attribute; + } + + /** + * Generate Options for Attribute. + * + * @param int $optionsPerAttribute + * @return array + */ + private function generateOptions($optionsPerAttribute) + { + $options = []; + for ($index = 1; $index <= $optionsPerAttribute; $index++) { + $options[] = [ + 'label' => 'option ' . $index, + 'value' => 'option_' . $index + ]; + } + + return $options; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/SwatchesGenerator.php b/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/SwatchesGenerator.php new file mode 100644 index 0000000..56263d0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/AttributeSet/SwatchesGenerator.php @@ -0,0 +1,145 @@ +swatchHelper = $swatchHelper; + $this->imagesGeneratorFactory = $imagesGeneratorFactory; + } + + /** + * Generates data for Swatch Attribute of the required type + * + * @param int $optionCount + * @param string $data + * @param string $type + * @return array + */ + public function generateSwatchData($optionCount, $data, $type) + { + if ($type === null) { + return []; + } + + $attribute['swatch_input_type'] = Swatch::SWATCH_INPUT_TYPE_VISUAL; + $attribute['swatchvisual']['value'] = array_reduce( + range(1, $optionCount), + function ($values, $index) use ($optionCount, $data, $type) { + if ($type === 'image') { + $values['option_' . $index] = $this->generateSwatchImage($data . $index); + } + if ($type === 'color') { + $values['option_' . $index] = $this->generateSwatchColor($index / $optionCount); + } + return $values; + }, + [] + ); + $attribute['optionvisual']['value'] = array_reduce( + range(1, $optionCount), + function ($values, $index) { + $values['option_' . $index] = ['option ' . $index]; + return $values; + }, + [] + ); + + return $attribute; + } + + /** + * Generate hex-coded color for Swatch Attribute based on provided index + * + * Colors will change gradually according to index value. + * + * @param int $index + * @return string + */ + private function generateSwatchColor($index) + { + return '#' . str_repeat(dechex(255 * $index), 3); + } + + /** + * Generate and save image for Swatch Attribute + * + * Image is generated with a set background color rgb(240, 240, 240), random foreground color, and pattern which + * is based on the binary representation of $data. + * + * @param string $data String value to be used for generation. + * @return string Path to the image file. + */ + private function generateSwatchImage($data) + { + if ($this->imagesGenerator === null) { + $this->imagesGenerator = $this->imagesGeneratorFactory->create(); + } + + // phpcs:ignore Magento2.Security.InsecureFunction + $imageName = md5($data) . '.jpg'; + $this->imagesGenerator->generate([ + 'image-width' => self::GENERATED_SWATCH_WIDTH, + 'image-height' => self::GENERATED_SWATCH_HEIGHT, + 'image-name' => $imageName + ]); + + $imagePath = substr($this->swatchHelper->moveImageFromTmp($imageName), 1); + $this->swatchHelper->generateSwatchVariations($imagePath); + + return $imagePath; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/AttributeSetsFixture.php b/magento/setup/src/Magento/Setup/Fixtures/AttributeSetsFixture.php new file mode 100644 index 0000000..4e0a7be --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/AttributeSetsFixture.php @@ -0,0 +1,111 @@ + + * {int} + * + * + * {int} + * + * + * {int} + * + * @see setup/performance-toolkit/profiles/ce/small.xml + */ +class AttributeSetsFixture extends Fixture +{ + /** Name of generated attribute set */ + const PRODUCT_SET_NAME = 'Product Set '; + + /** + * @var int + */ + protected $priority = 25; + + /** + * @var AttributeSet\AttributeSetFixture + */ + private $attributeSetsFixture; + + /** + * @var AttributeSet\Pattern + */ + private $pattern; + + /** + * @param FixtureModel $fixtureModel + * @param AttributeSet\AttributeSetFixture $attributeSetsFixture + * @param AttributeSet\Pattern $pattern + */ + public function __construct( + FixtureModel $fixtureModel, + AttributeSet\AttributeSetFixture $attributeSetsFixture, + \Magento\Setup\Fixtures\AttributeSet\Pattern $pattern + ) { + parent::__construct($fixtureModel); + $this->attributeSetsFixture = $attributeSetsFixture; + $this->pattern = $pattern; + } + + /** + * {@inheritdoc} + */ + public function execute() + { + $attributeSets = $this->fixtureModel->getValue('attribute_sets', null); + if ($attributeSets !== null) { + foreach ($attributeSets['attribute_set'] as $attributeSetData) { + $this->attributeSetsFixture->createAttributeSet($attributeSetData); + } + } + + $attributeSetsCount = $this->fixtureModel->getValue('product_attribute_sets', null); + if ($attributeSetsCount !== null) { + for ($index = 1; $index <= $attributeSetsCount; $index++) { + $this->attributeSetsFixture->createAttributeSet( + $this->pattern->generateAttributeSet( + self::PRODUCT_SET_NAME . $index, + $this->fixtureModel->getValue('product_attribute_sets_attributes', 3), + $this->fixtureModel->getValue('product_attribute_sets_attributes_values', 3), + function ($attributeIndex, $attribute) use ($index) { + return array_replace_recursive( + $attribute, + [ + 'attribute_code' => "attribute_set{$index}_" . $attributeIndex, + ] + ); + } + ) + ); + } + } + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating attribute sets'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'attribute_sets' => 'Attribute Sets (Default)', + 'product_attribute_sets' => 'Attribute Sets (Extra)' + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/BundleProductsFixture.php b/magento/setup/src/Magento/Setup/Fixtures/BundleProductsFixture.php new file mode 100644 index 0000000..d93d122 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/BundleProductsFixture.php @@ -0,0 +1,265 @@ +{products amount} + * {bundle product options amount} + * {amount of simple products per each option} + * + * Products will be uniformly distributed per categories and websites + * If node "assign_entities_to_all_websites" from profile is set to "1" then products will be assigned to all websites + * + * @see setup/performance-toolkit/profiles/ce/small.xml + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class BundleProductsFixture extends Fixture +{ + /** + * Bundle sku pattern with entity number and suffix. Suffix equals "{options}-{variations_per_option}" + */ + const SKU_PATTERN = 'Bundle Product %s - %s'; + + /** + * @var int + */ + protected $priority = 42; + + /** + * @var \Magento\Setup\Model\FixtureGenerator\ProductGenerator + */ + private $productGenerator; + + /** + * @var \Magento\Setup\Model\FixtureGenerator\BundleProductGenerator + */ + private $bundleProductGenerator; + + /** + * @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory + */ + private $productCollectionFactory; + + /** + * @var int + */ + private $productStartIndex; + + /** + * @var ProductsAmountProvider + */ + private $productsAmountProvider; + + /** + * @var WebsiteCategoryProvider + */ + private $websiteCategoryProvider; + + /** + * @var PriceProvider + */ + private $priceProvider; + + /** + * @param FixtureModel $fixtureModel + * @param \Magento\Setup\Model\FixtureGenerator\ProductGenerator $productGenerator + * @param \Magento\Setup\Model\FixtureGenerator\BundleProductGenerator $bundleProductGenerator + * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory + * @param ProductsAmountProvider $productsAmountProvider + * @param WebsiteCategoryProvider $websiteCategoryProvider + * @param PriceProvider $priceProvider + */ + public function __construct( + FixtureModel $fixtureModel, + \Magento\Setup\Model\FixtureGenerator\ProductGenerator $productGenerator, + \Magento\Setup\Model\FixtureGenerator\BundleProductGenerator $bundleProductGenerator, + \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, + ProductsAmountProvider $productsAmountProvider, + WebsiteCategoryProvider $websiteCategoryProvider, + PriceProvider $priceProvider + ) { + parent::__construct($fixtureModel); + $this->productGenerator = $productGenerator; + $this->bundleProductGenerator = $bundleProductGenerator; + $this->productCollectionFactory = $productCollectionFactory; + $this->productsAmountProvider = $productsAmountProvider; + $this->websiteCategoryProvider = $websiteCategoryProvider; + $this->priceProvider = $priceProvider; + } + + /** + * @inheritdoc + * + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + */ + public function execute() + { + $bundlesAmount = $this->fixtureModel->getValue('bundle_products', 0); + $bundleOptions = $this->fixtureModel->getValue('bundle_products_options', 1); + $bundleProductsPerOption = $this->fixtureModel->getValue('bundle_products_variation', 10); + $bundleOptionSuffix = $bundleOptions . '-' . $bundleProductsPerOption; + $variationCount = $bundleOptions * $bundleProductsPerOption; + $bundlesAmount = $this->productsAmountProvider->getAmount( + $bundlesAmount, + $this->getBundleSkuPattern($bundleOptionSuffix) + ); + + if (!$bundlesAmount) { + return; + } + $variationSkuClosure = function ($productId, $entityNumber) use ($bundleOptionSuffix, $variationCount) { + $productIndex = $this->getBundleProductIndex($entityNumber, $variationCount); + $variationIndex = $this->getBundleVariationIndex($entityNumber, $variationCount); + + return sprintf($this->getBundleOptionItemSkuPattern($bundleOptionSuffix), $productIndex, $variationIndex); + }; + $fixtureMap = [ + 'name' => $variationSkuClosure, + 'sku' => $variationSkuClosure, + 'price' => function ($index, $entityNumber) { + return $this->priceProvider->getPrice($entityNumber); + }, + 'website_ids' => function ($index, $entityNumber) use ($variationCount) { + $configurableIndex = $this->getBundleProductIndex($entityNumber, $variationCount); + + return $this->websiteCategoryProvider->getWebsiteIds($configurableIndex); + }, + 'visibility' => Visibility::VISIBILITY_NOT_VISIBLE, + ]; + $this->productGenerator->generate($bundlesAmount * $bundleOptions * $bundleProductsPerOption, $fixtureMap); + + $optionPriceType = [ + LinkInterface::PRICE_TYPE_FIXED, + LinkInterface::PRICE_TYPE_PERCENT, + ]; + $priceTypeClosure = function ($index) use ($optionPriceType) { + return $optionPriceType[$index % count($optionPriceType)]; + }; + $skuClosure = function ($index, $entityNumber) use ($bundleOptionSuffix) { + return sprintf( + $this->getBundleSkuPattern($bundleOptionSuffix), + $entityNumber + $this->getNewProductStartIndex() + ); + }; + $fixtureMap = [ + '_bundle_options' => $bundleOptions, + '_bundle_products_per_option' => $bundleProductsPerOption, + '_bundle_variation_sku_pattern' => sprintf( + $this->getBundleOptionItemSkuPattern($bundleOptionSuffix), + $this->getNewProductStartIndex(), + '%s' + ), + 'type_id' => Type::TYPE_CODE, + 'name' => $skuClosure, + 'sku' => $skuClosure, + 'meta_title' => $skuClosure, + 'price' => function ($index) use ($priceTypeClosure) { + // phpcs:ignore Magento2.Functions.DiscouragedFunction + return $priceTypeClosure($index) === LinkInterface::PRICE_TYPE_PERCENT + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + ? mt_rand(10, 90) + : $this->priceProvider->getPrice($index); + }, + 'priceType' => $priceTypeClosure, + 'website_ids' => function ($index, $entityNumber) { + return $this->websiteCategoryProvider->getWebsiteIds($entityNumber + $this->getNewProductStartIndex()); + }, + 'category_ids' => function ($index, $entityNumber) { + return $this->websiteCategoryProvider->getCategoryId($entityNumber + $this->getNewProductStartIndex()); + }, + ]; + $this->bundleProductGenerator->generate($bundlesAmount, $fixtureMap); + } + + /** + * Get sku pattern for bundle product option item + * + * @param string $bundleOptionSuffix + * @return string + */ + private function getBundleOptionItemSkuPattern($bundleOptionSuffix) + { + return $this->getBundleSkuPattern($bundleOptionSuffix) . ' - option %s'; + } + + /** + * Get sku pattern for bundle product. Replace suffix pattern with passed value + * + * @param string $bundleOptionSuffix + * @return string + */ + private function getBundleSkuPattern($bundleOptionSuffix) + { + return sprintf(self::SKU_PATTERN, '%s', $bundleOptionSuffix); + } + + /** + * Get start index for product number generation + * + * @return int + */ + private function getNewProductStartIndex() + { + if (null === $this->productStartIndex) { + $this->productStartIndex = $this->productCollectionFactory->create() + ->addFieldToFilter('type_id', Type::TYPE_CODE) + ->getSize() + 1; + } + + return $this->productStartIndex; + } + + /** + * Get bundle product index number + * + * @param int $entityNumber + * @param int $variationCount + * @return float + */ + private function getBundleProductIndex($entityNumber, $variationCount) + { + return floor($entityNumber / $variationCount) + $this->getNewProductStartIndex(); + } + + /** + * Get bundle variation index number + * + * @param int $entityNumber + * @param int $variationCount + * @return float + */ + private function getBundleVariationIndex($entityNumber, $variationCount) + { + return $entityNumber % $variationCount + 1; + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating bundle products'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'bundle_products' => 'Bundle products', + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/CartPriceRulesFixture.php b/magento/setup/src/Magento/Setup/Fixtures/CartPriceRulesFixture.php new file mode 100644 index 0000000..5d4d5dc --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/CartPriceRulesFixture.php @@ -0,0 +1,463 @@ + + * {int} + * + * + * {int} + * + * @see setup/performance-toolkit/profiles/ce/small.xml + */ +class CartPriceRulesFixture extends Fixture +{ + /** + * @var int + */ + protected $priority = 80; + + /** + * @var float + */ + protected $cartPriceRulesCount = 0; + + /** + * @var float + */ + protected $cartPriceRulesProductsFloor = 3; + + /** + * @var bool + */ + protected $cartRulesAdvancedType = false; + + /** + * @var \Magento\SalesRule\Model\RuleFactory + */ + private $ruleFactory; + + /** + * Constructor + * + * @param FixtureModel $fixtureModel + * @param \Magento\SalesRule\Model\RuleFactory|null $ruleFactory + */ + public function __construct( + FixtureModel $fixtureModel, + \Magento\SalesRule\Model\RuleFactory $ruleFactory = null + ) { + parent::__construct($fixtureModel); + $this->ruleFactory = $ruleFactory ?: $this->fixtureModel->getObjectManager() + ->get(\Magento\SalesRule\Model\RuleFactory::class); + } + + /** + * @inheritdoc + * @SuppressWarnings(PHPMD) + */ + public function execute() + { + $this->fixtureModel->resetObjectManager(); + $this->cartPriceRulesCount = $this->fixtureModel->getValue('cart_price_rules', 0); + if (!$this->cartPriceRulesCount) { + return; + } + + $this->cartRulesAdvancedType = $this->fixtureModel->getValue('cart_price_rules_advanced_type', false); + $this->cartPriceRulesProductsFloor = $this->fixtureModel->getValue( + 'cart_price_rules_floor', + 3 + ); + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->fixtureModel->getObjectManager()->create(\Magento\Store\Model\StoreManager::class); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->fixtureModel->getObjectManager()->get(\Magento\Catalog\Model\Category::class); + + //Get all websites + $categoriesArray = []; + $websites = $storeManager->getWebsites(); + foreach ($websites as $website) { + //Get all groups + $websiteGroups = $website->getGroups(); + foreach ($websiteGroups as $websiteGroup) { + $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); + $category->load($websiteGroupRootCategory); + $categoryResource = $category->getResource(); + //Get all categories + $resultsCategories = $categoryResource->getAllChildren($category); + foreach ($resultsCategories as $resultsCategory) { + $category->load($resultsCategory); + $structure = explode('/', $category->getPath()); + if (count($structure) > 2) { + $categoriesArray[] = [$category->getId(), $website->getId()]; + } + } + } + } + asort($categoriesArray); + $categoriesArray = array_values($categoriesArray); + + if ($this->cartRulesAdvancedType == false) { + $this->generateRules($this->ruleFactory, $categoriesArray); + } else { + $this->generateAdvancedRules($this->ruleFactory, $categoriesArray); + } + } + + /** + * Generate condition. + * + * @param int $ruleId + * @param array $categoriesArray + * @return array + */ + public function generateCondition($ruleId, $categoriesArray) + { + return [ + 'conditions' => [ + 1 => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1' => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Address::class, + 'attribute' => 'total_qty', + 'operator' => '>=', + 'value' => $this->cartPriceRulesProductsFloor + $ruleId, + ], + '1--2' => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product\Found::class, + 'value' => '1', + 'aggregator' => 'all', + 'new_child' => '', + ], + '1--2--1' => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product::class, + 'attribute' => 'category_ids', + 'operator' => '==', + 'value' => $categoriesArray[$ruleId % count($categoriesArray)][0], + ], + ], + 'actions' => [ + 1 => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + ], + ]; + } + + /** + * Generate rules. + * + * @param \Magento\SalesRule\Model\RuleFactory $ruleFactory + * @param array $categoriesArray + * @return void + */ + public function generateRules($ruleFactory, $categoriesArray) + { + for ($i = 0; $i < $this->cartPriceRulesCount; $i++) { + $ruleName = sprintf('Cart Price Rule %1$d', $i); + $data = [ + 'rule_id' => null, + 'product_ids' => '', + 'name' => $ruleName, + 'description' => '', + 'is_active' => '1', + 'website_ids' => $categoriesArray[$i % count($categoriesArray)][1], + 'customer_group_ids' => [ + 0 => '0', + 1 => '1', + 2 => '2', + 3 => '3', + ], + 'coupon_type' => '1', + 'coupon_code' => '', + 'uses_per_customer' => '', + 'from_date' => '', + 'to_date' => '', + 'sort_order' => '100', + 'is_rss' => '1', + 'rule' => $this->generateCondition($i, $categoriesArray), + 'simple_action' => 'by_percent', + 'discount_amount' => '10', + 'discount_qty' => '0', + 'discount_step' => '', + 'apply_to_shipping' => '0', + 'simple_free_shipping' => '0', + 'stop_rules_processing' => '1', + 'reward_points_delta' => '', + 'store_labels' => [ + 0 => '', + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + 11 => '', + ], + 'page' => '1', + 'limit' => '20', + 'in_banners' => '', + 'banner_id' => [ + 'from' => '', + 'to' => '', + ], + 'banner_name' => '', + 'visible_in' => '', + 'banner_is_enabled' => '', + 'related_banners' => [], + ]; + if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent' + && isset($data['discount_amount']) + ) { + $data['discount_amount'] = min(100, $data['discount_amount']); + } + if (isset($data['rule']['conditions'])) { + $data['conditions'] = $data['rule']['conditions']; + } + if (isset($data['rule']['actions'])) { + $data['actions'] = $data['rule']['actions']; + } + unset($data['rule']); + + $model = $ruleFactory->create(); + $model->loadPost($data); + $useAutoGeneration = (int)!empty($data['use_auto_generation']); + $model->setUseAutoGeneration($useAutoGeneration); + $model->save(); + } + } + + /** + * Generate advanced condition. + * + * @param int $ruleId + * @param array $categoriesArray + * @return array + */ + public function generateAdvancedCondition($ruleId, $categoriesArray) + { + // Generate only 200 region rules, the rest are based on category + if ($ruleId < ($this->cartPriceRulesCount - 200)) { + // Category + $firstCondition = [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product::class, + 'attribute' => 'category_ids', + 'operator' => '==', + 'value' => $categoriesArray[intdiv($ruleId, 4) % count($categoriesArray)][0], + ]; + + $subtotal = [0, 5, 10, 15]; + // Subtotal + $secondCondition = [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Address::class, + 'attribute' => 'base_subtotal', + 'operator' => '>=', + 'value' => $subtotal[$ruleId % 4], + ]; + + return [ + 'conditions' => [ + 1 => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1'=> [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product\Found::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1--1' => $firstCondition, + '1--2' => $secondCondition + ], + 'actions' => [ + 1 => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + ] + ]; + } else { + // Shipping Region + $regions = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', + 'Delaware', 'District of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', + 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', + 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', + 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', + 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', + 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', + 'Wisconsin', 'Wyoming']; + $firstCondition = [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Address::class, + 'attribute' => 'region', + 'operator' => '==', + 'value' => $regions[intdiv($ruleId, 4) % 50], + ]; + + $subtotals = [0, 5, 10, 15]; + // Subtotal + $secondCondition = [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Address::class, + 'attribute' => 'base_subtotal', + 'operator' => '>=', + 'value' => $subtotals[$ruleId % 4], + ]; + return [ + 'conditions' => [ + 1 => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1' => $firstCondition, + '1--2' => $secondCondition + ], + 'actions' => [ + 1 => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + ] + ]; + } + } + + /** + * Generate advanced rules. + * + * @param \Magento\SalesRule\Model\RuleFactory $ruleFactory + * @param array $categoriesArray + * @return void + */ + public function generateAdvancedRules($ruleFactory, $categoriesArray) + { + $j = 0; + for ($i = 0; $i < $this->cartPriceRulesCount; $i++) { + if ($i < ($this->cartPriceRulesCount - 200)) { + $ruleName = sprintf('Cart Price Advanced Catalog Rule %1$d', $j); + } else { + $ruleName = sprintf('Cart Price Advanced Region Rule %1$d', $j); + } + $j++; + $data = [ + 'rule_id' => null, + 'product_ids' => '', + 'name' => $ruleName, + 'description' => '', + 'is_active' => '1', + 'website_ids' => $categoriesArray[$i % count($categoriesArray)][1], + 'customer_group_ids' => [ + 0 => '0', + 1 => '1', + 2 => '2', + 3 => '3', + ], + 'coupon_type' => '1', + 'coupon_code' => '', + 'uses_per_customer' => '', + 'from_date' => '', + 'to_date' => '', + 'sort_order' => '50', + 'is_rss' => '1', + 'rule' => $this->generateAdvancedCondition($i, $categoriesArray), + 'simple_action' => 'cart_fixed', + 'discount_amount' => '1', + 'discount_qty' => '0', + 'discount_step' => '', + 'apply_to_shipping' => '0', + 'simple_free_shipping' => '0', + 'stop_rules_processing' => '0', + 'reward_points_delta' => '', + 'store_labels' => [ + 0 => '', + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + 11 => '', + ], + 'page' => '1', + 'limit' => '20', + 'in_banners' => '', + 'banner_id' => [ + 'from' => '', + 'to' => '', + ], + 'banner_name' => '', + 'visible_in' => '', + 'banner_is_enabled' => '', + 'related_banners' => [], + ]; + if (isset($data['simple_action']) && $data['simple_action'] == 'cart_fixed' + && isset($data['discount_amount']) + ) { + $data['discount_amount'] = min(1, $data['discount_amount']); + } + if (isset($data['rule']['conditions'])) { + $data['conditions'] = $data['rule']['conditions']; + } + if (isset($data['rule']['actions'])) { + $data['actions'] = $data['rule']['actions']; + } + unset($data['rule']); + + $model = $ruleFactory->create(); + $model->loadPost($data); + $useAutoGeneration = (int)!empty($data['use_auto_generation']); + $model->setUseAutoGeneration($useAutoGeneration); + $model->save(); + } + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating cart price rules'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'cart_price_rules' => 'Cart Price Rules' + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/CatalogPriceRulesFixture.php b/magento/setup/src/Magento/Setup/Fixtures/CatalogPriceRulesFixture.php new file mode 100644 index 0000000..4884fbb --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/CatalogPriceRulesFixture.php @@ -0,0 +1,161 @@ + + * {int} + * + * @see setup/performance-toolkit/profiles/ce/small.xml + */ +class CatalogPriceRulesFixture extends Fixture +{ + /** + * @var int + */ + protected $priority = 90; + + /** + * @inheritdoc + * + * @SuppressWarnings(PHPMD) + */ + public function execute() + { + $catalogPriceRulesCount = $this->fixtureModel->getValue('catalog_price_rules', 0); + if (!$catalogPriceRulesCount) { + return; + } + $this->fixtureModel->resetObjectManager(); + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->fixtureModel->getObjectManager()->create(\Magento\Store\Model\StoreManager::class); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->fixtureModel->getObjectManager()->get(\Magento\Catalog\Model\Category::class); + /** @var $model \Magento\CatalogRule\Model\Rule*/ + $model = $this->fixtureModel->getObjectManager()->get(\Magento\CatalogRule\Model\Rule::class); + /** @var \Magento\Framework\EntityManager\MetadataPool $metadataPool */ + $metadataPool = $this->fixtureModel->getObjectManager() + ->get(\Magento\Framework\EntityManager\MetadataPool::class); + $metadata = $metadataPool->getMetadata(\Magento\CatalogRule\Api\Data\RuleInterface::class); + + //Get all websites + $categoriesArray = []; + $websites = $storeManager->getWebsites(); + foreach ($websites as $website) { + //Get all groups + $websiteGroups = $website->getGroups(); + foreach ($websiteGroups as $websiteGroup) { + $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); + $category->load($websiteGroupRootCategory); + $categoryResource = $category->getResource(); + //Get all categories + $resultsCategories = $categoryResource->getAllChildren($category); + foreach ($resultsCategories as $resultsCategory) { + $category->load($resultsCategory); + $structure = explode('/', $category->getPath()); + if (count($structure) > 2) { + $categoriesArray[] = [$category->getId(), $website->getId()]; + } + } + } + } + asort($categoriesArray); + $categoriesArray = array_values($categoriesArray); + $linkField = $metadata->getLinkField(); + $idField = $metadata->getIdentifierField(); + + for ($i = 0; $i < $catalogPriceRulesCount; $i++) { + $ruleName = sprintf('Catalog Price Rule %1$d', $i); + $data = [ + $idField => null, + $linkField => null, + 'name' => $ruleName, + 'description' => '', + 'is_active' => '1', + 'website_ids' => $categoriesArray[$i % count($categoriesArray)][1], + 'customer_group_ids' => [ + 0 => '0', + 1 => '1', + 2 => '2', + 3 => '3', + ], + 'from_date' => '', + 'to_date' => '', + 'sort_order' => '25', + 'rule' => [ + 'conditions' => [ + 1 => [ + 'type' => \Magento\CatalogRule\Model\Rule\Condition\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1' => [ + 'type' => \Magento\CatalogRule\Model\Rule\Condition\Product::class, + 'attribute' => 'category_ids', + 'operator' => '==', + 'value' => $categoriesArray[$i % count($categoriesArray)][0], + ], + ], + ], + 'simple_action' => 'by_percent', + 'discount_amount' => '15', + 'stop_rules_processing' => '0', + 'page' => '1', + 'limit' => '20', + 'in_banners' => '1', + 'banner_id' => [ + 'from' => '', + 'to' => '', + ], + 'banner_name' => '', + 'visible_in' => '', + 'banner_is_enabled' => '', + 'related_banners' => [], + ]; + if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent' + && isset($data['discount_amount']) + ) { + $data['discount_amount'] = min(100, $data['discount_amount']); + } + if (isset($data['rule']['conditions'])) { + $data['conditions'] = $data['rule']['conditions']; + } + if (isset($data['rule']['actions'])) { + $data['actions'] = $data['rule']['actions']; + } + unset($data['rule']); + + $model->loadPost($data); + $useAutoGeneration = (int)!empty($data['use_auto_generation']); + $model->setUseAutoGeneration($useAutoGeneration); + $model->save(); + } + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating catalog price rules'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'catalog_price_rules' => 'Catalog Price Rules' + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/CategoriesFixture.php b/magento/setup/src/Magento/Setup/Fixtures/CategoriesFixture.php new file mode 100644 index 0000000..782f688 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/CategoriesFixture.php @@ -0,0 +1,258 @@ +{amount of categories} + * {Nesting level of categories} + * + * If config "assign_entities_to_all_websites" set to "0" then all categories will be + * uniformly distributed per root categories, else all categories assigned to one root category + */ +class CategoriesFixture extends Fixture +{ + /** + * @var StoreManager + */ + private $storeManager; + + /** + * @var CategoryFactory + */ + private $categoryFactory; + + /** + * @var CollectionFactory + */ + private $collectionFactory; + + /** + * @var int + */ + private $firstLevelCategoryIndex; + + /** + * @var array + */ + private $rootCategoriesIds; + + /** + * @var int + */ + private $categoriesNumber; + + /** + * @var int + */ + private $maxNestingLevel; + + /** + * CategoriesFixture constructor. + * @param FixtureModel $fixtureModel + * @param StoreManager $storeManager + * @param CategoryFactory $categoryFactory + * @param CollectionFactory $collectionFactory + */ + public function __construct( + FixtureModel $fixtureModel, + StoreManager $storeManager, + CategoryFactory $categoryFactory, + CollectionFactory $collectionFactory + ) { + parent::__construct($fixtureModel); + $this->storeManager = $storeManager; + $this->categoryFactory = $categoryFactory; + $this->collectionFactory = $collectionFactory; + } + + /** + * @var int + */ + protected $priority = 20; + + /** + * @inheritdoc + */ + public function execute() + { + $this->categoriesNumber = $this->getCategoriesAmount(); + if (!$this->categoriesNumber) { + return; + } + $this->maxNestingLevel = $this->fixtureModel->getValue('categories_nesting_level', 3); + + $categoriesNumberOnLevel = abs(ceil(pow($this->categoriesNumber, 1 / $this->maxNestingLevel) - 2)); + foreach ($this->getRootCategoriesIds() as $parentCategoryId) { + $category = $this->categoryFactory->create(); + $category->load($parentCategoryId); + // Need for generation url rewrites per all category store view + $category->setStoreId(Store::DEFAULT_STORE_ID); + $categoryIndex = 1; + $this->generateCategories( + $category, + $categoriesNumberOnLevel, + 1, + $categoryIndex + ); + } + } + + /** + * Generate categories + * + * @param Category $parentCategory + * @param int $categoriesNumberOnLevel + * @param int $nestingLevel + * @param int $categoryIndex + * @return void + */ + private function generateCategories( + Category $parentCategory, + $categoriesNumberOnLevel, + $nestingLevel, + &$categoryIndex + ) { + $maxCategoriesNumberOnLevel = $nestingLevel === 1 ? $this->categoriesNumber : $categoriesNumberOnLevel; + for ($i = 0; $i < $maxCategoriesNumberOnLevel && $categoryIndex <= $this->categoriesNumber; $i++) { + try { + $category = clone $parentCategory; + $category->setId(null) + ->setUrlKey(null) + ->setUrlPath(null) + ->setStoreId(Store::DEFAULT_STORE_ID) + ->setName($this->getCategoryName($parentCategory, $nestingLevel, $i)) + ->setParentId($parentCategory->getId()) + ->setLevel($parentCategory->getLevel() + 1) + ->setAvailableSortBy('name') + ->setIsAnchor($nestingLevel <= 2) + ->setDefaultSortBy('name') + ->setIsActive(true); + $category->save(); + $categoryIndex++; + if ($nestingLevel < $this->maxNestingLevel) { + $this->generateCategories( + $category, + $categoriesNumberOnLevel, + $nestingLevel + 1, + $categoryIndex + ); + } + } catch (\Magento\Framework\Exception\AlreadyExistsException $e) { + $categoryIndex++; + continue; + } catch (\Magento\Framework\DB\Adapter\DuplicateException $e) { + $categoryIndex++; + continue; + } + } + } + + /** + * Get category name based on parent category and current level + * + * @param Category $parentCategory + * @param int $nestingLevel + * @param int $index + * @return string + */ + private function getCategoryName($parentCategory, $nestingLevel, $index) + { + $categoryNameSuffix = $nestingLevel === 1 ? $this->getFirstLevelCategoryIndex() + $index : $index + 1; + return ($nestingLevel === 1 ? $this->getCategoryPrefix() . ' ' : $parentCategory->getName() . '.') + . $categoryNameSuffix; + } + + /** + * Get ids of root categories + * + * @return int[] + */ + private function getRootCategoriesIds() + { + if (null === $this->rootCategoriesIds) { + $this->rootCategoriesIds = []; + foreach ($this->storeManager->getGroups() as $storeGroup) { + $this->rootCategoriesIds[] = $storeGroup->getRootCategoryId(); + // in this case root category will be the same for all store groups + if ((bool)$this->fixtureModel->getValue('assign_entities_to_all_websites', false)) { + break; + } + } + } + + return $this->rootCategoriesIds; + } + + /** + * Get categories amount for generation + * + * @return int + */ + private function getCategoriesAmount() + { + $categoriesAmount = $this->collectionFactory->create()->getSize(); + $rootCategories = count($this->getRootCategoriesIds()); + $categoriesNumber = $this->fixtureModel->getValue('categories', 0) - ($categoriesAmount - $rootCategories - 1); + + return max( + 0, + ceil($categoriesNumber / $rootCategories) + ); + } + + /** + * Get next category index, which will be used as index of first-level category + * + * @return int + */ + private function getFirstLevelCategoryIndex() + { + if (null === $this->firstLevelCategoryIndex) { + $this->firstLevelCategoryIndex = $this->collectionFactory->create() + ->addFieldToFilter('level', 2) + ->getSize() + 1; + } + + return $this->firstLevelCategoryIndex; + } + + /** + * Get Category name prefix + * + * @return string + */ + private function getCategoryPrefix() + { + return 'Category'; + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating categories'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'categories' => 'Categories' + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/CategoryResolver.php b/magento/setup/src/Magento/Setup/Fixtures/CategoryResolver.php new file mode 100644 index 0000000..de0da80 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/CategoryResolver.php @@ -0,0 +1,104 @@ +storeManager = $storeManager; + $this->categoryFactory = $categoryFactory; + $this->collectionFactory = $collectionFactory; + $this->categoryRepository = $categoryRepository; + } + + /** + * Get category id + * + * @param int $websiteId + * @param string $categoryName + * @return int + */ + public function getCategory($websiteId, $categoryName) + { + $categoryKey = $websiteId . $categoryName; + + if (!isset($this->categories[$categoryKey])) { + $website = $this->storeManager->getWebsite($websiteId); + $rootCategoryId = $website->getDefaultGroup()->getRootCategoryId(); + $website->getDefaultGroup()->getStoreId(); + $category = $this->collectionFactory->create() + ->addFieldToFilter('parent_id', $rootCategoryId) + ->addFieldToFilter('name', $categoryName) + ->fetchItem(); + if ($category && $category->getId()) { + $this->categories[$categoryKey] = $category->getId(); + } else { + $category = $this->categoryFactory->create( + [ + 'data' => [ + 'parent_id' => $rootCategoryId, + 'name' => $categoryName, + 'position' => 1, + 'is_active' => true, + 'available_sort_by' => ['position', 'name'], + 'url_key' => $categoryName . '-' . $websiteId + ] + ] + ); + $category = $this->categoryRepository->save($category); + $this->categories[$categoryKey] = $category->getId(); + } + } + + return $this->categories[$categoryKey]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/ConfigsApplyFixture.php b/magento/setup/src/Magento/Setup/Fixtures/ConfigsApplyFixture.php new file mode 100644 index 0000000..6c6fdbd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/ConfigsApplyFixture.php @@ -0,0 +1,68 @@ +fixtureModel->getValue('configs', []); + if (empty($configs)) { + return; + } + $this->fixtureModel->resetObjectManager(); + + foreach ($configs['config'] as $config) { + $backendModel = isset($config['backend_model']) + ? + $config['backend_model'] : \Magento\Framework\App\Config\Value::class; + /** + * @var \Magento\Framework\App\Config\ValueInterface $configData + */ + $configData = $this->fixtureModel->getObjectManager()->create($backendModel); + $configData->setPath($config['path']) + ->setScope($config['scope']) + ->setScopeId($config['scopeId']) + ->setValue($config['value']) + ->save(); + } + $this->fixtureModel->getObjectManager() + ->get(\Magento\Framework\App\CacheInterface::class) + ->clean([\Magento\Framework\App\Config::CACHE_TAG]); + + $this->fixtureModel->getObjectManager() + ->get(\Magento\Config\App\Config\Type\System::class) + ->clean(); + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Config Changes'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return []; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php b/magento/setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php new file mode 100644 index 0000000..e54cf7e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php @@ -0,0 +1,937 @@ +{products amount} + * + * 2.1 Generate products based on existing attribute set: + * + * + * {Existing attribute set name} + * {Configurable sku pattern with %s} + * {Amount of configurable products} + * [{Category Name}] By default category name from CategoriesFixture will be used + * color|image Type of Swatch attribute + * + * + * + * 2.2 Generate products based on dynamically created attribute set with specified amount of attributes and options + * + * + * {Amount of attributes in configurable product} + * {Amount of options per attribute} + * {Configurable sku pattern with %s} + * {Amount of configurable products} + * [{Category Name}] By default category name from CategoriesFixture will be used + * color|image Type of Swatch attribute + * + * + * + * 2.3 Generate products based on dynamically created attribute set with specified configuration per each attribute + * + * + * + * + * + * {Amount of options per attribute} + * color|image Type of Swatch attribute + * + * + * + * {Amount of options per attribute} + * + * + * {Configurable sku pattern with %s} + * {Amount of configurable products} + * + * + * + * Products will be uniformly distributed per categories and websites + * If node "assign_entities_to_all_websites" from profile is set to "1" then products will be assigned to all websites + * + * @see setup/performance-toolkit/profiles/ce/small.xml + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.TooManyFields) + */ +class ConfigurableProductsFixture extends Fixture +{ + /** + * @var int + */ + protected $priority = 50; + + /** + * @var array + */ + private $searchConfig; + + /** + * @var DataGenerator + */ + private $dataGenerator; + + /** + * @var AttributeSet\AttributeSetFixture + */ + private $attributeSetsFixture; + + /** + * @var AttributeSet\Pattern + */ + private $attributePattern; + + /** + * @var ProductGenerator + */ + private $productGenerator; + + /** + * @var CollectionFactory + */ + private $attributeCollectionFactory; + + /** + * @var ConfigurableProductGenerator + */ + private $configurableProductGenerator; + + /** + * @var ProductCollectionFactory + */ + private $productCollectionFactory; + + /** + * @var int + */ + private $productStartIndex; + + /** + * @var ProductsAmountProvider + */ + private $productsAmountProvider; + + /** + * @var CategoryResolver + */ + private $categoryResolver; + + /** + * @var WebsiteCategoryProvider + */ + private $websiteCategoryProvider; + + /** + * @var PriceProvider + */ + private $priceProvider; + + /** + * @var \Magento\Setup\Fixtures\AttributeSet\SwatchesGenerator + */ + private $swatchesGenerator; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + + /** + * @param FixtureModel $fixtureModel + * @param AttributeSet\AttributeSetFixture $attributeSetsFixture + * @param AttributeSet\Pattern $attributePattern + * @param ProductGenerator $productGenerator + * @param CollectionFactory $attributeCollectionFactory + * @param ConfigurableProductGenerator $configurableProductGenerator + * @param ProductCollectionFactory $collectionFactory + * @param ProductsAmountProvider $productsAmountProvider + * @param CategoryResolver $categoryResolver + * @param WebsiteCategoryProvider $websiteCategoryProvider + * @param PriceProvider $priceProvider + * @param AttributeSet\SwatchesGenerator $swatchesGenerator + * @param \Magento\Framework\Serialize\SerializerInterface $serializer + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ + public function __construct( + FixtureModel $fixtureModel, + \Magento\Setup\Fixtures\AttributeSet\AttributeSetFixture $attributeSetsFixture, + \Magento\Setup\Fixtures\AttributeSet\Pattern $attributePattern, + ProductGenerator $productGenerator, + CollectionFactory $attributeCollectionFactory, + ConfigurableProductGenerator $configurableProductGenerator, + ProductCollectionFactory $collectionFactory, + ProductsAmountProvider $productsAmountProvider, + CategoryResolver $categoryResolver, + WebsiteCategoryProvider $websiteCategoryProvider, + PriceProvider $priceProvider, + \Magento\Setup\Fixtures\AttributeSet\SwatchesGenerator $swatchesGenerator, + \Magento\Framework\Serialize\SerializerInterface $serializer + ) { + parent::__construct($fixtureModel); + $this->attributeSetsFixture = $attributeSetsFixture; + $this->attributePattern = $attributePattern; + $this->productGenerator = $productGenerator; + $this->attributeCollectionFactory = $attributeCollectionFactory; + $this->configurableProductGenerator = $configurableProductGenerator; + $this->productCollectionFactory = $collectionFactory; + $this->productsAmountProvider = $productsAmountProvider; + $this->categoryResolver = $categoryResolver; + $this->websiteCategoryProvider = $websiteCategoryProvider; + $this->priceProvider = $priceProvider; + $this->swatchesGenerator = $swatchesGenerator; + $this->serializer = $serializer; + } + + /** + * @inheritdoc + * + * @SuppressWarnings(PHPMD) + */ + public function execute() + { + if (!$this->fixtureModel->getValue('configurable_products', [])) { + return; + } + $simpleProductsCount = $this->fixtureModel->getValue('simple_products', 0); + $maxAmountOfWordsDescription = $this->getSearchConfigValue('max_amount_of_words_description'); + $maxAmountOfWordsShortDescription = $this->getSearchConfigValue('max_amount_of_words_short_description'); + $minAmountOfWordsDescription = $this->getSearchConfigValue('min_amount_of_words_description'); + $minAmountOfWordsShortDescription = $this->getSearchConfigValue('min_amount_of_words_short_description'); + + foreach ($this->getConfigurableProductConfig() as $configurableConfig) { + $configurableSku = $configurableConfig['sku']; + $productAmount = $this->productsAmountProvider->getAmount( + $configurableConfig['products'], + $configurableSku + ); + if (!$productAmount) { + continue; + } + $searchTerms = $this->getSearchTerms(); + $shortDescriptionClosure = $this->getDescriptionClosure( + $searchTerms, + $simpleProductsCount, + $productAmount, + $maxAmountOfWordsShortDescription, + $minAmountOfWordsShortDescription, + 'shortDescription' + ); + $descriptionClosure = $this->getDescriptionClosure( + $searchTerms, + $simpleProductsCount, + $productAmount, + $maxAmountOfWordsDescription, + $minAmountOfWordsDescription, + 'description' + ); + $variationCount = $configurableConfig['variationCount']; + $attributeSet = $configurableConfig['attributeSet']; + $variationSkuClosure = function ($productId, $entityNumber) use ($configurableSku, $variationCount) { + $variationIndex = $this->getConfigurableVariationIndex($entityNumber, $variationCount); + $productId = $this->getConfigurableProductIndex($entityNumber, $variationCount); + + return sprintf($this->getConfigurableOptionSkuPattern($configurableSku), $productId, $variationIndex); + }; + $fixture = [ + 'name' => $variationSkuClosure, + 'sku' => $variationSkuClosure, + 'price' => function ($index, $entityNumber) { + return $this->priceProvider->getPrice($entityNumber); + }, + 'website_ids' => function ($index, $entityNumber) use ($variationCount) { + $configurableIndex = $this->getConfigurableProductIndex($entityNumber, $variationCount); + + return $this->websiteCategoryProvider->getWebsiteIds($configurableIndex); + }, + 'attribute_set_id' => $attributeSet['id'], + 'additional_attributes' => $this->getAdditionalAttributesClosure( + $attributeSet['attributes'], + $variationCount + ), + 'visibility' => Visibility::VISIBILITY_NOT_VISIBLE, + ]; + $this->productGenerator->generate($productAmount * $variationCount, $fixture); + + $skuClosure = function ($productId, $entityNumber) use ($configurableSku) { + return sprintf($configurableSku, $entityNumber + $this->getNewProductStartIndex()); + }; + $fixture = [ + '_variation_sku_pattern' => $this->getFirstVariationSkuPattern($configurableConfig), + '_attributes_count' => count($attributeSet['attributes']), + '_variation_count' => $variationCount, + '_attributes' => $attributeSet['attributes'], + 'type_id' => Configurable::TYPE_CODE, + 'name' => $skuClosure, + 'sku' => $skuClosure, + 'description' => $descriptionClosure, + 'short_description' => $shortDescriptionClosure, + 'attribute_set_id' => $attributeSet['id'], + 'website_ids' => $this->getConfigurableWebsiteIdsClosure(), + 'category_ids' => $configurableConfig['category'], + 'meta_keyword' => $skuClosure, + 'meta_title' => $skuClosure, + ]; + + $this->configurableProductGenerator->generate($productAmount, $fixture); + } + } + + /** + * Get the closure to return the website IDs. + * + * @return \Closure + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + */ + private function getConfigurableWebsiteIdsClosure() + { + return function ($index, $entityNumber) { + return $this->websiteCategoryProvider->getWebsiteIds($entityNumber + $this->getNewProductStartIndex()); + }; + } + + /** + * Get product distribution per attribute sets for default attribute sets + * + * @param array $defaultAttributeSets + * @param int $configurableProductsCount + * @return array + */ + private function getDefaultAttributeSetsConfig(array $defaultAttributeSets, $configurableProductsCount) + { + $attributeSetClosure = function ($index) use ($defaultAttributeSets) { + $attributeSetAmount = count(array_keys($defaultAttributeSets)); + // phpcs:ignore + mt_srand($index); + + // phpcs:ignore Magento2.Functions.DiscouragedFunction + return $attributeSetAmount > ($index - 1) % (int)$this->fixtureModel->getValue('categories', 30) + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + ? array_keys($defaultAttributeSets)[mt_rand(0, $attributeSetAmount - 1)] + : 'Default'; + }; + $productsPerSet = []; + for ($i = 1; $i <= $configurableProductsCount; $i++) { + $attributeSet = $attributeSetClosure($i); + if (!isset($productsPerSet[$attributeSet])) { + $productsPerSet[$attributeSet] = 0; + } + $productsPerSet[$attributeSet]++; + } + $configurableConfig = []; + foreach ($defaultAttributeSets as $attributeSetName => $attributeSet) { + $skuSuffix = $attributeSetName === 'Default' ? '' : ' - ' . $attributeSetName; + $configurableConfig[] = [ + 'attributeSet' => $attributeSetName, + 'products' => $productsPerSet[$attributeSetName], + 'sku' => 'Configurable Product %s' . $skuSuffix, + ]; + } + + return $configurableConfig; + } + + /** + * Get sku pattern in format "{configurable-sku}{configurable-index}-option 1" for get associated product ids + * + * @param array $configurableConfig + * @see \Magento\Setup\Model\FixtureGenerator\ConfigurableProductTemplateGenerator + * @return string + */ + private function getFirstVariationSkuPattern($configurableConfig) + { + $productIndex = $this->getConfigurableProductIndex(0, $configurableConfig['variationCount']); + + return sprintf($this->getConfigurableOptionSkuPattern($configurableConfig['sku']), $productIndex, 1); + } + + /** + * Get start product index which used in product name, sku, url generation + * + * @return int + */ + private function getNewProductStartIndex() + { + if (null === $this->productStartIndex) { + $this->productStartIndex = $this->productCollectionFactory->create() + ->addFieldToFilter('type_id', Configurable::TYPE_CODE) + ->getSize() + 1; + } + + return $this->productStartIndex; + } + + /** + * Get configurable product index number + * + * @param int $entityNumber + * @param int $variationCount + * @return float + */ + private function getConfigurableProductIndex($entityNumber, $variationCount) + { + return floor($entityNumber / $variationCount) + $this->getNewProductStartIndex(); + } + + /** + * Get configurable variation index number + * + * @param int $entityNumber + * @param int $variationCount + * @return float + */ + private function getConfigurableVariationIndex($entityNumber, $variationCount) + { + return $entityNumber % $variationCount + 1; + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating configurable products'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return []; + } + + /** + * @inheritdoc + * + * @param OutputInterface $output + * @return void + * @throws ValidatorException + */ + public function printInfo(OutputInterface $output) + { + if (!$this->fixtureModel->getValue('configurable_products', [])) { + return; + } + + $configurableProductConfig = $this->prepareConfigurableConfig( + $this->getDefaultAttributeSetsWithAttributes() + ); + $generalAmount = array_sum(array_column($configurableProductConfig, 'products')); + + $output->writeln(sprintf(' |- Configurable products: %s', $generalAmount)); + } + + /** + * Get default attribute sets with attributes. + * + * @see config/attributeSets.xml + * + * @return array + */ + private function getDefaultAttributeSetsWithAttributes() + { + $attributeSets = $this->fixtureModel->getValue('attribute_sets', null); + $attributeSetData = []; + + if ($attributeSets !== null && array_key_exists('attribute_set', $attributeSets)) { + foreach ($attributeSets['attribute_set'] as $attributeSet) { + $attributesData = array_key_exists(0, $attributeSet['attributes']['attribute']) + ? $attributeSet['attributes']['attribute'] : [$attributeSet['attributes']['attribute']]; + $attributes = []; + foreach ($attributesData as $attributeData) { + $values = []; + $optionsData = array_key_exists(0, $attributeData['options']['option']) + ? $attributeData['options']['option'] : [$attributeData['options']['option']]; + foreach ($optionsData as $optionData) { + $values[] = $optionData['label']; + } + + $attributes[] = ['name' => $attributeData['attribute_code'], 'values' => $values]; + } + $attributeSetData[$attributeSet['name']] = [ + 'name' => $attributeSet['name'], + 'attributes' => $attributes + ]; + } + } + + $attributeOptions = range(1, $this->getConfigurableProductsVariationsValue()); + array_walk( + $attributeOptions, + function (&$item, $key) { + $item = 'option ' . ($key + 1); + } + ); + $attributeSetData['Default'] = [ + 'name' => 'Default', + 'attributes' => [ + [ + 'name' => 'configurable_variation', + 'values' => $attributeOptions + ] + ] + ]; + + return $attributeSetData; + } + + /** + * Get configurable product configuration for generate products per attribute set + * + * @return array + * @throws ValidatorException + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + private function getConfigurableProductConfig() + { + $defaultAttributeSets = $this->getDefaultAttributeSetsWithAttributes(); + $configurableProductConfig = $this->prepareConfigurableConfig($defaultAttributeSets); + + $configurableProductConfig = array_map(function ($config) { + return array_merge( + [ + 'attributeSet' => null, + 'attributes' => null, + 'options' => null, + 'sku' => null, + 'category' => null, + 'swatches' => null, + ], + $config + ); + }, $configurableProductConfig); + + $skuPull = []; + foreach ($configurableProductConfig as $i => &$config) { + $attributeSet = $config['attributeSet']; + $attributes = $config['attributes']; + $options = (int)$config['options']; + if ($attributeSet && isset($defaultAttributeSets[$attributeSet])) { + // process default attribute sets + $attributeSet = $defaultAttributeSets[$attributeSet]; + $attributes = count($attributeSet['attributes']); + $options = count($attributeSet['attributes'][0]['values']); + } elseif (is_array($attributes)) { + $attributeSet = $this->getCustomAttributeSet($attributes); + $options = array_column($attributes, 'options'); + $attributes = count($attributes); + } elseif ($attributes && $options) { + $attributes = (int)$attributes; + // convert attributes and options to array for process custom attribute set creation + $attributesData = array_map(function ($options) use ($config) { + return ['options' => $options, 'swatches' => $config['swatches']]; + }, array_fill(0, $attributes, $options)); + + $attributeSet = $this->getCustomAttributeSet($attributesData); + } + + // do not process if any required option is missed + if (count(array_filter([$attributeSet, $attributes, $options])) !== 3) { + unset($configurableProductConfig[$i]); + continue; + } + + $config['sku'] = $this->getConfigurableSkuPattern($config, $attributeSet['name']); + $config['category'] = $this->getConfigurableCategory($config); + $config['attributeSet'] = $this->convertAttributesToDBFormat($attributeSet); + $config['attributes'] = $attributes; + $config['options'] = $options; + $config['variationCount'] = is_array($options) ? array_product($options) : pow($options, $attributes); + $skuPull[] = $config['sku']; + } + + if (count($skuPull) !== count(array_unique($skuPull))) { + throw new ValidatorException( + __("The configurable product's SKU pattern must be unique in an attribute set.") + ); + } + + return $configurableProductConfig; + } + + /** + * Prepare configuration. + * + * If amount of configurable products set in profile then return predefined attribute sets + * else return configuration from profile. + * + * @param array $defaultAttributeSets + * @return array + * @throws ValidatorException + */ + private function prepareConfigurableConfig($defaultAttributeSets) + { + $configurableConfigs = $this->fixtureModel->getValue('configurable_products', []); + $configurableConfigs = is_array($configurableConfigs) ? $configurableConfigs : (int)$configurableConfigs; + if (is_int($configurableConfigs)) { + $configurableConfigs = $this->getDefaultAttributeSetsConfig($defaultAttributeSets, $configurableConfigs); + } elseif (isset($configurableConfigs['config'])) { + if (!isset($configurableConfigs['config'][0])) { + // in case when one variation is passed + $configurableConfigs = [$configurableConfigs['config']]; + } else { + $configurableConfigs = $configurableConfigs['config']; + } + + foreach ($configurableConfigs as &$config) { + if (isset($config['attributes']) && is_array($config['attributes'])) { + if (!isset($config['attributes']['attribute'][0])) { + $config['attributes'] = [$config['attributes']['attribute']]; + } else { + $config['attributes'] = $config['attributes']['attribute']; + } + } + } + } else { + throw new ValidatorException( + __('The configurable product config is invalid. Verify the product and try again.') + ); + } + + return $configurableConfigs; + } + + /** + * Get closure to return configurable category. + * + * @param array $config + * @return \Closure + */ + private function getConfigurableCategory($config) + { + if (isset($config['category'])) { + return function ($index, $entityNumber) use ($config) { + $websiteClosure = $this->getConfigurableWebsiteIdsClosure(); + $websites = $websiteClosure($index, $entityNumber); + + return $this->categoryResolver->getCategory( + array_shift($websites), + $config['category'] + ); + }; + } else { + return function ($index, $entityNumber) { + return $this->websiteCategoryProvider->getCategoryId($entityNumber); + }; + } + } + + /** + * Get sku pattern. + * + * @param array $config + * @param string $attributeSetName + * @return string + */ + private function getConfigurableSkuPattern($config, $attributeSetName) + { + $sku = isset($config['sku']) ? $config['sku'] : null; + if (!$sku) { + $sku = 'Configurable Product ' . $attributeSetName . ' %s'; + } + if (false === strpos($sku, '%s')) { + $sku .= ' %s'; + } + + return $sku; + } + + /** + * Provide attribute set based on attributes configuration + * + * @param array $attributes + * @return array + */ + private function getCustomAttributeSet(array $attributes) + { + $attributeSetHash = crc32($this->serializer->serialize($attributes)); + $attributeSetName = sprintf('Dynamic Attribute Set %s', $attributeSetHash); + + $pattern = $this->attributePattern->generateAttributeSet( + $attributeSetName, + count($attributes), + array_column($attributes, 'options'), + function ($index, $attribute) use ($attributeSetName, $attributes, $attributeSetHash) { + $swatch = []; + $attributeCode = substr( + sprintf('ca_%s_%s', $index, $attributeSetHash), + 0, + Attribute::ATTRIBUTE_CODE_MAX_LENGTH + ); + $data = [ + 'attribute_code' => $attributeCode, + 'frontend_label' => 'Dynamic Attribute ' . $attributeCode, + ]; + + if (isset($attributes[$index - 1]['swatches'])) { + $data['is_visible_in_advanced_search'] = 1; + $data['is_searchable'] = 1; + $data['is_filterable'] = 1; + $data['is_filterable_in_search'] = 1; + $data['used_in_product_listing'] = 1; + + $swatch = $this->swatchesGenerator->generateSwatchData( + (int) $attributes[$index-1]['options'], + $attributeSetName . $index, + $attributes[$index-1]['swatches'] + ); + } + + return array_replace_recursive( + $attribute, + $data, + $swatch + ); + } + ); + + return $this->attributeSetsFixture->createAttributeSet($pattern); + } + + /** + * Get search configuration. + * + * @return array + */ + private function getSearchConfig() + { + if (!$this->searchConfig) { + $this->searchConfig = $this->fixtureModel->getValue('search_config', null); + } + return $this->searchConfig; + } + + /** + * Get value of search configuration property. + * + * @param string $name + * @return int|mixed + */ + private function getSearchConfigValue($name) + { + return $this->getSearchConfig() === null + ? 0 : ($this->getSearchConfig()[$name] === null ? 0 : $this->getSearchConfig()[$name]); + } + + /** + * Get search terms. + * + * @return array + */ + private function getSearchTerms() + { + $searchTerms = $this->fixtureModel->getValue('search_terms', null); + if ($searchTerms !== null) { + $searchTerms = array_key_exists(0, $searchTerms['search_term']) + ? $searchTerms['search_term'] : [$searchTerms['search_term']]; + } else { + $searchTerms = []; + } + return $searchTerms; + } + + /** + * Get configurable products variations value. + * + * @return int + */ + private function getConfigurableProductsVariationsValue() + { + return $this->fixtureModel->getValue('configurable_products_variation', 3); + } + + /** + * Get additional attributes closure. + * + * @param array $attributes + * @param int $variationCount + * @return \Closure + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + */ + private function getAdditionalAttributesClosure(array $attributes, $variationCount) + { + $optionsPerAttribute = array_map(function ($attr) { + return count($attr['values']); + }, $attributes); + $variationsMatrix = $this->generateVariationsMatrix(count($attributes), $optionsPerAttribute); + + return function ($attributeSetId, $index, $entityNumber) use ($attributes, $variationCount, $variationsMatrix) { + $variationIndex = $this->getConfigurableVariationIndex($entityNumber, $variationCount) - 1; + if (isset($variationsMatrix[$variationIndex])) { + $tempProductData = []; + foreach ($variationsMatrix[$variationIndex] as $attributeIndex => $optionIndex) { + $attributeCode = $attributes[$attributeIndex]['name']; + $option = $attributes[$attributeIndex]['values'][$optionIndex]; + $tempProductData[$attributeCode] = $option; + } + return $tempProductData; + } + + return []; + }; + } + + /** + * Generates matrix of all possible variations. + * + * @param int $attributesPerSet + * @param int $optionsPerAttribute + * @return array + */ + private function generateVariationsMatrix($attributesPerSet, $optionsPerAttribute) + { + $variationsMatrix = null; + for ($i = 0; $i < $attributesPerSet; $i++) { + $variationsMatrix[] = range(0, $optionsPerAttribute[$i] - 1); + } + return $this->generateVariations($variationsMatrix); + } + + /** + * Build all possible variations based on attributes and options count. + * + * @param array|null $variationsMatrix + * @return array + */ + private function generateVariations($variationsMatrix) + { + if (!$variationsMatrix) { + return [[]]; + } + $set = array_shift($variationsMatrix); + $subset = $this->generateVariations($variationsMatrix); + $result = []; + foreach ($set as $value) { + foreach ($subset as $subValue) { + array_unshift($subValue, $value); + $result[] = $subValue; + } + } + return $result; + } + + /** + * Get configurable option sku pattern. + * + * @param string $skuPattern + * @return string + */ + private function getConfigurableOptionSkuPattern($skuPattern) + { + return $skuPattern . ' - option %s'; + } + + /** + * Get description closure. + * + * @param array|null $searchTerms + * @param int $simpleProductsCount + * @param int $configurableProductsCount + * @param int $maxAmountOfWordsDescription + * @param int $minAmountOfWordsDescription + * @param string $descriptionPrefix + * @return \Closure + */ + private function getDescriptionClosure( + $searchTerms, + $simpleProductsCount, + $configurableProductsCount, + $maxAmountOfWordsDescription, + $minAmountOfWordsDescription, + $descriptionPrefix = 'description' + ) { + if (null === $this->dataGenerator) { + $fileName = __DIR__ . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'dictionary.csv'; + $this->dataGenerator = new DataGenerator($fileName); + } + + return function ($index) use ( + $searchTerms, + $simpleProductsCount, + $configurableProductsCount, + $maxAmountOfWordsDescription, + $minAmountOfWordsDescription, + $descriptionPrefix + ) { + $countSearchTerms = is_array($searchTerms) ? count($searchTerms) : 0; + $count = !$searchTerms + ? 0 + : round( + $searchTerms[$index % $countSearchTerms]['count'] * ( + $configurableProductsCount / ($simpleProductsCount + $configurableProductsCount) + ) + ); + // phpcs:ignore + mt_srand($index); + return $this->dataGenerator->generate( + $minAmountOfWordsDescription, + $maxAmountOfWordsDescription, + $descriptionPrefix . '-' . $index + ) . + ($index <= ($count * $countSearchTerms) ? ' ' . + $searchTerms[$index % $countSearchTerms]['term'] : ''); + }; + } + + /** + * Convert attribute set data to db format for use in simple product generation + * + * @param array $attributeSet + * @return array + */ + private function convertAttributesToDBFormat(array $attributeSet) + { + $attributeSetName = $attributeSet['name']; + $attributeSetId = null; + $attributes = []; + foreach ($attributeSet['attributes'] as $attributeData) { + $attributeCollection = $this->attributeCollectionFactory->create(); + + $attributeCollection->setAttributeSetFilterBySetName($attributeSetName, Product::ENTITY); + $attributeCollection->addFieldToFilter( + 'attribute_code', + $attributeData['name'] + ); + /** @var Attribute $attribute */ + foreach ($attributeCollection as $attribute) { + $attributeSetId = $attribute->getAttributeSetId(); + $values = []; + $options = $attribute->getOptions(); + foreach ($options ?: [] as $option) { + if ($option->getValue()) { + $values[] = $option->getValue(); + } + } + $attributes[] = + [ + 'name' => $attribute->getAttributeCode(), + 'id' => $attribute->getAttributeId(), + 'values' => $values + ]; + } + } + + return ['id' => $attributeSetId, 'name' => $attributeSetName, 'attributes' => $attributes]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/CouponCodesFixture.php b/magento/setup/src/Magento/Setup/Fixtures/CouponCodesFixture.php new file mode 100644 index 0000000..a134da8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/CouponCodesFixture.php @@ -0,0 +1,150 @@ + + * {int} + * + * @see setup/performance-toolkit/profiles/ce/small.xml + */ +class CouponCodesFixture extends Fixture +{ + /** + * @var int + */ + protected $priority = 129; + + /** + * @var int + */ + protected $couponCodesCount = 0; + + /** + * @var \Magento\SalesRule\Model\RuleFactory + */ + private $ruleFactory; + + /** + * @var \Magento\SalesRule\Model\CouponFactory + */ + private $couponCodeFactory; + + /** + * Constructor + * + * @param FixtureModel $fixtureModel + * @param \Magento\SalesRule\Model\RuleFactory|null $ruleFactory + * @param \Magento\SalesRule\Model\CouponFactory|null $couponCodeFactory + */ + public function __construct( + FixtureModel $fixtureModel, + \Magento\SalesRule\Model\RuleFactory $ruleFactory = null, + \Magento\SalesRule\Model\CouponFactory $couponCodeFactory = null + ) { + parent::__construct($fixtureModel); + $this->ruleFactory = $ruleFactory ?: $this->fixtureModel->getObjectManager() + ->get(\Magento\SalesRule\Model\RuleFactory::class); + $this->couponCodeFactory = $couponCodeFactory ?: $this->fixtureModel->getObjectManager() + ->get(\Magento\SalesRule\Model\CouponFactory::class); + } + + /** + * @inheritdoc + * + * @SuppressWarnings(PHPMD) + */ + public function execute() + { + $this->fixtureModel->resetObjectManager(); + $this->couponCodesCount = $this->fixtureModel->getValue('coupon_codes', 0); + if (!$this->couponCodesCount) { + return; + } + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->fixtureModel->getObjectManager()->create(\Magento\Store\Model\StoreManager::class); + + //Get all websites + $websitesArray = []; + $websites = $storeManager->getWebsites(); + foreach ($websites as $website) { + $websitesArray[] = $website->getId(); + } + + $this->generateCouponCodes($this->ruleFactory, $this->couponCodeFactory, $websitesArray); + } + + /** + * Generate Coupon Codes + * + * @param \Magento\SalesRule\Model\RuleFactory $ruleFactory + * @param \Magento\SalesRule\Model\CouponFactory $couponCodeFactory + * @param array $websitesArray + * + * @return void + */ + public function generateCouponCodes($ruleFactory, $couponCodeFactory, $websitesArray) + { + for ($i = 0; $i < $this->couponCodesCount; $i++) { + $ruleName = sprintf('Coupon Code %1$d', $i); + $data = [ + 'rule_id' => null, + 'name' => $ruleName, + 'is_active' => '1', + 'website_ids' => $websitesArray, + 'customer_group_ids' => [ + 0 => '0', + 1 => '1', + 2 => '2', + 3 => '3', + ], + 'coupon_type' => \Magento\SalesRule\Model\Rule::COUPON_TYPE_SPECIFIC, + 'conditions' => [], + 'simple_action' => \Magento\SalesRule\Model\Rule::BY_PERCENT_ACTION, + 'discount_amount' => 5, + 'discount_step' => 0, + 'stop_rules_processing' => 1, + 'sort_order' => '5', + ]; + + $model = $ruleFactory->create(); + $model->loadPost($data); + $useAutoGeneration = (int)!empty($data['use_auto_generation']); + $model->setUseAutoGeneration($useAutoGeneration); + $model->save(); + + $coupon = $couponCodeFactory->create(); + $coupon->setRuleId($model->getId()) + ->setCode('CouponCode' . $i) + ->setIsPrimary(true) + ->setType(0); + $coupon->save(); + } + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating coupon codes'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'coupon_codes' => 'Coupon Codes' + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/CustomerGroupsFixture.php b/magento/setup/src/Magento/Setup/Fixtures/CustomerGroupsFixture.php new file mode 100644 index 0000000..5550181 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/CustomerGroupsFixture.php @@ -0,0 +1,92 @@ +groupCollectionFactory = $groupCollectionFactory; + $this->groupRepository = $groupRepository; + $this->groupFactory = $groupFactory; + } + + /** + * @inheritdoc + */ + public function execute() + { + $existingCustomerGroupsCount = $this->groupCollectionFactory->create()->getSize(); + $customerGroupsCount = $this->fixtureModel->getValue('customer_groups', 0); + if ($customerGroupsCount < 1) { + return; + } + + for ($i = $existingCustomerGroupsCount; $i < $customerGroupsCount; ++$i) { + $groupDataObject = $this->groupFactory->create(); + $groupDataObject + ->setCode('customer_group_' . $i) + ->setTaxClassId(self::DEFAULT_TAX_CLASS_ID); + $this->groupRepository->save($groupDataObject); + } + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating customer groups'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'customer_groups' => 'Customer groups' + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/CustomersFixture.php b/magento/setup/src/Magento/Setup/Fixtures/CustomersFixture.php new file mode 100644 index 0000000..e97b974 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/CustomersFixture.php @@ -0,0 +1,146 @@ +{customers amount} + * Customers will have normal distribution on all available websites + * + * Each customer will have absolutely the same data + * except customer email, customer group and customer addresses + * + * @see \Magento\Setup\Model\FixtureGenerator\CustomerTemplateGenerator + * to view general customer data + * + * @see \Magento\Setup\Model\Customer\CustomerDataGenerator + * if you need dynamically change data per each customer + * + * @see \Magento\Setup\Model\Address\AddressDataGenerator + * if you need dynamically change address data per each customer + * + * @see setup/performance-toolkit/config/customerConfig.xml + * here you can change amount of addresses to be generated per each customer + * Supports the following format: + * + * {amount of addresses} + * + * + * @see setup/performance-toolkit/profiles/ce/small.xml + */ +class CustomersFixture extends Fixture +{ + /** + * @var int + */ + protected $priority = 70; + + /** + * @var CustomerGenerator + */ + private $customerGenerator; + + /** + * @var CustomerDataGeneratorFactory + */ + private $customerDataGeneratorFactory; + + /** + * @var array + */ + private $defaultCustomerConfig = [ + 'addresses-count' => 2 + ]; + + /** + * @var CollectionFactory + */ + private $collectionFactory; + + /** + * @param FixtureModel $fixtureModel + * @param CustomerGenerator $customerGenerator + * @param CustomerDataGeneratorFactory $customerDataGeneratorFactory + * @param CollectionFactory $collectionFactory + */ + public function __construct( + FixtureModel $fixtureModel, + CustomerGenerator $customerGenerator, + CustomerDataGeneratorFactory $customerDataGeneratorFactory, + CollectionFactory $collectionFactory + ) { + parent::__construct($fixtureModel); + + $this->customerGenerator = $customerGenerator; + $this->customerDataGeneratorFactory = $customerDataGeneratorFactory; + $this->collectionFactory = $collectionFactory; + } + + /** + * {@inheritdoc} + */ + public function execute() + { + $customersNumber = $this->getCustomersAmount(); + if (!$customersNumber) { + return; + } + + /** @var CustomerDataGenerator $customerDataGenerator */ + $customerDataGenerator = $this->customerDataGeneratorFactory->create( + $this->getCustomersConfig() + ); + + $fixtureMap = [ + 'customer_data' => function ($customerId) use ($customerDataGenerator) { + return $customerDataGenerator->generate($customerId); + }, + ]; + + $this->customerGenerator->generate($customersNumber, $fixtureMap); + } + + /** + * @return int + */ + private function getCustomersAmount() + { + return max(0, $this->fixtureModel->getValue('customers', 0) - $this->collectionFactory->create()->getSize()); + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating customers'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'customers' => 'Customers' + ]; + } + + /** + * @return array + */ + private function getCustomersConfig() + { + return $this->fixtureModel->getValue('customer-config', $this->defaultCustomerConfig); + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/EavVariationsFixture.php b/magento/setup/src/Magento/Setup/Fixtures/EavVariationsFixture.php new file mode 100644 index 0000000..671627b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/EavVariationsFixture.php @@ -0,0 +1,207 @@ +eavConfig = $eavConfig; + $this->cache = $cache; + $this->storeManager = $storeManager; + $this->attributeSet = $attributeSet; + $this->attributeFactory = $attributeFactory; + } + + /** + * @inheritDoc + */ + public function execute() + { + if (!$this->fixtureModel->getValue('configurable_products', []) + || in_array($this->getAttributeCode(), $this->eavConfig->getEntityAttributeCodes(Product::ENTITY))) { + return; + } + + $this->generateAttribute($this->fixtureModel->getValue('configurable_products_variation', 3)); + + $cacheKey = Config::ATTRIBUTES_CACHE_ID . Product::ENTITY; + $this->cache->remove($cacheKey); + } + + /** + * @inheritDoc + */ + public function getActionTitle() + { + return 'Generating configurable EAV variations'; + } + + /** + * @inheritDoc + */ + public function introduceParamLabels() + { + return []; + } + + /** + * Generate Attribute + * + * @param int $optionCount + * @return void + */ + private function generateAttribute($optionCount) + { + $storeIds = array_keys($this->storeManager->getStores(true)); + $options = []; + + for ($option = 1; $option <= $optionCount; $option++) { + $options['order']['option_' . $option] = $option; + $options['value']['option_' . $option] = array_fill_keys($storeIds, 'option ' . $option); + $options['delete']['option_' . $option] = ''; + } + + $data = [ + 'frontend_label' => array_fill_keys($storeIds, 'configurable variations'), + 'frontend_input' => 'select', + 'is_required' => '0', + 'option' => $options, + 'default' => ['option_0'], + 'attribute_code' => $this->getAttributeCode(), + 'is_global' => '1', + 'default_value_text' => '', + 'default_value_yesno' => '0', + 'default_value_date' => '', + 'default_value_textarea' => '', + 'is_unique' => '0', + 'is_searchable' => '1', + 'is_visible_in_advanced_search' => '0', + 'is_comparable' => '0', + 'is_filterable' => '1', + 'is_filterable_in_search' => '0', + 'is_used_for_promo_rules' => '0', + 'is_html_allowed_on_front' => '1', + 'is_visible_on_front' => '0', + 'used_in_product_listing' => '0', + 'used_for_sort_by' => '0', + 'source_model' => null, + 'backend_model' => null, + 'apply_to' => [], + 'backend_type' => 'int', + 'entity_type_id' => 4, + 'is_user_defined' => 1, + ]; + + $data['swatch_input_type'] = Swatch::SWATCH_INPUT_TYPE_VISUAL; + $data['swatchvisual']['value'] = array_reduce( + range(1, $optionCount), + function ($values, $index) use ($optionCount) { + $values['option_' . $index] = '#' + . str_repeat( + dechex(255 * $index / $optionCount), + 3 + ); + return $values; + }, + [] + ); + $data['optionvisual']['value'] = array_reduce( + range(1, $optionCount), + function ($values, $index) { + $values['option_' . $index] = ['option ' . $index]; + return $values; + }, + [] + ); + + /** + * The logic is not obvious, but looking to the controller logic for configurable products this attribute + * requires to be saved twice to become a child of Default attribute set and become available for creating + * and|or importing configurable products. + * See MAGETWO-16492 + */ + $model = $this->attributeFactory->create(['data' => $data]); + $attributeSet = $this->attributeSet->load(self::ATTRIBUTE_SET_ID); + + $model->setAttributeSetId(self::ATTRIBUTE_SET_ID); + $model->setAttributeGroupId($attributeSet->getDefaultGroupId(4)); + $model->save(); + + $model->setAttributeSetId(self::ATTRIBUTE_SET_ID); + $model->save(); + } + + /** + * Get attribute code + * + * @return string + */ + private function getAttributeCode() + { + return 'configurable_variation'; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/Fixture.php b/magento/setup/src/Magento/Setup/Fixtures/Fixture.php new file mode 100644 index 0000000..8e9b834 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/Fixture.php @@ -0,0 +1,84 @@ +fixtureModel = $fixtureModel; + } + + /** + * Execute fixture + * + * @return void + */ + abstract public function execute(); + + /** + * Get fixture action description + * + * @return string + */ + abstract public function getActionTitle(); + + /** + * Print information about generated fixture. Print fixture label and amount of generated items + * + * @param OutputInterface $output + * @return void + */ + public function printInfo(OutputInterface $output) + { + foreach ($this->introduceParamLabels() as $configName => $label) { + $configValue = $this->fixtureModel->getValue($configName); + $generationCount = is_array($configValue) === true + ? count($configValue[array_keys($configValue)[0]]) + : $configValue; + + if (!empty($generationCount)) { + $output->writeln(' |- ' . $label . ': ' . $generationCount . ''); + } + } + } + + /** + * Introduce parameters labels + * + * @return array + */ + abstract public function introduceParamLabels(); + + /** + * Get fixture priority + * + * @return int + */ + public function getPriority() + { + return $this->priority; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/FixtureConfig.php b/magento/setup/src/Magento/Setup/Fixtures/FixtureConfig.php new file mode 100644 index 0000000..e33dff5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/FixtureConfig.php @@ -0,0 +1,75 @@ +parser = $parser; + } + + /** + * Load config from file + * + * @param string $filename + * @throws \Exception + * + * @return void + */ + public function loadConfig($filename) + { + if (!is_readable($filename)) { + throw new \Exception("Profile configuration file `{$filename}` is not readable or does not exists."); + } + $this->parser->getDom()->load($filename); + $this->parser->getDom()->xinclude(); + $this->config = $this->parser->xmlToArray(); + $this->config['config']['profile']['di'] = dirname($filename) . '/' + . (isset($this->config['config']['profile']['di']) + ? $this->config['config']['profile']['di'] + : '../../config/di.xml' + ); + } + + /** + * Get profile configuration value + * + * @param string $key + * @param null|mixed $default + * + * @return mixed + */ + public function getValue($key, $default = null) + { + return isset($this->config['config']['profile'][$key]) ? + ( + // Work around for how attributes are handled in the XML parser when injected via xinclude due to the + // files existing outside of the current working directory. + isset($this->config['config']['profile'][$key]['_value']) ? + $this->config['config']['profile'][$key]['_value'] : $this->config['config']['profile'][$key] + ) : $default; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/FixtureModel.php b/magento/setup/src/Magento/Setup/Fixtures/FixtureModel.php new file mode 100644 index 0000000..376eec6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/FixtureModel.php @@ -0,0 +1,302 @@ +initArguments = $initArguments; + $this->reindexCommand = $reindexCommand; + } + + /** + * Run reindex + * + * @param OutputInterface $output + * @return void + */ + public function reindex(OutputInterface $output) + { + $input = new ArrayInput([]); + $this->reindexCommand->run($input, $output); + } + + /** + * Load fixtures + * + * @return $this + * @throws \Exception + */ + public function loadFixtures() + { + $files = glob(__DIR__ . DIRECTORY_SEPARATOR . self::FIXTURE_PATTERN, GLOB_NOSORT); + foreach ($files as $file) { + $file = basename($file, '.php'); + /** @var Fixture $fixture */ + $type = 'Magento\Setup\Fixtures' . '\\' . $file; + $fixture = $this->getObjectManager()->create( + $type, + [ + 'fixtureModel' => $this, + ] + ); + $this->loadFixture($fixture); + } + foreach ($this->getFixturesFromRegistry() as $fixture) { + $this->loadFixture($fixture); + } + ksort($this->fixtures); + return $this; + } + + /** + * Gets Fixtures from FixtureRegistry and gets instances of them from ObjectManager + * + * @return array + */ + private function getFixturesFromRegistry() : array + { + $fixtureRegistry = $this->getObjectManager()->create(FixtureRegistry::class); + $fixtures = []; + foreach ($fixtureRegistry->getFixtures() as $fixtureClassName) { + $fixtures[] = $this->getObjectManager()->create( + $fixtureClassName, + ['fixtureModel' => $this] + ); + } + return $fixtures; + } + + /** + * Loads fixture into $this->fixturesByName and $this->fixtures + * + * @param Fixture $fixture + * @return void + */ + private function loadFixture(Fixture $fixture) + { + $fixtureClassName = get_class($fixture); + if (isset($this->fixtures[$fixture->getPriority()])) { + throw new \InvalidArgumentException( + sprintf('Duplicate priority %d in fixture %s', $fixture->getPriority(), $fixtureClassName) + ); + } + if ($fixture->getPriority() >= 0) { + $this->fixtures[$fixture->getPriority()] = $fixture; + } + $this->fixturesByNames[$fixtureClassName] = $fixture; + } + + /** + * Get param labels + * + * @return array + * @deprecated 2.2.0 + */ + public function getParamLabels() + { + return $this->paramLabels; + } + + /** + * Get fixtures + * + * @return Fixture[] + */ + public function getFixtures() + { + return $this->fixtures; + } + + /** + * Returns fixture by name + * + * @param string $name + * @return Fixture + * @throws \Magento\Setup\Exception + */ + public function getFixtureByName($name) + { + if (!array_key_exists($name, $this->fixturesByNames)) { + throw new Exception('Wrong fixture name'); + } + + return $this->fixturesByNames[$name]; + } + + /** + * Get object manager + * + * @return \Magento\Framework\ObjectManagerInterface + */ + public function getObjectManager() + { + if (!$this->objectManager) { + $objectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory( + BP, + $this->initArguments + ); + $this->objectManager = $objectManagerFactory->create($this->initArguments); + $this->objectManager->get(\Magento\Framework\App\State::class)->setAreaCode(self::AREA_CODE); + } + + return $this->objectManager; + } + + /** + * Init Object Manager + * + * @param string $area + * @return FixtureModel + */ + public function initObjectManager($area = self::AREA_CODE) + { + $objectManger = $this->getObjectManager(); + $configuration = $objectManger + ->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class) + ->load($area); + $objectManger->configure($configuration); + + $diConfiguration = $this->getValue('di'); + if (file_exists($diConfiguration)) { + $dom = new \DOMDocument(); + $dom->load($diConfiguration); + + $objectManger->configure( + $objectManger + ->get(\Magento\Framework\ObjectManager\Config\Mapper\Dom::class) + ->convert($dom) + ); + } + + $objectManger->get(\Magento\Framework\Config\ScopeInterface::class) + ->setCurrentScope($area); + return $this; + } + + /** + * Reset object manager + * + * @return \Magento\Framework\ObjectManagerInterface + * @deprecated 2.2.0 + */ + public function resetObjectManager() + { + return $this; + } + + /** + * Gets instance of FixtureConfig from ObjectManager + * + * @return FixtureConfig + */ + private function getConfig() + { + if (null === $this->config) { + $this->config = $this->getObjectManager()->get(FixtureConfig::class); + } + return $this->config; + } + + /** + * Load config from file + * + * @param string $filename + * @throws \Exception + * + * @return void + */ + public function loadConfig($filename) + { + return $this->getConfig()->loadConfig($filename); + } + + /** + * Get profile configuration value + * + * @param string $key + * @param null|mixed $default + * + * @return mixed + */ + public function getValue($key, $default = null) + { + return $this->getConfig()->getValue($key, $default); + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/FixtureRegistry.php b/magento/setup/src/Magento/Setup/Fixtures/FixtureRegistry.php new file mode 100644 index 0000000..0b90fb7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/FixtureRegistry.php @@ -0,0 +1,41 @@ +fixtures = $fixtures; + } + + /** + * Get fixtures + * + * @return string[] + */ + public function getFixtures() :array + { + return $this->fixtures; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/ImagesFixture.php b/magento/setup/src/Magento/Setup/Fixtures/ImagesFixture.php new file mode 100644 index 0000000..af0cbe6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/ImagesFixture.php @@ -0,0 +1,555 @@ + + * X + * Y + * + * + * Where + * X - number of images to be generated + * Y - number of images that will be assigned per each product + * + * note, that probably you would need to run command: + * php bin/magento catalog:images:resize + * to resize images after generation but be patient with it + * because it can take pretty much time + * + * @see setup/performance-toolkit/profiles/ce/small.xml + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class ImagesFixture extends Fixture +{ + /** + * @var int + */ + protected $priority = 51; + + /** + * @var \Magento\Framework\App\ResourceConnection + */ + private $resourceConnection; + + /** + * @var \Magento\Setup\Fixtures\ImagesGenerator\ImagesGeneratorFactory + */ + private $imagesGeneratorFactory; + + /** + * @var \Magento\Framework\Filesystem + */ + private $filesystem; + + /** + * @var \Magento\Catalog\Model\Product\Media\Config + */ + private $mediaConfig; + + /** + * @var \Magento\Eav\Model\AttributeRepository + */ + private $attributeRepository; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface + */ + private $dbConnection; + + /** + * @var \Magento\Framework\DB\Sql\ColumnValueExpressionFactory + */ + private $expressionFactory; + + /** + * @var \Magento\Setup\Model\BatchInsertFactory + */ + private $batchInsertFactory; + + /** + * @var \Magento\Framework\EntityManager\MetadataPool + */ + private $metadataPool; + + /** + * @var array + */ + private $attributeCodesCache = []; + + /** + * @var int + */ + private $imagesInsertBatchSize = 1000; + + /** + * @var int + */ + private $productsSelectBatchSize = 1000; + + /** + * @var int + */ + private $productsCountCache; + + /** + * @var array + */ + private $tableCache = []; + /** + * @var ImageResize + */ + private $imageResize; + + /** + * @param FixtureModel $fixtureModel + * @param \Magento\Framework\App\ResourceConnection $resourceConnection + * @param ImagesGenerator\ImagesGeneratorFactory $imagesGeneratorFactory + * @param \Magento\Framework\Filesystem $filesystem + * @param \Magento\Catalog\Model\Product\Media\Config $mediaConfig + * @param \Magento\Eav\Model\AttributeRepository $attributeRepository + * @param \Magento\Framework\DB\Sql\ColumnValueExpressionFactory $expressionFactory + * @param \Magento\Setup\Model\BatchInsertFactory $batchInsertFactory + * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool + * @param ImageResize $imageResize + */ + public function __construct( + FixtureModel $fixtureModel, + \Magento\Framework\App\ResourceConnection $resourceConnection, + \Magento\Setup\Fixtures\ImagesGenerator\ImagesGeneratorFactory $imagesGeneratorFactory, + \Magento\Framework\Filesystem $filesystem, + \Magento\Catalog\Model\Product\Media\Config $mediaConfig, + \Magento\Eav\Model\AttributeRepository $attributeRepository, + \Magento\Framework\DB\Sql\ColumnValueExpressionFactory $expressionFactory, + \Magento\Setup\Model\BatchInsertFactory $batchInsertFactory, + \Magento\Framework\EntityManager\MetadataPool $metadataPool, + ImageResize $imageResize + ) { + parent::__construct($fixtureModel); + + $this->imagesGeneratorFactory = $imagesGeneratorFactory; + $this->resourceConnection = $resourceConnection; + $this->filesystem = $filesystem; + $this->mediaConfig = $mediaConfig; + $this->attributeRepository = $attributeRepository; + $this->expressionFactory = $expressionFactory; + $this->batchInsertFactory = $batchInsertFactory; + $this->metadataPool = $metadataPool; + $this->imageResize = $imageResize; + } + + /** + * {@inheritdoc} + * @throws \Exception + */ + public function execute() + { + if (!$this->checkIfImagesExists() && $this->getImagesToGenerate()) { + $this->createImageEntities(); + $this->assignImagesToProducts(); + iterator_to_array($this->imageResize->resizeFromThemes(), false); + } + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating images'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'product-images' => 'Product Images' + ]; + } + + /** + * {@inheritdoc} + * @throws ValidatorException + */ + public function printInfo(OutputInterface $output) + { + $config = $this->fixtureModel->getValue('product-images', []); + if (!$config) { + return; + } + + if (!isset($config['images-count'])) { + throw new ValidatorException( + __("The amount of images to generate wasn't specified. Enter the amount and try again.") + ); + } + + if (!isset($config['images-per-product'])) { + throw new ValidatorException( + __("The amount of images per product wasn't specified. Enter the amount and try again.") + ); + } + + $output->writeln( + sprintf( + ' |- Product images: %s, %s per product', + $config['images-count'], + $config['images-per-product'] + ) + ); + } + + /** + * Check if DB already has any images + * + * @return bool + */ + private function checkIfImagesExists() + { + return $this->getImagesCount() > 0; + } + + /** + * Create image file and add it to media gallery table in DB + * + * @return void + */ + private function createImageEntities() + { + /** @var \Magento\Setup\Model\BatchInsert $batchInsert */ + $batchInsert = $this->batchInsertFactory->create([ + 'insertIntoTable' => $this->getTable('catalog_product_entity_media_gallery'), + 'batchSize' => $this->imagesInsertBatchSize + ]); + + foreach ($this->generateImageFilesGenerator() as $imageName) { + $batchInsert->insert([ + 'attribute_id' => $this->getAttributeId('media_gallery'), + 'value' => $imageName, + ]); + } + + $batchInsert->flush(); + } + + /** + * Create generator that creates image files and puts them to appropriate media folder + * in memory-safe way + * + * @return \Generator + * @throws \Magento\Framework\Exception\FileSystemException + */ + private function generateImageFilesGenerator() + { + /** @var \Magento\Setup\Fixtures\ImagesGenerator\ImagesGenerator $imagesGenerator */ + $imagesGenerator = $this->imagesGeneratorFactory->create(); + $mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA); + $productImagesDirectoryPath = $mediaDirectory->getRelativePath($this->mediaConfig->getBaseMediaPath()); + + for ($i = 1; $i <= $this->getImagesToGenerate(); $i++) { + // md5() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $imageName = md5($i) . '.jpg'; + $imageFullName = DIRECTORY_SEPARATOR . substr($imageName, 0, 1) + . DIRECTORY_SEPARATOR . substr($imageName, 1, 1) + . DIRECTORY_SEPARATOR . $imageName; + + $imagePath = $imagesGenerator->generate([ + 'image-width' => 300, + 'image-height' => 300, + 'image-name' => $imageName + ]); + + $mediaDirectory->renameFile( + $mediaDirectory->getRelativePath($imagePath), + $productImagesDirectoryPath . $imageFullName + ); + + yield $imageFullName; + } + } + + /** + * Assign created images to products according to Y images per each product + * + * @return void + * @throws \Exception + */ + private function assignImagesToProducts() + { + /** @var \Magento\Setup\Model\BatchInsert $batchInsertCatalogProductEntityVarchar */ + $batchInsertCatalogProductEntityVarchar = $this->batchInsertFactory->create([ + 'insertIntoTable' => $this->getTable('catalog_product_entity_varchar'), + 'batchSize' => $this->imagesInsertBatchSize + ]); + + /** @var \Magento\Setup\Model\BatchInsert $batchInsertCatalogProductEntityMediaGalleryValue */ + $batchInsertCatalogProductEntityMediaGalleryValue = $this->batchInsertFactory->create([ + 'insertIntoTable' => $this->getTable('catalog_product_entity_media_gallery_value'), + 'batchSize' => $this->imagesInsertBatchSize + ]); + + /** @var \Magento\Setup\Model\BatchInsert $batchInsertCatalogProductEntityMediaGalleryValueToEntity */ + $batchInsertCatalogProductEntityMediaGalleryValueToEntity = $this->batchInsertFactory->create([ + 'insertIntoTable' => $this->getTable('catalog_product_entity_media_gallery_value_to_entity'), + 'batchSize' => $this->imagesInsertBatchSize + ]); + + $imageGenerator = $this->getImagesGenerator(); + + foreach ($this->getProductGenerator() as $productEntity) { + for ($imageNum = 1; $imageNum <= $this->getImagesPerProduct(); $imageNum++) { + $image = $imageGenerator->current(); + $imageGenerator->next(); + + if ($imageNum === 1) { + $attributes = ['image', 'small_image', 'thumbnail', 'swatch_image']; + foreach ($attributes as $attr) { + $batchInsertCatalogProductEntityVarchar->insert([ + $this->getProductLinkField() => $productEntity[$this->getProductLinkField()], + 'attribute_id' => $this->getAttributeId($attr), + 'value' => $image['value'], + 'store_id' => 0, + ]); + } + } + + $batchInsertCatalogProductEntityMediaGalleryValueToEntity->insert([ + 'value_id' => $image['value_id'], + $this->getProductLinkField() => $productEntity[$this->getProductLinkField()] + ]); + + $batchInsertCatalogProductEntityMediaGalleryValue->insert([ + 'value_id' => $image['value_id'], + 'store_id' => 0, + $this->getProductLinkField() => $productEntity[$this->getProductLinkField()], + 'position' => $image['value_id'], + 'disabled' => 0 + ]); + } + } + + $batchInsertCatalogProductEntityVarchar->flush(); + $batchInsertCatalogProductEntityMediaGalleryValue->flush(); + $batchInsertCatalogProductEntityMediaGalleryValueToEntity->flush(); + } + + /** + * Returns generator to iterate in memory-safe way over all product entities in DB + * + * @return \Generator + * @throws \Exception + */ + private function getProductGenerator() + { + $offset = 0; + + $products = $this->getProducts($this->productsSelectBatchSize, $offset); + $offset += $this->productsSelectBatchSize; + + while (true) { + yield current($products); + + if (next($products) === false) { + $products = $this->getProducts($this->productsSelectBatchSize, $offset); + $offset += $this->productsSelectBatchSize; + + if (empty($products)) { + break; + } + } + } + } + + /** + * Get products entity ids + * + * @param int $limit + * @param int $offset + * @return array + * @throws \Exception + */ + private function getProducts($limit, $offset) + { + $select = $this->getDbConnection() + ->select() + ->from(['product_entity' => $this->getTable('catalog_product_entity')], []) + ->columns([$this->getProductLinkField()]) + ->limit($limit, $offset); + + return $this->getDbConnection()->fetchAssoc($select); + } + + /** + * Creates generator to iterate infinitely over all image entities + * + * @return \Generator + */ + private function getImagesGenerator() + { + $select = $this->getDbConnection() + ->select() + ->from( + $this->getTable('catalog_product_entity_media_gallery'), + ['value_id', 'value'] + )->order('value_id desc') + ->limit($this->getProductsCount() * $this->getImagesPerProduct()); + + $images = $this->getDbConnection()->fetchAssoc($select); + + while (true) { + yield current($images); + + if (next($images) === false) { + reset($images); + } + } + } + + /** + * Return number of images to create + * + * @return null|int + */ + private function getImagesToGenerate() + { + $config = $this->fixtureModel->getValue('product-images', []); + + return $config['images-count'] ?? null; + } + + /** + * Return number of images to be assigned per each product + * + * @return null|int + */ + private function getImagesPerProduct() + { + $config = $this->fixtureModel->getValue('product-images', []); + + return $config['images-per-product'] ?? null; + } + + /** + * Get amount of existing products + * + * @return int + */ + private function getProductsCount() + { + if ($this->productsCountCache === null) { + $select = $select = $this->getDbConnection() + ->select() + ->from(['product_entity' => $this->getTable('catalog_product_entity')], []) + ->columns([ + 'count' => $this->expressionFactory->create([ + 'expression' => 'COUNT(*)' + ]) + ]); + + $this->productsCountCache = (int) $this->getDbConnection()->fetchOne($select); + } + + return $this->productsCountCache; + } + + /** + * Get amount of existing images + * + * @return int + */ + private function getImagesCount() + { + $select = $select = $this->getDbConnection() + ->select() + ->from(['product_entity' => $this->getTable('catalog_product_entity_media_gallery')], []) + ->columns([ + 'count' => $this->expressionFactory->create([ + 'expression' => 'COUNT(*)' + ]) + ])->where('media_type="image"'); + + return (int) $this->getDbConnection()->fetchOne($select); + } + + /** + * Get eav attribute id by its code + * + * @param string $attributeCode + * @return int + * @throws \Magento\Framework\Exception\NoSuchEntityException + */ + private function getAttributeId($attributeCode) + { + if (!isset($this->attributeCodesCache[$attributeCode])) { + $attribute = $this->attributeRepository->get( + 'catalog_product', + $attributeCode + ); + + $this->attributeCodesCache[$attributeCode] = $attribute->getAttributeId(); + } + + return $this->attributeCodesCache[$attributeCode]; + } + + /** + * Retrieve current connection to DB + * + * Method is required to eliminate multiple calls to ResourceConnection class + * + * @return \Magento\Framework\DB\Adapter\AdapterInterface + */ + private function getDbConnection() + { + if ($this->dbConnection === null) { + $this->dbConnection = $this->resourceConnection->getConnection(); + } + + return $this->dbConnection; + } + + /** + * Retrieve real table name + * + * Method act like a cache for already retrieved table names + * is required to eliminate multiple calls to ResourceConnection class + * + * @param string $tableName + * @return string + */ + private function getTable($tableName) + { + if (!isset($this->tableCache[$tableName])) { + $this->tableCache[$tableName] = $this->resourceConnection->getTableName($tableName); + } + + return $this->tableCache[$tableName]; + } + + /** + * Return product id field name - entity_id|row_id + * + * @return string + * @throws \Exception + */ + private function getProductLinkField() + { + return $this->metadataPool + ->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class) + ->getLinkField(); + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/ImagesGenerator/ImagesGenerator.php b/magento/setup/src/Magento/Setup/Fixtures/ImagesGenerator/ImagesGenerator.php new file mode 100644 index 0000000..7c58336 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/ImagesGenerator/ImagesGenerator.php @@ -0,0 +1,88 @@ +filesystem = $filesystem; + $this->mediaConfig = $mediaConfig; + } + + /** + * Generates image from $data and puts its to /tmp folder + * @param array $config + * @return string $imagePath + * @throws \Exception + */ + public function generate($config) + { + // phpcs:disable Magento2.Functions.DiscouragedFunction + $binaryData = ''; + $data = str_split(sha1($config['image-name']), 2); + foreach ($data as $item) { + $binaryData .= base_convert($item, 16, 2); + } + $binaryData = str_split($binaryData, 1); + + $image = imagecreate($config['image-width'], $config['image-height']); + $bgColor = imagecolorallocate($image, 240, 240, 240); + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $fgColor = imagecolorallocate($image, mt_rand(0, 230), mt_rand(0, 230), mt_rand(0, 230)); + $colors = [$fgColor, $bgColor]; + imagefilledrectangle($image, 0, 0, $config['image-width'], $config['image-height'], $bgColor); + + for ($row = 10; $row < ($config['image-height'] - 10); $row += 10) { + for ($col = 10; $col < ($config['image-width'] - 10); $col += 10) { + if (next($binaryData) === false) { + reset($binaryData); + } + + imagefilledrectangle($image, $row, $col, $row + 10, $col + 10, $colors[current($binaryData)]); + } + } + + $mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA); + $relativePathToMedia = $mediaDirectory->getRelativePath($this->mediaConfig->getBaseTmpMediaPath()); + $mediaDirectory->create($relativePathToMedia); + + $imagePath = $relativePathToMedia . DIRECTORY_SEPARATOR . $config['image-name']; + $imagePath = preg_replace('|/{2,}|', '/', $imagePath); + $memory = fopen('php://memory', 'r+'); + if(!imagejpeg($image, $memory)) { + throw new \Exception('Could not create picture ' . $imagePath); + } + $mediaDirectory->writeFile($imagePath, stream_get_contents($memory, -1, 0)); + fclose($memory); + imagedestroy($image); + // phpcs:enable + + return $imagePath; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/IndexersStatesApplyFixture.php b/magento/setup/src/Magento/Setup/Fixtures/IndexersStatesApplyFixture.php new file mode 100644 index 0000000..b07ce33 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/IndexersStatesApplyFixture.php @@ -0,0 +1,59 @@ +fixtureModel->getValue('indexers', []); + if (!isset($indexers["indexer"]) || empty($indexers["indexer"])) { + return; + } + + $this->fixtureModel->resetObjectManager(); + + /** @var $indexerRegistry \Magento\Framework\Indexer\IndexerRegistry */ + $indexerRegistry = $this->fixtureModel->getObjectManager() + ->create(\Magento\Framework\Indexer\IndexerRegistry::class); + + foreach ($indexers["indexer"] as $indexerConfig) { + $indexer = $indexerRegistry->get($indexerConfig['id']); + $indexer->setScheduled($indexerConfig['set_scheduled'] == "true"); + } + + $this->fixtureModel->getObjectManager()->get(\Magento\Framework\App\CacheInterface::class) + ->clean([\Magento\Framework\App\Config::CACHE_TAG]); + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Indexers Mode Changes'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return []; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/OrdersFixture.php b/magento/setup/src/Magento/Setup/Fixtures/OrdersFixture.php new file mode 100644 index 0000000..4c08e8f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/OrdersFixture.php @@ -0,0 +1,777 @@ + + * {bool} + * + * + * {int} + * + * + * {int} + * + * + * {int} + * + * + * {int} + * + * + * {int} + * + * + * {int} + * + * + * {int} + * + * @see setup/performance-toolkit/profiles/ce/small.xml + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class OrdersFixture extends Fixture +{ + /** + * Batch size for order generation. + * + * @var string + */ + const BATCH_SIZE = 1000; + + /** + * Product type for "big" configurable products. + * + * @var string + */ + const BIG_CONFIGURABLE_TYPE = 'big_configurable'; + + /** + * Default value for minimum items (simple) per order configuration. + * + * @var int + */ + const ORDER_SIMPLE_PRODUCT_COUNT_FROM = 2; + + /** + * Default value for maximum items (simple) per order configuration. + * + * @var int + */ + const ORDER_SIMPLE_PRODUCT_COUNT_TO = 2; + + /** + * Default value for minimum items (configurable) per order configuration. + * + * @var int + */ + const ORDER_CONFIGURABLE_PRODUCT_COUNT_FROM = 0; + + /** + * Default value for maximum items (configurable) per order configuration. + * + * @var int + */ + const ORDER_CONFIGURABLE_PRODUCT_COUNT_TO = 0; + + /** + * Default value for minimum items (big configurable) per order configuration. + * + * @var int + */ + const ORDER_BIG_CONFIGURABLE_PRODUCT_COUNT_FROM = 0; + + /** + * Default value for maximum items (big configurable) per order configuration. + * + * @var int + */ + const ORDER_BIG_CONFIGURABLE_PRODUCT_COUNT_TO = 0; + + /** + * Fixture execution priority. + * + * @var int + */ + protected $priority = 135; + + /** + * INSERT query templates. + * + * @var array + */ + private $queryTemplates; + + /** + * Array of resource connections ordered by tables. + * + * @var \Magento\Framework\DB\Adapter\AdapterInterface[] + */ + private $resourceConnections; + + /** + * @var \Magento\Store\Model\StoreManagerInterface + */ + private $storeManager; + + /** + * @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory + */ + private $productCollectionFactory; + + /** + * @var \Magento\Catalog\Api\ProductRepositoryInterface + */ + private $productRepository; + + /** + * @var \Magento\ConfigurableProduct\Api\OptionRepositoryInterface + */ + private $optionRepository; + + /** + * @var \Magento\ConfigurableProduct\Api\LinkManagementInterface + */ + private $linkManagement; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + + /** + * Flag specifies if inactive quotes should be generated for orders. + * + * @var bool + */ + private $orderQuotesEnable = true; + + /** + * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory + * @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository + * @param \Magento\ConfigurableProduct\Api\OptionRepositoryInterface $optionRepository + * @param \Magento\ConfigurableProduct\Api\LinkManagementInterface $linkManagement + * @param \Magento\Framework\Serialize\SerializerInterface $serializer + * @param FixtureModel $fixtureModel + */ + public function __construct( + \Magento\Store\Model\StoreManagerInterface $storeManager, + \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, + \Magento\Catalog\Api\ProductRepositoryInterface $productRepository, + \Magento\ConfigurableProduct\Api\OptionRepositoryInterface $optionRepository, + \Magento\ConfigurableProduct\Api\LinkManagementInterface $linkManagement, + \Magento\Framework\Serialize\SerializerInterface $serializer, + FixtureModel $fixtureModel + ) { + $this->storeManager = $storeManager; + $this->productCollectionFactory = $productCollectionFactory; + $this->productRepository = $productRepository; + $this->optionRepository = $optionRepository; + $this->linkManagement = $linkManagement; + $this->serializer = $serializer; + parent::__construct($fixtureModel); + } + + /** + * @inheritdoc + * + * Design of Performance Fixture Generators require generator classes to override Fixture Model's execute method. + * + * @throws \Exception Any exception raised during DB query. + * @return void + * @SuppressWarnings(PHPMD) + */ + public function execute() + { + $orderSimpleCountFrom = (int)$this->fixtureModel->getValue( + 'order_simple_product_count_from', + self::ORDER_SIMPLE_PRODUCT_COUNT_FROM + ); + $orderSimpleCountTo = (int)$this->fixtureModel->getValue( + 'order_simple_product_count_to', + self::ORDER_SIMPLE_PRODUCT_COUNT_TO + ); + $orderConfigurableCountFrom = (int)$this->fixtureModel->getValue( + 'order_configurable_product_count_from', + self::ORDER_CONFIGURABLE_PRODUCT_COUNT_FROM + ); + $orderConfigurableCountTo = (int)$this->fixtureModel->getValue( + 'order_configurable_product_count_to', + self::ORDER_CONFIGURABLE_PRODUCT_COUNT_TO + ); + $orderBigConfigurableCountFrom = (int)$this->fixtureModel->getValue( + 'order_big_configurable_product_count_from', + self::ORDER_BIG_CONFIGURABLE_PRODUCT_COUNT_FROM + ); + $orderBigConfigurableCountTo = (int)$this->fixtureModel->getValue( + 'order_big_configurable_product_count_to', + self::ORDER_BIG_CONFIGURABLE_PRODUCT_COUNT_TO + ); + $this->orderQuotesEnable = (bool)$this->fixtureModel->getValue('order_quotes_enable', true); + + $entityId = $this->getMaxEntityId( + 'sales_order', + \Magento\Sales\Model\ResourceModel\Order::class, + 'entity_id' + ); + $requestedOrders = (int)$this->fixtureModel->getValue('orders', 0); + if ($requestedOrders - $entityId < 1) { + return; + } + + $ruleId = $this->getMaxEntityId( + 'salesrule', + \Magento\SalesRule\Model\ResourceModel\Rule::class, + 'rule_id' + ); + + $maxItemId = $this->getMaxEntityId( + 'sales_order_item', + \Magento\Sales\Model\ResourceModel\Order\Item::class, + 'item_id' + ); + $maxItemsPerOrder = $orderSimpleCountTo + ($orderConfigurableCountTo + $orderBigConfigurableCountTo) * 2; + + /** @var \Generator $itemIdSequence */ + $itemIdSequence = $this->getItemIdSequence($maxItemId, $requestedOrders, $maxItemsPerOrder); + + $this->prepareQueryTemplates(); + + $result = []; + foreach ($this->storeManager->getStores() as $store) { + $productsResult = []; + $this->storeManager->setCurrentStore($store->getId()); + + if ($orderSimpleCountTo > 0) { + $productsResult[Type::TYPE_SIMPLE] = $this->prepareSimpleProducts( + $this->getProductIds($store, Type::TYPE_SIMPLE, $orderSimpleCountTo) + ); + } + if ($orderConfigurableCountTo > 0) { + $productsResult[Configurable::TYPE_CODE] = $this->prepareConfigurableProducts( + $this->getProductIds($store, Configurable::TYPE_CODE, $orderConfigurableCountTo) + ); + } + if ($orderBigConfigurableCountTo > 0) { + $productsResult[self::BIG_CONFIGURABLE_TYPE] = $this->prepareConfigurableProducts( + $this->getProductIds($store, self::BIG_CONFIGURABLE_TYPE, $orderBigConfigurableCountTo) + ); + } + + $result[] = [ + $store->getId(), + implode(PHP_EOL, [ + $this->storeManager->getWebsite($store->getWebsiteId())->getName(), + $this->storeManager->getGroup($store->getStoreGroupId())->getName(), + $store->getName() + ]), + $productsResult + ]; + } + + $productStoreId = function ($index) use ($result) { + return $result[$index % count($result)][0]; + }; + $productStoreName = function ($index) use ($result) { + return $result[$index % count($result)][1]; + }; + $productId = function ($entityId, $index, $type) use ($result) { + return $result[$entityId % count($result)][2][$type][$index]['id']; + }; + $productSku = function ($entityId, $index, $type) use ($result) { + return $result[$entityId % count($result)][2][$type][$index]['sku']; + }; + $productName = function ($entityId, $index, $type) use ($result) { + return $result[$entityId % count($result)][2][$type][$index]['name']; + }; + $productBuyRequest = function ($entityId, $index, $type) use ($result) { + return $result[$entityId % count($result)][2][$type][$index]['buyRequest']; + }; + $productChildBuyRequest = function ($entityId, $index, $type) use ($result) { + return $result[$entityId % count($result)][2][$type][$index]['childBuyRequest']; + }; + $productChildId = function ($entityId, $index, $type) use ($result) { + return $result[$entityId % count($result)][2][$type][$index]['childId']; + }; + + $address = [ + '%firstName%' => 'First Name', + '%lastName%' => 'Last Name', + '%company%' => 'Company', + '%address%' => 'Address', + '%city%' => 'city', + '%state%' => 'Alabama', + '%country%' => 'US', + '%zip%' => '11111', + '%phone%' => '911' + ]; + + $batchNumber = 0; + $entityId++; + while ($entityId <= $requestedOrders) { + $batchNumber++; + // phpcs:ignore Magento2.Functions.DiscouragedFunction + $productCount = [ + // mt_rand() here is not for cryptographic use. + // phpcs:disable Magento2.Security.InsecureFunction + Type::TYPE_SIMPLE => mt_rand($orderSimpleCountFrom, $orderSimpleCountTo), + Configurable::TYPE_CODE => mt_rand($orderConfigurableCountFrom, $orderConfigurableCountTo), + self::BIG_CONFIGURABLE_TYPE => mt_rand($orderBigConfigurableCountFrom, $orderBigConfigurableCountTo) + // phpcs:enable + ]; + $order = [ + '%itemsPerOrder%' => array_sum($productCount), + '%orderNumber%' => 100000000 * $productStoreId($entityId) + $entityId, + '%email%' => "order_{$entityId}@example.com", + '%time%' => date(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT), + '%productStoreId%' => $productStoreId($entityId), + '%productStoreName%' => $productStoreName($entityId), + '%entityId%' => $entityId, + '%ruleId%' => $ruleId, + ]; + $shippingAddress = ['%orderAddressId%' => $entityId * 2 - 1, '%addressType%' => 'shipping']; + $billingAddress = ['%orderAddressId%' => $entityId * 2, '%addressType%' => 'billing']; + + try { + $this->query('quote', $order); + $this->query('quote_address', $order, $address, $shippingAddress); + $this->query('quote_address', $order, $address, $billingAddress); + $this->query('quote_payment', $order); + $this->query('quote_shipping_rate', $order, $shippingAddress); + + $this->query('eav_entity_store', $order); + $this->query('sales_order', $order); + $this->query('sales_order_address', $order, $address, $shippingAddress); + $this->query('sales_order_address', $order, $address, $billingAddress); + $this->query('sales_order_grid', $order); + $this->query('sales_order_payment', $order); + $this->query('sales_order_status_history', $order); + + for ($i = 0; $i < $productCount[Type::TYPE_SIMPLE]; $i++) { + $itemData = [ + '%productId%' => $productId($entityId, $i, Type::TYPE_SIMPLE), + '%sku%' => $productSku($entityId, $i, Type::TYPE_SIMPLE), + '%name%' => $productName($entityId, $i, Type::TYPE_SIMPLE), + '%itemId%' => $itemIdSequence->current(), + '%productType%' => Type::TYPE_SIMPLE, + '%productOptions%' => $productBuyRequest($entityId, $i, Type::TYPE_SIMPLE), + '%parentItemId%' => 'null', + ]; + $this->query('sales_order_item', $order, $itemData); + $this->query('quote_item', $order, $itemData); + $this->query('quote_item_option', $order, $itemData, [ + '%code%' => 'info_buyRequest', + '%value%' => $this->serializer->serialize([ + 'product' => $productId($entityId, $i, Type::TYPE_SIMPLE), + 'qty' => "1", + 'uenc' => 'aHR0cDovL21hZ2UyLmNvbS9jYXRlZ29yeS0xLmh0bWw' + ]) + ]); + $itemIdSequence->next(); + } + + foreach ([Configurable::TYPE_CODE, self::BIG_CONFIGURABLE_TYPE] as $type) { + for ($i = 0; $i < $productCount[$type]; $i++) { + // Generate parent item + $parentItemId = $itemIdSequence->current(); + $itemData = [ + '%productId%' => $productId($entityId, $i, $type), + '%sku%' => $productSku($entityId, $i, $type), + '%name%' => $productName($entityId, $i, $type), + '%productOptions%' => $productBuyRequest($entityId, $i, $type)['order'], + '%itemId%' => $parentItemId, + '%parentItemId%' => 'null', + '%productType%' => Configurable::TYPE_CODE + ]; + $this->query('sales_order_item', $order, $itemData); + $this->query('quote_item', $order, $itemData); + $this->query('quote_item_option', $order, $itemData, [ + '%code%' => 'info_buyRequest', + '%value%' => $productBuyRequest($entityId, $i, $type)['quote'] + ]); + $this->query('quote_item_option', $order, $itemData, [ + '%code%' => 'attributes', + '%value%' => $productBuyRequest($entityId, $i, $type)['super_attribute'] + ]); + $itemData['%productId%'] = $productChildId($entityId, $i, $type); + $this->query('quote_item_option', $itemData, [ + '%code%' => "product_qty_" . $productChildId($entityId, $i, $type), + '%value%' => "1" + ]); + $this->query('quote_item_option', $itemData, [ + '%code%' => "simple_product", + '%value%' => $productChildId($entityId, $i, $type) + ]); + $itemIdSequence->next(); + + // Generate child item + $itemData = [ + '%productId%' => $productChildId($entityId, $i, $type), + '%sku%' => $productSku($entityId, $i, $type), + '%name%' => $productName($entityId, $i, $type), + '%productOptions%' => $productChildBuyRequest($entityId, $i, $type)['order'], + '%itemId%' => $itemIdSequence->current(), + '%parentItemId%' => $parentItemId, + '%productType%' => Type::TYPE_SIMPLE + ]; + + $this->query('sales_order_item', $order, $itemData); + $this->query('quote_item', $order, $itemData); + $this->query('quote_item_option', $itemData, [ + '%code%' => "info_buyRequest", + '%value%' => $productChildBuyRequest($entityId, $i, $type)['quote'] + ]); + $this->query('quote_item_option', $itemData, [ + '%code%' => "parent_product_id", + '%value%' => $productId($entityId, $i, $type) + ]); + $itemIdSequence->next(); + } + } + } catch (\Exception $lastException) { + foreach ($this->resourceConnections as $connection) { + if ($connection->getTransactionLevel() > 0) { + $connection->rollBack(); + } + } + throw $lastException; + } + + if ($batchNumber >= self::BATCH_SIZE) { + $this->commitBatch(); + $batchNumber = 0; + } + $entityId++; + } + + foreach ($this->resourceConnections as $connection) { + if ($connection->getTransactionLevel() > 0) { + $connection->commit(); + } + } + } + + /** + * Load and prepare INSERT query templates data from external file. + * + * Queries are prepared using external json file, where keys are DB column names and values represent data, + * to be inserted to the table. Data may contain a default value or a placeholder which is replaced later during + * flow (in the query method of this class). + * Additionally, in case if multiple DB connections are set up, transaction is started for each connection. + * + * @return void + */ + private function prepareQueryTemplates() + { + $fileName = __DIR__ . DIRECTORY_SEPARATOR . "_files" . DIRECTORY_SEPARATOR . "orders_fixture_data.json"; + // phpcs:ignore Magento2.Functions.DiscouragedFunction + $templateData = json_decode(file_get_contents(realpath($fileName)), true); + foreach ($templateData as $table => $template) { + if (isset($template['_table'])) { + $table = $template['_table']; + unset($template['_table']); + } + if (isset($template['_resource'])) { + $resource = $template['_resource']; + unset($template['_resource']); + } else { + $resource = explode("_", $table); + foreach ($resource as &$item) { + $item = ucfirst($item); + } + $resource = "Magento\\" + . array_shift($resource) + . "\\Model\\ResourceModel\\" + . implode("\\", $resource); + } + + $tableName = $this->getTableName($table, $resource); + + $querySuffix = ""; + if (isset($template['_query_suffix'])) { + $querySuffix = $template['_query_suffix']; + unset($template['_query_suffix']); + } + + $fields = implode(', ', array_keys($template)); + $values = implode(', ', array_values($template)); + + /** @var \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resourceModel */ + $resourceModel = $this->fixtureModel->getObjectManager()->get($resource); + $connection = $resourceModel->getConnection(); + if ($connection->getTransactionLevel() == 0) { + $connection->beginTransaction(); + } + + // phpcs:ignore Magento2.SQL.RawQuery + $this->queryTemplates[$table] = "INSERT INTO `{$tableName}` ({$fields}) VALUES ({$values}){$querySuffix};"; + $this->resourceConnections[$table] = $connection; + } + } + + /** + * Build and execute query. + * + * Builds a database query by replacing placeholder values in the cached queries and executes query in appropriate + * DB connection (if setup). Additionally filters out quote-related queries, if appropriate flag is set. + * + * @param string $table + * @param array $replacements + * @return void + */ + protected function query($table, ... $replacements) + { + if (!$this->orderQuotesEnable && strpos($table, "quote") !== false) { + return; + } + $query = $this->queryTemplates[$table]; + foreach ($replacements as $data) { + $query = str_replace(array_keys($data), array_values($data), $query); + } + + $this->resourceConnections[$table]->query($query); + } + + /** + * Get maximum order id currently existing in the database. + * + * To support incremental generation of the orders it is necessary to get the maximum order entity_id currently + * existing in the database. + * + * @param string $tableName + * @param string $resourceName + * @param string $column + * @return int + */ + private function getMaxEntityId($tableName, $resourceName, $column = 'entity_id') + { + $tableName = $this->getTableName( + $tableName, + $resourceName + ); + + /** @var \Magento\Framework\Model\ResourceModel\Db\VersionControl\AbstractDb $resource */ + $resource = $this->fixtureModel->getObjectManager()->get($resourceName); + $connection = $resource->getConnection(); + // phpcs:ignore Magento2.SQL.RawQuery + return (int)$connection->query("SELECT MAX(`{$column}`) FROM `{$tableName}`;")->fetchColumn(0); + } + + /** + * Get a limited amount of product id's from a collection filtered by store and specific product type. + * + * @param \Magento\Store\Api\Data\StoreInterface $store + * @param string $typeId + * @param int $limit + * @return array + * @throws \RuntimeException + */ + private function getProductIds(\Magento\Store\Api\Data\StoreInterface $store, $typeId, $limit = null) + { + /** @var $productCollection \Magento\Catalog\Model\ResourceModel\Product\Collection */ + $productCollection = $this->productCollectionFactory->create(); + + $productCollection->addStoreFilter($store->getId()); + $productCollection->addWebsiteFilter($store->getWebsiteId()); + + // "Big%" should be replaced with a configurable value. + if ($typeId === self::BIG_CONFIGURABLE_TYPE) { + $productCollection->getSelect()->where(" type_id = '" . Configurable::TYPE_CODE . "' "); + $productCollection->getSelect()->where(" sku LIKE 'Big%' "); + } else { + $productCollection->getSelect()->where(" type_id = '$typeId' "); + $productCollection->getSelect()->where(" sku NOT LIKE 'Big%' "); + } + $ids = $productCollection->getAllIds($limit); + if ($limit && count($ids) < $limit) { + throw new \RuntimeException('Not enough products of type: ' . $typeId); + } + return $ids; + } + + /** + * Prepare data for the simple products to be used as order items. + * + * Based on the Product Id's load data, which is required to replace placeholders in queries. + * + * @param array $productIds + * @return array + */ + private function prepareSimpleProducts(array $productIds = []) + { + $productsResult = []; + + foreach ($productIds as $key => $simpleId) { + $simpleProduct = $this->productRepository->getById($simpleId); + $productsResult[$key]['id'] = $simpleId; + $productsResult[$key]['sku'] = $simpleProduct->getSku(); + $productsResult[$key]['name'] = $simpleProduct->getName(); + $productsResult[$key]['buyRequest'] = $this->serializer->serialize([ + "info_buyRequest" => [ + "uenc" => "aHR0cDovL21hZ2VudG8uZGV2L2NvbmZpZ3VyYWJsZS1wcm9kdWN0LTEuaHRtbA,,", + "product" => $simpleId, + "qty" => "1" + ] + ]); + } + return $productsResult; + } + + /** + * Prepare data for the configurable products to be used as order items. + * + * Based on the Product Id's load data, which is required to replace placeholders in queries. + * + * @param array $productIds + * @return array + */ + private function prepareConfigurableProducts(array $productIds = []) + { + $productsResult = []; + foreach ($productIds as $key => $configurableId) { + $configurableProduct = $this->productRepository->getById($configurableId); + $options = $this->optionRepository->getList($configurableProduct->getSku()); + $configurableChild = $configurableProduct->getTypeInstance()->getUsedProducts($configurableProduct); + $configurableChild = reset($configurableChild); + $simpleSku = $configurableChild->getSku(); + $simpleId = $this->productRepository->get($simpleSku)->getId(); + + $attributesInfo = []; + $superAttribute = []; + foreach ($options as $option) { + $attributesInfo[] = [ + "label" => $option->getLabel(), + "value" => $option['options']['0']['label'], + "option_id" => $option->getAttributeId(), + "option_value" => $option->getValues()[0]->getValueIndex() + ]; + $superAttribute[$option->getAttributeId()] = $option->getValues()[0]->getValueIndex(); + } + + $configurableBuyRequest = [ + "info_buyRequest" => [ + "uenc" => "aHR0cDovL21hZ2UyLmNvbS9jYXRlZ29yeS0xLmh0bWw", + "product" => $configurableId, + "selected_configurable_option" => $simpleId, + "related_product" => "", + "super_attribute" => $superAttribute, + "qty" => 1 + ], + "attributes_info" => $attributesInfo, + "simple_name" => $configurableChild->getName(), + "simple_sku" => $configurableChild->getSku(), + ]; + $simpleBuyRequest = [ + "info_buyRequest" => [ + "uenc" => "aHR0cDovL21hZ2VudG8uZGV2L2NvbmZpZ3VyYWJsZS1wcm9kdWN0LTEuaHRtbA,,", + "product" => $configurableId, + "selected_configurable_option" => $simpleId, + "related_product" => "", + "super_attribute" => $superAttribute, + "qty" => "1" + ] + ]; + + $quoteConfigurableBuyRequest = $configurableBuyRequest['info_buyRequest']; + $quoteSimpleBuyRequest = $simpleBuyRequest['info_buyRequest']; + unset($quoteConfigurableBuyRequest['selected_configurable_option']); + unset($quoteSimpleBuyRequest['selected_configurable_option']); + + $productsResult[$key]['id'] = $configurableId; + $productsResult[$key]['sku'] = $simpleSku; + $productsResult[$key]['name'] = $configurableProduct->getName(); + $productsResult[$key]['childId'] = $simpleId; + $productsResult[$key]['buyRequest'] = [ + 'order' => $this->serializer->serialize($configurableBuyRequest), + 'quote' => $this->serializer->serialize($quoteConfigurableBuyRequest), + 'super_attribute' => $this->serializer->serialize($superAttribute) + ]; + $productsResult[$key]['childBuyRequest'] = [ + 'order' => $this->serializer->serialize($simpleBuyRequest), + 'quote' => $this->serializer->serialize($quoteSimpleBuyRequest), + ]; + } + return $productsResult; + } + + /** + * Commit all active transactions at the end of the batch. + * + * Many transactions may exist, since generation process creates a transaction per each available DB connection. + * + * @return void + */ + private function commitBatch() + { + foreach ($this->resourceConnections as $connection) { + if ($connection->getTransactionLevel() > 0) { + $connection->commit(); + $connection->beginTransaction(); + } + } + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating orders'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'orders' => 'Orders' + ]; + } + + /** + * Get real table name for db table, validated by db adapter. + * + * In case prefix or other features mutating default table names are used. + * + * @param string $tableName + * @param string $resourceName + * @return string + */ + public function getTableName($tableName, $resourceName) + { + /** @var \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource */ + $resource = $this->fixtureModel->getObjectManager()->get($resourceName); + return $resource->getConnection()->getTableName($resource->getTable($tableName)); + } + + /** + * Get sequence for order items + * + * @param int $maxItemId + * @param int $requestedOrders + * @param int $maxItemsPerOrder + * @return \Generator + */ + private function getItemIdSequence($maxItemId, $requestedOrders, $maxItemsPerOrder) + { + $requestedItems = $requestedOrders * $maxItemsPerOrder; + for ($i = $maxItemId + 1; $i <= $requestedItems; $i++) { + yield $i; + } + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/PriceProvider.php b/magento/setup/src/Magento/Setup/Fixtures/PriceProvider.php new file mode 100644 index 0000000..63ad3f0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/PriceProvider.php @@ -0,0 +1,36 @@ +productCollectionFactory = $collectionFactory; + } + + /** + * Get amount of products filtered by specified pattern + * + * @param int $requestedProducts + * @param string $productSkuPattern + * @return int + */ + public function getAmount($requestedProducts, $productSkuPattern) + { + $productSkuPattern = str_replace('%s', '[0-9]+', $productSkuPattern); + $productCollection = $this->productCollectionFactory->create(); + $productCollection + ->getSelect() + ->where('sku ?', new \Zend_Db_Expr('REGEXP \'^' . $productSkuPattern . '$\'')); + + return max(0, $requestedProducts - $productCollection->getSize()); + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteConfiguration.php b/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteConfiguration.php new file mode 100644 index 0000000..0e6f855 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteConfiguration.php @@ -0,0 +1,138 @@ + 'simple_count_to', + 'order_simple_product_count_from' => 'simple_count_from', + 'order_configurable_product_count_to' => 'configurable_count_to', + 'order_configurable_product_count_from' => 'configurable_count_from', + 'order_big_configurable_product_count_to' => 'big_configurable_count_to', + 'order_big_configurable_product_count_from' => 'big_configurable_count_from', + 'order_quotes_enable' => 'order_quotes_enable', + ]; + + /** + * @var string + */ + protected $fixtureDataFilename = 'orders_fixture_data.json'; + + /** + * @var FixtureModel + */ + private $fixtureModel; + + /** + * @param FixtureModel $fixtureModel + */ + public function __construct(FixtureModel $fixtureModel) + { + $this->fixtureModel = $fixtureModel; + } + + /** + * Fills object with data. + * + * @return $this + */ + public function load() + { + $this->addData([ + 'simple_count_to' => self::SIMPLE_PRODUCT_COUNT_TO, + 'simple_count_from' => self::SIMPLE_PRODUCT_COUNT_FROM, + 'configurable_count_to' => self::CONFIGURABLE_PRODUCT_COUNT_TO, + 'configurable_count_from' => self::CONFIGURABLE_PRODUCT_COUNT_FROM, + 'big_configurable_count_to' => self::BIG_CONFIGURABLE_PRODUCT_COUNT_TO, + 'big_configurable_count_from' => self::BIG_CONFIGURABLE_PRODUCT_COUNT_FROM, + ]); + + $this->setData( + 'fixture_data_filename', + dirname(__DIR__) . DIRECTORY_SEPARATOR . "_files" . DIRECTORY_SEPARATOR . $this->fixtureDataFilename + ); + $this->accumulateData(); + + return $this; + } + + /** + * Accumulate data from fixute model to object values. + * + * @return $this + */ + private function accumulateData() + { + foreach ($this->_globalMap as $getKey => $setKey) { + $value = $this->fixtureModel->getValue($getKey); + if (null !== $value) { + $this->setData($setKey, $value); + } + } + return $this; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteGenerator.php b/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteGenerator.php new file mode 100644 index 0000000..8b6b31e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteGenerator.php @@ -0,0 +1,805 @@ +storeManager = $storeManager; + $this->productCollectionFactory = $productCollectionFactory; + $this->productRepository = $productRepository; + $this->optionRepository = $optionRepository; + $this->linkManagement = $linkManagement; + $this->serializer = $serializer; + $this->config = $config; + $this->fixtureModel = $fixtureModel; + } + + /** + * Prepare and save quotes in database. + * + * @throws \Exception + * @return void + */ + public function generateQuotes() + { + $maxItemsPerOrder = $this->config->getSimpleCountTo() + + ($this->config->getConfigurableCountTo() + $this->config->getBigConfigurableCountTo()) * 2; + + $maxItemId = $this->getMaxEntityId( + 'quote_item', + \Magento\Quote\Model\ResourceModel\Quote\Item::class, + 'item_id' + ); + /** @var \Generator $itemIdSequence */ + $itemIdSequence = $this->getItemIdSequence( + $maxItemId, + $this->config->getRequiredQuoteQuantity(), + $maxItemsPerOrder + ); + $this->productStubData = $this->prepareProductsForQuote(); + $this->prepareQueryTemplates(); + + $entityId = $this->getMaxEntityId('quote', \Magento\Quote\Model\ResourceModel\Quote::class, 'entity_id'); + $quoteQty = $this->config->getExistsQuoteQuantity(); + $batchNumber = 0; + while ($quoteQty < $this->config->getRequiredQuoteQuantity()) { + $entityId++; + $batchNumber++; + $quoteQty++; + + try { + $this->saveQuoteWithQuoteItems($entityId, $itemIdSequence); + } catch (\Exception $lastException) { + foreach ($this->resourceConnections as $connection) { + if ($connection->getTransactionLevel() > 0) { + $connection->rollBack(); + } + } + throw $lastException; + } + + if ($batchNumber >= self::BATCH_SIZE) { + $this->commitBatch(); + $batchNumber = 0; + } + } + + foreach ($this->resourceConnections as $connection) { + if ($connection->getTransactionLevel() > 0) { + $connection->commit(); + } + } + } + + /** + * Save quote and quote items. + * + * @param int $entityId + * @param \Generator $itemIdSequence + * @return void + */ + private function saveQuoteWithQuoteItems($entityId, \Generator $itemIdSequence) + { + $productCount = [ + Type::TYPE_SIMPLE => random_int( + $this->config->getSimpleCountFrom(), + $this->config->getSimpleCountTo() + ), + Configurable::TYPE_CODE => random_int( + $this->config->getConfigurableCountFrom(), + $this->config->getConfigurableCountTo() + ), + QuoteConfiguration::BIG_CONFIGURABLE_TYPE => random_int( + $this->config->getBigConfigurableCountFrom(), + $this->config->getBigConfigurableCountTo() + ) + ]; + $quote = [ + '%itemsPerOrder%' => array_sum($productCount), + '%orderNumber%' => 100000000 * $this->getStubProductStoreId($entityId) + $entityId, + '%email%' => "quote_{$entityId}@example.com", + '%time%' => date(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT), + '%productStoreId%' => $this->getStubProductStoreId($entityId), + '%productStoreName%' => $this->getStubProductStoreName($entityId), + '%entityId%' => $entityId, + ]; + $shippingAddress = ['%orderAddressId%' => $entityId * 2 - 1, '%addressType%' => 'shipping']; + $billingAddress = ['%orderAddressId%' => $entityId * 2, '%addressType%' => 'billing']; + $address = $this->getAddressDataFixture(); + + $this->query('quote', $quote); + $this->query('quote_address', $quote, $address, $shippingAddress); + $this->query('quote_address', $quote, $address, $billingAddress); + + for ($i = 0; $i < $productCount[Type::TYPE_SIMPLE]; $i++) { + $this->saveItemSimpleData($entityId, $i, $itemIdSequence->current(), $quote); + $itemIdSequence->next(); + } + + foreach ([Configurable::TYPE_CODE, QuoteConfiguration::BIG_CONFIGURABLE_TYPE] as $type) { + for ($i = 0; $i < $productCount[$type]; $i++) { + // Generate parent item + $parentItemId = $itemIdSequence->current(); + $this->saveParentItemConfigurableData($entityId, $i, $parentItemId, $type, $quote); + $itemIdSequence->next(); + + // Generate child item + $itemId = $itemIdSequence->current(); + $this->saveChildItemConfigurable($entityId, $i, $itemId, $parentItemId, $type, $quote); + $itemIdSequence->next(); + } + } + } + + /** + * Prepare and save quote item with simple product. + * + * @param int $entityId + * @param int $index + * @param int $itemId + * @param array $quote + * @return void + */ + private function saveItemSimpleData($entityId, $index, $itemId, array $quote) + { + $itemData = [ + '%productId%' => $this->getStubProductId($entityId, $index, Type::TYPE_SIMPLE), + '%sku%' => $this->getStubProductSku($entityId, $index, Type::TYPE_SIMPLE), + '%name%' => $this->getStubProductName($entityId, $index, Type::TYPE_SIMPLE), + '%itemId%' => $itemId, + '%productType%' => Type::TYPE_SIMPLE, + '%productOptions%' => $this->getStubProductBuyRequest($entityId, $index, Type::TYPE_SIMPLE), + '%parentItemId%' => 'null', + ]; + $this->query('quote_item', $quote, $itemData); + $this->query('quote_item_option', $quote, $itemData, [ + '%code%' => 'info_buyRequest', + '%value%' => $this->serializer->serialize([ + 'product' => $this->getStubProductId($entityId, $index, Type::TYPE_SIMPLE), + 'qty' => "1", + 'uenc' => 'aHR0cDovL21hZ2UyLmNvbS9jYXRlZ29yeS0xLmh0bWw' + ]) + ]); + } + + /** + * Prepare and save parent quote item for configurable product. + * + * @param int $entityId + * @param int $index + * @param int $parentItemId + * @param string $productType + * @param array $quote + * @return void + */ + private function saveParentItemConfigurableData($entityId, $index, $parentItemId, $productType, array $quote) + { + $itemData = [ + '%productId%' => $this->getStubProductId($entityId, $index, $productType), + '%sku%' => $this->getStubProductSku($entityId, $index, $productType), + '%name%' => $this->getStubProductName($entityId, $index, $productType), + '%productOptions%' => $this->getStubProductBuyRequest($entityId, $index, $productType)['order'], + '%itemId%' => $parentItemId, + '%parentItemId%' => 'null', + '%productType%' => Configurable::TYPE_CODE + ]; + $this->query('quote_item', $quote, $itemData); + $this->query('quote_item_option', $quote, $itemData, [ + '%code%' => 'info_buyRequest', + '%value%' => $this->getStubProductBuyRequest($entityId, $index, $productType)['quote'] + ]); + $this->query('quote_item_option', $quote, $itemData, [ + '%code%' => 'attributes', + '%value%' => $this->getStubProductBuyRequest($entityId, $index, $productType)['super_attribute'] + ]); + $itemData['%productId%'] = $this->getStubProductChildId($entityId, $index, $productType); + $this->query('quote_item_option', $itemData, [ + '%code%' => "product_qty_" . $this->getStubProductChildId($entityId, $index, $productType), + '%value%' => "1" + ]); + $this->query('quote_item_option', $itemData, [ + '%code%' => "simple_product", + '%value%' => $this->getStubProductChildId($entityId, $index, $productType) + ]); + } + + /** + * Prepare and save child quote item for configurable product. + * + * @param int $entityId + * @param int $index + * @param int $itemId + * @param int $parentItemId + * @param string $productType + * @param array $quote + * @return void + */ + private function saveChildItemConfigurable($entityId, $index, $itemId, $parentItemId, $productType, array $quote) + { + $itemData = [ + '%productId%' => $this->getStubProductChildId($entityId, $index, $productType), + '%sku%' => $this->getStubProductSku($entityId, $index, $productType), + '%name%' => $this->getStubProductName($entityId, $index, $productType), + '%productOptions%' => $this->getStubProductChildBuyRequest($entityId, $index, $productType)['order'], + '%itemId%' => $itemId, + '%parentItemId%' => $parentItemId, + '%productType%' => Type::TYPE_SIMPLE + ]; + + $this->query('quote_item', $quote, $itemData); + $this->query('quote_item_option', $itemData, [ + '%code%' => "info_buyRequest", + '%value%' => $this->getStubProductChildBuyRequest($entityId, $index, $productType)['quote'] + ]); + $this->query('quote_item_option', $itemData, [ + '%code%' => "parent_product_id", + '%value%' => $this->getStubProductId($entityId, $index, $productType) + ]); + } + + /** + * Get store id for quote item by product index. + * + * @param int $entityId + * @return int + */ + private function getStubProductStoreId($entityId) + { + return $this->productStubData[$this->getProductStubIndex($entityId)][0]; + } + + /** + * Get store name for quote item by product index. + * + * @param int $entityId + * @return string + */ + private function getStubProductStoreName($entityId) + { + return $this->productStubData[$this->getProductStubIndex($entityId)][1]; + } + + /** + * Get product id for quote item by product index. + * + * @param int $entityId + * @param int $index + * @param string $type + * @return int + */ + private function getStubProductId($entityId, $index, $type) + { + return $this->productStubData[$this->getProductStubIndex($entityId)][2][$type][$index]['id']; + } + + /** + * Get product SKU for quote item by product index. + * + * @param int $entityId + * @param int $index + * @param string $type + * @return string + */ + private function getStubProductSku($entityId, $index, $type) + { + return $this->productStubData[$this->getProductStubIndex($entityId)][2][$type][$index]['sku']; + } + + /** + * Get product name for quote item by product index. + * + * @param int $entityId + * @param int $index + * @param string $type + * @return string + */ + private function getStubProductName($entityId, $index, $type) + { + return $this->productStubData[$this->getProductStubIndex($entityId)][2][$type][$index]['name']; + } + + /** + * Get product buy request for quote item by product index. + * + * @param int $entityId + * @param int $index + * @param string $type + * @return string + */ + private function getStubProductBuyRequest($entityId, $index, $type) + { + return $this->productStubData[$this->getProductStubIndex($entityId)][2][$type][$index]['buyRequest']; + } + + /** + * Get configurable product child id for quote item by product index. + * + * @param int $entityId + * @param int $index + * @param string $type + * @return string + */ + private function getStubProductChildBuyRequest($entityId, $index, $type) + { + return $this->productStubData[$this->getProductStubIndex($entityId)][2][$type][$index]['childBuyRequest']; + } + + /** + * Get configurable product child id for quote item by product index. + * + * @param int $entityId + * @param int $index + * @param string $type + * @return int + */ + private function getStubProductChildId($entityId, $index, $type) + { + return $this->productStubData[$this->getProductStubIndex($entityId)][2][$type][$index]['childId']; + } + + /** + * Get index of item in product stub array. + * + * @param int $entityId + * @return int + */ + private function getProductStubIndex($entityId) + { + $storeCount = count($this->productStubData); + $qty = intdiv($this->config->getRequiredQuoteQuantity(), $storeCount); + return intdiv($entityId, $qty) % $storeCount; + } + + /** + * Get quote address mock data. + * + * @return array + */ + private function getAddressDataFixture() + { + return [ + '%firstName%' => 'First Name', + '%lastName%' => 'Last Name', + '%company%' => 'Company', + '%address%' => 'Address', + '%city%' => 'city', + '%state%' => 'Alabama', + '%country%' => 'US', + '%zip%' => '11111', + '%phone%' => '911' + ]; + } + + /** + * Prepare mock of products for quotes. + * + * @return array + */ + private function prepareProductsForQuote() + { + $result = []; + + foreach ($this->storeManager->getStores() as $store) { + $productsResult = []; + $this->storeManager->setCurrentStore($store->getId()); + + if ($this->config->getSimpleCountTo() > 0) { + $productsResult[Type::TYPE_SIMPLE] = $this->prepareSimpleProducts( + $this->getProductIds($store, Type::TYPE_SIMPLE, $this->config->getSimpleCountTo()) + ); + } + $configurables = [ + Configurable::TYPE_CODE => $this->config->getConfigurableCountTo(), + QuoteConfiguration::BIG_CONFIGURABLE_TYPE => $this->config->getBigConfigurableCountTo(), + ]; + + foreach ($configurables as $type => $qty) { + if ($qty > 0) { + $productsResult[$type] = $this->prepareConfigurableProducts( + $this->getProductIds( + $store, + $type, + $qty + ) + ); + } + } + + $result[] = [ + $store->getId(), + implode(PHP_EOL, [ + $this->storeManager->getWebsite($store->getWebsiteId())->getName(), + $this->storeManager->getGroup($store->getStoreGroupId())->getName(), + $store->getName() + ]), + $productsResult + ]; + } + + return $result; + } + + /** + * Load and prepare INSERT query templates data from external file. + * + * Queries are prepared using external json file, where keys are DB column names and values represent data, + * to be inserted to the table. Data may contain a default value or a placeholder which is replaced later during + * flow (in the query method of this class). + * Additionally, in case if multiple DB connections are set up, transaction is started for each connection. + * + * @return void + */ + private function prepareQueryTemplates() + { + $fileName = $this->config->getFixtureDataFilename(); + // phpcs:ignore Magento2.Functions.DiscouragedFunction + $templateData = json_decode(file_get_contents(realpath($fileName)), true); + foreach ($templateData as $table => $template) { + if (isset($template['_table'])) { + $table = $template['_table']; + unset($template['_table']); + } + if (isset($template['_resource'])) { + $resource = $template['_resource']; + unset($template['_resource']); + } else { + $resource = explode("_", $table); + foreach ($resource as &$item) { + $item = ucfirst($item); + } + $resource = "Magento\\" + . array_shift($resource) + . "\\Model\\ResourceModel\\" + . implode("\\", $resource); + } + + $tableName = $this->getTableName($table, $resource); + + $querySuffix = ""; + if (isset($template['_query_suffix'])) { + $querySuffix = $template['_query_suffix']; + unset($template['_query_suffix']); + } + + $fields = implode(', ', array_keys($template)); + $values = implode(', ', array_values($template)); + + $connection = $this->getConnection($resource); + if ($connection->getTransactionLevel() == 0) { + $connection->beginTransaction(); + } + + // phpcs:ignore Magento2.SQL.RawQuery + $this->queryTemplates[$table] = "INSERT INTO `{$tableName}` ({$fields}) VALUES ({$values}){$querySuffix};"; + $this->resourceConnections[$table] = $connection; + } + } + + /** + * Build and execute query. + * + * Builds a database query by replacing placeholder values in the cached queries and executes query in appropriate + * DB connection (if setup). Additionally filters out quote-related queries, if appropriate flag is set. + * + * @param string $table + * @param array $replacements + * @return void + */ + protected function query($table, ...$replacements) + { + $query = $this->queryTemplates[$table]; + foreach ($replacements as $data) { + $query = str_replace(array_keys($data), array_values($data), $query); + } + + $this->resourceConnections[$table]->query($query); + } + + /** + * Get maximum order id currently existing in the database. + * + * To support incremental generation of the orders it is necessary to get the maximum order entity_id currently. + * existing in the database. + * + * @param string $tableName + * @param string $resourceName + * @param string $column [optional] + * @return int + */ + private function getMaxEntityId($tableName, $resourceName, $column = 'entity_id') + { + $tableName = $this->getTableName($tableName, $resourceName); + $connection = $this->getConnection($resourceName); + // phpcs:ignore Magento2.SQL.RawQuery + return (int)$connection->query("SELECT MAX(`{$column}`) FROM `{$tableName}`;")->fetchColumn(0); + } + + /** + * Get a limited amount of product id's from a collection filtered by store and specific product type. + * + * @param \Magento\Store\Api\Data\StoreInterface $store + * @param string $typeId + * @param int $limit [optional] + * @return array + */ + private function getProductIds(\Magento\Store\Api\Data\StoreInterface $store, $typeId, $limit = null) + { + /** @var $productCollection \Magento\Catalog\Model\ResourceModel\Product\Collection */ + $productCollection = $this->productCollectionFactory->create(); + $productCollection->addStoreFilter($store->getId()); + $productCollection->addWebsiteFilter($store->getWebsiteId()); + + // "Big%" should be replaced with a configurable value. + if ($typeId === QuoteConfiguration::BIG_CONFIGURABLE_TYPE) { + $productCollection->getSelect()->where(" type_id = '" . Configurable::TYPE_CODE . "' "); + $productCollection->getSelect()->where(" sku LIKE 'Big%' "); + } else { + $productCollection->getSelect()->where(" type_id = '$typeId' "); + $productCollection->getSelect()->where(" sku NOT LIKE 'Big%' "); + } + + return $productCollection->getAllIds($limit); + } + + /** + * Prepare data for the simple products to be used as order items. + * + * Based on the Product Id's load data, which is required to replace placeholders in queries. + * + * @param array $productIds [optional] + * @return array + */ + private function prepareSimpleProducts(array $productIds = []) + { + $productsResult = []; + foreach ($productIds as $key => $simpleId) { + $simpleProduct = $this->productRepository->getById($simpleId); + $productsResult[$key]['id'] = $simpleId; + $productsResult[$key]['sku'] = $simpleProduct->getSku(); + $productsResult[$key]['name'] = $simpleProduct->getName(); + $productsResult[$key]['buyRequest'] = $this->serializer->serialize([ + "info_buyRequest" => [ + "uenc" => "aHR0cDovL21hZ2VudG8uZGV2L2NvbmZpZ3VyYWJsZS1wcm9kdWN0LTEuaHRtbA,,", + "product" => $simpleId, + "qty" => "1" + ] + ]); + } + return $productsResult; + } + + /** + * Prepare data for the configurable products to be used as order items. + * + * Based on the Product Id's load data, which is required to replace placeholders in queries. + * + * @param array $productIds [optional] + * @return array + */ + private function prepareConfigurableProducts(array $productIds = []) + { + $productsResult = []; + foreach ($productIds as $key => $configurableId) { + $configurableProduct = $this->productRepository->getById($configurableId); + $options = $this->optionRepository->getList($configurableProduct->getSku()); + $configurableChild = $this->linkManagement->getChildren($configurableProduct->getSku())[0]; + $simpleSku = $configurableChild->getSku(); + $simpleId = $this->productRepository->get($simpleSku)->getId(); + + $attributesInfo = []; + $superAttribute = []; + foreach ($options as $option) { + $attributesInfo[] = [ + "label" => $option->getLabel(), + "value" => $option['options']['0']['label'] ?? null, + "option_id" => $option->getAttributeId(), + "option_value" => $option->getValues()[0]->getValueIndex() + ]; + $superAttribute[$option->getAttributeId()] = $option->getValues()[0]->getValueIndex(); + } + + $configurableBuyRequest = [ + "info_buyRequest" => [ + "uenc" => "aHR0cDovL21hZ2UyLmNvbS9jYXRlZ29yeS0xLmh0bWw", + "product" => $configurableId, + "selected_configurable_option" => $simpleId, + "related_product" => "", + "super_attribute" => $superAttribute, + "qty" => 1 + ], + "attributes_info" => $attributesInfo, + "simple_name" => $configurableChild->getName(), + "simple_sku" => $configurableChild->getSku(), + ]; + $simpleBuyRequest = [ + "info_buyRequest" => [ + "uenc" => "aHR0cDovL21hZ2VudG8uZGV2L2NvbmZpZ3VyYWJsZS1wcm9kdWN0LTEuaHRtbA,,", + "product" => $configurableId, + "selected_configurable_option" => $simpleId, + "related_product" => "", + "super_attribute" => $superAttribute, + "qty" => "1" + ] + ]; + + $quoteConfigurableBuyRequest = $configurableBuyRequest['info_buyRequest']; + $quoteSimpleBuyRequest = $simpleBuyRequest['info_buyRequest']; + unset($quoteConfigurableBuyRequest['selected_configurable_option']); + unset($quoteSimpleBuyRequest['selected_configurable_option']); + + $productsResult[$key]['id'] = $configurableId; + $productsResult[$key]['sku'] = $simpleSku; + $productsResult[$key]['name'] = $configurableProduct->getName(); + $productsResult[$key]['childId'] = $simpleId; + $productsResult[$key]['buyRequest'] = [ + 'order' => $this->serializer->serialize($configurableBuyRequest), + 'quote' => $this->serializer->serialize($quoteConfigurableBuyRequest), + 'super_attribute' => $this->serializer->serialize($superAttribute) + ]; + $productsResult[$key]['childBuyRequest'] = [ + 'order' => $this->serializer->serialize($simpleBuyRequest), + 'quote' => $this->serializer->serialize($quoteSimpleBuyRequest), + ]; + } + return $productsResult; + } + + /** + * Commit all active transactions at the end of the batch. + * + * Many transactions may exist, since generation process creates a transaction per each available DB connection. + * + * @return void + */ + private function commitBatch() + { + foreach ($this->resourceConnections as $connection) { + if ($connection->getTransactionLevel() > 0) { + $connection->commit(); + $connection->beginTransaction(); + } + } + } + + /** + * Get sequence for order items. + * + * @param int $maxItemId + * @param int $requestedOrders + * @param int $maxItemsPerOrder + * @return \Generator + */ + private function getItemIdSequence($maxItemId, $requestedOrders, $maxItemsPerOrder) + { + $requestedItems = $maxItemId + ($requestedOrders + 1) * $maxItemsPerOrder; + for ($i = $maxItemId + 1; $i <= $requestedItems; $i++) { + yield $i; + } + } + + /** + * Get real table name for db table, validated by db adapter. + * + * In case prefix or other features mutating default table names are used. + * + * @param string $tableName + * @param string $resourceName + * @return string + */ + private function getTableName($tableName, $resourceName) + { + /** @var \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource */ + $resource = $this->fixtureModel->getObjectManager()->get($resourceName); + return $this->getConnection($resourceName)->getTableName($resource->getTable($tableName)); + } + + /** + * Get connection to database for specified resource. + * + * @param string $resourceName + * @return \Magento\Framework\DB\Adapter\AdapterInterface + */ + private function getConnection($resourceName) + { + $resource = $this->fixtureModel->getObjectManager()->get($resourceName); + return $resource->getConnection(); + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteGeneratorFactory.php b/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteGeneratorFactory.php new file mode 100644 index 0000000..e904d21 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/Quote/QuoteGeneratorFactory.php @@ -0,0 +1,50 @@ +objectManager = $objectManager; + $this->instanceName = $instanceName; + } + + /** + * Create class instance with specified parameters. + * + * @param array $data [optional] + * @return mixed + */ + public function create(array $data = []) + { + return $this->objectManager->create($this->instanceName, $data); + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/SimpleProductsFixture.php b/magento/setup/src/Magento/Setup/Fixtures/SimpleProductsFixture.php new file mode 100644 index 0000000..84fb2e5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/SimpleProductsFixture.php @@ -0,0 +1,446 @@ +{products amount} + * Products will be distributed per Default and pre-defined + * attribute sets (@see setup/performance-toolkit/config/attributeSets.xml) + * + * If extra attribute set is specified in profile as: {sets amount} + * then products also will be distributed per additional attribute sets + * + * Products will be uniformly distributed per categories and websites + * If node "assign_entities_to_all_websites" from profile is set to "1" then products will be assigned to all websites + * + * @see setup/performance-toolkit/profiles/ce/small.xml + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class SimpleProductsFixture extends Fixture +{ + /** + * Simple product sku pattern + */ + const SKU_PATTERN = 'product_dynamic_%s'; + + /** + * @var int + */ + protected $priority = 31; + + /** + * @var array + */ + private $descriptionConfig; + + /** + * @var array + */ + private $shortDescriptionConfig; + + /** + * @var ProductFactory + */ + private $productFactory; + + /** + * @var ProductGenerator + */ + private $productGenerator; + + /** + * @var int + */ + private $defaultAttributeSetId; + + /** + * @var Collection + */ + private $attributeCollectionFactory; + + /** + * @var AttributeSetCollectionFactory + */ + private $attributeSetCollectionFactory; + + /** + * @var SearchTermDescriptionGeneratorFactory + */ + private $descriptionGeneratorFactory; + + /** + * @var ProductsAmountProvider + */ + private $productsAmountProvider; + + /** + * @var WebsiteCategoryProvider + */ + private $websiteCategoryProvider; + + /** + * @var PriceProvider + */ + private $priceProvider; + + /** + * @var int[] + */ + private $additionalAttributeSetIds; + + /** + * @param FixtureModel $fixtureModel + * @param ProductFactory $productFactory + * @param ProductGenerator $productGenerator + * @param CollectionFactory $attributeCollectionFactory + * @param AttributeSetCollectionFactory $attributeSetCollectionFactory + * @param SearchTermDescriptionGeneratorFactory $descriptionGeneratorFactory + * @param WebsiteCategoryProvider $websiteCategoryProvider + * @param ProductsAmountProvider $productsAmountProvider + * @param PriceProvider $priceProvider + * @internal param FixtureConfig $fixtureConfig + */ + public function __construct( + FixtureModel $fixtureModel, + ProductFactory $productFactory, + ProductGenerator $productGenerator, + CollectionFactory $attributeCollectionFactory, + AttributeSetCollectionFactory $attributeSetCollectionFactory, + SearchTermDescriptionGeneratorFactory $descriptionGeneratorFactory, + WebsiteCategoryProvider $websiteCategoryProvider, + ProductsAmountProvider $productsAmountProvider, + PriceProvider $priceProvider + ) { + parent::__construct($fixtureModel); + $this->productFactory = $productFactory; + $this->productGenerator = $productGenerator; + $this->attributeCollectionFactory = $attributeCollectionFactory; + $this->attributeSetCollectionFactory = $attributeSetCollectionFactory; + $this->descriptionGeneratorFactory = $descriptionGeneratorFactory; + $this->productsAmountProvider = $productsAmountProvider; + $this->websiteCategoryProvider = $websiteCategoryProvider; + $this->priceProvider = $priceProvider; + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating simple products'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'simple_products' => 'Simple products' + ]; + } + + /** + * @inheritdoc + * + * @SuppressWarnings(PHPMD) + */ + public function execute() + { + $simpleProductsCount = $this->productsAmountProvider->getAmount( + $this->fixtureModel->getValue('simple_products', 0), + $this->getSkuPattern() + ); + + if (!$simpleProductsCount) { + return; + } + + $defaultAttributeSets = $this->getDefaultAttributeSets(); + $searchTermsConfig = $this->getSearchTerms(); + + /** @var \Magento\Setup\Model\SearchTermDescriptionGenerator $descriptionGenerator */ + $descriptionGenerator = $this->descriptionGeneratorFactory->create( + $this->getDescriptionConfig(), + $searchTermsConfig, + $simpleProductsCount, + 'Full simple product Description %s' + ); + + /** @var \Magento\Setup\Model\SearchTermDescriptionGenerator $shortDescriptionGenerator */ + $shortDescriptionGenerator = $this->descriptionGeneratorFactory->create( + $this->getShortDescriptionConfig(), + $searchTermsConfig, + $simpleProductsCount, + 'Short simple product Description %s' + ); + + $additionalAttributeSetIds = $this->getAdditionalAttributeSetIds(); + $attributeSet = function ($index) use ($defaultAttributeSets, $additionalAttributeSetIds) { + // phpcs:ignore + mt_srand($index); + $attributeSetCount = count(array_keys($defaultAttributeSets)); + if ($attributeSetCount > (($index - 1) % (int)$this->fixtureModel->getValue('categories', 30))) { + // phpcs:ignore Magento2.Security.InsecureFunction + return array_keys($defaultAttributeSets)[mt_rand(0, count(array_keys($defaultAttributeSets)) - 1)]; + } else { + $customSetsAmount = count($additionalAttributeSetIds); + return $customSetsAmount + ? $additionalAttributeSetIds[$index % $customSetsAmount] + : $this->getDefaultAttributeSetId(); + } + }; + + $additionalAttributeValues = $this->getAdditionalAttributeValues(); + $additionalAttributes = function ( + $attributeSetId, + $index + ) use ( + $defaultAttributeSets, + $additionalAttributeValues + ) { + $attributeValues = []; + // phpcs:ignore + mt_srand($index); + $attributeValuesByAttributeSet = $defaultAttributeSets[$attributeSetId] + ?? $additionalAttributeValues[$attributeSetId]; + if (!empty($attributeValuesByAttributeSet)) { + foreach ($attributeValuesByAttributeSet as $attributeCode => $values) { + // phpcs:ignore Magento2.Security.InsecureFunction + $attributeValues[$attributeCode] = $values[mt_rand(0, count($values) - 1)]; + } + } + + return $attributeValues; + }; + + $fixtureMap = [ + 'name' => function ($productId) { + return sprintf('Simple Product %s', $productId); + }, + 'sku' => function ($productId) { + return sprintf($this->getSkuPattern(), $productId); + }, + 'price' => function ($index, $entityNumber) { + return $this->priceProvider->getPrice($entityNumber); + }, + 'url_key' => function ($productId) { + return sprintf('simple-product-%s', $productId); + }, + 'description' => function ($index) use ($descriptionGenerator) { + return $descriptionGenerator->generate($index); + }, + 'short_description' => function ($index) use ($shortDescriptionGenerator) { + return $shortDescriptionGenerator->generate($index); + }, + 'website_ids' => function ($index, $entityNumber) { + return $this->websiteCategoryProvider->getWebsiteIds($index); + }, + 'category_ids' => function ($index, $entityNumber) { + return $this->websiteCategoryProvider->getCategoryId($index); + }, + 'attribute_set_id' => $attributeSet, + 'additional_attributes' => $additionalAttributes, + 'status' => function () { + return Status::STATUS_ENABLED; + } + ]; + $this->productGenerator->generate($simpleProductsCount, $fixtureMap); + } + + /** + * Get simple product sku pattern + * + * @return string + */ + private function getSkuPattern() + { + return self::SKU_PATTERN; + } + + /** + * Get default attribute set id + * + * @return int + */ + private function getDefaultAttributeSetId() + { + if (null === $this->defaultAttributeSetId) { + $this->defaultAttributeSetId = (int)$this->productFactory->create()->getDefaultAttributeSetId(); + } + + return $this->defaultAttributeSetId; + } + + /** + * Get default attribute sets with attributes. + * + * @return array + * @see config/attributeSets.xml + */ + private function getDefaultAttributeSets() + { + $attributeSets = $this->fixtureModel->getValue('attribute_sets', null); + $attributes = []; + + if ($attributeSets !== null && array_key_exists('attribute_set', $attributeSets)) { + foreach ($attributeSets['attribute_set'] as $attributeSet) { + $attributesData = array_key_exists(0, $attributeSet['attributes']['attribute']) + ? $attributeSet['attributes']['attribute'] : [$attributeSet['attributes']['attribute']]; + + $attributeCollection = $this->attributeCollectionFactory->create(); + + $attributeCollection->setAttributeSetFilterBySetName($attributeSet['name'], Product::ENTITY); + $attributeCollection->addFieldToFilter( + 'attribute_code', + array_column($attributesData, 'attribute_code') + ); + $attributes = $this->processAttributeValues($attributeCollection, $attributes); + } + } + $attributes[$this->getDefaultAttributeSetId()] = []; + + return $attributes; + } + + /** + * Get search terms config which used for product description generation + * + * @return array + */ + private function getSearchTerms() + { + $searchTerms = $this->fixtureModel->getValue('search_terms', []); + if (!empty($searchTerms)) { + $searchTerms = array_key_exists(0, $searchTerms['search_term']) + ? $searchTerms['search_term'] : [$searchTerms['search_term']]; + } + + return $searchTerms; + } + + /** + * Get description config + * + * @return array + */ + private function getDescriptionConfig() + { + if (null === $this->descriptionConfig) { + $this->descriptionConfig = $this->readDescriptionConfig('description'); + } + + return $this->descriptionConfig; + } + + /** + * Get short description config + * + * @return array + */ + private function getShortDescriptionConfig() + { + if (null === $this->shortDescriptionConfig) { + $this->shortDescriptionConfig = $this->readDescriptionConfig('short-description'); + } + + return $this->shortDescriptionConfig; + } + + /** + * Get description config from fixture + * + * @param string $configSrc + * @return array + */ + private function readDescriptionConfig($configSrc) + { + $configData = $this->fixtureModel->getValue($configSrc, []); + + if (isset($configData['mixin']['tags'])) { + $configData['mixin']['tags'] = explode('|', $configData['mixin']['tags']); + } + + return $configData; + } + + /** + * Get additional attribute set ids. + * + * @return int[] + */ + private function getAdditionalAttributeSetIds() + { + if (null === $this->additionalAttributeSetIds) { + /** @var AttributeSetCollection $sets */ + $sets = $this->attributeSetCollectionFactory->create(); + $sets->addFieldToFilter( + 'attribute_set_name', + ['like' => AttributeSetsFixture::PRODUCT_SET_NAME . '%'] + ); + $this->additionalAttributeSetIds = $sets->getAllIds(); + } + + return $this->additionalAttributeSetIds; + } + + /** + * Get values of additional attributes. + * + * @return array + */ + private function getAdditionalAttributeValues(): array + { + $attributeCollection = $this->attributeCollectionFactory->create(); + $attributeCollection->setAttributeSetsFilter($this->getAdditionalAttributeSetIds()) + ->addFieldToFilter('attribute_code', ['like' => 'attribute_set%']); + $attributeCollection->getSelect()->columns(['entity_attribute.attribute_set_id']); + + return $this->processAttributeValues($attributeCollection); + } + + /** + * Maps attribute values by attribute set and attribute code. + * + * @param Collection $attributeCollection + * @param array $attributes + * @return array + */ + private function processAttributeValues( + Collection $attributeCollection, + array $attributes = [] + ): array { + /** @var Attribute $attribute */ + foreach ($attributeCollection as $attribute) { + $values = []; + $options = $attribute->getOptions() ?? []; + $attributeSetId = $attribute->getAttributeSetId() ?? $this->getDefaultAttributeSetId(); + foreach ($options as $option) { + if ($option->getValue()) { + $values[] = $option->getValue(); + } + } + $attributes[$attributeSetId][$attribute->getAttributeCode()] = $values; + } + + return $attributes; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/StoresFixture.php b/magento/setup/src/Magento/Setup/Fixtures/StoresFixture.php new file mode 100644 index 0000000..691a7f4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/StoresFixture.php @@ -0,0 +1,391 @@ +{amount of websites} + * {amount of store groups} + * {amount of store views} + * {1|0} + * + * Each node of configuration except + * means how many entities need to be generated + * + * Store groups will have normal distribution among websites + * Store views will have normal distribution among store groups + * + * 1 + * means that all stores will have the same root category + * + * 0 + * means that all stores will have unique root category + * + * @see setup/performance-toolkit/profiles/ce/small.xml + * @SuppressWarnings(PHPMD) + */ +class StoresFixture extends Fixture +{ + private const DEFAULT_WEBSITE_COUNT = 1; + + private const DEFAULT_STORE_COUNT = 1; + + private const DEFAULT_STORE_VIEW_COUNT = 1; + + /** + * @var int + */ + protected $priority = 10; + + /** + * @var array + */ + private $websiteIds = []; + + /** + * @var array + */ + private $storeGroupsIds = []; + + /** + * @var array + */ + private $storeGroupsToWebsites = []; + + /** + * @var StoreManager + */ + private $storeManager; + + /** + * @var Writer + */ + private $scopeConfig; + + /** + * @var Group + */ + private $defaultStoreGroup; + + /** + * @var Website + */ + private $defaultWebsite; + + /** + * @var int + */ + private $defaultParentCategoryId; + + /** + * @var int + */ + private $defaultStoreGroupId; + + /** + * @var int + */ + private $defaultWebsiteId; + + /** + * @var int + */ + private $storeGroupsCount; + + /** + * @var int + */ + private $storesCount; + + /** + * @var int + */ + private $websitesCount; + + /** + * @var bool + */ + private $singleRootCategory; + + /** + * @var StoreInterface + */ + private $defaultStoreView; + + /** + * @var int + */ + private $storeViewIds; + + /** + * @var string[] + */ + private $websiteCodes = []; + + /** + * @var ManagerInterface + */ + private $eventManager; + + /** + * @var CategoryFactory + */ + private $categoryFactory; + + /** + * @var Config + */ + private $localeConfig; + + /** + * StoresFixture constructor + * @param FixtureModel $fixtureModel + * @param StoreManager $storeManager + * @param ManagerInterface $eventManager + * @param CategoryFactory $categoryFactory + * @param Config $localeConfig + * @param Writer $scopeConfig + */ + public function __construct( + FixtureModel $fixtureModel, + StoreManager $storeManager, + ManagerInterface $eventManager, + CategoryFactory $categoryFactory, + Config $localeConfig, + Writer $scopeConfig + ) { + parent::__construct($fixtureModel); + $this->storeManager = $storeManager; + $this->eventManager = $eventManager; + $this->categoryFactory = $categoryFactory; + $this->localeConfig = $localeConfig; + $this->scopeConfig = $scopeConfig; + } + + /** + * @inheritdoc + * + * @SuppressWarnings(PHPMD) + */ + public function execute() + { + //get settings counts + $this->websitesCount = $this->fixtureModel->getValue('websites', self::DEFAULT_WEBSITE_COUNT); + $this->storeGroupsCount = $this->fixtureModel->getValue('store_groups', self::DEFAULT_STORE_COUNT); + $this->storesCount = $this->fixtureModel->getValue('store_views', self::DEFAULT_STORE_VIEW_COUNT); + $this->singleRootCategory = (bool)$this->fixtureModel->getValue('assign_entities_to_all_websites', false); + if ($this->websitesCount <= self::DEFAULT_WEBSITE_COUNT + && $this->storeGroupsCount <= self::DEFAULT_STORE_COUNT + && $this->storesCount <= self::DEFAULT_STORE_VIEW_COUNT + ) { + return; + } + //Get existing entities counts + $storeGroups = $this->storeManager->getGroups(); + $this->storeGroupsIds= array_keys($storeGroups); + foreach ($storeGroups as $storeGroupId => $storeGroup) { + $this->storeGroupsToWebsites[$storeGroupId] = $storeGroup->getWebsiteId(); + } + $this->websiteIds = array_values(array_unique($this->storeGroupsToWebsites)); + $this->defaultWebsite = $this->storeManager->getWebsite(); + $this->defaultStoreGroup = $this->storeManager->getGroup(); + $this->defaultWebsiteId = $this->defaultWebsite->getId(); + $this->defaultStoreGroupId = $this->defaultStoreGroup->getId(); + $this->defaultStoreView = $this->storeManager->getDefaultStoreView(); + $this->storeViewIds = array_keys($this->storeManager->getStores()); + $this->generateWebsites(); + $this->generateStoreGroups(); + $this->generateStoreViews(); + } + + /** + * Generating web sites + * + * @return void + */ + private function generateWebsites() + { + $existedWebsitesCount = count($this->websiteIds) + self::DEFAULT_WEBSITE_COUNT; + while ($existedWebsitesCount <= $this->websitesCount) { + $website = clone $this->defaultWebsite; + $websiteCode = sprintf('website_%d', $existedWebsitesCount); + $websiteName = sprintf('Website %d', $existedWebsitesCount); + $website->addData( + [ + 'website_id' => null, + 'code' => $websiteCode, + 'name' => $websiteName, + 'is_default' => false, + ] + ); + $website->save(); + $this->websiteIds[] = $website->getId(); + $existedWebsitesCount++; + $this->websiteCodes[] = $websiteCode; + } + } + + /** + * Generating store groups ('stores' on frontend) + * + * @return void + */ + private function generateStoreGroups() + { + $existedStoreGroupCount = count($this->storeGroupsIds); + $existedWebsitesCount = count($this->websiteIds); + while ($existedStoreGroupCount < $this->storeGroupsCount) { + $websiteId = $this->websiteIds[$existedStoreGroupCount % $existedWebsitesCount]; + $storeGroupName = sprintf('Store Group %d - website_id_%d', ++$existedStoreGroupCount, $websiteId); + $storeGroupCode = sprintf('store_group_%d', $existedStoreGroupCount); + $storeGroup = clone $this->defaultStoreGroup; + $storeGroup->addData( + [ + 'group_id' => null, + 'website_id' => $websiteId, + 'name' => $storeGroupName, + 'code' => $storeGroupCode, + 'root_category_id' => $this->getStoreCategoryId($storeGroupName), + ] + ); + $storeGroup->save(); + $this->storeGroupsIds[] = $storeGroup->getId(); + $this->storeGroupsToWebsites[$storeGroup->getId()] = $websiteId; + } + } + + /** + * Generating store views + * + * @return void + */ + private function generateStoreViews() + { + $localesList = $this->localeConfig->getAllowedLocales(); + $localesListCount = count($localesList); + $existedStoreViewsCount = count($this->storeViewIds); + $existedStoreGroupCount = count($this->storeGroupsIds); + while ($existedStoreViewsCount < $this->storesCount) { + $groupId = $this->storeGroupsIds[$existedStoreViewsCount % $existedStoreGroupCount]; + $websiteId = $this->storeGroupsToWebsites[$groupId]; + $store = clone $this->defaultStoreView; + $storeCode = sprintf('store_view_%d', ++$existedStoreViewsCount); + $storeName = sprintf( + 'Store view %d - website_id_%d - group_id_%d', + $existedStoreViewsCount, + $websiteId, + $groupId + ); + $store->addData( + [ + 'store_id' => null, + 'name' => $storeName, + 'website_id' => $websiteId, + 'group_id' => $groupId, + 'code' => $storeCode + ] + )->save(); + $this->saveStoreLocale($store->getId(), $localesList[$existedStoreViewsCount % $localesListCount]); + } + } + + /** + * Saves store into locale + * + * @param int $storeId + * @param string $localeCode + * @return void + */ + private function saveStoreLocale($storeId, $localeCode) + { + $this->scopeConfig->save( + \Magento\Directory\Helper\Data::XML_PATH_DEFAULT_LOCALE, + $localeCode, + \Magento\Store\Model\ScopeInterface::SCOPE_STORES, + $storeId + ); + } + + /** + * Getting category id for store + * + * @param string $storeGroupName + * @return int + */ + private function getStoreCategoryId($storeGroupName) + { + if ($this->singleRootCategory) { + return $this->getDefaultCategoryId(); + } else { + //Generating category for store + $category = $this->categoryFactory->create(); + $categoryPath = Category::TREE_ROOT_ID; + $category->setName("Category " . $storeGroupName) + ->setPath($categoryPath) + ->setLevel(1) + ->setAvailableSortBy('name') + ->setDefaultSortBy('name') + ->setIsActive(true) + ->save(); + return $category->getId(); + } + } + + /** + * @inheritdoc + */ + public function getActionTitle() + { + return 'Generating websites, stores and store views'; + } + + /** + * @inheritdoc + */ + public function introduceParamLabels() + { + return [ + 'websites' => 'Websites', + 'store_groups' => 'Store Groups Count', + 'store_views' => 'Store Views Count' + ]; + } + + /** + * Get default category id + * + * @return int + */ + private function getDefaultCategoryId() + { + if (null === $this->defaultParentCategoryId) { + $this->defaultParentCategoryId = $this->storeManager->getStore()->getRootCategoryId(); + } + return $this->defaultParentCategoryId; + } + + /** + * Gets the website codes that were created by this object + * + * @return string[] + */ + public function getWebsiteCodes() + { + return $this->websiteCodes; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/TaxRatesFixture.php b/magento/setup/src/Magento/Setup/Fixtures/TaxRatesFixture.php new file mode 100644 index 0000000..120e467 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/TaxRatesFixture.php @@ -0,0 +1,79 @@ +/setup/src/Magento/Setup/Fixtures/_files) --> + * {csv file name} + * + * @see setup/performance-toolkit/profiles/ce/small.xml + */ +class TaxRatesFixture extends Fixture +{ + /** + * @var int + */ + protected $priority = 100; + + /** + * {@inheritdoc} + */ + public function execute() + { + $taxRatesFile = $this->fixtureModel->getValue('tax_rates_file', null); + if (empty($taxRatesFile)) { + return; + } + $this->fixtureModel->resetObjectManager(); + /** Clean predefined tax rates to maintain consistency */ + /** @var $collection \Magento\Tax\Model\ResourceModel\Calculation\Rate\Collection */ + $collection = $this->fixtureModel->getObjectManager() + ->get(\Magento\Tax\Model\ResourceModel\Calculation\Rate\Collection::class); + + /** @var $model \Magento\Tax\Model\Calculation\Rate */ + $model = $this->fixtureModel->getObjectManager() + ->get(\Magento\Tax\Model\Calculation\Rate::class); + + foreach ($collection->getAllIds() as $id) { + $model->setId($id); + $model->delete(); + } + /** + * Import tax rates with import handler + */ + $filename = realpath(__DIR__ . DIRECTORY_SEPARATOR . "_files" . DIRECTORY_SEPARATOR . $taxRatesFile); + $file = [ + 'name' => $filename, + 'type' => 'fixtureModel/vnd.ms-excel', + 'tmp_name' => $filename, + 'error' => 0, + 'size' => filesize($filename), + ]; + $importHandler = $this->fixtureModel->getObjectManager() + ->create(\Magento\TaxImportExport\Model\Rate\CsvImportHandler::class); + $importHandler->importFromCsvFile($file); + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating tax rates'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return []; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/TaxRulesFixture.php b/magento/setup/src/Magento/Setup/Fixtures/TaxRulesFixture.php new file mode 100644 index 0000000..1762448 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/TaxRulesFixture.php @@ -0,0 +1,226 @@ + [ + Config::CONFIG_XML_PATH_SHIPPING_INCLUDES_TAX => 1, + Config::CONFIG_XML_PATH_PRICE_INCLUDES_TAX => 1, + Config::CONFIG_XML_PATH_APPLY_AFTER_DISCOUNT => 1, + Config::XML_PATH_DISPLAY_SALES_PRICE => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::XML_PATH_DISPLAY_SALES_SUBTOTAL => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::XML_PATH_DISPLAY_SALES_SHIPPING => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::XML_PATH_DISPLAY_SALES_DISCOUNT => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::XML_PATH_DISPLAY_SALES_GRANDTOTAL => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::XML_PATH_DISPLAY_SALES_FULL_SUMMARY => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::CONFIG_XML_PATH_DISPLAY_SHIPPING => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::CONFIG_XML_PATH_PRICE_DISPLAY_TYPE => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::XML_PATH_DISPLAY_CART_PRICE => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::XML_PATH_DISPLAY_CART_SUBTOTAL => Config::DISPLAY_TYPE_INCLUDING_TAX, + Config::XML_PATH_DISPLAY_CART_SHIPPING => Config::DISPLAY_TYPE_INCLUDING_TAX, + Custom::XML_PATH_TAX_WEEE_ENABLE => 1, + ] + ]; + + /** + * @var int + */ + protected $priority = 101; + + /** + * @var TaxRuleRepositoryInterface + */ + private $taxRuleRepository; + + /** + * @var TaxRuleInterfaceFactory + */ + private $taxRuleFactory; + + /** + * @var TaxRateInterfaceFactory + */ + private $taxRateFactory; + + /** + * @var CollectionFactory + */ + private $taxRateCollectionFactory; + + /** + * @var TaxRateRepositoryInterface + */ + private $taxRateRepository; + + /** + * @var ConfigWriter + */ + private $configWriter; + + /** + * @param FixtureModel $fixtureModel + * @param TaxRuleRepositoryInterface $taxRuleRepository + * @param TaxRuleInterfaceFactory $taxRuleFactory + * @param CollectionFactory $taxRateCollectionFactory + * @param TaxRateInterfaceFactory $taxRateFactory + * @param TaxRateRepositoryInterface $taxRateRepository + * @param ConfigWriter $configWriter + */ + public function __construct( + FixtureModel $fixtureModel, + TaxRuleRepositoryInterface $taxRuleRepository, + TaxRuleInterfaceFactory $taxRuleFactory, + CollectionFactory $taxRateCollectionFactory, + TaxRateInterfaceFactory $taxRateFactory, + TaxRateRepositoryInterface $taxRateRepository, + ConfigWriter $configWriter + ) { + parent::__construct($fixtureModel); + + $this->taxRuleRepository = $taxRuleRepository; + $this->taxRuleFactory = $taxRuleFactory; + $this->taxRateCollectionFactory = $taxRateCollectionFactory; + $this->taxRateFactory = $taxRateFactory; + $this->taxRateRepository = $taxRateRepository; + $this->configWriter = $configWriter; + } + + /** + * {@inheritdoc} + */ + public function execute() + { + //Getting config values + $taxMode = $this->fixtureModel->getValue('tax_mode', null); + $taxRules = $this->fixtureModel->getValue('tax_rules', 0); + + if ($taxMode && in_array($taxMode, array_keys($this->configs))) { + $this->setTaxMode($taxMode); + } + + $taxRateIds = $this->taxRateCollectionFactory->create()->getAllIds(); + $taxRatesCount = count($taxRateIds); + + while ($taxRules) { + /** @var $taxRuleDataObject TaxRuleInterface */ + $taxRuleDataObject = $this->taxRuleFactory->create(); + $taxRuleDataObject->setCode('Tax_Rule_' . $taxRules) + ->setTaxRateIds([$taxRateIds[$taxRules % $taxRatesCount]]) + ->setCustomerTaxClassIds([self::DEFAULT_CUSTOMER_TAX_CLASS_ID]) + ->setProductTaxClassIds([self::DEFAULT_PRODUCT_TAX_CLASS_ID]) + ->setPriority(0) + ->setPosition(0); + + $this->taxRuleRepository->save($taxRuleDataObject); + + $taxRules--; + } + } + + /** + * Adding appropriate Tax Rate, Tax Rule and Config Settings for selected Tax Mode (for example EU/VAT) + * + * @param string $taxMode + * @return void + */ + private function setTaxMode($taxMode) + { + //Add Tax Rate for selected Tax Mode + /** @var $taxRate TaxRateInterface */ + $taxRate = $this->taxRateFactory->create(); + $taxRate->setCode($taxMode) + ->setRate(self::DEFAULT_TAX_RATE) + ->setTaxCountryId(self::DEFAULT_TAX_COUNTRY) + ->setTaxPostcode('*'); + + $taxRateData = $this->taxRateRepository->save($taxRate); + + //Add Tax Rule for Tax Mode + /** @var $taxRuleDataObject TaxRuleInterface */ + $taxRuleDataObject = $this->taxRuleFactory->create(); + $taxRuleDataObject->setCode($taxMode) + ->setTaxRateIds([$taxRateData->getId()]) + ->setCustomerTaxClassIds([self::DEFAULT_CUSTOMER_TAX_CLASS_ID]) + ->setProductTaxClassIds([self::DEFAULT_PRODUCT_TAX_CLASS_ID]) + ->setPriority(0) + ->setPosition(0); + + $this->taxRuleRepository->save($taxRuleDataObject); + + //Set Tax Mode configs + $this->setConfigByTaxMode($taxMode); + } + + /** + * Set appropriate Tax Config Settings for selected Tax Mode + * + * @param string $mode + * @return void + */ + private function setConfigByTaxMode($mode = self::DEFAULT_TAX_MODE) + { + if (isset($this->configs[$mode]) && is_array($this->configs[$mode])) { + foreach ($this->configs[$mode] as $configPath => $value) { + $this->configWriter->save( + $configPath, + $value + ); + } + } + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating tax rules'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'tax_rules' => 'Tax Rules Count', + 'tax_mode' => 'Tax Mode', + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/WebsiteCategoryProvider.php b/magento/setup/src/Magento/Setup/Fixtures/WebsiteCategoryProvider.php new file mode 100644 index 0000000..673b815 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/WebsiteCategoryProvider.php @@ -0,0 +1,171 @@ +fixtureConfig = $fixtureConfig; + $this->resourceConnection = $resourceConnection; + } + + /** + * Get websites for $productIndex product + * + * @param int $productIndex Index of generated product + * @return array + * @throws \Exception + */ + public function getWebsiteIds($productIndex) + { + if ($this->isAssignToAllWebsites()) { + return $this->getAllWebsites(); + } else { + $categoriesPerWebsite = $this->getCategoriesAndWebsites(); + if (!count($categoriesPerWebsite)) { + throw new \Exception('Cannot find categories. Please, be sure that you have generated categories'); + } + return [$categoriesPerWebsite[$productIndex % count($categoriesPerWebsite)]['website']]; + } + } + + /** + * Get product if for $productIndex product + * + * @param int $productIndex + * @return int + */ + public function getCategoryId($productIndex) + { + if ($this->isAssignToAllWebsites()) { + $categories = $this->getAllCategories(); + return $categories[$productIndex % count($categories)]; + } else { + $categoriesPerWebsite = $this->getCategoriesAndWebsites(); + return $categoriesPerWebsite[$productIndex % count($categoriesPerWebsite)]['category']; + } + } + + /** + * Get categories and websites + * + * @return array + */ + private function getCategoriesAndWebsites() + { + if (null === $this->categoriesPerWebsite) { + $select = $this->getConnection()->select() + ->from( + ['c' => $this->resourceConnection->getTableName('catalog_category_entity')], + ['category' => 'entity_id'] + )->join( + ['sg' => $this->resourceConnection->getTableName('store_group')], + "c.path like concat('1/', sg.root_category_id, '/%')", + ['website' => 'website_id'] + )->order('category ASC'); + $this->categoriesPerWebsite = $this->getConnection()->fetchAll($select); + } + + return $this->categoriesPerWebsite; + } + + /** + * Checks is assign_entities_to_all_websites flag set + * + * @return bool + */ + private function isAssignToAllWebsites() + { + return (bool)$this->fixtureConfig->getValue('assign_entities_to_all_websites', false); + } + + /** + * Provides all websites + * + * @return array + */ + private function getAllWebsites() + { + if (null === $this->websites) { + $this->websites = array_unique(array_column($this->getCategoriesAndWebsites(), 'website')); + } + + return $this->websites; + } + + /** + * Provides all categories + * + * @return array + */ + private function getAllCategories() + { + if (null === $this->categories) { + $this->categories = array_values(array_unique(array_column($this->getCategoriesAndWebsites(), 'category'))); + } + + return $this->categories; + } + + /** + * Provides connection + * + * @return AdapterInterface + */ + private function getConnection() + { + if (null === $this->connection) { + $this->connection = $this->resourceConnection->getConnection(); + } + + return $this->connection; + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/_files/dictionary.csv b/magento/setup/src/Magento/Setup/Fixtures/_files/dictionary.csv new file mode 100644 index 0000000..ba18853 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/_files/dictionary.csv @@ -0,0 +1,7373 @@ +the +of +and +a +in +to +it +is +to +was +I +for +that +you +he +be +with +on +by +at +have +are +not +this +but +had +they +his +from +she +that +which +or +we +an +were +as +do +been +their +has +would +there +what +will +all +if +can +her +said +who +one +so +up +as +them +some +when +could +him +into +its +then +two +out +time +my +about +did +your +now +me +no +other +only +just +more +these +also +people +know +any +first +see +very +new +may +well +should +like +than +how +get +way +one +our +made +got +after +think +between +many +years +er +those +go +being +because +down +yeah +three +good +back +make +such +on +there +through +year +over +must +still +even +take +too +more +here +own +come +last +does +oh +say +no +going +work +where +erm +us +government +same +man +might +day +yes +however +put +world +over +another +in +want +as +life +most +against +again +never +under +old +much +something +Mr +why +each +while +house +part +number +found +off +different +went +really +thought +came +used +children +always +four +where +without +give +few +within +about +system +local +place +great +during +although +small +before +look +next +when +case +end +things +social +most +find +group +quite +mean +five +party +every +company +women +says +important +took +much +men +information +both +national +often +seen +given +school +fact +money +told +away +high +point +night +state +business +second +British +need +taken +done +right +having +thing +looked +London +area +perhaps +head +water +right +family +long +hand +like +already +possible +nothing +yet +large +left +side +asked +set +whether +days +mm +home +called +John +development +week +use +country +power +later +almost +young +council +himself +far +both +use +room +together +tell +little +political +before +able +become +six +general +service +eyes +members +since +times +problem +anything +market +towards +court +public +others +face +full +doing +war +car +felt +police +keep +held +problems +road +probably +help +interest +available +law +best +form +looking +early +making +today +mother +saw +knew +education +work +actually +policy +ever +so +at least +office +am +research +feel +big +body +door +let +Britain +name +person +services +months +report +question +using +health +turned +lot +million +main +though +words +enough +child +less +book +period +until +several +sure +father +level +control +known +society +major +seemed +around +began +itself +themselves +minister +economic +wanted +upon +areas +after +therefore +woman +England +city +community +only +including +centre +gave +job +among +position +effect +likely +real +clear +staff +black +kind +read +provide +particular +became +line +moment +international +action +special +difficult +certain +particularly +either +open +management +taking +across +idea +further +whole +age +process +act +around +evidence +view +better +off +mind +sense +rather +seems +believe +morning +third +else +half +white +death +sometimes +thus +brought +getting +ten +shall +try +behind +heard +table +change +support +back +sort +Mrs +whose +industry +ago +free +care +order +century +range +European +gone +yesterday +training +working +ask +street +home +word +groups +history +central +all +study +usually +remember +trade +hundred +programme +food +committee +air +hours +experience +rate +hands +indeed +sir +language +land +result +course +someone +everything +certainly +based +team +section +leave +trying +coming +similar +once +minutes +authority +human +changes +little +cases +common +role +Europe +necessary +nature +class +reason +long +saying +town +show +subject +voice +companies +since +simply +especially +department +single +short +personal +pay +value +member +started +run +patients +paper +private +seven +UK +eight +systems +herself +practice +wife +price +type +seem +figure +former +lost +right +need +matter +decision +bank +countries +until +makes +union +terms +financial +needed +south +university +club +president +friend +parents +quality +cos +building +north +stage +meeting +foreign +soon +strong +situation +comes +late +bed +recent +date +low +US +concerned +girl +hard +American +David +according to +twenty +higher +tax +production +various +understand +led +bring +schools +ground +conditions +secretary +weeks +clearly +bad +art +start +include +poor +hospital +friends +decided +shown +music +month +English +tried +game +1990 +May +anyone +wrong +ways +chapter +followed +cost +play +present +love +issue +goes +described +award +Mr. +king +royal +results +workers +April +expected +amount +students +despite +knowledge +June +moved +news +light +March +approach +cut +basis +hair +required +further +paid +series +better +before +field +allowed +easy +kept +questions +natural +live +future +rest +project +greater +feet +meet +simple +died +for +happened +added +manager +computer +security +near +met +evening +means +round +carried +hear +bit +heart +forward +sent +above +attention +labour +story +structure +move +agreed +nine +letter +individual +force +studies +movement +account +per +call +board +success +1989 +French +following +considered +current +everyone +fire +agreement +please +boy +capital +stood +analysis +whatever +population +modern +theory +books +stop +legal +Scotland +material +son +received +model +chance +environment +finally +performance +sea +rights +growth +authorities +provided +nice +whom +produced +relationship +talk +turn +built +final +east +1991 +talking +fine +worked +west +parties +size +record +red +close +property +myself +example +space +giving +normal +nor +reached +buy +serious +quickly +Peter +along +plan +behaviour +France +recently +term +previous +couple +included +pounds +anyway +cup +treatment +energy +total +thank +director +prime +levels +significant +issues +sat +income +top +choice +costs +design +pressure +scheme +July +change +a bit +list +suddenly +continue +technology +hall +takes +ones +details +happy +consider +won +defence +following +parts +loss +industrial +activities +throughout +spent +outside +teachers +generally +opened +floor +round +activity +hope +points +association +nearly +United +allow +rates +sun +army +sorry +wall +hotel +forces +contract +dead +Paul +stay +reported +as well +hour +difference +meant +summer +county +specific +numbers +wide +appropriate +husband +top +played +relations +Dr +figures +chairman +set +lower +product +colour +ideas +George +St +look +arms +obviously +unless +produce +changed +season +developed +unit +appear +investment +test +basic +write +village +reasons +military +original +successful +garden +effects +aware +yourself +exactly +help +suppose +showed +style +employment +passed +appeared +page +hold +suggested +Germany +continued +October +offered +products +popular +science +New +window +expect +beyond +resources +rules +professional +announced +economy +picture +okay +needs +doctor +maybe +events +direct +gives +advice +running +circumstances +sales +risk +interests +September +dark +event +thousand +involved +written +park +1988 +returned +ensure +America +fish +wish +opportunity +commission +1992 +oil +sound +ready +lines +shop +looks +James +immediately +worth +college +press +January +fell +blood +goods +playing +carry +less +film +prices +useful +conference +operation +follows +extent +designed +application +station +television +access +Richard +response +degree +majority +effective +established +wrote +region +green +York +ah +western +traditional +easily +cold +shows +offer +though +statement +Scottish +published +forms +German +down +accept +miles +independent +election +support +importance +lady +site +jobs +needs +plans +earth +earlier +title +parliament +standards +leaving +interesting +houses +planning +considerable +girls +involved +Ireland +increase +species +stopped +concern +public +means +caused +raised +through +glass +physical +thought +Michael +eye +left +heavy +walked +daughter +existing +competition +speak +responsible +up to +river +follow +software +complete +above +November +December +purpose +mouth +medical +responsibility +Sunday +Wales +leader +tomorrow +piece +thirty +lay +officer +task +blue +answer +stand +thinking +extra +highly +places +arm +eventually +campaign +ability +appeal +whole +Charles +skills +opposition +remained +pattern +method +miss +hot +lead +source +bought +baby +lack +once +bill +division +remain +surface +older +charge +methods +trouble +fully +equipment +moving +suggest +disease +officers +past +peace +male +slightly +demand +failed +wants +attempt +types +Christmas +hit +post +policies +hardly +ii +arrived +compared +below +otherwise +windows +West +deal +directly +interested +sale +like +firm +status +happen +box +even if +teacher +radio +provision +variety +show +ran +sector +return +factors +essential +direction +beautiful +civil +base +waiting +caught +sit +develop +character +safety +placed +past +completely +tea +introduced +killed +love +mum +context +fifty +primary +animals +culture +Oxford +brother +obvious +weight +discussion +created +1987 +future +other +start +States +none +sold +let's +machine +afternoon +knows +environmental +fair +William +February +provides +wait +league +trees +positive +organisation +win +condition +families +argument +Saturday +learn +up +normally +claimed +truth +senior +kitchen +works +add +lived +library +minute +believed +enough +transport +share +principle +create +agree +born +players +cash +exchange +rule +budget +turn +pupils +nuclear +sitting +version +English +best +features +duty +annual +balance +front +send +boys +presence +protection +dog +courses +individuals +matters +media +avoid +influence +presented +speaker +stone +relevant +apply +August +explain +deep +Robert +1986 +achieved +slowly +relatively +shares +letters +finished +survey +huge +accepted +covered +review +Smith +closed +form +marriage +commercial +aid +lives +collection +living +speech +Africa +regional +differences +benefit +apparently +effort +gets +executive +later +latter +function +failure +return +chair +reference +horse +becomes +attack +reports +practical +queen +subjects +career +bar +official +text +appears +separate +student +names +sell +holiday +larger +cells +open +progress +early +states +helped +visit +smiled +stock +memory +merely +studio +key +putting +eat +opinion +understanding +regular +decisions +chief +drawn +firms +remains +facilities +values +district +cars +due +mhm +begin +managed +receive +corner +image +edge +sister +politics +expression +instead +impact +quarter +forced +inside +views +scale +plant +race +ball +gold +join +Henry +spend +voice +alone +additional +benefits +1985 +trust +for instance +largely +advantage +associated +increased +standing +dad +foot +somebody +pain +gas +clothes +smaller +aspects +active +affairs +possibly +increase +railway +ended +feeling +network +leaders +nevertheless +cause +half +powerful +step +complex +joined +plants +standard +holding +carefully +length +mind +rise +strength +crime +hard +wind +Mary +possibility +becoming +damage +records +reduce +examples +mainly +credit +winter +impossible +insurance +explained +units +currently +forest +formed +somewhere +earlier +beginning +regarded +fall +confidence +discussed +speed +legislation +mentioned +along +pulled +spoke +debate +intended +bodies +message +middle +plus +supply +100 +skin +Edward +stuff +providing +entirely +front +domestic +require +proved +expressed +treated +match +solution +previously +tonight +patient +actual +difficulties +farm +united +far +build +reach +proposals +extremely +choose +ministers +technical +fresh +ordinary +scene +materials +museum +Thomas +move +article +prevent +achieve +customers +includes +powers +band +items +justice +play +animal +internal +suggests +excellent +face +rich +assessment +save +phone +fairly +football +watched +telephone +steps +decide +South +traffic +watch +coffee +deal +sources +past +buildings +increasingly +relief +distance +introduction +forty +administration +no +safe +applied +sight +Mark +island +potential +banks +housing +meaning +existence +claim +northern +enjoy +reduced +twelve +equally +in front of +walk +very +apart from +watching +cultural +famous +latest +users +TV +cabinet +legs +institutions +Japan +measures +reality +proper +video +worse +lose +argued +train +spirit +programmes +accounts +trial +target +fear +joint +doubt +formal +unemployment +prison +accident +concept +limited +elements +strange +served +papers +discovered +conservative +rock +cover +usual +tree +smile +unable +warm +surely +organization +battle +proportion +difficulty +sides +refused +weekend +construction +picked +distribution +dinner +wine +while +works +obtained +exercise +writing +asking +showing +ahead +rural +lovely +applications +twice +factor +path +games +funds +whereas +nobody +shape +initial +substantial +referred +tend +seat +improve +onto +thanks +aircraft +light +contact +quiet +rain +background +identified +contrast +officials +strategy +average +master +forget +leading +soft +reasonable +seeing +pound +grounds +raise +immediate +communication +client +Paris +star +fourth +suitable +determined +ought +detail +everybody +noted +equal +imagine +appointed +manner +homes +classes +freedom +operations +detailed +keeping +selection +requirements +pair +draw +walls +talks +working +call +danger +attitude +user +overall +offer +female +relationships +Edinburgh +note +afraid +pick +charges +democratic +elections +entered +courts +growing +goal +straight +techniques +sufficient +middle +agency +scientific +eastern +crisis +rose +correct +removed +prince +theatre +Irish +laid +act +expensive +markets +sign +educational +capacity +telling +happens +absolutely +patterns +whilst +managers +purposes +employees +1984 +totally +opportunities +cause +break +will +procedure +feeling +output +mental +frequently +bridge +dangerous +either +fingers +recognition +largest +turning +arrangements +sites +profits +quick +absence +sentence +beside +pass +fields +critical +pointed +prove +listen +inc +recorded +cost +signed +hill +dropped +card +tour +understood +notes +track +1983 +partly +replaced +increased +weather +principles +seriously +familiar +related +package +elsewhere +teaching +bottom +necessarily +commitment +player +double +birds +properly +1993 +Jack +threat +notice +unlikely +admitted +1981 +replied +silence +route +file +liked +supported +issued +perfect +victory +discuss +widely +occur +second +violence +efforts +element +neck +carrying +conflict +pieces +Darlington +under +profit +reaction +colleagues +historical +standard +end +Friday +finance +hope +rooms +projects +closely +fund +daily +below +cell +Liverpool +Tom +southern +expenditure +increasing +discipline +completed +occurred +individual +spring +audience +lead +thousands +grow +conversation +tiny +congress +emphasis +finding +exist +check +alone +consideration +speaking +learning +defined +seek +1979 +appearance +maintain +option +dry +bright +urban +pictures +estate +debt +youth +neither +affected +married +feature +payment +exhibition +liberal +supposed +assembly +reform +empty +boat +suffered +bus +hell +remembered +driver +lunch +flowers +heat +processes +upper +volume +share +captain +murder +North +fifteen +represented +meetings +contribution +drugs +die +feelings +outside +Ian +arts +leg +serve +dealing +writing +curriculum +bag +sought +apparent +branch +beginning +noticed +procedures +models +Martin +enter +revealed +institute +establish +object +occasion +waste +facts +membership +requires +shook +Monday +claims +control +prepared +younger +faith +shops +challenge +answer +Russian +moral +pleasure +orders +Alan +heads +bloody +careful +filled +Corp +literature +birth +1980 +leading +code +centres +broke +prepared +that +professor +1982 +aye +wood +gentleman +flight +entry +pretty +attractive +wild +investigation +crown +protect +nodded +greatest +subject to +functions +encourage +belief +care +developments +description +tradition +Japanese +thin +adopted +vital +document +conclusion +hoped +Italy +enjoyed +engineering +coal +transfer +address +breath +along with +Ltd +alternative +total +schemes +copy +desire +search +effectively +organisations +demands +pushed +visit +etc +planning +farmers +ancient +released +opening +lips +iii +treaty +newspaper +aim +drug +identify +engine +Manchester +USA +tests +owner +sky +Tony +wearing +depends +elderly +ministry +Australia +busy +inside +anybody +reading +external +capable +marketing +streets +partner +respect +shot +institution +generation +acid +realised +chosen +wider +his +narrow +horses +broad +ordered +wonderful +key +contained +laughed +bringing +clients +typical +drink +Stephen +employed +atmosphere +slow +wondered +clean +actions +entire +troops +Leeds +vote +definition +welfare +reduction +row +walking +laws +visitors +release +meanwhile +confirmed +examination +doors +leadership +attitudes +East +enable +beneath +journey +milk +stated +hence +IBM +machines +affect +grey +screen +criticism +surprise +reading +nineteen +stories +billion +constant +teeth +brain +explanation +brief +signs +married +highest +cover +starting +knowing +claim +creation +castle +governments +goals +intention +India +vast +flat +guide +drive +surprised +easier +ideal +shut +readers +run +Bill +magazine +bound +terrible +thoughts +kinds +academic +worry +minor +seats +customer +significance +measure +pleased +unfortunately +o'clock +revolution +attempts +noise +charged +rare +biggest +rather than +somewhat +sections +stared +seeking +paying +meeting +encouraged +thick +Jones +loved +metal +grand +plenty +note +phase +coast +injury +China +granted +motion +observed +technique +ill +drew +potential +factory +lying +severe +mine +lights +wonder +Harry +spread +contains +strongly +offers +afterwards +committed +tape +shoulder +bear +corporate +obtain +kill +that is +worst +learned +settlement +ooh +grew +represent +rapidly +tall +hole +living +adult +iron +amongst +faced +negative +afford +lots +index +permanent +beat +trip +contain +fundamental +doctors +desk +ourselves +sport +unions +implications +fashion +content +similarly +elected +proposed +judge +pool +inflation +brown +Brian +originally +funny +via +practices +somehow +payments +odd +Andrew +pension +pay +crucial +fit +inner +appointment +used +flow +launched +Chris +independence +Spain +objects +setting +little +least +colours +palace +perfectly +combination +contracts +criminal +consequences +pages +contemporary +UN +talked +session +sharp +structures +planned +drive +Wednesday +Kingdom +falling +sample +virtually +fast +sick +movements +dogs +Anne +Yorkshire +Roman +accommodation +nation +temperature +massive +societies +consumer +cities +offices +documents +valley +indicated +breakfast +stayed +kids +display +named +bedroom +sports +aspect +unique +Steve +sixty +author +lane +objectives +secondary +wear +republic +agent +interpretation +assistance +directors +badly +alright +parliamentary +African +Joe +unknown +industries +assets +selling +moreover +Northern +nose +Jim +Russia +subsequent +place +describe +declared +gallery +allowing +ship +other than +visited +cross +grown +crowd +recognised +interview +broken +Simon +argue +BBC +naturally +thinking +general +Mike +meal +catch +representatives +proceedings +tears +alive +involving +shoulders +employers +begun +departments +vision +yours +unix +beauty +guilty +proposal +impression +square +angry +regulations +regions +vehicle +Jane +democracy +sequence +offering +Graham +enormous +invited +cancer +sheet +struck +Glasgow +rarely +involve +involvement +improvement +ninety +motor +shock +tone +significantly +contact +manufacturing +close +seconds +dress +assumed +well +quietly +grass +nations +provisions +communities +roof +yellow +indicate +distinction +present +statements +comments +allows +late +pollution +fruit +acting +involves +unusual +assume +towns +lucky +fuel +spot +properties +touch +fall +Major +bottle +except +anywhere +net +buying +long-term +soil +sum +stages +decline +missed +reader +extensive +manage +calling +talk +heavily +containing +plate +advertising +revenue +remaining +glad +diet +agricultural +artist +plastic +artists +gently +Bob +alright +location +ring +ice +operate +lies +candidates +Italian +pull +passage +principal +cope +linked +tired +periods +firmly +occasionally +identity +persons +limited +warned +efficient +runs +hundreds +maintenance +divided +unlike +establishment +channel +producing +fight +happening +song +map +expert +formation +comfortable +border +constitution +weapons +emergency +Chinese +waited +continues +arranged +link +Wilson +spokesman +extended +rail +Philip +candidate +believes +funding +promised +positions +mostly +household +remove +performed +cat +sleep +abroad +teams +mountain +program +countryside +stars +victim +studied +relative +criteria +conventional +parish +framework +willing +strike +cheap +ref +sudden +approval +concentration +partners +autumn +maintained +warning +cards +roads +approved +lake +starts +determine +liability +editor +realise +thinks +helping +longer +proposed +voluntary +settled +grant +characters +valuable +situations +deputy +walk +regularly +occasions +trading +rejected +agriculture +premises +dramatic +fill +theme +silver +golden +duties +friendly +arguments +accused +driving +losses +error +reflected +dream +shortly +wealth +working +temporary +federal +stress +painting +request +initially +reflect +lifted +eighty +hello +pub +recovery +loan +electricity +1980s +chest +Margaret +refer +taught +silent +Brown +beach +Indian +eleven +answered +learning +recession +focus +facing +video-taped +height +clubs +item +characteristics +emerged +options +matter +hurt +forgotten +worried +bread +admit +chief +specifically +owners +Lewis +statutory +mirror +agents +writer +deeply +Welsh +foundation +struggle +1978 +parent +dependent +mistake +reputation +Frank +eggs +decade +steel +gain +leads +publication +resistance +offence +incident +Thursday +prefer +stations +denied +examine +lifespan +wages +tasks +gained +acquired +outcome +claims +travel +competitive +marked +panel +resolution +wished +dear +efficiency +demanded +flat +yards +subsequently +gradually +businesses +chancellor +chain +specialist +1977 +dressed +tells +negotiations +relating +supporters +armed +radical +sleep +representation +agencies +theories +outside +shoes +threatened +spending +keen +drove +gardens +acceptable +notion +initiative +stairs +Cambridge +advance +leaves +recognise +worker +essentially +empire +shared +sensitive +uses +clause +attached +Taylor +living +fallen +Belfast +fighting +dear +controlled +sugar +Elizabeth +block +global +delivery +changing +Lee +computers +ages +meat +mass +emotional +brothers +bird +expansion +islands +healthy +Middlesbrough +aside +attend +secret +store +1976 +break +writers +self +rising +travel +bigger +alternative +rapid +instructions +wet +adequate +weak +licence +fixed +soldiers +examined +aimed +owned +average +awareness +centuries +images +drama +notice +Tuesday +handed +furniture +gate +scientists +administrative +sees +pocket +wooden +uncle +remarkable +co-operation +creating +Adam +Luke +newspapers +currency +comprehensive +intelligence +charity +fifth +links +hoping +respond +surprising +extension +solid +survive +growing +apart +restaurant +churches +precisely +pale +skill +close +connection +mass +dealt +brilliant +maximum +losing +depend +200 +experienced +across +introduce +philosophy +convention +gun +films +sons +eh +communications +regime +miss +attended +suffer +copies +councils +round +partnership +inquiry +Sarah +residents +absolute +firm +French +corporation +arrested +reports +minority +arrival +in addition to +listening +taste +sad +gap +plane +scope +experiences +coat +command +consequence +left +fun +Birmingham +tory +golf +electronic +behind +visual +retirement +replace +rise +darkness +fault +directed +complete +1970s +enemy +comment +electric +priority +metres +database +Tim +pure +Spanish +Nigel +rough +core +circle +result +literary +bay +championship +guests +1975 +insisted +mere +bits +successfully +limit +imposed +continuing +Rome +sounds +abuse +categories +languages +tower +Thatcher +anger +accompanied +category +collected +present +need +comparison +supreme +supplied +chemical +fans +greatly +sweet +wedding +teaching +represents +duke +mark +personnel +genuine +adults +mail +politicians +occurs +exciting +written +returning +promotion +longer +preparation +defendant +presumably +DNA +derived +Washington +paintings +fitted +mothers +affair +stupid +cricket +advanced +tank +arise +photographs +point +disappeared +expectations +findings +illness +citizens +mood +faces +tension +Commons +ladies +briefly +stones +mixture +classical +arrangement +extreme +Williams +nineteenth +discover +favourite +shot +causing +yard +begins +socialist +judgment +landscape +fail +feels +consumption +mill +1974 +informed +birthday +widespread +consent +confident +acts +Gloucester +sake +estimated +requirement +catholic +experts +Israel +numerous +throat +permission +ignored +guidance +moments +brings +costs +module +opposite +respectively +altogether +input +presentation +everywhere +distinct +statistics +repeated +tough +earnings +saved +finger +branches +fishing +components +truly +drink +turns +luck +boss +exists +champion +MP +answers +tools +cycle +recommended +intervention +mile +Scott +whenever +AIDS +promote +helpful +prospect +definitely +Johnson +organised +controls +Ben +express +Iraq +nurse +frame +perform +cottage +wave +adding +proud +by +winner +solicitor +neighbours +pilot +calls +mad +alliance +given +straight +survival +winning +votes +primarily +attacks +compensation +Sam +destroyed +camp +hat +territory +symptoms +prior to +ownership +wage +concluded +discussions +developing +cream +achievement +drawing +entrance +basically +poverty +disabled +extend +fast +suggestion +consistent +shareholders +degrees +mention +anxious +fewer +delivered +dark +transferred +employee +throw +assumption +inevitably +nervous +profession +awful +cool +hang +threw +vehicles +stable +realized +suit +hills +prize +drop +constitutional +perspective +Neil +satisfied +bid +aunt +festival +constantly +conscious +developing +connected +concerning +savings +reasonably +concentrate +pace +novel +operating +breach +purchase +crossed +Asia +chances +depth +calls +strategic +thrown +bills +Jean +Ken +reply +ha +Ruth +treat +green +sheep +dominant +phrase +push +eating +now that +conducted +employer +ears +contents +touched +prepare +sounded +Moscow +theoretical +setting +soul +wore +study +1960s +outstanding +benefit +vary +jacket +except +holy +processing +sand +clinical +prisoners +dispute +shadow +minimum +organizations +plaintiff +snow +cried +fit +driven +Joseph +port +recognized +servants +limits +pink +et al +sound +hearing +measured +dance +eighteen +sorts +Patrick +trained +stomach +slight +fought +points +storage +breaking +impressive +honest +provided +dismissed +glanced +related +cast +crew +defeat +hold +gift +enthusiasm +princess +press +spending +advantages +reaching +articles +resulted +files +hung +cuts +residential +extraordinary +visible +shouted +reducing +experiments +tables +finish +tendency +conduct +objective +report +ring +hospitals +mechanism +seventy +exception +poetry +inspector +1973 +covering +stepped +accurate +percent +victims +approached +distant +alongside +airport +furthermore +considerably +pressed +missing +origin +salt +personality +fight +Canada +arrive +fly +Greek +receiving +still +rocks +fees +fee +complicated +ends +musical +stands +moon +chamber +puts +turnover +attacked +ultimately +routine +observation +precise +plain +gentle +watch +staring +since +leisure +economics +device +broken +mortgage +live +leaves +confusion +cut +finds +instruments +secondly +Bush +certificate +ear +remote +satisfaction +responsibilities +ratio +coach +fears +sentences +holder +shopping +possession +selected +Bristol +sets +smoke +rugby +songs +clock +summary +implementation +protein +housing +escape +wing +fixed +helps +poll +Arthur +scored +chose +column +holidays +contributions +architecture +Nick +approximately +disaster +minds +Keith +marks +trust +neither +monetary +mountains +White +discovery +collect +spoken +steam +smooth +silly +childhood +teach +Kong +unity +staying +climate +percentage +villages +attracted +Americans +designs +secure +cutting +iv +Hong +last +taxes +tennis +peak +relation +readily +evaluation +frequency +Andy +shirt +cake +nights +bishop +test +pretty +Charlie +deliberately +round +determination +applies +automatically +standing +rent +psychological +violent +medicine +boards +protest +Anna +unemployed +final +being +Rose +reforms +inevitable +junior +signal +building +till +welcome +fat +roles +headquarters +sensible +visits +manufacturers +restrictions +samples +Pacific +improved +Berlin +grateful +strategies +score +tended +expense +loans +addressed +mode +structural +dozen +pride +newly +founded +variation +aged +rely +investors +infection +dominated +combined +survived +Helen +string +Lucy +experiment +fourteen +undertaken +committees +buyer +agreements +participation +welcome +match +complaints +ships +critics +guitar +camera +laboratory +waves +landlord +rang +hate +demonstrated +bomb +engaged +knife +so-called +modules +pleasant +headed +surgery +universities +millions +concepts +proof +marry +Maggie +operating +pressures +lives +sixteen +repeat +host +Dave +pitch +attempted +assess +penalty +tail +boxes +holes +deep +contribute +passing +reveal +cleared +thereby +acceptance +1972 +anxiety +above +Newcastle +formula +personally +Howard +mission +deaf +relatives +imagination +apple +dirty +rid +abandoned +appreciate +continuous +describes +suffering +circuit +stronger +responses +excitement +approaches +supply +plan +Zealand +tested +disk +holds +replacement +instrument +universe +memories +overseas +expertise +causes +solicitors +comfort +sergeant +trend +treasury +entitled +sounds +acquisition +opening +tickets +bath +delighted +sending +increasing +confirm +loose +state +targets +occasional +paragraph +writes +evident +Kent +desperate +handle +fellow +blind +occupied +overcome +dust +burden +psychology +relate +drivers +surprisingly +1970 +Matthew +cheese +consciousness +considering +universal +Gordon +aha +square +succeeded +knees +1971 +boots +smell +closer +mummy +slipped +component +regulation +Roger +attempt +locked +keeps +wheel +classic +MPs +cattle +consists +touch +illustrated +platform +shift +draft +purely +load +influenced +passengers +recommendations +preparing +solutions +Alexander +injuries +tenant +commonly +Victoria +leather +gathered +zone +sufficiently +like +Laura +squad +recall +steady +retain +checked +existed +attract +conservation +flesh +pack +publicity +rose +mean +variations +split +sixth +edition +concerns +tied +summit +engineers +Terry +listed +judges +researchers +equivalent +assist +upstairs +hers +Francis +located +nurses +fear +mark +suggesting +whispered +serving +intellectual +influence +stream +generated +consequently +San +authors +wondering +judgement +experience +Victorian +egg +supplies +level +produces +councillor +roots +taxation +bathroom +ultimate +awarded +stick +glasses +raising +qualities +layer +lost +creative +medieval +risks +assumptions +displayed +dreams +Germans +accounting +curve +drawing +backed +adopt +colleges +guard +evolution +sign +aims +sharply +constructed +advised +softly +settle +decades +completion +linguistic +ignore +convinced +Colin +judicial +photograph +sophisticated +Alice +asleep +paused +amounts +poem +recording +carbon +Durham +possibilities +good +explains +equation +NHS +vulnerable +raw +net +deaths +babies +illegal +outer +topic +medium +till +promise +tends +hopes +angle +interviews +ban +feed +potentially +machinery +tongue +coalition +travelling +define +consultation +reception +pulling +Nicholas +integration +revolutionary +quoted +compare +surrounded +bitter +attempting +guess +improvements +climbed +cathedral +heaven +wanting +painted +Australian +changing +grammar +jumped +Ulster +Gulf +native +imperial +persuade +voices +conclusions +laughing +lift +1968 +Gary +boundaries +favour +guy +studying +Jimmy +beliefs +undoubtedly +wings +retained +joy +bone +informal +demonstrate +Douglas +regard +clear +calculated +flexible +meals +announcement +lawyers +ruled +account +sheets +tunnel +exercise +bars +carpet +quantity +catalogue +reminded +shrugged +notably +Anthony +schedule +petrol +investigate +hotels +buried +once more +journal +nowhere +considerations +concentrated +collective +destruction +frequent +versions +offences +agenda +clever +experimental +plays +Kate +listened +La +texts +plates +deficit +transition +Norman +spiritual +intense +indication +flew +pushing +rational +hanging +entitled +excluded +knocked +professionals +tight +composition +indicates +conservatives +Kevin +interaction +ceiling +guidelines +cold +roughly +Governor +qualifications +ethnic +me +argues +Dublin +inches +opera +pupil +cheaper +generous +prominent +inadequate +accordingly +welcomed +instruction +logical +passion +drawings +exposure +departure +blame +racing +mixed +historic +guest +Mrs. +pipe +modest +Dutch +lessons +hero +Lloyd +sectors +Diana +barely +logic +Essex +acute +harm +representing +discourse +voted +electrical +hearing +consumers +jury +Grant +weekly +acted +delay +valid +wherever +representative +transaction +bowl +increases +contributed +Christopher +record +leaned +lesson +lit +admission +stores +awards +automatic +timber +trousers +vote +habit +Oliver +arrange +red +matches +punishment +bones +cross +deny +rubbish +hide +mortality +complex +pc +earl +explore +urged +occupation +storm +darling +keys +customs +profile +gross +depression +classroom +glance +mystery +mutual +reliable +wholly +entering +bare +liable +facility +stressed +stuck +realize +engineer +smiling +confined +province +registration +males +laughter +humour +resource +multiple +Albert +ruling +silk +waters +Rachel +paint +cotton +Atlantic +identification +claiming +sole +coverage +arising +Owen +honour +poet +prospects +travelled +divisions +posts +avoided +in case +charter +managing +pregnant +obligation +win +adds +formally +flying +Latin +nearby +Egypt +exact +directions +curious +bother +participants +lawyer +resignation +bearing +sets +pointing +tool +damages +speakers +fate +daddy +devices +phenomenon +strain +substance +bags +wire +Wood +underlying +responded +enjoying +visitor +joining +uncertainty +but +drop +submitted +flower +Ford +California +perception +identical +farming +letting +audit +satisfactory +Billy +ticket +lists +preference +Great +thirteen +Van +secret +pop +album +federation +learnt +deliver +Westminster +chemicals +farmer +variables +male +assault +marginal +leave +namely +fed +distinctive +kingdom +assessed +refuse +electoral +urgent +allowance +observations +libraries +Lawrence +reflects +force +sympathy +running +falls +publishing +recovered +stability +canal +funeral +singing +titles +beds +sessions +restricted +Sheffield +Nottingham +expecting +clothing +drinks +disposal +failing +joke +focus +succeed +Maria +typically +official +conversion +presidential +generations +mayor +sharing +Clare +worth +transactions +era +policeman +Fred +gaze +controversial +count +proceed +Young +folk +fabric +oral +horror +Kelly +everyday +emperor +viewed +sing +belt +fortune +demand +doubt +crash +encouraging +interpreted +Louis +organic +maintaining +removal +female +routes +continued +trials +enables +print +laugh +bent +expected +connections +magistrates +errors +statistical +resolved +desirable +recognize +Stuart +thoroughly +injured +van +blocks +prosecution +register +trends +preferred +reckon +innocent +ideology +belong +improved +past +corridor +exclusive +tale +pairs +prayer +collapse +lease +talent +gains +separated +marked +experienced +persuaded +sighed +butter +suggestions +Russell +unexpected +foods +picking +banking +sciences +superb +contacts +operated +alarm +go +Poland +gene +daughters +sheer +guardian +count +cloud +disappointed +Bernard +format +scenes +frightened +hardware +traditionally +gastric +genes +effectiveness +full-time +intend +concentrations +defend +strict +fighting +creatures +closer +Swindon +capitalist +Walker +addition +chocolate +emerge +Hugh +hidden +likes +Susan +Stewart +reactions +lands +establishing +swept +anniversary +permitted +export +1967 +justify +tissue +Davies +bet +specified +romantic +garage +conviction +declined +resigned +Clarke +advise +scientist +root +asset +warmth +bulk +bands +knee +minimum +humans +references +any +associations +muscles +withdrawal +registered +distributed +regarding +exposed +declaration +graphics +reluctant +actor +switched +sisters +winners +eighteenth +chemistry +rest +justified +stop +converted +boundary +suspect +magnificent +stretched +convenient +friendship +established +recover +destroy +Jackson +mess +correspondent +navy +dollar +craft +reflection +chicken +plans +tin +Miller +curtains +gesture +tourist +diary +protected +ocean +discussing +practitioners +bloody +entertainment +nearest +mechanisms +closed +expenses +uncertain +artificial +democrats +damaged +composed +heating +diplomatic +drinking +discrimination +rows +bench +councillors +acquire +installed +guns +killing +Microsoft +blow +salary +Baker +tip +1950s +physically +estates +tremendous +marine +ease +institutional +mechanical +retail +resist +mixed +literally +chapel +distinguish +wildlife +Rivers +Iran +tories +doubts +formerly +priorities +reserves +publications +commented +gender +passenger +Sussex +strictly +boats +causes +pen +chapters +cheque +required +testing +carriage +weapon +generate +Clinton +asks +earn +supporting +mentally +judge +messages +females +biological +applying +implies +known +Emily +rolled +tube +functional +accidents +flexibility +chairs +Phil +styles +cap +straightforward +moves +wise +fired +organized +inspection +Derek +mathematics +heritage +superior +1969 +specially +finance +cloth +sociology +desperately +fiction +equity +satisfy +Lords +shell +Wright +lad +whereby +forests +suit +pursue +digital +increases +tenants +refers +voters +piano +productivity +part-time +lightly +assistant +Commander +address +situated +restoration +outlined +imports +comment +stolen +Harris +clerk +cinema +Ann +covers +capitalism +spectacular +shapes +controversy +Marx +gates +escaped +Robin +continuing +trains +ensuring +colonel +confused +grants +remarks +bonds +wives +computing +constraints +solve +aggressive +availability +unfair +sadly +invasion +tracks +compete +closure +spare +painful +earned +venture +topics +wonder +equivalent +grade +Korea +pot +emotions +washed +escape +abstract +Eric +murmured +stake +lift +states +breeding +securities +asian +mud +Joan +estimates +cheek +stored +correctly +refugees +Moore +obligations +spirits +unhappy +Ross +networks +beaten +snapped +initiatives +understanding +alter +shame +pensions +oxygen +therapy +associated +courage +discretion +dates +deposits +hopefully +exports +legislative +Eliot +ward +monthly +deciding +describing +assuming +opposed +Alex +searching +intelligent +impose +explicit +jurisdiction +designer +tie +fellow +quantities +fleet +Barry +seller +RAF +borough +stand +flats +virtue +constituency +complained +coloured +midnight +taxi +engines +railways +display +just +ridiculous +Caroline +debts +comparable +amazing +acknowledged +appeal +wars +successive +refusal +incorporated +creature +secured +economies +isolation +Leicester +succession +signals +working-class +physics +feared +concert +tonnes +realistic +hungry +launch +Evans +resort +burst +sort +back +Walter +gear +Shakespeare +surveys +volunteers +stick +separation +la +demonstration +fails +conception +decent +discount +unnecessary +prevented +flying +worn +dictionary +twentieth +fat +random +retired +local +origins +packed +achieving +heading +forever +influential +masters +channels +harbour +producers +duration +Thames +cable +1945 +desert +terrace +assured +allocation +check +diseases +merchant +constable +Vietnam +Dean +recalled +lifetime +chips +Ray +genetic +complaint +near +visiting +explaining +order +marvellous +Malcolm +Morgan +restored +earliest +enabled +release +Cardiff +assurance +bottles +brick +essence +autonomy +giant +requiring +hunting +consensus +differ +vegetables +junction +workshop +measure +purchaser +secure +attendance +necessity +bottom +demanding +skilled +shaking +subtle +select +attack +questioned +sooner +producer +planet +elegant +amendment +hopes +carries +recommend +lesser +farms +parallel +limitations +locally +Marie +tragedy +instance +cousin +collections +backwards +grain +resulting +fraud +swung +landed +quarters +liberation +seventeen +referring +interior +bike +suspended +officially +journalists +nasty +movie +suppliers +dealer +shows +soldier +intensive +kit +witness +delight +symbol +forum +casual +tropical +shorter +Allen +crimes +printed +miners +feeding +relax +pass +manufacturer +chip +crazy +forming +kissed +swimming +happily +copper +arguing +shots +landing +nursery +entries +preliminary +besides +arises +partial +households +damp +wool +1964 +servant +Pakistan +attending +Guy +plot +muscle +beings +inch +simultaneously +concrete +Roy +roll +bell +neighbour +reign +analysed +tide +expand +alleged +guilt +rank +introducing +transfer +uses +ceremony +Morris +separately +opinions +enquiry +grinned +lover +slept +choices +assistant +severely +finest +poured +vertical +Easter +upset +hey +allegations +IRA +justification +detective +programs +throwing +strike +ate +appendix +Jenny +districts +commonwealth +dealers +delicate +forms +advisers +lonely +dull +mouse +Pat +occupational +pity +behave +complexity +youngsters +riding +weakness +excessive +Clark +progressive +captured +stance +undertake +exceptional +faster +Iraqi +remind +counter +Greece +triumph +remarked +continental +striking +integrated +pit +encountered +implemented +sizes +directive +participate +safely +lowest +lighting +villa +okay +downstairs +portrait +alternatively +edges +focused +bye +residence +panic +label +aims +magazines +neat +combined +transformation +theft +lecture +incidence +scores +radiation +perceived +spread +firstly +interface +doctrine +shouting +affecting +ours +excuse +accepting +risen +Lancashire +approach +deposit +pond +substantially +innovation +diagnosis +gifts +allocated +regard +remainder +speculation +approaching +dialogue +estimate +wash +supervision +dying +exclusively +happiness +politically +timing +chronic +Geoffrey +peasants +tightly +characteristic +accuracy +compulsory +wrapped +interim +objective +Benjamin +walking +infant +Bruce +judged +splendid +ride +divorce +magic +Cleveland +bond +review +short-term +ambulance +brave +investigations +systematic +Green +seized +cry +laugh +advanced +obliged +opens +eaten +relevance +1930s +careers +Liz +withdrawn +Barbara +no +payable +handsome +fun +Ms +instances +governors +horrible +measurement +employ +primitive +steadily +switch +fascinating +Brazil +ideological +pile +mounted +metropolitan +alternatives +dollars +north-east +explosion +starting +glory +scarcely +Harriet +surrounding +coup +domain +fence +threatening +dragged +breast +habits +mine +hierarchy +grip +socialism +enquiries +particles +Sweden +choosing +colleague +monitoring +Midlands +restore +printer +imagined +doorway +prisoner +juice +classification +estimated +equilibrium +solely +with regard to +serves +peaceful +observer +explanations +circles +rescue +maps +hated +observe +Hughes +premier +mate +hypothesis +1966 +ride +companion +liver +factories +buyers +reward +controlling +satellite +loyalty +operational +pardon +improving +jump +potatoes +intervals +technological +near +fortunately +hostile +advisory +cook +precious +opponents +peasant +insist +geography +button +consistently +cultures +seeds +monopoly +accessible +tournament +moves +excited +determined +owed +pockets +belonged +Hollywood +dining +switch +traditions +compromise +intensity +chaos +obtaining +Mexico +King +combine +altered +nonsense +clouds +themes +suspicion +ranks +disorder +stocks +Kuwait +1965 +2000 +consultant +collapsed +purchased +impressed +half +Catherine +provincial +sterling +performances +instantly +Bell +constitute +arrest +dose +exercises +issue +competitors +spectrum +dangers +allies +travellers +plc +kid +disc +Donald +nowadays +Surrey +cheeks +endless +isolated +dimension +twin +bedrooms +clean +columns +privilege +post-war +volumes +broadcasting +commerce +historians +train +geographical +oak +actors +step +like +dynamic +freely +checking +equipped +inspired +density +1994 +forthcoming +HIV +boring +handled +poems +recording +unfortunate +banned +Karen +own +suspected +boom +tribunal +kicked +possessed +Jonathan +broadly +publicly +attributed +definite +challenged +extending +cooking +pause +strip +predicted +super +barrier +pregnancy +loud +menu +preserved +Avenue +restaurants +acres +prompted +senses +essay +lip +recruitment +defendants +presents +guarantee +invest +cats +maximum +notable +upwards +arose +cry +fierce +detected +indirect +German +witnesses +patch +sensitivity +Le +mistakes +receiver +crops +chin +wheels +rice +Dec +forgot +illustrate +reveals +Freud +limit +chap +Campbell +races +awkward +Turkey +implied +climb +widow +varied +slid +stopping +rope +steep +neutral +Oxfordshire +finish +debut +seed +challenge +promoted +delegation +hitherto +artistic +muttered +adoption +architect +dear +Kenneth +portfolio +continent +transformed +couples +probability +content +Robinson +struggling +mild +counties +wish +mention +fitness +tackle +dish +statute +invariably +Charlotte +prey +view +consultants +gather +arriving +corners +delegates +Holland +archbishop +Sue +withdraw +replacing +Milton +meaning +mature +differently +chart +technologies +woods +possess +cab +grace +toilet +grabbed +prevention +equality +wishes +bases +operator +regardless +harsh +colonial +ambitious +exploration +lords +investigated +collecting +Switzerland +shadows +Corbett +evil +Johnny +dramatically +Marshall +indicating +orchestra +lock +inhabitants +defeated +disappointment +magnetic +washing +fibre +correspondence +verbal +legitimate +requested +emotion +odds +workforce +vessels +brass +pursued +ph +balls +adviser +faint +handling +appointments +grandfather +motivation +sympathetic +publishers +peoples +socially +investments +rhythm +variable +Chelsea +memorial +well-known +empirical +roses +ceased +fluid +descriptions +incidents +DC +dismissal +appreciated +communicate +rushed +bronze +wisdom +Daniel +supper +adventure +tribute +seeks +promise +head +ye +1960 +crop +beef +suited +exercised +respects +terror +circulation +identifying +achievements +fool +intentions +proportions +lads +directory +Brighton +inn +promoting +flag +separate +Roberts +Ward +Dennis +clay +Cook +Norway +attraction +ends +disability +championships +vague +virus +shift +ranging +competence +examining +inform +spaces +goodness +gang +favourite +preserve +remembering +naval +molecules +hearts +trapped +actively +leaf +Brussels +distress +resolve +custody +packages +drinking +operators +myth +gain +voting +Mick +returns +tourists +encouragement +lacking +seldom +processor +sums +integrity +acknowledge +shortage +depressed +rightly +Louise +remarkably +repair +shoot +electronics +wishing +Kinnock +imprisonment +kings +waved +shared +shocked +uniform +added +reject +implement +pays +hesitated +seventh +magic +mid +populations +worthwhile +filling +crystal +fraction +qualified +Newton +Sally +server +Nato +specimens +kiss +reflecting +shower +missing +roll +sword +varieties +clinic +imply +ie +rivals +Julia +breakdown +Anderson +scales +fan +operates +blank +whoever +scandal +oldest +smart +favourable +filter +interviewed +absent +mining +gentlemen +enemies +champions +Duncan +exclusion +boot +locations +Hamilton +transmission +custom +tanks +tries +Gloucestershire +publisher +beating +evidently +Netherlands +Polish +lively +exceptions +Emma +appeals +Israeli +mobility +reviewed +buses +conclude +mix +shore +commissioner +absorbed +Norwich +dawn +developed +guards +incomes +parking +vendor +wishes +republics +loads +barriers +translation +evenings +Hungary +lectures +stimulus +conflicts +remains +margin +question +bothered +neighbourhood +tourism +meanings +FA +desktop +reportedly +risk +zero +demonstrations +dividend +opponent +wake +stiff +rejection +flavour +relates +borrow +emissions +representative +Midland +thereafter +enthusiastic +observers +cited +quid +fortnight +dreadful +guarantee +reduced +rigid +killer +ending +trick +successor +execution +influences +temperatures +mines +drank +coastal +greeted +nightmare +peculiar +corruption +tray +speaks +cupboard +creates +Jordan +Aberdeen +harder +burned +appearing +Swiss +rabbit +environments +comedy +referendum +bureau +avoiding +just about +matrix +honestly +profound +journalist +extended +Julie +tapes +suspension +delayed +eager +comply +selected +skirt +matched +feminist +Davis +Canadian +closing +acts +grief +relaxed +insight +deck +sensation +placing +sequences +temple +parks +tactics +verdict +adapted +enhance +corresponding +strings +accurately +running +pray +accent +envelope +interference +grandmother +examinations +phone +planned +shelf +deemed +waist +waste +onwards +applicable +futures +sauce +immense +purchase +breathing +allied +Norfolk +contest +expects +supports +km +blacks +decision-making +coins +genuinely +accounted +expressing +assessing +dance +scheduled +adjustment +charge +winds +meets +practically +merger +comparative +permit +celebrate +vessel +belonging +affection +outline +albeit +Lily +leaning +lounge +raises +Cheltenham +workshops +refusing +shallow +dishes +monitor +propose +blamed +dioxide +kind +broader +handling +bastard +uncomfortable +affects +proposition +representations +conservation +ya +makers +Yugoslavia +Fox +citizen +forcing +productive +woke +bored +beneficial +slip +campaigns +handful +aged +collar +curtain +diversity +hint +Thompson +disappear +charming +bonus +secrets +interrupted +specialists +accommodate +frustration +recommendation +meantime +coffin +daily +condemned +minimal +mobile +academy +testing +independently +appealed +museums +cruel +faces +murdered +on board +Turkish +aim +Will +territories +pressing +Churchill +commit +verse +research +orange +interval +threats +passive +suspicious +forgive +liberty +ghost +rear +believing +correlation +measurements +1963 +investigating +shade +layers +bias +overwhelming +certainty +Sunderland +cow +commissioned +trusts +maturity +resulting +fatal +surrounding +crying +planted +symbolic +isle +historian +enabling +removing +slope +excuse +angel +nearby +rats +straw +1962 +surfaces +gods +foundations +honours +Belgium +disputes +insects +inspiration +draw +presenting +registered +pavement +telephone +reserve +keeper +dimensions +predict +neighbouring +validity +breeze +ugly +expanded +lasted +irrelevant +complain +shelter +patient +driving +wealthy +upset +hostility +profitable +rod +fled +compact +lamp +shifted +supplier +crossing +phenomena +IT +measuring +horizon +rival +making +clergy +marble +pensioners +fragments +loyal +Alison +Stanley +conscience +sixties +Hill +saving +tune +moderate +1961 +soup +paths +struggled +popularity +score +singer +distinguished +climbing +kick +Betty +characteristic +interior +episode +oven +basket +noble +forwards +consisted +crowds +positively +pole +burning +pet +insufficient +evil +mysterious +jet +eligible +behalf +passes +nails +collaboration +lorry +nest +varying +enforcement +Spencer +Denmark +make-up +molecular +managerial +raid +ambition +middle-class +brand +migration +embassy +neatly +looks +worship +Olympic +devised +exclude +organ +favoured +linear +Samuel +cared +manor +detect +interpret +Kennedy +substances +crude +fantasy +counselling +abilities +treating +blew +embarrassment +executed +implication +Ron +printed +prospective +importantly +Preston +continually +Barnes +executives +catching +forehead +Ali +diverse +parental +elaborate +furious +definitions +appreciation +fiscal +Kim +commitments +sculpture +runs +striker +beans +brush +soccer +spell +reductions +contrary +soap +dated +stretch +publish +russians +pig +stroke +ladder +Greater +burning +expressions +useless +nerve +pence +Gabriel +rumours +relied +Edwards +semantic +inherent +embarrassed +1948 +specification +despair +yep +name +serum +Maxwell +Dick +apartment +Vienna +deliberate +stranger +philosophical +criterion +trap +pubs +utterly +link +frowned +awake +bureaucracy +nonetheless +sunshine +bloke +partially +remedy +battery +variable +within +forth +barn +ties +settlements +installation +crashed +negotiate +Somerset +nursing +dignity +promising +minus +criticised +sacred +analyse +senate +incentive +unpleasant +varied +selective +qualified +Devon +powder +clauses +expectation +tender +inclined +funded +alleged +hidden +ridge +exhibitions +lengths +Joyce +posed +explicitly +symbols +exploitation +receives +1950 +intermediate +Isabel +blocked +trophy +launch +spotted +manufacture +diesel +masses +protective +paint +budgets +Lisa +grows +fortunate +deserve +lap +concerns +varies +compliance +defensive +damage +objections +qualify +featured +suite +salmon +reach +requests +objection +devoted +thesis +repeatedly +blow +palm +Austria +Rover +parked +Carter +Guinness +temporarily +Land +south-east +chains +worthy +ozone +pursuit +valued +divine +react +deals +head +phoned +carrier +jeans +feedback +dancing +tales +rally +grant +performing +rush +handicap +consisting +counted +qualification +guaranteed +negligence +continuity +lend +offers +educated +stuck +surplus +swallowed +eagle +printing +land +Willie +novels +driving +dependence +1st +eighth +Craig +organise +Cornwall +orange +diameter +1939 +toward +auction +eating +Max +invisible +determining +construct +faculty +offenders +occurring +Pete +charm +Don +suffering +contempt +Wimbledon +reinforced +specify +misery +dropping +breasts +overall +Sara +jewellery +bacteria +sin +comparisons +privatisation +owe +squadron +grave +codes +circular +misleading +centred +sunlight +lowered +invested +mathematical +proteins +sanctions +aggression +caution +loch +reply +direct +subjected +inappropriate +diagram +terribly +St +human +liquid +solar +angles +sorted +persistent +poles +laying +inherited +phrases +doubtful +calcium +shake +ingredients +Sophie +admits +black +BR +monster +flames +allowances +sustain +needle +telecommunications +sphere +revenues +guessed +bowel +doubled +prints +rangers +accountants +screaming +legend +petition +predominantly +manual +lies +premium +photo +surroundings +spots +gravel +19th +architectural +bold +Maastricht +inheritance +Harvey +knock +blues +beyond +Day +emergence +beautifully +deeper +intact +cooperation +convince +incredible +sound +devoted +conduct +united +celebration +abruptly +considers +flights +explored +loves +blue +Derby +restriction +prior +submit +gaining +Santa +morality +tragic +musicians +invite +Ipswich +selling +script +coupled +tap +remark +consist +respectable +pint +optimistic +humanity +layout +openly +breed +policemen +Scots +invented +linking +convincing +Harold +guide +vocabulary +Rob +unacceptable +competent +Carrie +spatial +ignoring +applicant +swiftly +easier +painter +decisive +traders +pretend +bargaining +depended +modes +preventing +rage +respective +elite +permanently +seemingly +bunch +carers +fathers +engagement +liquid +Canterbury +binding +fires +sentenced +rebels +founder +ballet +erosion +Gould +syndrome +relieved +nursing +harmony +Coventry +protested +hut +sits +stops +Lamont +bore +instructed +fertility +toxic +testament +1957 +sickness +stretch +Bath +lemon +practise +mix +faster +integral +select +redundant +handle +throne +conceived +polytechnic +nerves +belongs +privately +burn +gravity +labelled +Alfred +bishops +basin +rings +holders +swing +flood +Christie +evolved +sovereignty +then +applicants +cows +lion +Virginia +trail +smoking +trading +Murray +boxing +amateur +probable +scrutiny +tempted +borders +pan +fix +hydrogen +accountability +consulted +echo +sponsorship +fame +El +lakes +protests +patience +documentation +Geoff +backing +search +Mozart +silently +passing +seasons +recipe +fetch +auditors +territorial +specified +abandon +bombs +Los +mineral +horizontal +lined +Robyn +booked +du +cleaning +bear +old-fashioned +inland +youngest +envisaged +floors +thrust +likewise +strengthen +penny +wake +Bradford +overseas +consult +cognitive +Ralph +dock +reaches +disturbed +communists +slim +synthesis +contexts +revival +Reading +regulatory +hurried +defender +dry +miserable +walks +debates +dancing +isolated +venue +Hampshire +resident +rounds +deals +packet +likelihood +remaining +induced +guys +temper +comparatively +calculations +protecting +holdings +corn +1947 +Yeltsin +fusion +Marxist +conferences +creditors +questionnaire +gothic +scared +willingness +civilian +shelves +reporting +precision +divide +Phillips +overnight +Intel +Linda +deputies +Indians +Trevor +Juliet +Watson +conventions +modified +instant +praise +Des +coin +blown +hiding +galleries +1940 +Constance +outlook +incurred +adverse +subsidiary +tiles +seventeenth +Korean +emphasised +Eddie +bile +1959 +fancy +accounting +leaflet +headmaster +crack +heels +truck +engage +reporter +plays +Steven +calm +initiated +brigade +Dorothy +unconscious +convicted +illustration +trustees +sustained +alike +End +ideally +entity +tons +sang +telegraph +negotiation +opposite +smell +aesthetic +wiped +concentrating +anonymous +trace +usage +orthodox +fulfil +polite +girlfriend +lovers +translated +static +intent +cancelled +inside +unaware +presidency +corps +assigned +appearances +exploit +margins +worldwide +cups +solved +panels +halt +EEC +Suffolk +developers +fantastic +Lancaster +seminar +fashionable +criticisms +Cooper +motorway +zones +foolish +intake +advances +receipt +rule +regiment +trades +manual +backs +duck +causal +convey +Tommy +wee +cleaning +fond +compatible +Southampton +inclusion +Herbert +finding +lengthy +two-thirds +tent +shed +implicit +cameras +dare +abolition +Romania +pigs +lace +dedicated +cuts +perceptions +ft +counts +earning +kiss +confirmation +dual +confronted +twenty-five +mistress +assignment +propaganda +toys +Arsenal +Eleanor +critic +curiosity +republican +pipes +reduces +shooting +cheerful +reporting +plea +distinguished +subjective +pie +priests +returns +tel +labels +width +relaxation +advertisement +white +smoke +pencil +legally +following +lacked +surviving +disadvantage +ruling +forward +sleeping +owl +adequately +reproduction +rewards +architects +rear +Shelley +exotic +ambassador +1914 +camps +displays +passages +gazed +timetable +salad +purple +cautious +visiting +Turner +aggregate +ignorance +anticipated +Parker +redundancy +array +penalties +renaissance +theology +try +warn +process +ethical +major +proving +plain +protestant +grid +tenth +takeover +canvas +Ted +skull +highlighted +jokes +beat +pools +twins +borne +criticized +chemical +omitted +revision +sincerely +prizes +salvation +teenage +responding +indicators +repairs +amnesty +comparing +large-scale +yield +Claire +photography +disastrous +thumb +dying +jointly +kilometres +scholars +ace +lump +delicious +confidential +clash +market +underground +Blanche +armed +destination +witnessed +parameters +costly +restraint +bit +1958 +shaped +rode +tips +prosperity +diamond +fury +instinct +reserved +valuation +contacted +subsidies +Hunt +collector +Darwin +sponsored +compound +strengths +sank +defences +lifestyle +prejudice +announce +apparatus +dot +shoe +blanket +wound +Christine +hunger +cabin +photographer +stay +preservation +calendar +assessments +colony +Katherine +thorough +medal +trips +washing +eliminate +breathe +actress +provinces +helicopter +mist +clue +dominance +relaxed +analysts +searched +grin +Czechoslovakia +hitting +inability +portion +restrict +Gray +conspiracy +Nicholson +mercy +log +autonomous +intends +solidarity +jail +genius +1920s +pilots +incorporate +atomic +blade +frozen +1956 +colourful +discharge +injured +mask +provided that +Trent +ease +draws +retire +supposed +ml +angrily +sigh +stamp +adjust +ferry +concessions +majesty +Gilbert +pylori +uniform +adjusted +ashamed +admired +alpha +referee +1944 +Lebanon +respondents +Collins +rested +reconstruction +flown +individually +jaw +submission +efficiently +bitterly +glorious +pour +illustrates +Angeles +amid +convert +wicked +provoked +Chapman +elbow +videos +coherent +annually +le +rising +disciplines +cliff +boyfriend +novel +controls +sweat +depths +Claudia +cave +balanced +strikes +stretching +pains +Close +Tokyo +Portugal +racism +priced +delightful +evaluate +arbitrary +Chicago +Richards +signature +reversed +heroes +clarity +hit +screamed +adjacent +lid +psychiatric +comprising +honey +temptation +beam +immigration +recordings +worrying +weird +practitioner +unchanged +calculation +tutor +politician +rolling +Athens +expedition +electorate +evolutionary +scattered +abolished +researcher +ports +Chester +dilemma +Carl +loaded +IMF +flung +intimate +fever +parallel +tight +miracle +including +lawn +biology +Lothian +failures +breaks +Angela +shy +appraisal +sporting +wines +cleaned +disciplinary +occurrence +smile +formidable +lexical +graduates +fined +cooking +privacy +needles +Reagan +Black +Ed +sink +march +equations +grim +narrative +HP +charts +polls +Paula +express +OK +limbs +decorated +high +addressing +proceeds +pact +Madame +Merseyside +revenge +vice-president +far from +proceeded +airline +minerals +killing +accused +double +gradual +descent +mount +homeless +courtesy +enhanced +supermarket +Blake +Cheshire +interfere +organisers +managing +monitoring +coming +rat +supporting +Marcus +trace +approve +delays +pm +Reynolds +please +yo +programming +training +renewed +Hull +invention +writings +back +excess +planes +legacy +challenges +gaps +dug +Jason +interpretations +smallest +pulse +analyses +Ashley +rubber +retired +specimen +outdoor +shooting +chosen +embarrassing +wrist +atoms +Hereford +smoking +incidentally +preferred +renewal +Japanese +vanished +hook +loudly +bride +Annie +interactions +bizarre +gospel +realm +mainland +knit +appalling +exchanges +surgeon +crews +orientation +twisted +occupy +flame +hatred +exceed +Maurice +laboratories +reviews +Bosnia +agreed +Butler +utility +conversations +imaginative +pursuing +flour +accepted +wartime +governing +Reid +object +cutting +indirectly +governed +palestinian +vocational +von +modification +slopes +allegedly +parade +free +aluminium +Al +movies +biscuits +motive +register +merchants +hip +print +rabbits +remedies +stress +trainer +welcome +wound +Geneva +configuration +boost +puzzled +encounter +axis +no matter how +Clive +worldwide +Arnold +Allan +lamb +laser +vegetation +reluctance +jazz +databases +strengthened +protocol +enjoyment +organisational +knitting +census +calculate +handicapped +mucosa +theirs +1951 +advertisements +eldest +Carol +1936 +eventual +husbands +fur +followers +wasted +pump +lifting +practised +yacht +toes +stimulate +speeches +1953 +traced +ensured +arrow +journals +weekends +spontaneous +appoint +1949 +binding +superintendent +vivid +corporations +organisms +celebrated +mice +motives +torn +tie +dies +1954 +waiting +classified +organs +lack +worlds +nineteenth-century +faithful +shield +withdrew +reckoned +north-west +rolling +missiles +noisy +hire +organising +quote +sofa +reminder +Venice +ministerial +A +daylight +injection +graph +exchanged +prayers +boost +preparations +borrowing +innovative +strongest +audiences +disclosure +confrontation +constitutes +burnt +liaison +armies +strangely +wounds +Hewlett-Packard +controlled +Newman +cease +incentives +extends +Mitchell +echoed +facilitate +resentment +shout +cage +gloves +1990s +exploring +saving +Leonard +crossing +choir +Gibson +exit +Sydney +assumes +woodland +fog +underneath +promises +Ellen +nationalism +Kenya +commentators +Ferguson +metals +reasoning +acids +hunt +pop +1946 +dirt +Texas +Keynes +conceptual +aiming +stating +technically +heading +economically +constituted +Union +maker +blowing +touching +tours +erected +ambitions +spare +chorus +Bond +bladder +settings +dividends +18th +Gaulle +unusually +phases +adapt +colitis +exploded +Nelson +civic +bells +gall +Macdonald +unwilling +retreat +booklet +enforce +defining +goodbye +meaningful +Gregory +pine +borrowed +bow +disturbing diff --git a/magento/setup/src/Magento/Setup/Fixtures/_files/orders_fixture_data.json b/magento/setup/src/Magento/Setup/Fixtures/_files/orders_fixture_data.json new file mode 100644 index 0000000..d323246 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/_files/orders_fixture_data.json @@ -0,0 +1,568 @@ +{ + "eav_entity_store": { + "entity_store_id": "'%productStoreId%'", + "entity_type_id": 5, + "store_id": "'%productStoreId%'", + "increment_prefix": "'%productStoreId%'", + "increment_last_id": "'%orderNumber%'", + "_query_suffix": " ON DUPLICATE KEY UPDATE `increment_last_id`='%orderNumber%'" + }, + "sales_order": { + "entity_id": "'%entityId%'", + "state": "'new'", + "status": "'pending'", + "coupon_code": "NULL", + "protect_code": "'272ecb'", + "shipping_description": "'Flat Rate - Fixed'", + "is_virtual": 0, + "store_id": "'%productStoreId%'", + "customer_id": "NULL", + "base_discount_amount": -1.7000, + "base_discount_canceled": "NULL", + "base_discount_invoiced": "NULL", + "base_discount_refunded": "NULL", + "base_grand_total": 25.3000, + "base_shipping_amount": 10.0000, + "base_shipping_canceled": "NULL", + "base_shipping_invoiced": "NULL", + "base_shipping_refunded": "NULL", + "base_shipping_tax_amount": 0.0000, + "base_shipping_tax_refunded": "NULL", + "base_subtotal": 17.0000, + "base_subtotal_canceled": "NULL", + "base_subtotal_invoiced": "NULL", + "base_subtotal_refunded": "NULL", + "base_tax_amount": 0.0000, + "base_tax_canceled": "NULL", + "base_tax_invoiced": "NULL", + "base_tax_refunded": "NULL", + "base_to_global_rate": 1.0000, + "base_to_order_rate": 1.0000, + "base_total_canceled": "NULL", + "base_total_invoiced": "NULL", + "base_total_invoiced_cost": "NULL", + "base_total_offline_refunded": "NULL", + "base_total_online_refunded": "NULL", + "base_total_paid": "NULL", + "base_total_qty_ordered": "NULL", + "base_total_refunded": "NULL", + "discount_amount": -1.7000, + "discount_canceled": "NULL", + "discount_invoiced": "NULL", + "discount_refunded": "NULL", + "grand_total": 25.3000, + "shipping_amount": 10.0000, + "shipping_canceled": "NULL", + "shipping_invoiced": "NULL", + "shipping_refunded": "NULL", + "shipping_tax_amount": 0.0000, + "shipping_tax_refunded": "NULL", + "store_to_base_rate": 0.0000, + "store_to_order_rate": 0.0000, + "subtotal": 17.0000, + "subtotal_canceled": "NULL", + "subtotal_invoiced": "NULL", + "subtotal_refunded": "NULL", + "tax_amount": 0.0000, + "tax_canceled": "NULL", + "tax_invoiced": "NULL", + "tax_refunded": "NULL", + "total_canceled": "NULL", + "total_invoiced": "NULL", + "total_offline_refunded": "NULL", + "total_online_refunded": "NULL", + "total_paid": "NULL", + "total_qty_ordered": 2.0000, + "total_refunded": "NULL", + "can_ship_partially": "NULL", + "can_ship_partially_item": "NULL", + "customer_is_guest": 1, + "customer_note_notify": 1, + "billing_address_id": 2, + "customer_group_id": 0, + "edit_increment": "NULL", + "email_sent": 1, + "send_email": 1, + "forced_shipment_with_invoice": "NULL", + "payment_auth_expiration": "NULL", + "quote_address_id": "NULL", + "quote_id": "'%entityId%'", + "shipping_address_id": 1, + "adjustment_negative": "NULL", + "adjustment_positive": "NULL", + "base_adjustment_negative": "NULL", + "base_adjustment_positive": "NULL", + "base_shipping_discount_amount": "NULL", + "base_subtotal_incl_tax": 17.0000, + "base_total_due": 25.3000, + "payment_authorization_amount": "NULL", + "shipping_discount_amount": "NULL", + "subtotal_incl_tax": 17.0000, + "total_due": 25.3000, + "weight": 2.0000, + "customer_dob": "NULL", + "increment_id": "'%orderNumber%'", + "applied_rule_ids": "%ruleId%", + "base_currency_code": "'USD'", + "customer_email": "'%email%'", + "customer_firstname": "NULL", + "customer_lastname": "NULL", + "customer_middlename": "NULL", + "customer_prefix": "NULL", + "customer_suffix": "NULL", + "customer_taxvat": "NULL", + "discount_description": "NULL", + "ext_customer_id": "NULL", + "ext_order_id": "NULL", + "global_currency_code": "'USD'", + "hold_before_state": "NULL", + "hold_before_status": "NULL", + "order_currency_code": "'USD'", + "original_increment_id": "NULL", + "relation_child_id": "NULL", + "relation_child_real_id": "NULL", + "relation_parent_id": "NULL", + "relation_parent_real_id": "NULL", + "remote_ip": "'127.0.0.1'", + "shipping_method": "'flatrate_flatrate'", + "store_currency_code": "'USD'", + "store_name": "'%productStoreName%'", + "x_forwarded_for": "NULL", + "customer_note": "NULL", + "created_at": "'%time%'", + "updated_at": "'%time%'", + "total_item_count": "'%itemsPerOrder%'", + "customer_gender": "NULL", + "discount_tax_compensation_amount": 0.0000, + "base_discount_tax_compensation_amount": 0.0000, + "shipping_discount_tax_compensation_amount": 0.0000, + "base_shipping_discount_tax_compensation_amnt": "NULL", + "discount_tax_compensation_invoiced": "NULL", + "base_discount_tax_compensation_invoiced": "NULL", + "discount_tax_compensation_refunded": "NULL", + "base_discount_tax_compensation_refunded": "NULL", + "shipping_incl_tax": 10.0000, + "base_shipping_incl_tax": 10.0000, + "coupon_rule_name": "NULL", + "gift_message_id": "NULL" + }, + "sales_order_address": { + "entity_id": "'%orderAddressId%'", + "parent_id": "'%entityId%'", + "customer_address_id": "NULL", + "quote_address_id": "NULL", + "region_id": "1", + "customer_id": "NULL", + "fax": "NULL", + "region": "'%state%'", + "postcode": "'%zip%'", + "lastname": "'%lastName%'", + "street": "'%address%'", + "city": "'%city%'", + "email": "'%email%'", + "telephone": "'%phone%'", + "country_id": "'%country%'", + "firstname": "'%firstName%'", + "address_type": "'%addressType%'", + "prefix": "NULL", + "middlename": "NULL", + "suffix": "NULL", + "company": "'%company%'", + "vat_id": "NULL", + "vat_is_valid": "NULL", + "vat_request_id": "NULL", + "vat_request_date": "NULL", + "vat_request_success": "NULL" + }, + "sales_order_grid": { + "entity_id": "'%entityId%'", + "status": "'pending'", + "store_id": "'%productStoreId%'", + "store_name": "'%entityId%'", + "customer_id": "NULL", + "base_grand_total": 25.3000, + "base_total_paid": "NULL", + "grand_total": 25.3000, + "total_paid": "NULL", + "increment_id": "'%orderNumber%'", + "base_currency_code": "'USD'", + "order_currency_code": "'USD'", + "shipping_name": "''", + "billing_name": "''", + "created_at": "'%time%'", + "updated_at": "NULL" + }, + "sales_order_item": { + "item_id": "'%itemId%'", + "order_id": "'%entityId%'", + "parent_item_id": "'%parentItemId%'", + "quote_item_id": "'%itemId%'", + "store_id": "'%productStoreId%'", + "created_at": "'%time%'", + "updated_at": "'0000-00-00 00:00:00'", + "product_id": "'%productId%'", + "product_type": "'%productType%'", + "product_options": "'%productOptions%'", + "weight": 1.0000, + "is_virtual": "'0'", + "sku": "'%sku%'", + "name": "'%name%'", + "description": "NULL", + "applied_rule_ids": "'%ruleId%'", + "additional_data": "NULL", + "is_qty_decimal": "'0'", + "no_discount": "'0'", + "qty_backordered": "NULL", + "qty_canceled": 0.0000, + "qty_invoiced": 0.0000, + "qty_ordered": 1.0000, + "qty_refunded": 0.0000, + "qty_shipped": 0.0000, + "base_cost": "NULL", + "price": 8.5000, + "base_price": 8.5000, + "original_price": 10.0000, + "base_original_price": 10.0000, + "tax_percent": 0.0000, + "tax_amount": 0.0000, + "base_tax_amount": 0.0000, + "tax_invoiced": 0.0000, + "base_tax_invoiced": 0.0000, + "discount_percent": 10.0000, + "discount_amount": 0.8500, + "base_discount_amount": 0.8500, + "discount_invoiced": 0.0000, + "base_discount_invoiced": 0.0000, + "amount_refunded": 0.0000, + "base_amount_refunded": 0.0000, + "row_total": 8.5000, + "base_row_total": 8.5000, + "row_invoiced": 0.0000, + "base_row_invoiced": 0.0000, + "row_weight": 1.0000, + "base_tax_before_discount": "NULL", + "tax_before_discount": "NULL", + "ext_order_item_id": "NULL", + "locked_do_invoice": "NULL", + "locked_do_ship": "NULL", + "price_incl_tax": 8.5000, + "base_price_incl_tax": 8.5000, + "row_total_incl_tax": 8.5000, + "base_row_total_incl_tax": 8.5000, + "discount_tax_compensation_amount": 0.0000, + "base_discount_tax_compensation_amount": 0.0000, + "discount_tax_compensation_invoiced": "NULL", + "base_discount_tax_compensation_invoiced": "NULL", + "discount_tax_compensation_refunded": "NULL", + "base_discount_tax_compensation_refunded": "NULL", + "tax_canceled": "NULL", + "discount_tax_compensation_canceled": "NULL", + "tax_refunded": "NULL", + "base_tax_refunded": "NULL", + "discount_refunded": "NULL", + "base_discount_refunded": "NULL", + "free_shipping": "'0'", + "gift_message_id": "NULL", + "gift_message_available": "NULL", + "weee_tax_applied": "NULL", + "weee_tax_applied_amount": "NULL", + "weee_tax_applied_row_amount": "NULL", + "weee_tax_disposition": "NULL", + "weee_tax_row_disposition": "NULL", + "base_weee_tax_applied_amount": "NULL", + "base_weee_tax_applied_row_amnt": "NULL", + "base_weee_tax_disposition": "NULL", + "base_weee_tax_row_disposition": "NULL" + }, + "sales_order_payment": { + "entity_id": "'%entityId%'", + "parent_id": "'%entityId%'", + "base_shipping_captured": "NULL", + "shipping_captured": "NULL", + "amount_refunded": "NULL", + "base_amount_paid": "NULL", + "amount_canceled": "NULL", + "base_amount_authorized": "NULL", + "base_amount_paid_online": "NULL", + "base_amount_refunded_online": "NULL", + "base_shipping_amount": 10.0000, + "shipping_amount": 10.0000, + "amount_paid": "NULL", + "amount_authorized": "NULL", + "base_amount_ordered": 25.3000, + "base_shipping_refunded": "NULL", + "shipping_refunded": "NULL", + "base_amount_refunded": "NULL", + "amount_ordered": 25.3000, + "base_amount_canceled": "NULL", + "quote_payment_id": "NULL", + "additional_data": "NULL", + "cc_exp_month": "NULL", + "cc_ss_start_year": "'0'", + "echeck_bank_name": "NULL", + "method": "'checkmo'", + "cc_debug_request_body": "NULL", + "cc_secure_verify": "NULL", + "protection_eligibility": "NULL", + "cc_approval": "NULL", + "cc_last_4": "NULL", + "cc_status_description": "NULL", + "echeck_type": "NULL", + "cc_debug_response_serialized": "NULL", + "cc_ss_start_month": "'0'", + "echeck_account_type": "NULL", + "last_trans_id": "NULL", + "cc_cid_status": "NULL", + "cc_owner": "NULL", + "cc_type": "NULL", + "po_number": "NULL", + "cc_exp_year": "NULL", + "cc_status": "NULL", + "echeck_routing_number": "NULL", + "account_status": "NULL", + "anet_trans_method": "NULL", + "cc_debug_response_body": "NULL", + "cc_ss_issue": "NULL", + "echeck_account_name": "NULL", + "cc_avs_status": "NULL", + "cc_number_enc": "NULL", + "cc_trans_id": "NULL", + "address_status": "NULL", + "additional_information": "'{\"method_title\":\"Check \/ Money order\"}'" + }, + "sales_order_status_history": { + "entity_id": "'%entityId%'", + "parent_id": "'%entityId%'", + "is_customer_notified": "1", + "is_visible_on_front": "0", + "comment": "NULL", + "status": "'pending'", + "created_at": "'%time%'", + "entity_name": "'order'" + }, + "quote": { + "entity_id": "'%entityId%'", + "store_id": "'%productStoreId%'", + "created_at": "'%time%'", + "updated_at": "'1970-01-01 03:00:00'", + "converted_at": "NULL", + "is_active": 0, + "is_virtual": 0, + "is_multi_shipping": 0, + "items_count": "'%itemsPerOrder%'", + "items_qty": "'%itemsPerOrder%'", + "orig_order_id": 0, + "store_to_base_rate": 0.0000, + "store_to_quote_rate": 0.0000, + "base_currency_code": "'USD'", + "store_currency_code": "'USD'", + "quote_currency_code": "'USD'", + "grand_total": 25.3000, + "base_grand_total": 25.3000, + "checkout_method": "'guest'", + "customer_id": "NULL", + "customer_tax_class_id": 3, + "customer_group_id": 0, + "customer_email": "'%email%'", + "customer_prefix": "NULL", + "customer_firstname": "NULL", + "customer_middlename": "NULL", + "customer_lastname": "NULL", + "customer_suffix": "NULL", + "customer_dob": "NULL", + "customer_note": "NULL", + "customer_note_notify": 1, + "customer_is_guest": 1, + "remote_ip": "'127.0.0.1'", + "applied_rule_ids": "'%ruleId%'", + "reserved_order_id": "NULL", + "password_hash": "NULL", + "coupon_code": "NULL", + "global_currency_code": "'USD'", + "base_to_global_rate": 1.0000, + "base_to_quote_rate": 1.0000, + "customer_taxvat": "NULL", + "customer_gender": "NULL", + "subtotal": 17.0000, + "base_subtotal": 17.0000, + "subtotal_with_discount": 15.3000, + "base_subtotal_with_discount": 15.3000, + "is_changed": 1, + "trigger_recollect": 0, + "ext_shipping_info": "NULL", + "is_persistent": 0, + "gift_message_id": "NULL", + "_table": "quote", + "_resource": "Magento\\Quote\\Model\\ResourceModel\\Quote" + }, + "quote_address": { + "address_id": "'%orderAddressId%'", + "quote_id": "'%entityId%'", + "created_at": "'%time%'", + "updated_at": "'1970-01-01 03:00:00'", + "customer_id": "NULL", + "save_in_address_book": 1, + "customer_address_id": "NULL", + "address_type": "'%addressType%'", + "email": "'%email%'", + "prefix": "NULL", + "firstname": "'%firstName%'", + "middlename": "NULL", + "lastname": "'%lastName%'", + "suffix": "NULL", + "company": "'%company%'", + "street": "'%address%'", + "city": "'%city%'", + "region": "'%state%'", + "region_id": "1", + "postcode": "'%zip%'", + "country_id": "'%country%'", + "telephone": "'%phone%'", + "fax": "NULL", + "same_as_billing": 0, + "collect_shipping_rates": 0, + "shipping_method": "'flatrate_flatrate'", + "shipping_description": "'Flat Rate - Fixed'", + "weight": 0.0000, + "subtotal": 0.0000, + "base_subtotal": 0.0000, + "subtotal_with_discount": 0.0000, + "base_subtotal_with_discount": 0.0000, + "tax_amount": 0.0000, + "base_tax_amount": 0.0000, + "shipping_amount": 0.0000, + "base_shipping_amount": 0.0000, + "shipping_tax_amount": "NULL", + "base_shipping_tax_amount": "NULL", + "discount_amount": 0.0000, + "base_discount_amount": 0.0000, + "grand_total": 0.0000, + "base_grand_total": 0.0000, + "customer_notes": "NULL", + "applied_taxes": "NULL", + "discount_description": "NULL", + "shipping_discount_amount": "NULL", + "base_shipping_discount_amount": "NULL", + "subtotal_incl_tax": 0.0000, + "base_subtotal_total_incl_tax": "NULL", + "discount_tax_compensation_amount": 0.0000, + "base_discount_tax_compensation_amount": 0.0000, + "shipping_discount_tax_compensation_amount": 0.0000, + "base_shipping_discount_tax_compensation_amnt": "NULL", + "shipping_incl_tax": "NULL", + "base_shipping_incl_tax": "NULL", + "free_shipping": 0, + "vat_id": "NULL", + "vat_is_valid": "NULL", + "vat_request_id": "NULL", + "vat_request_date": "NULL", + "vat_request_success": "NULL", + "gift_message_id": "NULL", + "_table": "quote_address", + "_resource": "Magento\\Quote\\Model\\ResourceModel\\Quote\\Address" + }, + "quote_payment": { + "payment_id": "'%entityId%'", + "quote_id": "'%entityId%'", + "created_at": "'%time%'", + "updated_at": "'1970-01-01 03:00:00'", + "method": "'checkmo'", + "cc_type": "NULL", + "cc_number_enc": "NULL", + "cc_last_4": "NULL", + "cc_cid_enc": "NULL", + "cc_owner": "NULL", + "cc_exp_month": "NULL", + "cc_exp_year": "0", + "cc_ss_owner": "NULL", + "cc_ss_start_month": "0", + "cc_ss_start_year": "0", + "po_number": "NULL", + "additional_data": "NULL", + "cc_ss_issue": "NULL", + "additional_information": "NULL", + "_table": "quote_payment", + "_resource": "Magento\\Quote\\Model\\ResourceModel\\Quote\\Payment" + }, + "quote_shipping_rate": { + "rate_id": "'%orderAddressId%'", + "address_id": "'%orderAddressId%'", + "created_at": "'%time%'", + "updated_at": "'1970-01-01 03:00:00'", + "carrier": "'flatrate'", + "carrier_title": "'Flat Rate'", + "code": "'flatrate_flatrate'", + "method": "'flatrate'", + "method_description": "NULL", + "price": "10.0000", + "error_message": "NULL", + "method_title": "'Fixed'", + "_table": "quote_shipping_rate", + "_resource": "Magento\\Quote\\Model\\ResourceModel\\Quote\\Address\\Rate" + }, + "quote_item": { + "item_id": "'%itemId%'", + "quote_id": "'%entityId%'", + "created_at": "'1970-01-01 03:00:00'", + "updated_at": "'1970-01-01 03:00:00'", + "product_id": "'%productId%'", + "store_id": "'%productStoreId%'", + "parent_item_id": "%parentItemId%", + "is_virtual": "0", + "sku": "'%sku%'", + "name": "'%name%'", + "description": "NULL", + "applied_rule_ids": "'%ruleId%'", + "additional_data": "NULL", + "is_qty_decimal": "0", + "no_discount": "0", + "weight": "1.0000", + "qty": "1.0000", + "price": "8.5000", + "base_price": "8.5000", + "custom_price": "NULL", + "discount_percent": "10.0000", + "discount_amount": "0.8500", + "base_discount_amount": "0.8500", + "tax_percent": "0.0000", + "tax_amount": "0.0000", + "base_tax_amount": "0.0000", + "row_total": "8.5000", + "base_row_total": "8.5000", + "row_total_with_discount": "0.0000", + "row_weight": "1.0000", + "product_type": "'simple'", + "base_tax_before_discount": "NULL", + "tax_before_discount": "NULL", + "original_custom_price": "NULL", + "redirect_url": "NULL", + "base_cost": "NULL", + "price_incl_tax": "8.5000", + "base_price_incl_tax": "8.5000", + "row_total_incl_tax": "8.5000", + "base_row_total_incl_tax": "8.5000", + "discount_tax_compensation_amount": "0.0000", + "base_discount_tax_compensation_amount": "0.0000", + "free_shipping": "0", + "gift_message_id": "NULL", + "weee_tax_applied": "NULL", + "weee_tax_applied_amount": "NULL", + "weee_tax_applied_row_amount": "NULL", + "weee_tax_disposition": "NULL", + "weee_tax_row_disposition": "NULL", + "base_weee_tax_applied_amount": "NULL", + "base_weee_tax_applied_row_amnt": "NULL", + "base_weee_tax_disposition": "NULL", + "base_weee_tax_row_disposition": "NULL", + "_table": "quote_item", + "_resource": "Magento\\Quote\\Model\\ResourceModel\\Quote\\Item" + }, + "quote_item_option": { + "item_id": "'%itemId%'", + "product_id": "'%productId%'", + "code": "'%code%'", + "value": "'%value%'", + "_table": "quote_item_option", + "_resource": "Magento\\Quote\\Model\\ResourceModel\\Quote\\Item\\Option" + } +} diff --git a/magento/setup/src/Magento/Setup/Fixtures/_files/tax_rates.csv b/magento/setup/src/Magento/Setup/Fixtures/_files/tax_rates.csv new file mode 100644 index 0000000..8dd382b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/_files/tax_rates.csv @@ -0,0 +1,39714 @@ +Code,Country,State,"Zip/Post Code",Rate,"Zip/Post is Range","Range From","Range To",default +US-AK-99547,US,AK,99547,3,,,, +US-AK-99554,US,AK,99554,4,,,, +US-AK-99555,US,AK,99555,5,,,, +US-AK-99556,US,AK,99556,3,,,, +US-AK-99557,US,AK,99557,2,,,, +US-AK-99559,US,AK,99559,6,,,, +US-AK-99561,US,AK,99561,2,,,, +US-AK-99563,US,AK,99563,3,,,, +US-AK-99568,US,AK,99568,3,,,, +US-AK-99569,US,AK,99569,5,,,, +US-AK-99572,US,AK,99572,3,,,, +US-AK-99574,US,AK,99574,6,,,, +US-AK-99576,US,AK,99576,6,,,, +US-AK-99578,US,AK,99578,2,,,, +US-AK-99581,US,AK,99581,3,,,, +US-AK-99583,US,AK,99583,3,,,, +US-AK-99585,US,AK,99585,4,,,, +US-AK-99591,US,AK,99591,3,,,, +US-AK-99603,US,AK,99603,7.5,,,, +US-AK-99604,US,AK,99604,4,,,, +US-AK-99605,US,AK,99605,3,,,, +US-AK-99609,US,AK,99609,3,,,, +US-AK-99610,US,AK,99610,3,,,, +US-AK-99611,US,AK,99611,6,,,, +US-AK-99612,US,AK,99612,4,,,, +US-AK-99615,US,AK,99615,7,,,, +US-AK-99619,US,AK,99619,7,,,, +US-AK-99620,US,AK,99620,3,,,, +US-AK-99621,US,AK,99621,5,,,, +US-AK-99624,US,AK,99624,3,,,, +US-AK-99628,US,AK,99628,2,,,, +US-AK-99629,US,AK,99629,2,,,, +US-AK-99630,US,AK,99630,4,,,, +US-AK-99631,US,AK,99631,3,,,, +US-AK-99632,US,AK,99632,3,,,, +US-AK-99634,US,AK,99634,4,,,, +US-AK-99635,US,AK,99635,6,,,, +US-AK-99637,US,AK,99637,6,,,, +US-AK-99639,US,AK,99639,3,,,, +US-AK-99640,US,AK,99640,3,,,, +US-AK-99641,US,AK,99641,4,,,, +US-AK-99643,US,AK,99643,3,,,, +US-AK-99644,US,AK,99644,3,,,, +US-AK-99650,US,AK,99650,4,,,, +US-AK-99652,US,AK,99652,3,,,, +US-AK-99655,US,AK,99655,3,,,, +US-AK-99658,US,AK,99658,3,,,, +US-AK-99659,US,AK,99659,4,,,, +US-AK-99660,US,AK,99660,3,,,, +US-AK-99661,US,AK,99661,3,,,, +US-AK-99662,US,AK,99662,4,,,, +US-AK-99663,US,AK,99663,5,,,, +US-AK-99664,US,AK,99664,3,,,, +US-AK-99666,US,AK,99666,3,,,, +US-AK-99669,US,AK,99669,3,,,, +US-AK-99671,US,AK,99671,3,,,, +US-AK-99672,US,AK,99672,3,,,, +US-AK-99677,US,AK,99677,6,,,, +US-AK-99678,US,AK,99678,2,,,, +US-AK-99679,US,AK,99679,6,,,, +US-AK-99680,US,AK,99680,6,,,, +US-AK-99682,US,AK,99682,3,,,, +US-AK-99684,US,AK,99684,5,,,, +US-AK-99685,US,AK,99685,3,,,, +US-AK-99687,US,AK,99687,2,,,, +US-AK-99689,US,AK,99689,5,,,, +US-AK-99690,US,AK,99690,6,,,, +US-AK-99692,US,AK,99692,3,,,, +US-AK-99694,US,AK,99694,3,,,, +US-AK-99697,US,AK,99697,7,,,, +US-AK-99704,US,AK,99704,6,,,, +US-AK-99711,US,AK,99711,4,,,, +US-AK-99727,US,AK,99727,6,,,, +US-AK-99736,US,AK,99736,3,,,, +US-AK-99739,US,AK,99739,3,,,, +US-AK-99740,US,AK,99740,3,,,, +US-AK-99741,US,AK,99741,3,,,, +US-AK-99742,US,AK,99742,3,,,, +US-AK-99744,US,AK,99744,4,,,, +US-AK-99749,US,AK,99749,3,,,, +US-AK-99750,US,AK,99750,2,,,, +US-AK-99752,US,AK,99752,6,,,, +US-AK-99753,US,AK,99753,2,,,, +US-AK-99760,US,AK,99760,4,,,, +US-AK-99761,US,AK,99761,3,,,, +US-AK-99762,US,AK,99762,5,,,, +US-AK-99763,US,AK,99763,4,,,, +US-AK-99766,US,AK,99766,3,,,, +US-AK-99770,US,AK,99770,5,,,, +US-AK-99772,US,AK,99772,2,,,, +US-AK-99773,US,AK,99773,2,,,, +US-AK-99777,US,AK,99777,2,,,, +US-AK-99778,US,AK,99778,3,,,, +US-AK-99783,US,AK,99783,3,,,, +US-AK-99784,US,AK,99784,1,,,, +US-AK-99785,US,AK,99785,3,,,, +US-AK-99786,US,AK,99786,3,,,, +US-AK-99788,US,AK,99788,3,,,, +US-AK-99801,US,AK,99801,5,,,, +US-AK-99802,US,AK,99802,5,,,, +US-AK-99803,US,AK,99803,5,,,, +US-AK-99811,US,AK,99811,5,,,, +US-AK-99812,US,AK,99812,5,,,, +US-AK-99820,US,AK,99820,3,,,, +US-AK-99821,US,AK,99821,5,,,, +US-AK-99824,US,AK,99824,5,,,, +US-AK-99826,US,AK,99826,3,,,, +US-AK-99827,US,AK,99827,4,,,, +US-AK-99829,US,AK,99829,6.5,,,, +US-AK-99830,US,AK,99830,5,,,, +US-AK-99832,US,AK,99832,4,,,, +US-AK-99833,US,AK,99833,6,,,, +US-AK-99835,US,AK,99835,5,,,, +US-AK-99836,US,AK,99836,5,,,, +US-AK-99840,US,AK,99840,3,,,, +US-AK-99841,US,AK,99841,2,,,, +US-AK-99850,US,AK,99850,5,,,, +US-AK-99901,US,AK,99901,6,,,, +US-AK-99903,US,AK,99903,6,,,, +US-AK-99918,US,AK,99918,6,,,, +US-AK-99919,US,AK,99919,6,,,, +US-AK-99921,US,AK,99921,5,,,, +US-AK-99922,US,AK,99922,4,,,, +US-AK-99925,US,AK,99925,5.5,,,, +US-AK-99928,US,AK,99928,2.5,,,, +US-AK-99929,US,AK,99929,7,,,, +US-AK-99950,US,AK,99950,6,,,, +US-AL-35004,US,AL,35004,9,,,, +US-AL-35005,US,AL,35005,9.5,,,, +US-AL-35006,US,AL,35006,6,,,, +US-AL-35007,US,AL,35007,9,,,, +US-AL-35010,US,AL,35010,8.5,,,, +US-AL-35011,US,AL,35011,8.5,,,, +US-AL-35013,US,AL,35013,7,,,, +US-AL-35014,US,AL,35014,7,,,, +US-AL-35015,US,AL,35015,10,,,, +US-AL-35016,US,AL,35016,9,,,, +US-AL-35019,US,AL,35019,8.5,,,, +US-AL-35020,US,AL,35020,10,,,, +US-AL-35021,US,AL,35021,10,,,, +US-AL-35022,US,AL,35022,10,,,, +US-AL-35023,US,AL,35023,10,,,, +US-AL-35031,US,AL,35031,6,,,, +US-AL-35032,US,AL,35032,7.5,,,, +US-AL-35033,US,AL,35033,8.5,,,, +US-AL-35034,US,AL,35034,8,,,, +US-AL-35035,US,AL,35035,8,,,, +US-AL-35036,US,AL,35036,10,,,, +US-AL-35038,US,AL,35038,8,,,, +US-AL-35040,US,AL,35040,9,,,, +US-AL-35042,US,AL,35042,9,,,, +US-AL-35043,US,AL,35043,9,,,, +US-AL-35044,US,AL,35044,8,,,, +US-AL-35045,US,AL,35045,8,,,, +US-AL-35046,US,AL,35046,5,,,, +US-AL-35048,US,AL,35048,10,,,, +US-AL-35049,US,AL,35049,8,,,, +US-AL-35051,US,AL,35051,5,,,, +US-AL-35052,US,AL,35052,9,,,, +US-AL-35053,US,AL,35053,8.5,,,, +US-AL-35054,US,AL,35054,6,,,, +US-AL-35055,US,AL,35055,9,,,, +US-AL-35056,US,AL,35056,9,,,, +US-AL-35057,US,AL,35057,8.5,,,, +US-AL-35058,US,AL,35058,8.5,,,, +US-AL-35060,US,AL,35060,7.75,,,, +US-AL-35061,US,AL,35061,10,,,, +US-AL-35062,US,AL,35062,8,,,, +US-AL-35063,US,AL,35063,6,,,, +US-AL-35064,US,AL,35064,10,,,, +US-AL-35068,US,AL,35068,10,,,, +US-AL-35070,US,AL,35070,8.5,,,, +US-AL-35071,US,AL,35071,10,,,, +US-AL-35072,US,AL,35072,6,,,, +US-AL-35073,US,AL,35073,9,,,, +US-AL-35074,US,AL,35074,9,,,, +US-AL-35077,US,AL,35077,8.5,,,, +US-AL-35078,US,AL,35078,9,,,, +US-AL-35079,US,AL,35079,6,,,, +US-AL-35080,US,AL,35080,9,,,, +US-AL-35082,US,AL,35082,6,,,, +US-AL-35083,US,AL,35083,8.5,,,, +US-AL-35085,US,AL,35085,5,,,, +US-AL-35087,US,AL,35087,8.5,,,, +US-AL-35089,US,AL,35089,6,,,, +US-AL-35091,US,AL,35091,10,,,, +US-AL-35094,US,AL,35094,10,,,, +US-AL-35096,US,AL,35096,10,,,, +US-AL-35097,US,AL,35097,8,,,, +US-AL-35098,US,AL,35098,8.5,,,, +US-AL-35111,US,AL,35111,6,,,, +US-AL-35112,US,AL,35112,10,,,, +US-AL-35114,US,AL,35114,9,,,, +US-AL-35115,US,AL,35115,9,,,, +US-AL-35116,US,AL,35116,10,,,, +US-AL-35117,US,AL,35117,6,,,, +US-AL-35118,US,AL,35118,9,,,, +US-AL-35119,US,AL,35119,8,,,, +US-AL-35120,US,AL,35120,9,,,, +US-AL-35121,US,AL,35121,9,,,, +US-AL-35123,US,AL,35123,8,,,, +US-AL-35124,US,AL,35124,9,,,, +US-AL-35125,US,AL,35125,6,,,, +US-AL-35126,US,AL,35126,6,,,, +US-AL-35127,US,AL,35127,9,,,, +US-AL-35128,US,AL,35128,10,,,, +US-AL-35130,US,AL,35130,6,,,, +US-AL-35131,US,AL,35131,10,,,, +US-AL-35133,US,AL,35133,6,,,, +US-AL-35135,US,AL,35135,10,,,, +US-AL-35136,US,AL,35136,8,,,, +US-AL-35137,US,AL,35137,7,,,, +US-AL-35139,US,AL,35139,9,,,, +US-AL-35142,US,AL,35142,9,,,, +US-AL-35143,US,AL,35143,5,,,, +US-AL-35144,US,AL,35144,9,,,, +US-AL-35146,US,AL,35146,6,,,, +US-AL-35147,US,AL,35147,5,,,, +US-AL-35148,US,AL,35148,9.5,,,, +US-AL-35149,US,AL,35149,7,,,, +US-AL-35150,US,AL,35150,8,,,, +US-AL-35151,US,AL,35151,7,,,, +US-AL-35160,US,AL,35160,10,,,, +US-AL-35161,US,AL,35161,10,,,, +US-AL-35171,US,AL,35171,8,,,, +US-AL-35172,US,AL,35172,6,,,, +US-AL-35173,US,AL,35173,10,,,, +US-AL-35175,US,AL,35175,5,,,, +US-AL-35176,US,AL,35176,5,,,, +US-AL-35178,US,AL,35178,9,,,, +US-AL-35179,US,AL,35179,8.5,,,, +US-AL-35180,US,AL,35180,6,,,, +US-AL-35181,US,AL,35181,8,,,, +US-AL-35182,US,AL,35182,6,,,, +US-AL-35183,US,AL,35183,6,,,, +US-AL-35184,US,AL,35184,8,,,, +US-AL-35185,US,AL,35185,7,,,, +US-AL-35186,US,AL,35186,8,,,, +US-AL-35187,US,AL,35187,6.5,,,, +US-AL-35188,US,AL,35188,10,,,, +US-AL-35201,US,AL,35201,10,,,, +US-AL-35202,US,AL,35202,10,,,, +US-AL-35203,US,AL,35203,10,,,, +US-AL-35204,US,AL,35204,10,,,, +US-AL-35205,US,AL,35205,10,,,, +US-AL-35206,US,AL,35206,10,,,, +US-AL-35207,US,AL,35207,10,,,, +US-AL-35208,US,AL,35208,10,,,, +US-AL-35209,US,AL,35209,9,,,, +US-AL-35210,US,AL,35210,10,,,, +US-AL-35211,US,AL,35211,10,,,, +US-AL-35212,US,AL,35212,10,,,, +US-AL-35213,US,AL,35213,9,,,, +US-AL-35214,US,AL,35214,6,,,, +US-AL-35215,US,AL,35215,8,,,, +US-AL-35216,US,AL,35216,9,,,, +US-AL-35217,US,AL,35217,10,,,, +US-AL-35218,US,AL,35218,10,,,, +US-AL-35219,US,AL,35219,9,,,, +US-AL-35220,US,AL,35220,8,,,, +US-AL-35221,US,AL,35221,10,,,, +US-AL-35222,US,AL,35222,10,,,, +US-AL-35223,US,AL,35223,9,,,, +US-AL-35224,US,AL,35224,10,,,, +US-AL-35226,US,AL,35226,9,,,, +US-AL-35228,US,AL,35228,10,,,, +US-AL-35229,US,AL,35229,10,,,, +US-AL-35231,US,AL,35231,6,,,, +US-AL-35232,US,AL,35232,10,,,, +US-AL-35233,US,AL,35233,10,,,, +US-AL-35234,US,AL,35234,10,,,, +US-AL-35235,US,AL,35235,10,,,, +US-AL-35236,US,AL,35236,9,,,, +US-AL-35237,US,AL,35237,10,,,, +US-AL-35238,US,AL,35238,8,,,, +US-AL-35242,US,AL,35242,6.5,,,, +US-AL-35243,US,AL,35243,9,,,, +US-AL-35244,US,AL,35244,9,,,, +US-AL-35246,US,AL,35246,10,,,, +US-AL-35249,US,AL,35249,10,,,, +US-AL-35253,US,AL,35253,9,,,, +US-AL-35254,US,AL,35254,10,,,, +US-AL-35255,US,AL,35255,10,,,, +US-AL-35259,US,AL,35259,9,,,, +US-AL-35260,US,AL,35260,9,,,, +US-AL-35261,US,AL,35261,10,,,, +US-AL-35266,US,AL,35266,9,,,, +US-AL-35270,US,AL,35270,10,,,, +US-AL-35282,US,AL,35282,10,,,, +US-AL-35283,US,AL,35283,10,,,, +US-AL-35285,US,AL,35285,10,,,, +US-AL-35287,US,AL,35287,10,,,, +US-AL-35288,US,AL,35288,10,,,, +US-AL-35290,US,AL,35290,10,,,, +US-AL-35291,US,AL,35291,10,,,, +US-AL-35292,US,AL,35292,10,,,, +US-AL-35293,US,AL,35293,9,,,, +US-AL-35294,US,AL,35294,10,,,, +US-AL-35295,US,AL,35295,10,,,, +US-AL-35296,US,AL,35296,10,,,, +US-AL-35297,US,AL,35297,10,,,, +US-AL-35298,US,AL,35298,10,,,, +US-AL-35401,US,AL,35401,9,,,, +US-AL-35402,US,AL,35402,9,,,, +US-AL-35403,US,AL,35403,9,,,, +US-AL-35404,US,AL,35404,9,,,, +US-AL-35405,US,AL,35405,9,,,, +US-AL-35406,US,AL,35406,9,,,, +US-AL-35407,US,AL,35407,9,,,, +US-AL-35440,US,AL,35440,9,,,, +US-AL-35441,US,AL,35441,7,,,, +US-AL-35442,US,AL,35442,8,,,, +US-AL-35443,US,AL,35443,7,,,, +US-AL-35444,US,AL,35444,9,,,, +US-AL-35446,US,AL,35446,9,,,, +US-AL-35447,US,AL,35447,7,,,, +US-AL-35448,US,AL,35448,7,,,, +US-AL-35449,US,AL,35449,9,,,, +US-AL-35452,US,AL,35452,9,,,, +US-AL-35453,US,AL,35453,9,,,, +US-AL-35456,US,AL,35456,9,,,, +US-AL-35457,US,AL,35457,9,,,, +US-AL-35458,US,AL,35458,9,,,, +US-AL-35459,US,AL,35459,7,,,, +US-AL-35460,US,AL,35460,7,,,, +US-AL-35461,US,AL,35461,7,,,, +US-AL-35462,US,AL,35462,10,,,, +US-AL-35463,US,AL,35463,9,,,, +US-AL-35464,US,AL,35464,7,,,, +US-AL-35466,US,AL,35466,7,,,, +US-AL-35468,US,AL,35468,9,,,, +US-AL-35469,US,AL,35469,7,,,, +US-AL-35470,US,AL,35470,7,,,, +US-AL-35471,US,AL,35471,8,,,, +US-AL-35473,US,AL,35473,9,,,, +US-AL-35474,US,AL,35474,7,,,, +US-AL-35475,US,AL,35475,9,,,, +US-AL-35476,US,AL,35476,9,,,, +US-AL-35477,US,AL,35477,7,,,, +US-AL-35478,US,AL,35478,9,,,, +US-AL-35480,US,AL,35480,9,,,, +US-AL-35481,US,AL,35481,7,,,, +US-AL-35482,US,AL,35482,9,,,, +US-AL-35485,US,AL,35485,9,,,, +US-AL-35486,US,AL,35486,9,,,, +US-AL-35487,US,AL,35487,9,,,, +US-AL-35490,US,AL,35490,9,,,, +US-AL-35491,US,AL,35491,7,,,, +US-AL-35501,US,AL,35501,9,,,, +US-AL-35502,US,AL,35502,9,,,, +US-AL-35503,US,AL,35503,6,,,, +US-AL-35504,US,AL,35504,6,,,, +US-AL-35540,US,AL,35540,6,,,, +US-AL-35541,US,AL,35541,6,,,, +US-AL-35542,US,AL,35542,6,,,, +US-AL-35543,US,AL,35543,8,,,, +US-AL-35544,US,AL,35544,6,,,, +US-AL-35545,US,AL,35545,7,,,, +US-AL-35546,US,AL,35546,6,,,, +US-AL-35548,US,AL,35548,9,,,, +US-AL-35549,US,AL,35549,9,,,, +US-AL-35550,US,AL,35550,6,,,, +US-AL-35551,US,AL,35551,9,,,, +US-AL-35552,US,AL,35552,6,,,, +US-AL-35553,US,AL,35553,6,,,, +US-AL-35554,US,AL,35554,6,,,, +US-AL-35555,US,AL,35555,6,,,, +US-AL-35559,US,AL,35559,7,,,, +US-AL-35560,US,AL,35560,6,,,, +US-AL-35563,US,AL,35563,9,,,, +US-AL-35564,US,AL,35564,8,,,, +US-AL-35565,US,AL,35565,9,,,, +US-AL-35570,US,AL,35570,9,,,, +US-AL-35571,US,AL,35571,6,,,, +US-AL-35572,US,AL,35572,6,,,, +US-AL-35573,US,AL,35573,7,,,, +US-AL-35574,US,AL,35574,7,,,, +US-AL-35575,US,AL,35575,8,,,, +US-AL-35576,US,AL,35576,6,,,, +US-AL-35577,US,AL,35577,6,,,, +US-AL-35578,US,AL,35578,6,,,, +US-AL-35579,US,AL,35579,6,,,, +US-AL-35580,US,AL,35580,6,,,, +US-AL-35581,US,AL,35581,6,,,, +US-AL-35582,US,AL,35582,8.5,,,, +US-AL-35584,US,AL,35584,8,,,, +US-AL-35585,US,AL,35585,6,,,, +US-AL-35586,US,AL,35586,6,,,, +US-AL-35587,US,AL,35587,6,,,, +US-AL-35592,US,AL,35592,6,,,, +US-AL-35593,US,AL,35593,6,,,, +US-AL-35594,US,AL,35594,9,,,, +US-AL-35601,US,AL,35601,9,,,, +US-AL-35602,US,AL,35602,9,,,, +US-AL-35603,US,AL,35603,9,,,, +US-AL-35609,US,AL,35609,9,,,, +US-AL-35610,US,AL,35610,5.5,,,, +US-AL-35611,US,AL,35611,9,,,, +US-AL-35612,US,AL,35612,9,,,, +US-AL-35613,US,AL,35613,6,,,, +US-AL-35614,US,AL,35614,6,,,, +US-AL-35615,US,AL,35615,6,,,, +US-AL-35616,US,AL,35616,5.5,,,, +US-AL-35617,US,AL,35617,5.5,,,, +US-AL-35618,US,AL,35618,7,,,, +US-AL-35619,US,AL,35619,7,,,, +US-AL-35620,US,AL,35620,6,,,, +US-AL-35621,US,AL,35621,7,,,, +US-AL-35622,US,AL,35622,7,,,, +US-AL-35630,US,AL,35630,8.5,,,, +US-AL-35631,US,AL,35631,8.5,,,, +US-AL-35632,US,AL,35632,8.5,,,, +US-AL-35633,US,AL,35633,5.5,,,, +US-AL-35634,US,AL,35634,5.5,,,, +US-AL-35640,US,AL,35640,9,,,, +US-AL-35643,US,AL,35643,7,,,, +US-AL-35645,US,AL,35645,5.5,,,, +US-AL-35646,US,AL,35646,5.5,,,, +US-AL-35647,US,AL,35647,6,,,, +US-AL-35648,US,AL,35648,5.5,,,, +US-AL-35649,US,AL,35649,6,,,, +US-AL-35650,US,AL,35650,7,,,, +US-AL-35651,US,AL,35651,7,,,, +US-AL-35652,US,AL,35652,5.5,,,, +US-AL-35653,US,AL,35653,9,,,, +US-AL-35654,US,AL,35654,6,,,, +US-AL-35660,US,AL,35660,9,,,, +US-AL-35661,US,AL,35661,9,,,, +US-AL-35662,US,AL,35662,9,,,, +US-AL-35670,US,AL,35670,7,,,, +US-AL-35671,US,AL,35671,6,,,, +US-AL-35672,US,AL,35672,7,,,, +US-AL-35673,US,AL,35673,7,,,, +US-AL-35674,US,AL,35674,9,,,, +US-AL-35677,US,AL,35677,5.5,,,, +US-AL-35699,US,AL,35699,9,,,, +US-AL-35739,US,AL,35739,6,,,, +US-AL-35740,US,AL,35740,9,,,, +US-AL-35741,US,AL,35741,5.5,,,, +US-AL-35742,US,AL,35742,6,,,, +US-AL-35744,US,AL,35744,6,,,, +US-AL-35745,US,AL,35745,6,,,, +US-AL-35746,US,AL,35746,6,,,, +US-AL-35747,US,AL,35747,5,,,, +US-AL-35748,US,AL,35748,5.5,,,, +US-AL-35749,US,AL,35749,5.5,,,, +US-AL-35750,US,AL,35750,5.5,,,, +US-AL-35751,US,AL,35751,6,,,, +US-AL-35752,US,AL,35752,9,,,, +US-AL-35754,US,AL,35754,7,,,, +US-AL-35755,US,AL,35755,8,,,, +US-AL-35756,US,AL,35756,6,,,, +US-AL-35757,US,AL,35757,5.5,,,, +US-AL-35758,US,AL,35758,9,,,, +US-AL-35759,US,AL,35759,5.5,,,, +US-AL-35760,US,AL,35760,5.5,,,, +US-AL-35761,US,AL,35761,5.5,,,, +US-AL-35762,US,AL,35762,8,,,, +US-AL-35763,US,AL,35763,8,,,, +US-AL-35764,US,AL,35764,6,,,, +US-AL-35765,US,AL,35765,6,,,, +US-AL-35766,US,AL,35766,6,,,, +US-AL-35767,US,AL,35767,5.5,,,, +US-AL-35768,US,AL,35768,9,,,, +US-AL-35769,US,AL,35769,9,,,, +US-AL-35771,US,AL,35771,6,,,, +US-AL-35772,US,AL,35772,9,,,, +US-AL-35773,US,AL,35773,5.5,,,, +US-AL-35774,US,AL,35774,6,,,, +US-AL-35775,US,AL,35775,7,,,, +US-AL-35776,US,AL,35776,6,,,, +US-AL-35801,US,AL,35801,8,,,, +US-AL-35802,US,AL,35802,8,,,, +US-AL-35803,US,AL,35803,8,,,, +US-AL-35804,US,AL,35804,8,,,, +US-AL-35805,US,AL,35805,8,,,, +US-AL-35806,US,AL,35806,8,,,, +US-AL-35807,US,AL,35807,8,,,, +US-AL-35808,US,AL,35808,5.5,,,, +US-AL-35809,US,AL,35809,8,,,, +US-AL-35810,US,AL,35810,8,,,, +US-AL-35811,US,AL,35811,5.5,,,, +US-AL-35812,US,AL,35812,8,,,, +US-AL-35813,US,AL,35813,8,,,, +US-AL-35814,US,AL,35814,8,,,, +US-AL-35815,US,AL,35815,8,,,, +US-AL-35816,US,AL,35816,8,,,, +US-AL-35824,US,AL,35824,8,,,, +US-AL-35893,US,AL,35893,8,,,, +US-AL-35894,US,AL,35894,8,,,, +US-AL-35895,US,AL,35895,8,,,, +US-AL-35896,US,AL,35896,8,,,, +US-AL-35897,US,AL,35897,5.5,,,, +US-AL-35899,US,AL,35899,8,,,, +US-AL-35901,US,AL,35901,9,,,, +US-AL-35902,US,AL,35902,9,,,, +US-AL-35903,US,AL,35903,9,,,, +US-AL-35904,US,AL,35904,9,,,, +US-AL-35905,US,AL,35905,9,,,, +US-AL-35906,US,AL,35906,9,,,, +US-AL-35907,US,AL,35907,9,,,, +US-AL-35950,US,AL,35950,8,,,, +US-AL-35951,US,AL,35951,7,,,, +US-AL-35952,US,AL,35952,5,,,, +US-AL-35953,US,AL,35953,6,,,, +US-AL-35954,US,AL,35954,5,,,, +US-AL-35956,US,AL,35956,5,,,, +US-AL-35957,US,AL,35957,8,,,, +US-AL-35958,US,AL,35958,6,,,, +US-AL-35959,US,AL,35959,7.5,,,, +US-AL-35960,US,AL,35960,7.5,,,, +US-AL-35961,US,AL,35961,5,,,, +US-AL-35962,US,AL,35962,5,,,, +US-AL-35963,US,AL,35963,5,,,, +US-AL-35964,US,AL,35964,8,,,, +US-AL-35966,US,AL,35966,6,,,, +US-AL-35967,US,AL,35967,8,,,, +US-AL-35968,US,AL,35968,5,,,, +US-AL-35971,US,AL,35971,5,,,, +US-AL-35972,US,AL,35972,5,,,, +US-AL-35973,US,AL,35973,7.5,,,, +US-AL-35974,US,AL,35974,8,,,, +US-AL-35975,US,AL,35975,5,,,, +US-AL-35976,US,AL,35976,7,,,, +US-AL-35978,US,AL,35978,9,,,, +US-AL-35979,US,AL,35979,5,,,, +US-AL-35980,US,AL,35980,5,,,, +US-AL-35981,US,AL,35981,7,,,, +US-AL-35983,US,AL,35983,9,,,, +US-AL-35984,US,AL,35984,5,,,, +US-AL-35986,US,AL,35986,9,,,, +US-AL-35987,US,AL,35987,8,,,, +US-AL-35988,US,AL,35988,9,,,, +US-AL-35989,US,AL,35989,5,,,, +US-AL-35990,US,AL,35990,8,,,, +US-AL-36003,US,AL,36003,6,,,, +US-AL-36005,US,AL,36005,6,,,, +US-AL-36006,US,AL,36006,6,,,, +US-AL-36008,US,AL,36008,6,,,, +US-AL-36009,US,AL,36009,7,,,, +US-AL-36010,US,AL,36010,8,,,, +US-AL-36013,US,AL,36013,8.75,,,, +US-AL-36015,US,AL,36015,5.5,,,, +US-AL-36016,US,AL,36016,5.5,,,, +US-AL-36017,US,AL,36017,8.5,,,, +US-AL-36020,US,AL,36020,8,,,, +US-AL-36022,US,AL,36022,5,,,, +US-AL-36023,US,AL,36023,9,,,, +US-AL-36024,US,AL,36024,5,,,, +US-AL-36025,US,AL,36025,6.5,,,, +US-AL-36026,US,AL,36026,5,,,, +US-AL-36027,US,AL,36027,9,,,, +US-AL-36028,US,AL,36028,8,,,, +US-AL-36029,US,AL,36029,6.5,,,, +US-AL-36030,US,AL,36030,5.5,,,, +US-AL-36031,US,AL,36031,5,,,, +US-AL-36032,US,AL,36032,10.5,,,, +US-AL-36033,US,AL,36033,9.5,,,, +US-AL-36034,US,AL,36034,5,,,, +US-AL-36035,US,AL,36035,6,,,, +US-AL-36036,US,AL,36036,6.5,,,, +US-AL-36037,US,AL,36037,5.5,,,, +US-AL-36038,US,AL,36038,7,,,, +US-AL-36039,US,AL,36039,5,,,, +US-AL-36040,US,AL,36040,10,,,, +US-AL-36041,US,AL,36041,7,,,, +US-AL-36042,US,AL,36042,7,,,, +US-AL-36043,US,AL,36043,8,,,, +US-AL-36045,US,AL,36045,9,,,, +US-AL-36046,US,AL,36046,7,,,, +US-AL-36047,US,AL,36047,8,,,, +US-AL-36048,US,AL,36048,5.5,,,, +US-AL-36049,US,AL,36049,9,,,, +US-AL-36051,US,AL,36051,6,,,, +US-AL-36052,US,AL,36052,6.5,,,, +US-AL-36053,US,AL,36053,5.5,,,, +US-AL-36054,US,AL,36054,8.5,,,, +US-AL-36057,US,AL,36057,7.625,,,, +US-AL-36061,US,AL,36061,7,,,, +US-AL-36062,US,AL,36062,9,,,, +US-AL-36064,US,AL,36064,8.75,,,, +US-AL-36065,US,AL,36065,6.5,,,, +US-AL-36066,US,AL,36066,9.5,,,, +US-AL-36067,US,AL,36067,9.5,,,, +US-AL-36068,US,AL,36068,9.5,,,, +US-AL-36069,US,AL,36069,6.5,,,, +US-AL-36071,US,AL,36071,7,,,, +US-AL-36072,US,AL,36072,9,,,, +US-AL-36075,US,AL,36075,7.5,,,, +US-AL-36078,US,AL,36078,9,,,, +US-AL-36079,US,AL,36079,9,,,, +US-AL-36080,US,AL,36080,5,,,, +US-AL-36081,US,AL,36081,9,,,, +US-AL-36082,US,AL,36082,9,,,, +US-AL-36083,US,AL,36083,10,,,, +US-AL-36087,US,AL,36087,10,,,, +US-AL-36088,US,AL,36088,10,,,, +US-AL-36089,US,AL,36089,9,,,, +US-AL-36091,US,AL,36091,5,,,, +US-AL-36092,US,AL,36092,5,,,, +US-AL-36093,US,AL,36093,5,,,, +US-AL-36101,US,AL,36101,10,,,, +US-AL-36102,US,AL,36102,10,,,, +US-AL-36103,US,AL,36103,10,,,, +US-AL-36104,US,AL,36104,10,,,, +US-AL-36105,US,AL,36105,10,,,, +US-AL-36106,US,AL,36106,10,,,, +US-AL-36107,US,AL,36107,10,,,, +US-AL-36108,US,AL,36108,10,,,, +US-AL-36109,US,AL,36109,10,,,, +US-AL-36110,US,AL,36110,10,,,, +US-AL-36111,US,AL,36111,10,,,, +US-AL-36112,US,AL,36112,10,,,, +US-AL-36113,US,AL,36113,10,,,, +US-AL-36114,US,AL,36114,10,,,, +US-AL-36115,US,AL,36115,10,,,, +US-AL-36116,US,AL,36116,10,,,, +US-AL-36117,US,AL,36117,10,,,, +US-AL-36118,US,AL,36118,10,,,, +US-AL-36119,US,AL,36119,10,,,, +US-AL-36120,US,AL,36120,10,,,, +US-AL-36121,US,AL,36121,10,,,, +US-AL-36123,US,AL,36123,10,,,, +US-AL-36124,US,AL,36124,10,,,, +US-AL-36125,US,AL,36125,10,,,, +US-AL-36130,US,AL,36130,10,,,, +US-AL-36131,US,AL,36131,10,,,, +US-AL-36132,US,AL,36132,10,,,, +US-AL-36133,US,AL,36133,10,,,, +US-AL-36134,US,AL,36134,10,,,, +US-AL-36135,US,AL,36135,10,,,, +US-AL-36140,US,AL,36140,10,,,, +US-AL-36141,US,AL,36141,10,,,, +US-AL-36142,US,AL,36142,10,,,, +US-AL-36177,US,AL,36177,10,,,, +US-AL-36191,US,AL,36191,10,,,, +US-AL-36201,US,AL,36201,10,,,, +US-AL-36202,US,AL,36202,10,,,, +US-AL-36203,US,AL,36203,10,,,, +US-AL-36204,US,AL,36204,10,,,, +US-AL-36205,US,AL,36205,10,,,, +US-AL-36206,US,AL,36206,9.5,,,, +US-AL-36207,US,AL,36207,10,,,, +US-AL-36250,US,AL,36250,7,,,, +US-AL-36251,US,AL,36251,6,,,, +US-AL-36253,US,AL,36253,10,,,, +US-AL-36254,US,AL,36254,7,,,, +US-AL-36255,US,AL,36255,6,,,, +US-AL-36256,US,AL,36256,8,,,, +US-AL-36257,US,AL,36257,10,,,, +US-AL-36258,US,AL,36258,6,,,, +US-AL-36260,US,AL,36260,10,,,, +US-AL-36261,US,AL,36261,8,,,, +US-AL-36262,US,AL,36262,6,,,, +US-AL-36263,US,AL,36263,5,,,, +US-AL-36264,US,AL,36264,6,,,, +US-AL-36265,US,AL,36265,10,,,, +US-AL-36266,US,AL,36266,6,,,, +US-AL-36267,US,AL,36267,6,,,, +US-AL-36268,US,AL,36268,7,,,, +US-AL-36269,US,AL,36269,6,,,, +US-AL-36271,US,AL,36271,7,,,, +US-AL-36272,US,AL,36272,9,,,, +US-AL-36273,US,AL,36273,6,,,, +US-AL-36274,US,AL,36274,8.5,,,, +US-AL-36275,US,AL,36275,7.5,,,, +US-AL-36276,US,AL,36276,5,,,, +US-AL-36277,US,AL,36277,10,,,, +US-AL-36278,US,AL,36278,5,,,, +US-AL-36279,US,AL,36279,7,,,, +US-AL-36280,US,AL,36280,5,,,, +US-AL-36301,US,AL,36301,9,,,, +US-AL-36302,US,AL,36302,9,,,, +US-AL-36303,US,AL,36303,9,,,, +US-AL-36304,US,AL,36304,9,,,, +US-AL-36305,US,AL,36305,9,,,, +US-AL-36310,US,AL,36310,6,,,, +US-AL-36311,US,AL,36311,6,,,, +US-AL-36312,US,AL,36312,5,,,, +US-AL-36313,US,AL,36313,5,,,, +US-AL-36314,US,AL,36314,7,,,, +US-AL-36316,US,AL,36316,5,,,, +US-AL-36317,US,AL,36317,6,,,, +US-AL-36318,US,AL,36318,5,,,, +US-AL-36319,US,AL,36319,6,,,, +US-AL-36320,US,AL,36320,5,,,, +US-AL-36321,US,AL,36321,7,,,, +US-AL-36322,US,AL,36322,9,,,, +US-AL-36323,US,AL,36323,5,,,, +US-AL-36330,US,AL,36330,8.5,,,, +US-AL-36331,US,AL,36331,8.5,,,, +US-AL-36340,US,AL,36340,8,,,, +US-AL-36343,US,AL,36343,5,,,, +US-AL-36344,US,AL,36344,5,,,, +US-AL-36345,US,AL,36345,9,,,, +US-AL-36346,US,AL,36346,5,,,, +US-AL-36349,US,AL,36349,8,,,, +US-AL-36350,US,AL,36350,6,,,, +US-AL-36351,US,AL,36351,5,,,, +US-AL-36352,US,AL,36352,5,,,, +US-AL-36353,US,AL,36353,6,,,, +US-AL-36360,US,AL,36360,9,,,, +US-AL-36361,US,AL,36361,9,,,, +US-AL-36362,US,AL,36362,6,,,, +US-AL-36370,US,AL,36370,5,,,, +US-AL-36371,US,AL,36371,8,,,, +US-AL-36373,US,AL,36373,6,,,, +US-AL-36374,US,AL,36374,6,,,, +US-AL-36375,US,AL,36375,5,,,, +US-AL-36376,US,AL,36376,8,,,, +US-AL-36401,US,AL,36401,6,,,, +US-AL-36420,US,AL,36420,9.5,,,, +US-AL-36421,US,AL,36421,6,,,, +US-AL-36425,US,AL,36425,6.5,,,, +US-AL-36426,US,AL,36426,8,,,, +US-AL-36427,US,AL,36427,9,,,, +US-AL-36429,US,AL,36429,6,,,, +US-AL-36432,US,AL,36432,6,,,, +US-AL-36435,US,AL,36435,7.5,,,, +US-AL-36436,US,AL,36436,5,,,, +US-AL-36439,US,AL,36439,7.5,,,, +US-AL-36441,US,AL,36441,8,,,, +US-AL-36442,US,AL,36442,8,,,, +US-AL-36444,US,AL,36444,6.5,,,, +US-AL-36445,US,AL,36445,6.5,,,, +US-AL-36446,US,AL,36446,8,,,, +US-AL-36449,US,AL,36449,6.5,,,, +US-AL-36451,US,AL,36451,5,,,, +US-AL-36453,US,AL,36453,5,,,, +US-AL-36454,US,AL,36454,6,,,, +US-AL-36455,US,AL,36455,8,,,, +US-AL-36456,US,AL,36456,5.5,,,, +US-AL-36458,US,AL,36458,7.75,,,, +US-AL-36460,US,AL,36460,9,,,, +US-AL-36461,US,AL,36461,9,,,, +US-AL-36467,US,AL,36467,9,,,, +US-AL-36470,US,AL,36470,6.5,,,, +US-AL-36471,US,AL,36471,6.5,,,, +US-AL-36473,US,AL,36473,6,,,, +US-AL-36474,US,AL,36474,6,,,, +US-AL-36475,US,AL,36475,6,,,, +US-AL-36476,US,AL,36476,8,,,, +US-AL-36477,US,AL,36477,8,,,, +US-AL-36480,US,AL,36480,6.5,,,, +US-AL-36481,US,AL,36481,6.5,,,, +US-AL-36482,US,AL,36482,5,,,, +US-AL-36483,US,AL,36483,6,,,, +US-AL-36502,US,AL,36502,9,,,, +US-AL-36503,US,AL,36503,9,,,, +US-AL-36504,US,AL,36504,9,,,, +US-AL-36505,US,AL,36505,7.5,,,, +US-AL-36507,US,AL,36507,10,,,, +US-AL-36509,US,AL,36509,10,,,, +US-AL-36511,US,AL,36511,8.5,,,, +US-AL-36512,US,AL,36512,5.5,,,, +US-AL-36513,US,AL,36513,4,,,, +US-AL-36515,US,AL,36515,9,,,, +US-AL-36518,US,AL,36518,4,,,, +US-AL-36521,US,AL,36521,5.5,,,, +US-AL-36522,US,AL,36522,9,,,, +US-AL-36523,US,AL,36523,5.5,,,, +US-AL-36524,US,AL,36524,5,,,, +US-AL-36525,US,AL,36525,9.5,,,, +US-AL-36526,US,AL,36526,9.5,,,, +US-AL-36527,US,AL,36527,8.5,,,, +US-AL-36528,US,AL,36528,10,,,, +US-AL-36529,US,AL,36529,4,,,, +US-AL-36530,US,AL,36530,8.5,,,, +US-AL-36532,US,AL,36532,9,,,, +US-AL-36533,US,AL,36533,9,,,, +US-AL-36535,US,AL,36535,9,,,, +US-AL-36536,US,AL,36536,9,,,, +US-AL-36538,US,AL,36538,4,,,, +US-AL-36539,US,AL,36539,4,,,, +US-AL-36540,US,AL,36540,5,,,, +US-AL-36541,US,AL,36541,5.5,,,, +US-AL-36542,US,AL,36542,10,,,, +US-AL-36543,US,AL,36543,9,,,, +US-AL-36544,US,AL,36544,5.5,,,, +US-AL-36545,US,AL,36545,9,,,, +US-AL-36547,US,AL,36547,10,,,, +US-AL-36548,US,AL,36548,4,,,, +US-AL-36549,US,AL,36549,7,,,, +US-AL-36550,US,AL,36550,7,,,, +US-AL-36551,US,AL,36551,8,,,, +US-AL-36553,US,AL,36553,4,,,, +US-AL-36555,US,AL,36555,9,,,, +US-AL-36556,US,AL,36556,4,,,, +US-AL-36558,US,AL,36558,4,,,, +US-AL-36559,US,AL,36559,8,,,, +US-AL-36560,US,AL,36560,5.5,,,, +US-AL-36561,US,AL,36561,10,,,, +US-AL-36562,US,AL,36562,7,,,, +US-AL-36564,US,AL,36564,8,,,, +US-AL-36567,US,AL,36567,7,,,, +US-AL-36568,US,AL,36568,5.5,,,, +US-AL-36569,US,AL,36569,4,,,, +US-AL-36571,US,AL,36571,10,,,, +US-AL-36572,US,AL,36572,10,,,, +US-AL-36574,US,AL,36574,7,,,, +US-AL-36575,US,AL,36575,6.75,,,, +US-AL-36576,US,AL,36576,8,,,, +US-AL-36577,US,AL,36577,9.5,,,, +US-AL-36578,US,AL,36578,8,,,, +US-AL-36579,US,AL,36579,7,,,, +US-AL-36580,US,AL,36580,7,,,, +US-AL-36581,US,AL,36581,4,,,, +US-AL-36582,US,AL,36582,5.5,,,, +US-AL-36583,US,AL,36583,4,,,, +US-AL-36584,US,AL,36584,4,,,, +US-AL-36585,US,AL,36585,4,,,, +US-AL-36587,US,AL,36587,5.5,,,, +US-AL-36590,US,AL,36590,10,,,, +US-AL-36601,US,AL,36601,10,,,, +US-AL-36602,US,AL,36602,10,,,, +US-AL-36603,US,AL,36603,10,,,, +US-AL-36604,US,AL,36604,10,,,, +US-AL-36605,US,AL,36605,10,,,, +US-AL-36606,US,AL,36606,10,,,, +US-AL-36607,US,AL,36607,10,,,, +US-AL-36608,US,AL,36608,10,,,, +US-AL-36609,US,AL,36609,10,,,, +US-AL-36610,US,AL,36610,10,,,, +US-AL-36611,US,AL,36611,10,,,, +US-AL-36612,US,AL,36612,10,,,, +US-AL-36613,US,AL,36613,10,,,, +US-AL-36615,US,AL,36615,10,,,, +US-AL-36616,US,AL,36616,10,,,, +US-AL-36617,US,AL,36617,10,,,, +US-AL-36618,US,AL,36618,10,,,, +US-AL-36619,US,AL,36619,5.5,,,, +US-AL-36625,US,AL,36625,10,,,, +US-AL-36628,US,AL,36628,10,,,, +US-AL-36630,US,AL,36630,10,,,, +US-AL-36633,US,AL,36633,10,,,, +US-AL-36640,US,AL,36640,10,,,, +US-AL-36641,US,AL,36641,10,,,, +US-AL-36644,US,AL,36644,10,,,, +US-AL-36652,US,AL,36652,10,,,, +US-AL-36660,US,AL,36660,10,,,, +US-AL-36663,US,AL,36663,10,,,, +US-AL-36670,US,AL,36670,10,,,, +US-AL-36671,US,AL,36671,10,,,, +US-AL-36675,US,AL,36675,10,,,, +US-AL-36685,US,AL,36685,10,,,, +US-AL-36688,US,AL,36688,10,,,, +US-AL-36689,US,AL,36689,10,,,, +US-AL-36691,US,AL,36691,10,,,, +US-AL-36693,US,AL,36693,10,,,, +US-AL-36695,US,AL,36695,8,,,, +US-AL-36701,US,AL,36701,10,,,, +US-AL-36702,US,AL,36702,10,,,, +US-AL-36703,US,AL,36703,10,,,, +US-AL-36720,US,AL,36720,7.5,,,, +US-AL-36721,US,AL,36721,7.5,,,, +US-AL-36722,US,AL,36722,7.5,,,, +US-AL-36723,US,AL,36723,7.5,,,, +US-AL-36726,US,AL,36726,7.5,,,, +US-AL-36727,US,AL,36727,5,,,, +US-AL-36728,US,AL,36728,7.5,,,, +US-AL-36732,US,AL,36732,9,,,, +US-AL-36736,US,AL,36736,6,,,, +US-AL-36738,US,AL,36738,6,,,, +US-AL-36740,US,AL,36740,9,,,, +US-AL-36741,US,AL,36741,7.5,,,, +US-AL-36742,US,AL,36742,6,,,, +US-AL-36744,US,AL,36744,7,,,, +US-AL-36745,US,AL,36745,6,,,, +US-AL-36748,US,AL,36748,9,,,, +US-AL-36749,US,AL,36749,6,,,, +US-AL-36750,US,AL,36750,5,,,, +US-AL-36751,US,AL,36751,7.5,,,, +US-AL-36752,US,AL,36752,8,,,, +US-AL-36753,US,AL,36753,7.5,,,, +US-AL-36754,US,AL,36754,6,,,, +US-AL-36756,US,AL,36756,10,,,, +US-AL-36758,US,AL,36758,5.5,,,, +US-AL-36759,US,AL,36759,5.5,,,, +US-AL-36761,US,AL,36761,5.5,,,, +US-AL-36762,US,AL,36762,5,,,, +US-AL-36763,US,AL,36763,8,,,, +US-AL-36764,US,AL,36764,6,,,, +US-AL-36765,US,AL,36765,7.5,,,, +US-AL-36766,US,AL,36766,7.5,,,, +US-AL-36767,US,AL,36767,5.5,,,, +US-AL-36768,US,AL,36768,7.5,,,, +US-AL-36769,US,AL,36769,7.5,,,, +US-AL-36773,US,AL,36773,5.5,,,, +US-AL-36775,US,AL,36775,5.5,,,, +US-AL-36776,US,AL,36776,7,,,, +US-AL-36782,US,AL,36782,6,,,, +US-AL-36783,US,AL,36783,6,,,, +US-AL-36784,US,AL,36784,10,,,, +US-AL-36785,US,AL,36785,8,,,, +US-AL-36786,US,AL,36786,10,,,, +US-AL-36790,US,AL,36790,5,,,, +US-AL-36792,US,AL,36792,8,,,, +US-AL-36793,US,AL,36793,8,,,, +US-AL-36801,US,AL,36801,9,,,, +US-AL-36802,US,AL,36802,9,,,, +US-AL-36803,US,AL,36803,9,,,, +US-AL-36804,US,AL,36804,6,,,, +US-AL-36830,US,AL,36830,9,,,, +US-AL-36831,US,AL,36831,9,,,, +US-AL-36832,US,AL,36832,9,,,, +US-AL-36849,US,AL,36849,9,,,, +US-AL-36850,US,AL,36850,5,,,, +US-AL-36851,US,AL,36851,8,,,, +US-AL-36852,US,AL,36852,6,,,, +US-AL-36853,US,AL,36853,5,,,, +US-AL-36854,US,AL,36854,10,,,, +US-AL-36855,US,AL,36855,9,,,, +US-AL-36856,US,AL,36856,8,,,, +US-AL-36858,US,AL,36858,8,,,, +US-AL-36859,US,AL,36859,8,,,, +US-AL-36860,US,AL,36860,8,,,, +US-AL-36861,US,AL,36861,6.5,,,, +US-AL-36862,US,AL,36862,9,,,, +US-AL-36863,US,AL,36863,9,,,, +US-AL-36865,US,AL,36865,7,,,, +US-AL-36866,US,AL,36866,5,,,, +US-AL-36867,US,AL,36867,8.75,,,, +US-AL-36868,US,AL,36868,8.75,,,, +US-AL-36869,US,AL,36869,8.75,,,, +US-AL-36870,US,AL,36870,7.875,,,, +US-AL-36871,US,AL,36871,8,,,, +US-AL-36872,US,AL,36872,10,,,, +US-AL-36874,US,AL,36874,7,,,, +US-AL-36875,US,AL,36875,8,,,, +US-AL-36877,US,AL,36877,8,,,, +US-AL-36879,US,AL,36879,7,,,, +US-AL-36901,US,AL,36901,7,,,, +US-AL-36904,US,AL,36904,7,,,, +US-AL-36907,US,AL,36907,7,,,, +US-AL-36908,US,AL,36908,7,,,, +US-AL-36910,US,AL,36910,7,,,, +US-AL-36912,US,AL,36912,7,,,, +US-AL-36913,US,AL,36913,7,,,, +US-AL-36915,US,AL,36915,7,,,, +US-AL-36916,US,AL,36916,10,,,, +US-AL-36919,US,AL,36919,7,,,, +US-AL-36921,US,AL,36921,7,,,, +US-AL-36922,US,AL,36922,7,,,, +US-AL-36925,US,AL,36925,10,,,, +US-AR-71601,US,AR,71601,9.75,,,, +US-AR-71602,US,AR,71602,9.75,,,, +US-AR-71603,US,AR,71603,9.75,,,, +US-AR-71611,US,AR,71611,9.75,,,, +US-AR-71612,US,AR,71612,9.125,,,, +US-AR-71613,US,AR,71613,9.75,,,, +US-AR-71630,US,AR,71630,8,,,, +US-AR-71631,US,AR,71631,8.5,,,, +US-AR-71635,US,AR,71635,8,,,, +US-AR-71638,US,AR,71638,12,,,, +US-AR-71639,US,AR,71639,10.5,,,, +US-AR-71640,US,AR,71640,11.5,,,, +US-AR-71642,US,AR,71642,8,,,, +US-AR-71643,US,AR,71643,8.5,,,, +US-AR-71644,US,AR,71644,8.125,,,, +US-AR-71646,US,AR,71646,8,,,, +US-AR-71647,US,AR,71647,8.5,,,, +US-AR-71651,US,AR,71651,8.5,,,, +US-AR-71652,US,AR,71652,7.75,,,, +US-AR-71653,US,AR,71653,11.5,,,, +US-AR-71654,US,AR,71654,11,,,, +US-AR-71655,US,AR,71655,10,,,, +US-AR-71656,US,AR,71656,10,,,, +US-AR-71657,US,AR,71657,10,,,, +US-AR-71658,US,AR,71658,8,,,, +US-AR-71659,US,AR,71659,8.125,,,, +US-AR-71660,US,AR,71660,7.75,,,, +US-AR-71661,US,AR,71661,8,,,, +US-AR-71662,US,AR,71662,8,,,, +US-AR-71663,US,AR,71663,8,,,, +US-AR-71665,US,AR,71665,7.75,,,, +US-AR-71666,US,AR,71666,11,,,, +US-AR-71667,US,AR,71667,7.5,,,, +US-AR-71670,US,AR,71670,8,,,, +US-AR-71671,US,AR,71671,9.5,,,, +US-AR-71674,US,AR,71674,8,,,, +US-AR-71675,US,AR,71675,9,,,, +US-AR-71676,US,AR,71676,8,,,, +US-AR-71677,US,AR,71677,9,,,, +US-AR-71678,US,AR,71678,7.5,,,, +US-AR-71701,US,AR,71701,10.25,,,, +US-AR-71711,US,AR,71711,10.25,,,, +US-AR-71720,US,AR,71720,8.5,,,, +US-AR-71721,US,AR,71721,8,,,, +US-AR-71722,US,AR,71722,7.5,,,, +US-AR-71724,US,AR,71724,8.5,,,, +US-AR-71725,US,AR,71725,8.5,,,, +US-AR-71726,US,AR,71726,8.5,,,, +US-AR-71728,US,AR,71728,8,,,, +US-AR-71730,US,AR,71730,9.75,,,, +US-AR-71731,US,AR,71731,9.75,,,, +US-AR-71740,US,AR,71740,8,,,, +US-AR-71742,US,AR,71742,10,,,, +US-AR-71743,US,AR,71743,9.5,,,, +US-AR-71744,US,AR,71744,8,,,, +US-AR-71745,US,AR,71745,8,,,, +US-AR-71747,US,AR,71747,8.5,,,, +US-AR-71748,US,AR,71748,8.5,,,, +US-AR-71749,US,AR,71749,8.5,,,, +US-AR-71750,US,AR,71750,8.5,,,, +US-AR-71751,US,AR,71751,8.5,,,, +US-AR-71752,US,AR,71752,8,,,, +US-AR-71753,US,AR,71753,10.375,,,, +US-AR-71754,US,AR,71754,10.375,,,, +US-AR-71758,US,AR,71758,8.5,,,, +US-AR-71759,US,AR,71759,8.5,,,, +US-AR-71762,US,AR,71762,8.5,,,, +US-AR-71763,US,AR,71763,8.5,,,, +US-AR-71764,US,AR,71764,8.5,,,, +US-AR-71765,US,AR,71765,8.5,,,, +US-AR-71766,US,AR,71766,9,,,, +US-AR-71770,US,AR,71770,8,,,, +US-AR-71772,US,AR,71772,8,,,, +US-AR-71801,US,AR,71801,9.5,,,, +US-AR-71802,US,AR,71802,9.5,,,, +US-AR-71820,US,AR,71820,8.75,,,, +US-AR-71822,US,AR,71822,10.75,,,, +US-AR-71823,US,AR,71823,8.875,,,, +US-AR-71825,US,AR,71825,8.5,,,, +US-AR-71826,US,AR,71826,8.75,,,, +US-AR-71827,US,AR,71827,8.75,,,, +US-AR-71828,US,AR,71828,7.5,,,, +US-AR-71831,US,AR,71831,8.5,,,, +US-AR-71832,US,AR,71832,9.875,,,, +US-AR-71833,US,AR,71833,9.25,,,, +US-AR-71834,US,AR,71834,7.75,,,, +US-AR-71835,US,AR,71835,7.5,,,, +US-AR-71836,US,AR,71836,8.75,,,, +US-AR-71837,US,AR,71837,7.75,,,, +US-AR-71838,US,AR,71838,8.5,,,, +US-AR-71839,US,AR,71839,8.75,,,, +US-AR-71840,US,AR,71840,7.75,,,, +US-AR-71841,US,AR,71841,8.875,,,, +US-AR-71842,US,AR,71842,8.875,,,, +US-AR-71845,US,AR,71845,8.75,,,, +US-AR-71846,US,AR,71846,8.875,,,, +US-AR-71847,US,AR,71847,8.5,,,, +US-AR-71851,US,AR,71851,9.25,,,, +US-AR-71852,US,AR,71852,10.25,,,, +US-AR-71853,US,AR,71853,8.75,,,, +US-AR-71854,US,AR,71854,10.25,,,, +US-AR-71855,US,AR,71855,8.5,,,, +US-AR-71857,US,AR,71857,8.5,,,, +US-AR-71858,US,AR,71858,7.5,,,, +US-AR-71859,US,AR,71859,8.5,,,, +US-AR-71860,US,AR,71860,9.75,,,, +US-AR-71861,US,AR,71861,8,,,, +US-AR-71862,US,AR,71862,8.5,,,, +US-AR-71864,US,AR,71864,7.5,,,, +US-AR-71865,US,AR,71865,9.75,,,, +US-AR-71866,US,AR,71866,8.75,,,, +US-AR-71901,US,AR,71901,9.5,,,, +US-AR-71902,US,AR,71902,9.5,,,, +US-AR-71903,US,AR,71903,9.5,,,, +US-AR-71909,US,AR,71909,8,,,, +US-AR-71910,US,AR,71910,8,,,, +US-AR-71913,US,AR,71913,8,,,, +US-AR-71914,US,AR,71914,9.5,,,, +US-AR-71920,US,AR,71920,9.5,,,, +US-AR-71921,US,AR,71921,8,,,, +US-AR-71922,US,AR,71922,8.5,,,, +US-AR-71923,US,AR,71923,9,,,, +US-AR-71929,US,AR,71929,8,,,, +US-AR-71932,US,AR,71932,8.5,,,, +US-AR-71933,US,AR,71933,8,,,, +US-AR-71935,US,AR,71935,7.5,,,, +US-AR-71937,US,AR,71937,8.5,,,, +US-AR-71940,US,AR,71940,8.5,,,, +US-AR-71941,US,AR,71941,8,,,, +US-AR-71942,US,AR,71942,8,,,, +US-AR-71943,US,AR,71943,10,,,, +US-AR-71944,US,AR,71944,8.5,,,, +US-AR-71945,US,AR,71945,8.5,,,, +US-AR-71949,US,AR,71949,8,,,, +US-AR-71950,US,AR,71950,8.5,,,, +US-AR-71952,US,AR,71952,8.5,,,, +US-AR-71953,US,AR,71953,9.5,,,, +US-AR-71956,US,AR,71956,8,,,, +US-AR-71957,US,AR,71957,7.5,,,, +US-AR-71958,US,AR,71958,10,,,, +US-AR-71959,US,AR,71959,8.5,,,, +US-AR-71960,US,AR,71960,7.5,,,, +US-AR-71961,US,AR,71961,7.5,,,, +US-AR-71962,US,AR,71962,8,,,, +US-AR-71964,US,AR,71964,8,,,, +US-AR-71965,US,AR,71965,7.5,,,, +US-AR-71966,US,AR,71966,7.5,,,, +US-AR-71968,US,AR,71968,8,,,, +US-AR-71969,US,AR,71969,7.5,,,, +US-AR-71970,US,AR,71970,7.5,,,, +US-AR-71971,US,AR,71971,9.25,,,, +US-AR-71972,US,AR,71972,8.5,,,, +US-AR-71973,US,AR,71973,8.5,,,, +US-AR-71998,US,AR,71998,9,,,, +US-AR-71999,US,AR,71999,9,,,, +US-AR-72001,US,AR,72001,9,,,, +US-AR-72002,US,AR,72002,6.5,,,, +US-AR-72003,US,AR,72003,7.5,,,, +US-AR-72004,US,AR,72004,8.125,,,, +US-AR-72005,US,AR,72005,8.75,,,, +US-AR-72006,US,AR,72006,8.5,,,, +US-AR-72007,US,AR,72007,7.5,,,, +US-AR-72010,US,AR,72010,9.5,,,, +US-AR-72011,US,AR,72011,6.5,,,, +US-AR-72012,US,AR,72012,9,,,, +US-AR-72013,US,AR,72013,8.5,,,, +US-AR-72014,US,AR,72014,9.25,,,, +US-AR-72015,US,AR,72015,8,,,, +US-AR-72016,US,AR,72016,9,,,, +US-AR-72017,US,AR,72017,7.5,,,, +US-AR-72018,US,AR,72018,8,,,, +US-AR-72019,US,AR,72019,6.5,,,, +US-AR-72020,US,AR,72020,8.75,,,, +US-AR-72021,US,AR,72021,8.5,,,, +US-AR-72022,US,AR,72022,9.5,,,, +US-AR-72023,US,AR,72023,9.5,,,, +US-AR-72024,US,AR,72024,7.5,,,, +US-AR-72025,US,AR,72025,9,,,, +US-AR-72026,US,AR,72026,7.5,,,, +US-AR-72027,US,AR,72027,8.25,,,, +US-AR-72028,US,AR,72028,8.5,,,, +US-AR-72029,US,AR,72029,9.5,,,, +US-AR-72030,US,AR,72030,8.25,,,, +US-AR-72031,US,AR,72031,8.5,,,, +US-AR-72032,US,AR,72032,8.75,,,, +US-AR-72033,US,AR,72033,8.75,,,, +US-AR-72034,US,AR,72034,8.75,,,, +US-AR-72035,US,AR,72035,8.75,,,, +US-AR-72036,US,AR,72036,8.5,,,, +US-AR-72037,US,AR,72037,8.5,,,, +US-AR-72038,US,AR,72038,7.5,,,, +US-AR-72039,US,AR,72039,8.5,,,, +US-AR-72040,US,AR,72040,8.5,,,, +US-AR-72041,US,AR,72041,7.5,,,, +US-AR-72042,US,AR,72042,11,,,, +US-AR-72043,US,AR,72043,9.75,,,, +US-AR-72044,US,AR,72044,8.125,,,, +US-AR-72045,US,AR,72045,8,,,, +US-AR-72046,US,AR,72046,10.5,,,, +US-AR-72047,US,AR,72047,7,,,, +US-AR-72048,US,AR,72048,7.5,,,, +US-AR-72051,US,AR,72051,7.5,,,, +US-AR-72052,US,AR,72052,8,,,, +US-AR-72053,US,AR,72053,7.5,,,, +US-AR-72055,US,AR,72055,7.5,,,, +US-AR-72057,US,AR,72057,7.75,,,, +US-AR-72058,US,AR,72058,7,,,, +US-AR-72059,US,AR,72059,7.5,,,, +US-AR-72060,US,AR,72060,8,,,, +US-AR-72061,US,AR,72061,9,,,, +US-AR-72063,US,AR,72063,8.25,,,, +US-AR-72064,US,AR,72064,7.5,,,, +US-AR-72065,US,AR,72065,6.5,,,, +US-AR-72066,US,AR,72066,7.5,,,, +US-AR-72067,US,AR,72067,8.125,,,, +US-AR-72068,US,AR,72068,8,,,, +US-AR-72069,US,AR,72069,6.5,,,, +US-AR-72070,US,AR,72070,9,,,, +US-AR-72072,US,AR,72072,7.5,,,, +US-AR-72073,US,AR,72073,7.5,,,, +US-AR-72074,US,AR,72074,7.5,,,, +US-AR-72075,US,AR,72075,8.75,,,, +US-AR-72076,US,AR,72076,9.5,,,, +US-AR-72078,US,AR,72078,9.5,,,, +US-AR-72079,US,AR,72079,8.125,,,, +US-AR-72080,US,AR,72080,8.5,,,, +US-AR-72081,US,AR,72081,8,,,, +US-AR-72082,US,AR,72082,8,,,, +US-AR-72083,US,AR,72083,8.5,,,, +US-AR-72084,US,AR,72084,7.75,,,, +US-AR-72085,US,AR,72085,8,,,, +US-AR-72086,US,AR,72086,7.5,,,, +US-AR-72087,US,AR,72087,6.5,,,, +US-AR-72088,US,AR,72088,10,,,, +US-AR-72089,US,AR,72089,9.5,,,, +US-AR-72099,US,AR,72099,9.5,,,, +US-AR-72101,US,AR,72101,7.5,,,, +US-AR-72102,US,AR,72102,8,,,, +US-AR-72103,US,AR,72103,6.5,,,, +US-AR-72104,US,AR,72104,8,,,, +US-AR-72105,US,AR,72105,8,,,, +US-AR-72106,US,AR,72106,9,,,, +US-AR-72107,US,AR,72107,11.25,,,, +US-AR-72108,US,AR,72108,6.5,,,, +US-AR-72110,US,AR,72110,9.25,,,, +US-AR-72111,US,AR,72111,7,,,, +US-AR-72112,US,AR,72112,10.25,,,, +US-AR-72113,US,AR,72113,8.5,,,, +US-AR-72114,US,AR,72114,8.5,,,, +US-AR-72115,US,AR,72115,8.5,,,, +US-AR-72116,US,AR,72116,8.5,,,, +US-AR-72117,US,AR,72117,8.5,,,, +US-AR-72118,US,AR,72118,8.5,,,, +US-AR-72119,US,AR,72119,8.5,,,, +US-AR-72120,US,AR,72120,8.5,,,, +US-AR-72121,US,AR,72121,8,,,, +US-AR-72122,US,AR,72122,6.5,,,, +US-AR-72123,US,AR,72123,8.5,,,, +US-AR-72124,US,AR,72124,8.5,,,, +US-AR-72125,US,AR,72125,9,,,, +US-AR-72126,US,AR,72126,9,,,, +US-AR-72127,US,AR,72127,10.25,,,, +US-AR-72128,US,AR,72128,7.75,,,, +US-AR-72129,US,AR,72129,7.75,,,, +US-AR-72130,US,AR,72130,8.125,,,, +US-AR-72131,US,AR,72131,8.125,,,, +US-AR-72132,US,AR,72132,8.125,,,, +US-AR-72133,US,AR,72133,8.125,,,, +US-AR-72134,US,AR,72134,6.5,,,, +US-AR-72135,US,AR,72135,7.5,,,, +US-AR-72136,US,AR,72136,8,,,, +US-AR-72137,US,AR,72137,8,,,, +US-AR-72139,US,AR,72139,8,,,, +US-AR-72140,US,AR,72140,9.5,,,, +US-AR-72141,US,AR,72141,8.5,,,, +US-AR-72142,US,AR,72142,7.5,,,, +US-AR-72143,US,AR,72143,8.5,,,, +US-AR-72145,US,AR,72145,8.5,,,, +US-AR-72149,US,AR,72149,8.5,,,, +US-AR-72150,US,AR,72150,7.75,,,, +US-AR-72152,US,AR,72152,8.125,,,, +US-AR-72153,US,AR,72153,8.5,,,, +US-AR-72156,US,AR,72156,8.25,,,, +US-AR-72157,US,AR,72157,8.25,,,, +US-AR-72158,US,AR,72158,8,,,, +US-AR-72160,US,AR,72160,9.5,,,, +US-AR-72164,US,AR,72164,7.5,,,, +US-AR-72165,US,AR,72165,8.5,,,, +US-AR-72166,US,AR,72166,7.5,,,, +US-AR-72167,US,AR,72167,6.5,,,, +US-AR-72168,US,AR,72168,8.125,,,, +US-AR-72169,US,AR,72169,8.75,,,, +US-AR-72170,US,AR,72170,7.5,,,, +US-AR-72173,US,AR,72173,7,,,, +US-AR-72175,US,AR,72175,8.125,,,, +US-AR-72176,US,AR,72176,7.5,,,, +US-AR-72178,US,AR,72178,8,,,, +US-AR-72179,US,AR,72179,8.125,,,, +US-AR-72180,US,AR,72180,7.5,,,, +US-AR-72181,US,AR,72181,7,,,, +US-AR-72182,US,AR,72182,8.125,,,, +US-AR-72183,US,AR,72183,7.5,,,, +US-AR-72190,US,AR,72190,8.5,,,, +US-AR-72199,US,AR,72199,7.5,,,, +US-AR-72201,US,AR,72201,9,,,, +US-AR-72202,US,AR,72202,9,,,, +US-AR-72203,US,AR,72203,9,,,, +US-AR-72204,US,AR,72204,9,,,, +US-AR-72205,US,AR,72205,9,,,, +US-AR-72206,US,AR,72206,7.5,,,, +US-AR-72207,US,AR,72207,9,,,, +US-AR-72209,US,AR,72209,9,,,, +US-AR-72210,US,AR,72210,7.5,,,, +US-AR-72211,US,AR,72211,9,,,, +US-AR-72212,US,AR,72212,9,,,, +US-AR-72214,US,AR,72214,9,,,, +US-AR-72215,US,AR,72215,9,,,, +US-AR-72216,US,AR,72216,9,,,, +US-AR-72217,US,AR,72217,9,,,, +US-AR-72219,US,AR,72219,9,,,, +US-AR-72221,US,AR,72221,9,,,, +US-AR-72222,US,AR,72222,9,,,, +US-AR-72223,US,AR,72223,9,,,, +US-AR-72225,US,AR,72225,9,,,, +US-AR-72227,US,AR,72227,9,,,, +US-AR-72231,US,AR,72231,8.5,,,, +US-AR-72255,US,AR,72255,9,,,, +US-AR-72260,US,AR,72260,9,,,, +US-AR-72295,US,AR,72295,9,,,, +US-AR-72301,US,AR,72301,9.75,,,, +US-AR-72303,US,AR,72303,9.75,,,, +US-AR-72310,US,AR,72310,8.5,,,, +US-AR-72311,US,AR,72311,7.5,,,, +US-AR-72312,US,AR,72312,8.5,,,, +US-AR-72313,US,AR,72313,8.5,,,, +US-AR-72315,US,AR,72315,9.75,,,, +US-AR-72316,US,AR,72316,9.75,,,, +US-AR-72319,US,AR,72319,9.75,,,, +US-AR-72320,US,AR,72320,7.5,,,, +US-AR-72321,US,AR,72321,8.5,,,, +US-AR-72322,US,AR,72322,8.5,,,, +US-AR-72324,US,AR,72324,8.5,,,, +US-AR-72325,US,AR,72325,8.25,,,, +US-AR-72326,US,AR,72326,8.5,,,, +US-AR-72327,US,AR,72327,8.25,,,, +US-AR-72328,US,AR,72328,8.5,,,, +US-AR-72329,US,AR,72329,8.5,,,, +US-AR-72330,US,AR,72330,8.5,,,, +US-AR-72331,US,AR,72331,10.25,,,, +US-AR-72332,US,AR,72332,8.25,,,, +US-AR-72333,US,AR,72333,8.5,,,, +US-AR-72335,US,AR,72335,9.5,,,, +US-AR-72336,US,AR,72336,9.5,,,, +US-AR-72338,US,AR,72338,8.5,,,, +US-AR-72339,US,AR,72339,9.25,,,, +US-AR-72340,US,AR,72340,8.5,,,, +US-AR-72341,US,AR,72341,7.5,,,, +US-AR-72342,US,AR,72342,10.5,,,, +US-AR-72346,US,AR,72346,8.5,,,, +US-AR-72347,US,AR,72347,8.5,,,, +US-AR-72348,US,AR,72348,8.25,,,, +US-AR-72350,US,AR,72350,8.5,,,, +US-AR-72352,US,AR,72352,7.5,,,, +US-AR-72353,US,AR,72353,8.5,,,, +US-AR-72354,US,AR,72354,9.5,,,, +US-AR-72355,US,AR,72355,8.5,,,, +US-AR-72358,US,AR,72358,9.5,,,, +US-AR-72359,US,AR,72359,9.5,,,, +US-AR-72360,US,AR,72360,9.5,,,, +US-AR-72364,US,AR,72364,10.25,,,, +US-AR-72365,US,AR,72365,9.75,,,, +US-AR-72366,US,AR,72366,8.5,,,, +US-AR-72367,US,AR,72367,8.5,,,, +US-AR-72368,US,AR,72368,7.5,,,, +US-AR-72369,US,AR,72369,8.5,,,, +US-AR-72370,US,AR,72370,9.5,,,, +US-AR-72372,US,AR,72372,8.5,,,, +US-AR-72373,US,AR,72373,8.5,,,, +US-AR-72374,US,AR,72374,8.5,,,, +US-AR-72376,US,AR,72376,8.25,,,, +US-AR-72377,US,AR,72377,7.75,,,, +US-AR-72379,US,AR,72379,8,,,, +US-AR-72383,US,AR,72383,8.5,,,, +US-AR-72384,US,AR,72384,8.25,,,, +US-AR-72386,US,AR,72386,7.75,,,, +US-AR-72387,US,AR,72387,8.5,,,, +US-AR-72389,US,AR,72389,8.5,,,, +US-AR-72390,US,AR,72390,10.5,,,, +US-AR-72391,US,AR,72391,8.5,,,, +US-AR-72392,US,AR,72392,8.5,,,, +US-AR-72394,US,AR,72394,8.5,,,, +US-AR-72395,US,AR,72395,8.5,,,, +US-AR-72396,US,AR,72396,9.5,,,, +US-AR-72401,US,AR,72401,9,,,, +US-AR-72402,US,AR,72402,9,,,, +US-AR-72403,US,AR,72403,9,,,, +US-AR-72404,US,AR,72404,9,,,, +US-AR-72410,US,AR,72410,8,,,, +US-AR-72411,US,AR,72411,8.5,,,, +US-AR-72412,US,AR,72412,8.25,,,, +US-AR-72413,US,AR,72413,7.75,,,, +US-AR-72414,US,AR,72414,7.5,,,, +US-AR-72415,US,AR,72415,9,,,, +US-AR-72416,US,AR,72416,7.5,,,, +US-AR-72417,US,AR,72417,7.5,,,, +US-AR-72419,US,AR,72419,7.5,,,, +US-AR-72421,US,AR,72421,7.5,,,, +US-AR-72422,US,AR,72422,8.75,,,, +US-AR-72424,US,AR,72424,7,,,, +US-AR-72425,US,AR,72425,8.25,,,, +US-AR-72426,US,AR,72426,8.5,,,, +US-AR-72427,US,AR,72427,7.5,,,, +US-AR-72428,US,AR,72428,9.5,,,, +US-AR-72429,US,AR,72429,7.75,,,, +US-AR-72430,US,AR,72430,7,,,, +US-AR-72431,US,AR,72431,8.75,,,, +US-AR-72432,US,AR,72432,7.75,,,, +US-AR-72433,US,AR,72433,9,,,, +US-AR-72434,US,AR,72434,7.75,,,, +US-AR-72435,US,AR,72435,7,,,, +US-AR-72436,US,AR,72436,8.25,,,, +US-AR-72437,US,AR,72437,7.5,,,, +US-AR-72438,US,AR,72438,8.5,,,, +US-AR-72440,US,AR,72440,8,,,, +US-AR-72441,US,AR,72441,7,,,, +US-AR-72442,US,AR,72442,8.5,,,, +US-AR-72443,US,AR,72443,8.25,,,, +US-AR-72444,US,AR,72444,7.75,,,, +US-AR-72445,US,AR,72445,8,,,, +US-AR-72447,US,AR,72447,8.5,,,, +US-AR-72449,US,AR,72449,7.75,,,, +US-AR-72450,US,AR,72450,9,,,, +US-AR-72451,US,AR,72451,9,,,, +US-AR-72453,US,AR,72453,7,,,, +US-AR-72454,US,AR,72454,9,,,, +US-AR-72455,US,AR,72455,7.75,,,, +US-AR-72456,US,AR,72456,7,,,, +US-AR-72457,US,AR,72457,9,,,, +US-AR-72458,US,AR,72458,8,,,, +US-AR-72459,US,AR,72459,7.75,,,, +US-AR-72460,US,AR,72460,7.75,,,, +US-AR-72461,US,AR,72461,9,,,, +US-AR-72462,US,AR,72462,7.75,,,, +US-AR-72464,US,AR,72464,7,,,, +US-AR-72465,US,AR,72465,8,,,, +US-AR-72466,US,AR,72466,8,,,, +US-AR-72467,US,AR,72467,9,,,, +US-AR-72469,US,AR,72469,8,,,, +US-AR-72470,US,AR,72470,7,,,, +US-AR-72471,US,AR,72471,9.75,,,, +US-AR-72472,US,AR,72472,8.75,,,, +US-AR-72473,US,AR,72473,10,,,, +US-AR-72474,US,AR,72474,8.25,,,, +US-AR-72475,US,AR,72475,9.75,,,, +US-AR-72476,US,AR,72476,9,,,, +US-AR-72478,US,AR,72478,7.75,,,, +US-AR-72479,US,AR,72479,7.75,,,, +US-AR-72482,US,AR,72482,7.5,,,, +US-AR-72501,US,AR,72501,8.5,,,, +US-AR-72503,US,AR,72503,10.5,,,, +US-AR-72512,US,AR,72512,9,,,, +US-AR-72513,US,AR,72513,8.5,,,, +US-AR-72515,US,AR,72515,8.5,,,, +US-AR-72517,US,AR,72517,7,,,, +US-AR-72519,US,AR,72519,7.5,,,, +US-AR-72520,US,AR,72520,8.5,,,, +US-AR-72521,US,AR,72521,7.5,,,, +US-AR-72522,US,AR,72522,8.5,,,, +US-AR-72523,US,AR,72523,8.125,,,, +US-AR-72524,US,AR,72524,8.5,,,, +US-AR-72525,US,AR,72525,8.5,,,, +US-AR-72526,US,AR,72526,8.5,,,, +US-AR-72527,US,AR,72527,8.5,,,, +US-AR-72528,US,AR,72528,7,,,, +US-AR-72529,US,AR,72529,8.5,,,, +US-AR-72530,US,AR,72530,8.125,,,, +US-AR-72531,US,AR,72531,7.5,,,, +US-AR-72532,US,AR,72532,7.5,,,, +US-AR-72533,US,AR,72533,7.5,,,, +US-AR-72534,US,AR,72534,8.5,,,, +US-AR-72536,US,AR,72536,8,,,, +US-AR-72537,US,AR,72537,7.5,,,, +US-AR-72538,US,AR,72538,8.5,,,, +US-AR-72539,US,AR,72539,8.5,,,, +US-AR-72540,US,AR,72540,7,,,, +US-AR-72542,US,AR,72542,8.5,,,, +US-AR-72543,US,AR,72543,8.125,,,, +US-AR-72544,US,AR,72544,7.5,,,, +US-AR-72545,US,AR,72545,9.125,,,, +US-AR-72546,US,AR,72546,8.125,,,, +US-AR-72550,US,AR,72550,8.5,,,, +US-AR-72553,US,AR,72553,8.5,,,, +US-AR-72554,US,AR,72554,8.5,,,, +US-AR-72555,US,AR,72555,7.5,,,, +US-AR-72556,US,AR,72556,9,,,, +US-AR-72560,US,AR,72560,7.5,,,, +US-AR-72561,US,AR,72561,7,,,, +US-AR-72562,US,AR,72562,8.5,,,, +US-AR-72564,US,AR,72564,8.5,,,, +US-AR-72565,US,AR,72565,8,,,, +US-AR-72566,US,AR,72566,7,,,, +US-AR-72567,US,AR,72567,7.5,,,, +US-AR-72568,US,AR,72568,8.5,,,, +US-AR-72569,US,AR,72569,7.5,,,, +US-AR-72571,US,AR,72571,8.5,,,, +US-AR-72572,US,AR,72572,8,,,, +US-AR-72573,US,AR,72573,7,,,, +US-AR-72575,US,AR,72575,8.5,,,, +US-AR-72576,US,AR,72576,8.5,,,, +US-AR-72577,US,AR,72577,7,,,, +US-AR-72578,US,AR,72578,8.5,,,, +US-AR-72579,US,AR,72579,8.5,,,, +US-AR-72581,US,AR,72581,8.125,,,, +US-AR-72583,US,AR,72583,8.5,,,, +US-AR-72584,US,AR,72584,7,,,, +US-AR-72585,US,AR,72585,7,,,, +US-AR-72587,US,AR,72587,7,,,, +US-AR-72601,US,AR,72601,7.75,,,, +US-AR-72602,US,AR,72602,8.5,,,, +US-AR-72611,US,AR,72611,7,,,, +US-AR-72613,US,AR,72613,7,,,, +US-AR-72615,US,AR,72615,7.75,,,, +US-AR-72616,US,AR,72616,7,,,, +US-AR-72617,US,AR,72617,7.5,,,, +US-AR-72619,US,AR,72619,8.5,,,, +US-AR-72623,US,AR,72623,7.5,,,, +US-AR-72624,US,AR,72624,8,,,, +US-AR-72626,US,AR,72626,9.5,,,, +US-AR-72628,US,AR,72628,8,,,, +US-AR-72629,US,AR,72629,8.5,,,, +US-AR-72630,US,AR,72630,7.75,,,, +US-AR-72631,US,AR,72631,7,,,, +US-AR-72632,US,AR,72632,7,,,, +US-AR-72633,US,AR,72633,7.75,,,, +US-AR-72634,US,AR,72634,7.5,,,, +US-AR-72635,US,AR,72635,7.5,,,, +US-AR-72636,US,AR,72636,8.5,,,, +US-AR-72638,US,AR,72638,7,,,, +US-AR-72639,US,AR,72639,7.5,,,, +US-AR-72640,US,AR,72640,8,,,, +US-AR-72641,US,AR,72641,10,,,, +US-AR-72642,US,AR,72642,7.5,,,, +US-AR-72644,US,AR,72644,7.75,,,, +US-AR-72645,US,AR,72645,7.5,,,, +US-AR-72648,US,AR,72648,8,,,, +US-AR-72650,US,AR,72650,7.5,,,, +US-AR-72651,US,AR,72651,7.5,,,, +US-AR-72653,US,AR,72653,7.5,,,, +US-AR-72654,US,AR,72654,8.5,,,, +US-AR-72655,US,AR,72655,8,,,, +US-AR-72657,US,AR,72657,7.5,,,, +US-AR-72658,US,AR,72658,7.5,,,, +US-AR-72659,US,AR,72659,8.5,,,, +US-AR-72660,US,AR,72660,7,,,, +US-AR-72661,US,AR,72661,7.5,,,, +US-AR-72662,US,AR,72662,7.75,,,, +US-AR-72663,US,AR,72663,7.5,,,, +US-AR-72666,US,AR,72666,8,,,, +US-AR-72668,US,AR,72668,7.5,,,, +US-AR-72669,US,AR,72669,7.5,,,, +US-AR-72670,US,AR,72670,8,,,, +US-AR-72672,US,AR,72672,8,,,, +US-AR-72675,US,AR,72675,7.5,,,, +US-AR-72677,US,AR,72677,8.5,,,, +US-AR-72679,US,AR,72679,7.5,,,, +US-AR-72680,US,AR,72680,7.5,,,, +US-AR-72682,US,AR,72682,7.5,,,, +US-AR-72683,US,AR,72683,8,,,, +US-AR-72685,US,AR,72685,7.75,,,, +US-AR-72686,US,AR,72686,7.5,,,, +US-AR-72687,US,AR,72687,7.5,,,, +US-AR-72701,US,AR,72701,9.75,,,, +US-AR-72702,US,AR,72702,9.75,,,, +US-AR-72703,US,AR,72703,9.75,,,, +US-AR-72704,US,AR,72704,9.75,,,, +US-AR-72711,US,AR,72711,8.5,,,, +US-AR-72712,US,AR,72712,9.5,,,, +US-AR-72714,US,AR,72714,8.5,,,, +US-AR-72715,US,AR,72715,8.5,,,, +US-AR-72716,US,AR,72716,9.5,,,, +US-AR-72717,US,AR,72717,7.75,,,, +US-AR-72718,US,AR,72718,8.5,,,, +US-AR-72719,US,AR,72719,9.5,,,, +US-AR-72721,US,AR,72721,8.5,,,, +US-AR-72722,US,AR,72722,7.5,,,, +US-AR-72727,US,AR,72727,8.5,,,, +US-AR-72728,US,AR,72728,8.75,,,, +US-AR-72729,US,AR,72729,7.75,,,, +US-AR-72730,US,AR,72730,10.75,,,, +US-AR-72732,US,AR,72732,7.5,,,, +US-AR-72733,US,AR,72733,7.5,,,, +US-AR-72734,US,AR,72734,7.5,,,, +US-AR-72735,US,AR,72735,7.75,,,, +US-AR-72736,US,AR,72736,7.5,,,, +US-AR-72737,US,AR,72737,9.75,,,, +US-AR-72738,US,AR,72738,8.5,,,, +US-AR-72739,US,AR,72739,9.5,,,, +US-AR-72740,US,AR,72740,8.5,,,, +US-AR-72741,US,AR,72741,9.75,,,, +US-AR-72742,US,AR,72742,8.5,,,, +US-AR-72744,US,AR,72744,7.75,,,, +US-AR-72745,US,AR,72745,9.5,,,, +US-AR-72747,US,AR,72747,7.5,,,, +US-AR-72749,US,AR,72749,7.75,,,, +US-AR-72751,US,AR,72751,8.5,,,, +US-AR-72752,US,AR,72752,8.5,,,, +US-AR-72753,US,AR,72753,7.75,,,, +US-AR-72756,US,AR,72756,9.5,,,, +US-AR-72757,US,AR,72757,9.5,,,, +US-AR-72758,US,AR,72758,9.5,,,, +US-AR-72760,US,AR,72760,8.5,,,, +US-AR-72761,US,AR,72761,9.5,,,, +US-AR-72762,US,AR,72762,9.75,,,, +US-AR-72764,US,AR,72764,9.75,,,, +US-AR-72765,US,AR,72765,9.75,,,, +US-AR-72766,US,AR,72766,9.75,,,, +US-AR-72768,US,AR,72768,7.5,,,, +US-AR-72769,US,AR,72769,7.75,,,, +US-AR-72770,US,AR,72770,9.75,,,, +US-AR-72773,US,AR,72773,8.5,,,, +US-AR-72774,US,AR,72774,7.75,,,, +US-AR-72776,US,AR,72776,8.5,,,, +US-AR-72801,US,AR,72801,9,,,, +US-AR-72802,US,AR,72802,7.5,,,, +US-AR-72811,US,AR,72811,9,,,, +US-AR-72812,US,AR,72812,9,,,, +US-AR-72820,US,AR,72820,8,,,, +US-AR-72821,US,AR,72821,8,,,, +US-AR-72823,US,AR,72823,7.5,,,, +US-AR-72824,US,AR,72824,7.5,,,, +US-AR-72826,US,AR,72826,7.5,,,, +US-AR-72827,US,AR,72827,7.5,,,, +US-AR-72828,US,AR,72828,7.5,,,, +US-AR-72829,US,AR,72829,7.5,,,, +US-AR-72830,US,AR,72830,7.5,,,, +US-AR-72832,US,AR,72832,8.5,,,, +US-AR-72833,US,AR,72833,7.5,,,, +US-AR-72834,US,AR,72834,7.5,,,, +US-AR-72835,US,AR,72835,7.5,,,, +US-AR-72837,US,AR,72837,7.5,,,, +US-AR-72838,US,AR,72838,7.5,,,, +US-AR-72839,US,AR,72839,7.5,,,, +US-AR-72840,US,AR,72840,7.5,,,, +US-AR-72841,US,AR,72841,9.125,,,, +US-AR-72842,US,AR,72842,7.5,,,, +US-AR-72843,US,AR,72843,7.5,,,, +US-AR-72845,US,AR,72845,7.5,,,, +US-AR-72846,US,AR,72846,7.5,,,, +US-AR-72847,US,AR,72847,7.5,,,, +US-AR-72851,US,AR,72851,7.5,,,, +US-AR-72852,US,AR,72852,7.5,,,, +US-AR-72853,US,AR,72853,7.5,,,, +US-AR-72854,US,AR,72854,7.5,,,, +US-AR-72855,US,AR,72855,8,,,, +US-AR-72856,US,AR,72856,7.5,,,, +US-AR-72857,US,AR,72857,7.5,,,, +US-AR-72858,US,AR,72858,9,,,, +US-AR-72860,US,AR,72860,7.5,,,, +US-AR-72863,US,AR,72863,7.5,,,, +US-AR-72865,US,AR,72865,7.5,,,, +US-AR-72901,US,AR,72901,9.75,,,, +US-AR-72902,US,AR,72902,9.75,,,, +US-AR-72903,US,AR,72903,9.75,,,, +US-AR-72904,US,AR,72904,9.75,,,, +US-AR-72905,US,AR,72905,9.75,,,, +US-AR-72906,US,AR,72906,9.75,,,, +US-AR-72908,US,AR,72908,9.75,,,, +US-AR-72913,US,AR,72913,9.75,,,, +US-AR-72914,US,AR,72914,9.75,,,, +US-AR-72916,US,AR,72916,7.75,,,, +US-AR-72917,US,AR,72917,9.75,,,, +US-AR-72918,US,AR,72918,9.75,,,, +US-AR-72919,US,AR,72919,7.75,,,, +US-AR-72921,US,AR,72921,7.5,,,, +US-AR-72923,US,AR,72923,8.75,,,, +US-AR-72926,US,AR,72926,9.125,,,, +US-AR-72927,US,AR,72927,7.5,,,, +US-AR-72928,US,AR,72928,9,,,, +US-AR-72930,US,AR,72930,8,,,, +US-AR-72932,US,AR,72932,7.5,,,, +US-AR-72933,US,AR,72933,9.5,,,, +US-AR-72934,US,AR,72934,7.5,,,, +US-AR-72935,US,AR,72935,8.5,,,, +US-AR-72936,US,AR,72936,7.75,,,, +US-AR-72937,US,AR,72937,7.75,,,, +US-AR-72938,US,AR,72938,8.75,,,, +US-AR-72940,US,AR,72940,7.75,,,, +US-AR-72941,US,AR,72941,7.75,,,, +US-AR-72943,US,AR,72943,7.5,,,, +US-AR-72944,US,AR,72944,7.75,,,, +US-AR-72945,US,AR,72945,7.75,,,, +US-AR-72946,US,AR,72946,7.5,,,, +US-AR-72947,US,AR,72947,7.5,,,, +US-AR-72948,US,AR,72948,7.5,,,, +US-AR-72949,US,AR,72949,8,,,, +US-AR-72950,US,AR,72950,9.125,,,, +US-AR-72951,US,AR,72951,7.5,,,, +US-AR-72952,US,AR,72952,7.5,,,, +US-AR-72955,US,AR,72955,7.5,,,, +US-AR-72956,US,AR,72956,9.5,,,, +US-AR-72957,US,AR,72957,9.5,,,, +US-AR-72958,US,AR,72958,9.125,,,, +US-AR-72959,US,AR,72959,7.75,,,, +US-AZ-85001,US,AZ,85001,8.3,,,, +US-AZ-85002,US,AZ,85002,8.3,,,, +US-AZ-85003,US,AZ,85003,8.3,,,, +US-AZ-85004,US,AZ,85004,8.3,,,, +US-AZ-85005,US,AZ,85005,8.3,,,, +US-AZ-85006,US,AZ,85006,8.3,,,, +US-AZ-85007,US,AZ,85007,8.3,,,, +US-AZ-85008,US,AZ,85008,8.3,,,, +US-AZ-85009,US,AZ,85009,8.3,,,, +US-AZ-85010,US,AZ,85010,8.3,,,, +US-AZ-85011,US,AZ,85011,8.3,,,, +US-AZ-85012,US,AZ,85012,8.3,,,, +US-AZ-85013,US,AZ,85013,8.3,,,, +US-AZ-85014,US,AZ,85014,8.3,,,, +US-AZ-85015,US,AZ,85015,8.3,,,, +US-AZ-85016,US,AZ,85016,8.3,,,, +US-AZ-85017,US,AZ,85017,8.3,,,, +US-AZ-85018,US,AZ,85018,8.3,,,, +US-AZ-85019,US,AZ,85019,8.3,,,, +US-AZ-85020,US,AZ,85020,8.3,,,, +US-AZ-85021,US,AZ,85021,8.3,,,, +US-AZ-85022,US,AZ,85022,8.3,,,, +US-AZ-85023,US,AZ,85023,8.3,,,, +US-AZ-85024,US,AZ,85024,8.3,,,, +US-AZ-85025,US,AZ,85025,8.3,,,, +US-AZ-85026,US,AZ,85026,8.3,,,, +US-AZ-85027,US,AZ,85027,8.3,,,, +US-AZ-85028,US,AZ,85028,8.3,,,, +US-AZ-85029,US,AZ,85029,8.3,,,, +US-AZ-85030,US,AZ,85030,8.3,,,, +US-AZ-85031,US,AZ,85031,8.3,,,, +US-AZ-85032,US,AZ,85032,8.3,,,, +US-AZ-85033,US,AZ,85033,8.3,,,, +US-AZ-85034,US,AZ,85034,8.3,,,, +US-AZ-85035,US,AZ,85035,8.3,,,, +US-AZ-85036,US,AZ,85036,8.3,,,, +US-AZ-85037,US,AZ,85037,8.3,,,, +US-AZ-85038,US,AZ,85038,8.3,,,, +US-AZ-85039,US,AZ,85039,6.3,,,, +US-AZ-85040,US,AZ,85040,8.3,,,, +US-AZ-85041,US,AZ,85041,8.3,,,, +US-AZ-85042,US,AZ,85042,8.3,,,, +US-AZ-85043,US,AZ,85043,8.3,,,, +US-AZ-85044,US,AZ,85044,8.3,,,, +US-AZ-85045,US,AZ,85045,8.3,,,, +US-AZ-85046,US,AZ,85046,8.3,,,, +US-AZ-85048,US,AZ,85048,8.3,,,, +US-AZ-85050,US,AZ,85050,8.3,,,, +US-AZ-85051,US,AZ,85051,8.3,,,, +US-AZ-85053,US,AZ,85053,8.3,,,, +US-AZ-85054,US,AZ,85054,8.3,,,, +US-AZ-85060,US,AZ,85060,8.3,,,, +US-AZ-85061,US,AZ,85061,8.3,,,, +US-AZ-85062,US,AZ,85062,8.3,,,, +US-AZ-85063,US,AZ,85063,8.3,,,, +US-AZ-85064,US,AZ,85064,8.3,,,, +US-AZ-85065,US,AZ,85065,8.3,,,, +US-AZ-85066,US,AZ,85066,8.3,,,, +US-AZ-85067,US,AZ,85067,8.3,,,, +US-AZ-85068,US,AZ,85068,8.3,,,, +US-AZ-85069,US,AZ,85069,8.3,,,, +US-AZ-85070,US,AZ,85070,8.3,,,, +US-AZ-85071,US,AZ,85071,8.3,,,, +US-AZ-85072,US,AZ,85072,8.3,,,, +US-AZ-85073,US,AZ,85073,6.3,,,, +US-AZ-85074,US,AZ,85074,8.3,,,, +US-AZ-85075,US,AZ,85075,8.3,,,, +US-AZ-85076,US,AZ,85076,8.3,,,, +US-AZ-85078,US,AZ,85078,8.3,,,, +US-AZ-85079,US,AZ,85079,8.3,,,, +US-AZ-85080,US,AZ,85080,8.3,,,, +US-AZ-85082,US,AZ,85082,8.3,,,, +US-AZ-85083,US,AZ,85083,8.3,,,, +US-AZ-85085,US,AZ,85085,8.3,,,, +US-AZ-85086,US,AZ,85086,6.3,,,, +US-AZ-85087,US,AZ,85087,6.3,,,, +US-AZ-85097,US,AZ,85097,8.3,,,, +US-AZ-85098,US,AZ,85098,8.3,,,, +US-AZ-85117,US,AZ,85117,8.9,,,, +US-AZ-85118,US,AZ,85118,6.7,,,, +US-AZ-85119,US,AZ,85119,8.9,,,, +US-AZ-85120,US,AZ,85120,8.9,,,, +US-AZ-85121,US,AZ,85121,6.7,,,, +US-AZ-85122,US,AZ,85122,8.5,,,, +US-AZ-85123,US,AZ,85123,8.5,,,, +US-AZ-85127,US,AZ,85127,8.55,,,, +US-AZ-85128,US,AZ,85128,9.7,,,, +US-AZ-85130,US,AZ,85130,8.5,,,, +US-AZ-85131,US,AZ,85131,9.7,,,, +US-AZ-85132,US,AZ,85132,6.7,,,, +US-AZ-85135,US,AZ,85135,9.6,,,, +US-AZ-85137,US,AZ,85137,6.7,,,, +US-AZ-85138,US,AZ,85138,8.7,,,, +US-AZ-85139,US,AZ,85139,6.7,,,, +US-AZ-85140,US,AZ,85140,6.7,,,, +US-AZ-85141,US,AZ,85141,6.7,,,, +US-AZ-85142,US,AZ,85142,8.55,,,, +US-AZ-85143,US,AZ,85143,6.7,,,, +US-AZ-85145,US,AZ,85145,6.7,,,, +US-AZ-85147,US,AZ,85147,6.7,,,, +US-AZ-85172,US,AZ,85172,6.7,,,, +US-AZ-85173,US,AZ,85173,8.7,,,, +US-AZ-85178,US,AZ,85178,8.9,,,, +US-AZ-85190,US,AZ,85190,8.9,,,, +US-AZ-85191,US,AZ,85191,6.7,,,, +US-AZ-85192,US,AZ,85192,6.7,,,, +US-AZ-85193,US,AZ,85193,6.7,,,, +US-AZ-85194,US,AZ,85194,6.7,,,, +US-AZ-85201,US,AZ,85201,8.05,,,, +US-AZ-85202,US,AZ,85202,8.05,,,, +US-AZ-85203,US,AZ,85203,8.05,,,, +US-AZ-85204,US,AZ,85204,8.05,,,, +US-AZ-85205,US,AZ,85205,8.05,,,, +US-AZ-85206,US,AZ,85206,8.05,,,, +US-AZ-85207,US,AZ,85207,8.05,,,, +US-AZ-85208,US,AZ,85208,8.05,,,, +US-AZ-85209,US,AZ,85209,8.05,,,, +US-AZ-85210,US,AZ,85210,8.05,,,, +US-AZ-85211,US,AZ,85211,8.05,,,, +US-AZ-85212,US,AZ,85212,8.05,,,, +US-AZ-85213,US,AZ,85213,8.05,,,, +US-AZ-85214,US,AZ,85214,8.05,,,, +US-AZ-85215,US,AZ,85215,8.05,,,, +US-AZ-85216,US,AZ,85216,8.05,,,, +US-AZ-85224,US,AZ,85224,7.8,,,, +US-AZ-85225,US,AZ,85225,7.8,,,, +US-AZ-85226,US,AZ,85226,7.8,,,, +US-AZ-85233,US,AZ,85233,7.8,,,, +US-AZ-85234,US,AZ,85234,7.8,,,, +US-AZ-85236,US,AZ,85236,7.8,,,, +US-AZ-85244,US,AZ,85244,7.8,,,, +US-AZ-85246,US,AZ,85246,7.8,,,, +US-AZ-85248,US,AZ,85248,7.8,,,, +US-AZ-85249,US,AZ,85249,7.8,,,, +US-AZ-85250,US,AZ,85250,7.95,,,, +US-AZ-85251,US,AZ,85251,7.95,,,, +US-AZ-85252,US,AZ,85252,7.95,,,, +US-AZ-85253,US,AZ,85253,8.8,,,, +US-AZ-85254,US,AZ,85254,8.3,,,, +US-AZ-85255,US,AZ,85255,7.95,,,, +US-AZ-85256,US,AZ,85256,7.95,,,, +US-AZ-85257,US,AZ,85257,7.95,,,, +US-AZ-85258,US,AZ,85258,7.95,,,, +US-AZ-85259,US,AZ,85259,7.95,,,, +US-AZ-85260,US,AZ,85260,7.95,,,, +US-AZ-85261,US,AZ,85261,7.95,,,, +US-AZ-85262,US,AZ,85262,7.95,,,, +US-AZ-85263,US,AZ,85263,6.3,,,, +US-AZ-85264,US,AZ,85264,6.3,,,, +US-AZ-85266,US,AZ,85266,7.95,,,, +US-AZ-85267,US,AZ,85267,7.95,,,, +US-AZ-85268,US,AZ,85268,8.9,,,, +US-AZ-85269,US,AZ,85269,8.9,,,, +US-AZ-85271,US,AZ,85271,7.95,,,, +US-AZ-85274,US,AZ,85274,8.05,,,, +US-AZ-85275,US,AZ,85275,8.05,,,, +US-AZ-85277,US,AZ,85277,8.05,,,, +US-AZ-85280,US,AZ,85280,8.3,,,, +US-AZ-85281,US,AZ,85281,8.3,,,, +US-AZ-85282,US,AZ,85282,8.3,,,, +US-AZ-85283,US,AZ,85283,8.3,,,, +US-AZ-85284,US,AZ,85284,8.3,,,, +US-AZ-85285,US,AZ,85285,8.3,,,, +US-AZ-85286,US,AZ,85286,7.8,,,, +US-AZ-85287,US,AZ,85287,8.3,,,, +US-AZ-85295,US,AZ,85295,7.8,,,, +US-AZ-85296,US,AZ,85296,7.8,,,, +US-AZ-85297,US,AZ,85297,7.8,,,, +US-AZ-85298,US,AZ,85298,7.8,,,, +US-AZ-85299,US,AZ,85299,7.8,,,, +US-AZ-85301,US,AZ,85301,9.2,,,, +US-AZ-85302,US,AZ,85302,9.2,,,, +US-AZ-85303,US,AZ,85303,9.2,,,, +US-AZ-85304,US,AZ,85304,9.2,,,, +US-AZ-85305,US,AZ,85305,9.2,,,, +US-AZ-85306,US,AZ,85306,9.2,,,, +US-AZ-85307,US,AZ,85307,9.2,,,, +US-AZ-85308,US,AZ,85308,9.2,,,, +US-AZ-85309,US,AZ,85309,9.2,,,, +US-AZ-85310,US,AZ,85310,8.3,,,, +US-AZ-85311,US,AZ,85311,9.2,,,, +US-AZ-85312,US,AZ,85312,9.2,,,, +US-AZ-85318,US,AZ,85318,9.2,,,, +US-AZ-85320,US,AZ,85320,6.3,,,, +US-AZ-85321,US,AZ,85321,6.1,,,, +US-AZ-85322,US,AZ,85322,6.3,,,, +US-AZ-85323,US,AZ,85323,8.8,,,, +US-AZ-85324,US,AZ,85324,6.35,,,, +US-AZ-85325,US,AZ,85325,7.6,,,, +US-AZ-85326,US,AZ,85326,9.3,,,, +US-AZ-85327,US,AZ,85327,9.3,,,, +US-AZ-85328,US,AZ,85328,7.6,,,, +US-AZ-85329,US,AZ,85329,8.8,,,, +US-AZ-85331,US,AZ,85331,8.3,,,, +US-AZ-85332,US,AZ,85332,6.35,,,, +US-AZ-85333,US,AZ,85333,6.712,,,, +US-AZ-85334,US,AZ,85334,7.6,,,, +US-AZ-85335,US,AZ,85335,9.3,,,, +US-AZ-85336,US,AZ,85336,10.712,,,, +US-AZ-85337,US,AZ,85337,9.3,,,, +US-AZ-85338,US,AZ,85338,8.8,,,, +US-AZ-85339,US,AZ,85339,8.3,,,, +US-AZ-85340,US,AZ,85340,6.3,,,, +US-AZ-85341,US,AZ,85341,6.1,,,, +US-AZ-85342,US,AZ,85342,6.3,,,, +US-AZ-85343,US,AZ,85343,9.3,,,, +US-AZ-85344,US,AZ,85344,7.6,,,, +US-AZ-85345,US,AZ,85345,8.1,,,, +US-AZ-85346,US,AZ,85346,10.1,,,, +US-AZ-85347,US,AZ,85347,6.712,,,, +US-AZ-85348,US,AZ,85348,7.6,,,, +US-AZ-85349,US,AZ,85349,10.712,,,, +US-AZ-85350,US,AZ,85350,6.712,,,, +US-AZ-85351,US,AZ,85351,6.3,,,, +US-AZ-85352,US,AZ,85352,6.712,,,, +US-AZ-85353,US,AZ,85353,8.3,,,, +US-AZ-85354,US,AZ,85354,6.3,,,, +US-AZ-85355,US,AZ,85355,6.3,,,, +US-AZ-85356,US,AZ,85356,9.212,,,, +US-AZ-85357,US,AZ,85357,7.6,,,, +US-AZ-85358,US,AZ,85358,8.5,,,, +US-AZ-85359,US,AZ,85359,10.1,,,, +US-AZ-85360,US,AZ,85360,5.85,,,, +US-AZ-85361,US,AZ,85361,6.3,,,, +US-AZ-85362,US,AZ,85362,6.35,,,, +US-AZ-85363,US,AZ,85363,9.3,,,, +US-AZ-85364,US,AZ,85364,8.412,,,, +US-AZ-85365,US,AZ,85365,8.412,,,, +US-AZ-85366,US,AZ,85366,8.412,,,, +US-AZ-85367,US,AZ,85367,6.712,,,, +US-AZ-85369,US,AZ,85369,8.412,,,, +US-AZ-85371,US,AZ,85371,9.6,,,, +US-AZ-85372,US,AZ,85372,6.3,,,, +US-AZ-85373,US,AZ,85373,6.3,,,, +US-AZ-85374,US,AZ,85374,8.5,,,, +US-AZ-85375,US,AZ,85375,6.3,,,, +US-AZ-85376,US,AZ,85376,6.3,,,, +US-AZ-85377,US,AZ,85377,9.3,,,, +US-AZ-85378,US,AZ,85378,8.5,,,, +US-AZ-85379,US,AZ,85379,8.5,,,, +US-AZ-85380,US,AZ,85380,8.1,,,, +US-AZ-85381,US,AZ,85381,8.1,,,, +US-AZ-85382,US,AZ,85382,8.1,,,, +US-AZ-85383,US,AZ,85383,8.1,,,, +US-AZ-85385,US,AZ,85385,8.1,,,, +US-AZ-85387,US,AZ,85387,8.5,,,, +US-AZ-85388,US,AZ,85388,8.5,,,, +US-AZ-85390,US,AZ,85390,8.5,,,, +US-AZ-85392,US,AZ,85392,8.8,,,, +US-AZ-85395,US,AZ,85395,8.8,,,, +US-AZ-85396,US,AZ,85396,9.3,,,, +US-AZ-85501,US,AZ,85501,8.6,,,, +US-AZ-85502,US,AZ,85502,8.6,,,, +US-AZ-85530,US,AZ,85530,6.1,,,, +US-AZ-85531,US,AZ,85531,6.1,,,, +US-AZ-85532,US,AZ,85532,6.6,,,, +US-AZ-85533,US,AZ,85533,6.1,,,, +US-AZ-85534,US,AZ,85534,6.1,,,, +US-AZ-85535,US,AZ,85535,8.1,,,, +US-AZ-85536,US,AZ,85536,6.1,,,, +US-AZ-85539,US,AZ,85539,9.1,,,, +US-AZ-85540,US,AZ,85540,9.1,,,, +US-AZ-85541,US,AZ,85541,8.72,,,, +US-AZ-85542,US,AZ,85542,6.6,,,, +US-AZ-85543,US,AZ,85543,8.1,,,, +US-AZ-85544,US,AZ,85544,6.6,,,, +US-AZ-85545,US,AZ,85545,6.6,,,, +US-AZ-85546,US,AZ,85546,8.6,,,, +US-AZ-85547,US,AZ,85547,8.72,,,, +US-AZ-85548,US,AZ,85548,8.6,,,, +US-AZ-85550,US,AZ,85550,6.6,,,, +US-AZ-85551,US,AZ,85551,6.1,,,, +US-AZ-85552,US,AZ,85552,8.6,,,, +US-AZ-85553,US,AZ,85553,6.6,,,, +US-AZ-85554,US,AZ,85554,6.6,,,, +US-AZ-85601,US,AZ,85601,6.1,,,, +US-AZ-85602,US,AZ,85602,8.6,,,, +US-AZ-85603,US,AZ,85603,8.6,,,, +US-AZ-85605,US,AZ,85605,6.1,,,, +US-AZ-85606,US,AZ,85606,6.1,,,, +US-AZ-85607,US,AZ,85607,8.9,,,, +US-AZ-85608,US,AZ,85608,8.9,,,, +US-AZ-85609,US,AZ,85609,6.1,,,, +US-AZ-85610,US,AZ,85610,6.1,,,, +US-AZ-85611,US,AZ,85611,6.6,,,, +US-AZ-85613,US,AZ,85613,7.85,,,, +US-AZ-85614,US,AZ,85614,6.1,,,, +US-AZ-85615,US,AZ,85615,6.1,,,, +US-AZ-85616,US,AZ,85616,6.1,,,, +US-AZ-85617,US,AZ,85617,6.1,,,, +US-AZ-85618,US,AZ,85618,8.7,,,, +US-AZ-85619,US,AZ,85619,6.1,,,, +US-AZ-85620,US,AZ,85620,6.1,,,, +US-AZ-85621,US,AZ,85621,8.6,,,, +US-AZ-85622,US,AZ,85622,6.1,,,, +US-AZ-85623,US,AZ,85623,6.7,,,, +US-AZ-85624,US,AZ,85624,6.6,,,, +US-AZ-85625,US,AZ,85625,6.1,,,, +US-AZ-85626,US,AZ,85626,6.1,,,, +US-AZ-85627,US,AZ,85627,6.1,,,, +US-AZ-85628,US,AZ,85628,8.6,,,, +US-AZ-85629,US,AZ,85629,8.1,,,, +US-AZ-85630,US,AZ,85630,6.1,,,, +US-AZ-85631,US,AZ,85631,6.7,,,, +US-AZ-85632,US,AZ,85632,6.1,,,, +US-AZ-85633,US,AZ,85633,6.1,,,, +US-AZ-85634,US,AZ,85634,6.1,,,, +US-AZ-85635,US,AZ,85635,7.85,,,, +US-AZ-85636,US,AZ,85636,7.85,,,, +US-AZ-85637,US,AZ,85637,6.1,,,, +US-AZ-85638,US,AZ,85638,9.6,,,, +US-AZ-85639,US,AZ,85639,6.1,,,, +US-AZ-85640,US,AZ,85640,6.6,,,, +US-AZ-85641,US,AZ,85641,6.1,,,, +US-AZ-85643,US,AZ,85643,6.1,,,, +US-AZ-85644,US,AZ,85644,9.1,,,, +US-AZ-85645,US,AZ,85645,6.1,,,, +US-AZ-85646,US,AZ,85646,6.6,,,, +US-AZ-85648,US,AZ,85648,6.6,,,, +US-AZ-85650,US,AZ,85650,6.1,,,, +US-AZ-85652,US,AZ,85652,8.1,,,, +US-AZ-85653,US,AZ,85653,6.1,,,, +US-AZ-85654,US,AZ,85654,8.1,,,, +US-AZ-85655,US,AZ,85655,8.9,,,, +US-AZ-85658,US,AZ,85658,8.1,,,, +US-AZ-85662,US,AZ,85662,8.6,,,, +US-AZ-85670,US,AZ,85670,7.85,,,, +US-AZ-85671,US,AZ,85671,6.1,,,, +US-AZ-85701,US,AZ,85701,8.1,,,, +US-AZ-85702,US,AZ,85702,8.1,,,, +US-AZ-85703,US,AZ,85703,8.1,,,, +US-AZ-85704,US,AZ,85704,6.1,,,, +US-AZ-85705,US,AZ,85705,8.1,,,, +US-AZ-85706,US,AZ,85706,8.1,,,, +US-AZ-85707,US,AZ,85707,8.1,,,, +US-AZ-85708,US,AZ,85708,8.1,,,, +US-AZ-85709,US,AZ,85709,8.1,,,, +US-AZ-85710,US,AZ,85710,8.1,,,, +US-AZ-85711,US,AZ,85711,8.1,,,, +US-AZ-85712,US,AZ,85712,8.1,,,, +US-AZ-85713,US,AZ,85713,8.1,,,, +US-AZ-85714,US,AZ,85714,8.1,,,, +US-AZ-85715,US,AZ,85715,8.1,,,, +US-AZ-85716,US,AZ,85716,8.1,,,, +US-AZ-85717,US,AZ,85717,8.1,,,, +US-AZ-85718,US,AZ,85718,6.1,,,, +US-AZ-85719,US,AZ,85719,8.1,,,, +US-AZ-85720,US,AZ,85720,6.1,,,, +US-AZ-85721,US,AZ,85721,8.1,,,, +US-AZ-85722,US,AZ,85722,8.1,,,, +US-AZ-85723,US,AZ,85723,8.1,,,, +US-AZ-85724,US,AZ,85724,8.1,,,, +US-AZ-85725,US,AZ,85725,8.6,,,, +US-AZ-85726,US,AZ,85726,8.1,,,, +US-AZ-85728,US,AZ,85728,8.1,,,, +US-AZ-85730,US,AZ,85730,8.1,,,, +US-AZ-85731,US,AZ,85731,8.1,,,, +US-AZ-85732,US,AZ,85732,8.1,,,, +US-AZ-85733,US,AZ,85733,8.1,,,, +US-AZ-85734,US,AZ,85734,8.1,,,, +US-AZ-85735,US,AZ,85735,6.1,,,, +US-AZ-85736,US,AZ,85736,6.1,,,, +US-AZ-85737,US,AZ,85737,8.1,,,, +US-AZ-85738,US,AZ,85738,6.1,,,, +US-AZ-85739,US,AZ,85739,6.7,,,, +US-AZ-85740,US,AZ,85740,6.1,,,, +US-AZ-85741,US,AZ,85741,6.1,,,, +US-AZ-85742,US,AZ,85742,6.1,,,, +US-AZ-85743,US,AZ,85743,6.1,,,, +US-AZ-85744,US,AZ,85744,8.1,,,, +US-AZ-85745,US,AZ,85745,8.1,,,, +US-AZ-85746,US,AZ,85746,6.1,,,, +US-AZ-85747,US,AZ,85747,8.1,,,, +US-AZ-85748,US,AZ,85748,8.1,,,, +US-AZ-85749,US,AZ,85749,6.1,,,, +US-AZ-85750,US,AZ,85750,6.1,,,, +US-AZ-85751,US,AZ,85751,8.1,,,, +US-AZ-85752,US,AZ,85752,6.1,,,, +US-AZ-85754,US,AZ,85754,8.1,,,, +US-AZ-85755,US,AZ,85755,8.1,,,, +US-AZ-85756,US,AZ,85756,6.1,,,, +US-AZ-85757,US,AZ,85757,6.1,,,, +US-AZ-85775,US,AZ,85775,6.1,,,, +US-AZ-85901,US,AZ,85901,8.1,,,, +US-AZ-85902,US,AZ,85902,8.1,,,, +US-AZ-85911,US,AZ,85911,8.1,,,, +US-AZ-85912,US,AZ,85912,8.1,,,, +US-AZ-85920,US,AZ,85920,6.1,,,, +US-AZ-85922,US,AZ,85922,6.1,,,, +US-AZ-85923,US,AZ,85923,6.1,,,, +US-AZ-85924,US,AZ,85924,6.1,,,, +US-AZ-85925,US,AZ,85925,9.1,,,, +US-AZ-85926,US,AZ,85926,6.1,,,, +US-AZ-85927,US,AZ,85927,6.1,,,, +US-AZ-85928,US,AZ,85928,6.1,,,, +US-AZ-85929,US,AZ,85929,6.1,,,, +US-AZ-85930,US,AZ,85930,6.1,,,, +US-AZ-85931,US,AZ,85931,6.1,,,, +US-AZ-85932,US,AZ,85932,6.1,,,, +US-AZ-85933,US,AZ,85933,6.1,,,, +US-AZ-85934,US,AZ,85934,6.1,,,, +US-AZ-85935,US,AZ,85935,6.1,,,, +US-AZ-85936,US,AZ,85936,9.1,,,, +US-AZ-85937,US,AZ,85937,8.1,,,, +US-AZ-85938,US,AZ,85938,9.1,,,, +US-AZ-85939,US,AZ,85939,8.1,,,, +US-AZ-85940,US,AZ,85940,6.1,,,, +US-AZ-85941,US,AZ,85941,6.1,,,, +US-AZ-85942,US,AZ,85942,8.1,,,, +US-AZ-86001,US,AZ,86001,8.446,,,, +US-AZ-86002,US,AZ,86002,8.446,,,, +US-AZ-86003,US,AZ,86003,8.446,,,, +US-AZ-86004,US,AZ,86004,8.446,,,, +US-AZ-86005,US,AZ,86005,8.446,,,, +US-AZ-86011,US,AZ,86011,8.446,,,, +US-AZ-86015,US,AZ,86015,8.446,,,, +US-AZ-86016,US,AZ,86016,6.725,,,, +US-AZ-86017,US,AZ,86017,8.446,,,, +US-AZ-86018,US,AZ,86018,8.446,,,, +US-AZ-86020,US,AZ,86020,6.725,,,, +US-AZ-86021,US,AZ,86021,7.85,,,, +US-AZ-86022,US,AZ,86022,5.85,,,, +US-AZ-86023,US,AZ,86023,6.725,,,, +US-AZ-86024,US,AZ,86024,6.725,,,, +US-AZ-86025,US,AZ,86025,9.1,,,, +US-AZ-86028,US,AZ,86028,8.446,,,, +US-AZ-86029,US,AZ,86029,8.446,,,, +US-AZ-86030,US,AZ,86030,6.1,,,, +US-AZ-86031,US,AZ,86031,8.446,,,, +US-AZ-86032,US,AZ,86032,6.1,,,, +US-AZ-86033,US,AZ,86033,6.1,,,, +US-AZ-86034,US,AZ,86034,6.1,,,, +US-AZ-86035,US,AZ,86035,8.446,,,, +US-AZ-86036,US,AZ,86036,9.725,,,, +US-AZ-86038,US,AZ,86038,6.725,,,, +US-AZ-86039,US,AZ,86039,6.1,,,, +US-AZ-86040,US,AZ,86040,9.725,,,, +US-AZ-86042,US,AZ,86042,6.1,,,, +US-AZ-86043,US,AZ,86043,6.1,,,, +US-AZ-86044,US,AZ,86044,6.725,,,, +US-AZ-86045,US,AZ,86045,6.725,,,, +US-AZ-86046,US,AZ,86046,6.725,,,, +US-AZ-86047,US,AZ,86047,9.1,,,, +US-AZ-86052,US,AZ,86052,5.85,,,, +US-AZ-86053,US,AZ,86053,6.725,,,, +US-AZ-86054,US,AZ,86054,6.725,,,, +US-AZ-86301,US,AZ,86301,8.35,,,, +US-AZ-86302,US,AZ,86302,8.35,,,, +US-AZ-86303,US,AZ,86303,8.35,,,, +US-AZ-86304,US,AZ,86304,8.35,,,, +US-AZ-86305,US,AZ,86305,6.35,,,, +US-AZ-86312,US,AZ,86312,8.68,,,, +US-AZ-86313,US,AZ,86313,8.35,,,, +US-AZ-86314,US,AZ,86314,8.68,,,, +US-AZ-86315,US,AZ,86315,6.35,,,, +US-AZ-86320,US,AZ,86320,6.35,,,, +US-AZ-86321,US,AZ,86321,6.35,,,, +US-AZ-86322,US,AZ,86322,9.35,,,, +US-AZ-86323,US,AZ,86323,10.35,,,, +US-AZ-86324,US,AZ,86324,9.35,,,, +US-AZ-86325,US,AZ,86325,6.35,,,, +US-AZ-86326,US,AZ,86326,9.35,,,, +US-AZ-86327,US,AZ,86327,6.35,,,, +US-AZ-86329,US,AZ,86329,8.35,,,, +US-AZ-86331,US,AZ,86331,9.85,,,, +US-AZ-86332,US,AZ,86332,6.35,,,, +US-AZ-86333,US,AZ,86333,6.35,,,, +US-AZ-86334,US,AZ,86334,6.35,,,, +US-AZ-86335,US,AZ,86335,6.35,,,, +US-AZ-86336,US,AZ,86336,9.35,,,, +US-AZ-86337,US,AZ,86337,6.35,,,, +US-AZ-86338,US,AZ,86338,6.35,,,, +US-AZ-86339,US,AZ,86339,9.725,,,, +US-AZ-86340,US,AZ,86340,9.35,,,, +US-AZ-86341,US,AZ,86341,6.35,,,, +US-AZ-86342,US,AZ,86342,6.35,,,, +US-AZ-86343,US,AZ,86343,6.35,,,, +US-AZ-86351,US,AZ,86351,6.35,,,, +US-AZ-86401,US,AZ,86401,8.35,,,, +US-AZ-86402,US,AZ,86402,8.35,,,, +US-AZ-86403,US,AZ,86403,7.85,,,, +US-AZ-86404,US,AZ,86404,7.85,,,, +US-AZ-86405,US,AZ,86405,7.85,,,, +US-AZ-86406,US,AZ,86406,7.85,,,, +US-AZ-86409,US,AZ,86409,5.85,,,, +US-AZ-86411,US,AZ,86411,5.85,,,, +US-AZ-86412,US,AZ,86412,5.85,,,, +US-AZ-86413,US,AZ,86413,5.85,,,, +US-AZ-86426,US,AZ,86426,5.85,,,, +US-AZ-86427,US,AZ,86427,7.85,,,, +US-AZ-86429,US,AZ,86429,7.85,,,, +US-AZ-86430,US,AZ,86430,7.85,,,, +US-AZ-86431,US,AZ,86431,5.85,,,, +US-AZ-86432,US,AZ,86432,5.85,,,, +US-AZ-86433,US,AZ,86433,5.85,,,, +US-AZ-86434,US,AZ,86434,5.85,,,, +US-AZ-86435,US,AZ,86435,6.725,,,, +US-AZ-86436,US,AZ,86436,5.85,,,, +US-AZ-86437,US,AZ,86437,5.85,,,, +US-AZ-86438,US,AZ,86438,5.85,,,, +US-AZ-86439,US,AZ,86439,7.85,,,, +US-AZ-86440,US,AZ,86440,5.85,,,, +US-AZ-86441,US,AZ,86441,5.85,,,, +US-AZ-86442,US,AZ,86442,7.85,,,, +US-AZ-86443,US,AZ,86443,8.35,,,, +US-AZ-86444,US,AZ,86444,5.85,,,, +US-AZ-86445,US,AZ,86445,5.85,,,, +US-AZ-86446,US,AZ,86446,5.85,,,, +US-AZ-86502,US,AZ,86502,6.1,,,, +US-AZ-86503,US,AZ,86503,6.1,,,, +US-AZ-86504,US,AZ,86504,6.1,,,, +US-AZ-86505,US,AZ,86505,6.1,,,, +US-AZ-86506,US,AZ,86506,6.1,,,, +US-AZ-86507,US,AZ,86507,6.1,,,, +US-AZ-86508,US,AZ,86508,6.1,,,, +US-AZ-86510,US,AZ,86510,6.1,,,, +US-AZ-86511,US,AZ,86511,6.1,,,, +US-AZ-86512,US,AZ,86512,6.1,,,, +US-AZ-86514,US,AZ,86514,6.1,,,, +US-AZ-86515,US,AZ,86515,6.1,,,, +US-AZ-86520,US,AZ,86520,6.1,,,, +US-AZ-86535,US,AZ,86535,6.1,,,, +US-AZ-86538,US,AZ,86538,6.1,,,, +US-AZ-86540,US,AZ,86540,6.1,,,, +US-AZ-86545,US,AZ,86545,6.1,,,, +US-AZ-86547,US,AZ,86547,6.1,,,, +US-AZ-86556,US,AZ,86556,6.1,,,, +US-CA-90001,US,CA,90001,9,,,, +US-CA-90002,US,CA,90002,9,,,, +US-CA-90003,US,CA,90003,9,,,, +US-CA-90004,US,CA,90004,9,,,, +US-CA-90005,US,CA,90005,9,,,, +US-CA-90006,US,CA,90006,9,,,, +US-CA-90007,US,CA,90007,9,,,, +US-CA-90008,US,CA,90008,9,,,, +US-CA-90009,US,CA,90009,9,,,, +US-CA-90010,US,CA,90010,9,,,, +US-CA-90011,US,CA,90011,9,,,, +US-CA-90012,US,CA,90012,9,,,, +US-CA-90013,US,CA,90013,9,,,, +US-CA-90014,US,CA,90014,9,,,, +US-CA-90015,US,CA,90015,9,,,, +US-CA-90016,US,CA,90016,9,,,, +US-CA-90017,US,CA,90017,9,,,, +US-CA-90018,US,CA,90018,9,,,, +US-CA-90019,US,CA,90019,9,,,, +US-CA-90020,US,CA,90020,9,,,, +US-CA-90021,US,CA,90021,9,,,, +US-CA-90022,US,CA,90022,9,,,, +US-CA-90023,US,CA,90023,9,,,, +US-CA-90024,US,CA,90024,9,,,, +US-CA-90025,US,CA,90025,9,,,, +US-CA-90026,US,CA,90026,9,,,, +US-CA-90027,US,CA,90027,9,,,, +US-CA-90028,US,CA,90028,9,,,, +US-CA-90029,US,CA,90029,9,,,, +US-CA-90030,US,CA,90030,9,,,, +US-CA-90031,US,CA,90031,9,,,, +US-CA-90032,US,CA,90032,9,,,, +US-CA-90033,US,CA,90033,9,,,, +US-CA-90034,US,CA,90034,9,,,, +US-CA-90035,US,CA,90035,9,,,, +US-CA-90036,US,CA,90036,9,,,, +US-CA-90037,US,CA,90037,9,,,, +US-CA-90038,US,CA,90038,9,,,, +US-CA-90039,US,CA,90039,9,,,, +US-CA-90040,US,CA,90040,9.5,,,, +US-CA-90041,US,CA,90041,9,,,, +US-CA-90042,US,CA,90042,9,,,, +US-CA-90043,US,CA,90043,9,,,, +US-CA-90044,US,CA,90044,9,,,, +US-CA-90045,US,CA,90045,9,,,, +US-CA-90046,US,CA,90046,9,,,, +US-CA-90047,US,CA,90047,9,,,, +US-CA-90048,US,CA,90048,9,,,, +US-CA-90049,US,CA,90049,9,,,, +US-CA-90050,US,CA,90050,9,,,, +US-CA-90051,US,CA,90051,9,,,, +US-CA-90052,US,CA,90052,9,,,, +US-CA-90053,US,CA,90053,9,,,, +US-CA-90054,US,CA,90054,9,,,, +US-CA-90055,US,CA,90055,9,,,, +US-CA-90056,US,CA,90056,9,,,, +US-CA-90057,US,CA,90057,9,,,, +US-CA-90058,US,CA,90058,9,,,, +US-CA-90059,US,CA,90059,9,,,, +US-CA-90060,US,CA,90060,9,,,, +US-CA-90061,US,CA,90061,9,,,, +US-CA-90062,US,CA,90062,9,,,, +US-CA-90063,US,CA,90063,9,,,, +US-CA-90064,US,CA,90064,9,,,, +US-CA-90065,US,CA,90065,9,,,, +US-CA-90066,US,CA,90066,9,,,, +US-CA-90067,US,CA,90067,9,,,, +US-CA-90068,US,CA,90068,9,,,, +US-CA-90069,US,CA,90069,9,,,, +US-CA-90070,US,CA,90070,9,,,, +US-CA-90071,US,CA,90071,9,,,, +US-CA-90072,US,CA,90072,9,,,, +US-CA-90073,US,CA,90073,9,,,, +US-CA-90074,US,CA,90074,9,,,, +US-CA-90075,US,CA,90075,9,,,, +US-CA-90076,US,CA,90076,9,,,, +US-CA-90077,US,CA,90077,9,,,, +US-CA-90078,US,CA,90078,9,,,, +US-CA-90079,US,CA,90079,9,,,, +US-CA-90080,US,CA,90080,9,,,, +US-CA-90081,US,CA,90081,9,,,, +US-CA-90082,US,CA,90082,9,,,, +US-CA-90083,US,CA,90083,9,,,, +US-CA-90084,US,CA,90084,9,,,, +US-CA-90086,US,CA,90086,9,,,, +US-CA-90087,US,CA,90087,9,,,, +US-CA-90088,US,CA,90088,9,,,, +US-CA-90089,US,CA,90089,9,,,, +US-CA-90090,US,CA,90090,9,,,, +US-CA-90091,US,CA,90091,9,,,, +US-CA-90093,US,CA,90093,9,,,, +US-CA-90094,US,CA,90094,9,,,, +US-CA-90095,US,CA,90095,9,,,, +US-CA-90096,US,CA,90096,9,,,, +US-CA-90099,US,CA,90099,9,,,, +US-CA-90101,US,CA,90101,9,,,, +US-CA-90189,US,CA,90189,9,,,, +US-CA-90201,US,CA,90201,9,,,, +US-CA-90202,US,CA,90202,9,,,, +US-CA-90209,US,CA,90209,9,,,, +US-CA-90210,US,CA,90210,9,,,, +US-CA-90211,US,CA,90211,9,,,, +US-CA-90212,US,CA,90212,9,,,, +US-CA-90213,US,CA,90213,9,,,, +US-CA-90220,US,CA,90220,9,,,, +US-CA-90221,US,CA,90221,9,,,, +US-CA-90222,US,CA,90222,9,,,, +US-CA-90223,US,CA,90223,9,,,, +US-CA-90224,US,CA,90224,9,,,, +US-CA-90230,US,CA,90230,9.5,,,, +US-CA-90231,US,CA,90231,9.5,,,, +US-CA-90232,US,CA,90232,9.5,,,, +US-CA-90233,US,CA,90233,9.5,,,, +US-CA-90239,US,CA,90239,9,,,, +US-CA-90240,US,CA,90240,9,,,, +US-CA-90241,US,CA,90241,9,,,, +US-CA-90242,US,CA,90242,9,,,, +US-CA-90245,US,CA,90245,9,,,, +US-CA-90247,US,CA,90247,9,,,, +US-CA-90248,US,CA,90248,9,,,, +US-CA-90249,US,CA,90249,9,,,, +US-CA-90250,US,CA,90250,9,,,, +US-CA-90251,US,CA,90251,9,,,, +US-CA-90254,US,CA,90254,9,,,, +US-CA-90255,US,CA,90255,9,,,, +US-CA-90260,US,CA,90260,9,,,, +US-CA-90261,US,CA,90261,9,,,, +US-CA-90262,US,CA,90262,9,,,, +US-CA-90263,US,CA,90263,9,,,, +US-CA-90264,US,CA,90264,9,,,, +US-CA-90265,US,CA,90265,9,,,, +US-CA-90266,US,CA,90266,9,,,, +US-CA-90267,US,CA,90267,9,,,, +US-CA-90270,US,CA,90270,9,,,, +US-CA-90272,US,CA,90272,9,,,, +US-CA-90274,US,CA,90274,9,,,, +US-CA-90275,US,CA,90275,9,,,, +US-CA-90277,US,CA,90277,9,,,, +US-CA-90278,US,CA,90278,9,,,, +US-CA-90280,US,CA,90280,10,,,, +US-CA-90290,US,CA,90290,9,,,, +US-CA-90291,US,CA,90291,9,,,, +US-CA-90292,US,CA,90292,9,,,, +US-CA-90293,US,CA,90293,9,,,, +US-CA-90294,US,CA,90294,9,,,, +US-CA-90295,US,CA,90295,9,,,, +US-CA-90296,US,CA,90296,9,,,, +US-CA-90301,US,CA,90301,9.5,,,, +US-CA-90302,US,CA,90302,9.5,,,, +US-CA-90303,US,CA,90303,9.5,,,, +US-CA-90304,US,CA,90304,9,,,, +US-CA-90305,US,CA,90305,9.5,,,, +US-CA-90306,US,CA,90306,9.5,,,, +US-CA-90307,US,CA,90307,9.5,,,, +US-CA-90308,US,CA,90308,9.5,,,, +US-CA-90309,US,CA,90309,9.5,,,, +US-CA-90310,US,CA,90310,9.5,,,, +US-CA-90311,US,CA,90311,9.5,,,, +US-CA-90312,US,CA,90312,9,,,, +US-CA-90401,US,CA,90401,9.5,,,, +US-CA-90402,US,CA,90402,9.5,,,, +US-CA-90403,US,CA,90403,9.5,,,, +US-CA-90404,US,CA,90404,9.5,,,, +US-CA-90405,US,CA,90405,9.5,,,, +US-CA-90406,US,CA,90406,9.5,,,, +US-CA-90407,US,CA,90407,9.5,,,, +US-CA-90408,US,CA,90408,9.5,,,, +US-CA-90409,US,CA,90409,9.5,,,, +US-CA-90410,US,CA,90410,9.5,,,, +US-CA-90411,US,CA,90411,9.5,,,, +US-CA-90501,US,CA,90501,9,,,, +US-CA-90502,US,CA,90502,9,,,, +US-CA-90503,US,CA,90503,9,,,, +US-CA-90504,US,CA,90504,9,,,, +US-CA-90505,US,CA,90505,9,,,, +US-CA-90506,US,CA,90506,9,,,, +US-CA-90507,US,CA,90507,9,,,, +US-CA-90508,US,CA,90508,9,,,, +US-CA-90509,US,CA,90509,9,,,, +US-CA-90510,US,CA,90510,9,,,, +US-CA-90601,US,CA,90601,9,,,, +US-CA-90602,US,CA,90602,9,,,, +US-CA-90603,US,CA,90603,9,,,, +US-CA-90604,US,CA,90604,9,,,, +US-CA-90605,US,CA,90605,9,,,, +US-CA-90606,US,CA,90606,9,,,, +US-CA-90607,US,CA,90607,9,,,, +US-CA-90608,US,CA,90608,9,,,, +US-CA-90609,US,CA,90609,9,,,, +US-CA-90610,US,CA,90610,9,,,, +US-CA-90620,US,CA,90620,8,,,, +US-CA-90621,US,CA,90621,8,,,, +US-CA-90622,US,CA,90622,8,,,, +US-CA-90623,US,CA,90623,8,,,, +US-CA-90624,US,CA,90624,8,,,, +US-CA-90630,US,CA,90630,8,,,, +US-CA-90631,US,CA,90631,8.5,,,, +US-CA-90632,US,CA,90632,8.5,,,, +US-CA-90633,US,CA,90633,8.5,,,, +US-CA-90637,US,CA,90637,10,,,, +US-CA-90638,US,CA,90638,10,,,, +US-CA-90639,US,CA,90639,10,,,, +US-CA-90640,US,CA,90640,9,,,, +US-CA-90650,US,CA,90650,9,,,, +US-CA-90651,US,CA,90651,9,,,, +US-CA-90652,US,CA,90652,9,,,, +US-CA-90660,US,CA,90660,10,,,, +US-CA-90661,US,CA,90661,10,,,, +US-CA-90662,US,CA,90662,10,,,, +US-CA-90670,US,CA,90670,9,,,, +US-CA-90671,US,CA,90671,9,,,, +US-CA-90680,US,CA,90680,8,,,, +US-CA-90701,US,CA,90701,9,,,, +US-CA-90702,US,CA,90702,9,,,, +US-CA-90703,US,CA,90703,9,,,, +US-CA-90704,US,CA,90704,9.5,,,, +US-CA-90706,US,CA,90706,9,,,, +US-CA-90707,US,CA,90707,9,,,, +US-CA-90710,US,CA,90710,9,,,, +US-CA-90711,US,CA,90711,9,,,, +US-CA-90712,US,CA,90712,9,,,, +US-CA-90713,US,CA,90713,9,,,, +US-CA-90714,US,CA,90714,9,,,, +US-CA-90715,US,CA,90715,9,,,, +US-CA-90716,US,CA,90716,9,,,, +US-CA-90717,US,CA,90717,9,,,, +US-CA-90720,US,CA,90720,8,,,, +US-CA-90721,US,CA,90721,8,,,, +US-CA-90723,US,CA,90723,9,,,, +US-CA-90731,US,CA,90731,9,,,, +US-CA-90732,US,CA,90732,9,,,, +US-CA-90733,US,CA,90733,9,,,, +US-CA-90734,US,CA,90734,9,,,, +US-CA-90740,US,CA,90740,8,,,, +US-CA-90742,US,CA,90742,8,,,, +US-CA-90743,US,CA,90743,8,,,, +US-CA-90744,US,CA,90744,9,,,, +US-CA-90745,US,CA,90745,9,,,, +US-CA-90746,US,CA,90746,9,,,, +US-CA-90747,US,CA,90747,9,,,, +US-CA-90748,US,CA,90748,9,,,, +US-CA-90749,US,CA,90749,9,,,, +US-CA-90755,US,CA,90755,9,,,, +US-CA-90801,US,CA,90801,9,,,, +US-CA-90802,US,CA,90802,9,,,, +US-CA-90803,US,CA,90803,9,,,, +US-CA-90804,US,CA,90804,9,,,, +US-CA-90805,US,CA,90805,9,,,, +US-CA-90806,US,CA,90806,9,,,, +US-CA-90807,US,CA,90807,9,,,, +US-CA-90808,US,CA,90808,9,,,, +US-CA-90809,US,CA,90809,9,,,, +US-CA-90810,US,CA,90810,9,,,, +US-CA-90813,US,CA,90813,9,,,, +US-CA-90814,US,CA,90814,9,,,, +US-CA-90815,US,CA,90815,9,,,, +US-CA-90822,US,CA,90822,9,,,, +US-CA-90831,US,CA,90831,9,,,, +US-CA-90832,US,CA,90832,9,,,, +US-CA-90833,US,CA,90833,9,,,, +US-CA-90834,US,CA,90834,9,,,, +US-CA-90835,US,CA,90835,9,,,, +US-CA-90840,US,CA,90840,9,,,, +US-CA-90842,US,CA,90842,9,,,, +US-CA-90844,US,CA,90844,9,,,, +US-CA-90846,US,CA,90846,9,,,, +US-CA-90847,US,CA,90847,9,,,, +US-CA-90848,US,CA,90848,9,,,, +US-CA-90853,US,CA,90853,9,,,, +US-CA-90895,US,CA,90895,9,,,, +US-CA-90899,US,CA,90899,9,,,, +US-CA-91001,US,CA,91001,9,,,, +US-CA-91003,US,CA,91003,9,,,, +US-CA-91006,US,CA,91006,9,,,, +US-CA-91007,US,CA,91007,9,,,, +US-CA-91008,US,CA,91008,9,,,, +US-CA-91009,US,CA,91009,9,,,, +US-CA-91010,US,CA,91010,9,,,, +US-CA-91011,US,CA,91011,9,,,, +US-CA-91012,US,CA,91012,9,,,, +US-CA-91016,US,CA,91016,9,,,, +US-CA-91017,US,CA,91017,9,,,, +US-CA-91020,US,CA,91020,9,,,, +US-CA-91021,US,CA,91021,9,,,, +US-CA-91024,US,CA,91024,9,,,, +US-CA-91025,US,CA,91025,9,,,, +US-CA-91030,US,CA,91030,9,,,, +US-CA-91031,US,CA,91031,9,,,, +US-CA-91040,US,CA,91040,9,,,, +US-CA-91041,US,CA,91041,9,,,, +US-CA-91042,US,CA,91042,9,,,, +US-CA-91043,US,CA,91043,9,,,, +US-CA-91046,US,CA,91046,9,,,, +US-CA-91066,US,CA,91066,9,,,, +US-CA-91077,US,CA,91077,9,,,, +US-CA-91101,US,CA,91101,9,,,, +US-CA-91102,US,CA,91102,9,,,, +US-CA-91103,US,CA,91103,9,,,, +US-CA-91104,US,CA,91104,9,,,, +US-CA-91105,US,CA,91105,9,,,, +US-CA-91106,US,CA,91106,9,,,, +US-CA-91107,US,CA,91107,9,,,, +US-CA-91108,US,CA,91108,9,,,, +US-CA-91109,US,CA,91109,9,,,, +US-CA-91110,US,CA,91110,9,,,, +US-CA-91114,US,CA,91114,9,,,, +US-CA-91115,US,CA,91115,9,,,, +US-CA-91116,US,CA,91116,9,,,, +US-CA-91117,US,CA,91117,9,,,, +US-CA-91118,US,CA,91118,9,,,, +US-CA-91121,US,CA,91121,9,,,, +US-CA-91123,US,CA,91123,9,,,, +US-CA-91124,US,CA,91124,9,,,, +US-CA-91125,US,CA,91125,9,,,, +US-CA-91126,US,CA,91126,9,,,, +US-CA-91129,US,CA,91129,9,,,, +US-CA-91182,US,CA,91182,9,,,, +US-CA-91184,US,CA,91184,9,,,, +US-CA-91185,US,CA,91185,9,,,, +US-CA-91188,US,CA,91188,9,,,, +US-CA-91189,US,CA,91189,9,,,, +US-CA-91199,US,CA,91199,9,,,, +US-CA-91201,US,CA,91201,9,,,, +US-CA-91202,US,CA,91202,9,,,, +US-CA-91203,US,CA,91203,9,,,, +US-CA-91204,US,CA,91204,9,,,, +US-CA-91205,US,CA,91205,9,,,, +US-CA-91206,US,CA,91206,9,,,, +US-CA-91207,US,CA,91207,9,,,, +US-CA-91208,US,CA,91208,9,,,, +US-CA-91209,US,CA,91209,9,,,, +US-CA-91210,US,CA,91210,9,,,, +US-CA-91214,US,CA,91214,9,,,, +US-CA-91221,US,CA,91221,9,,,, +US-CA-91222,US,CA,91222,9,,,, +US-CA-91224,US,CA,91224,9,,,, +US-CA-91225,US,CA,91225,9,,,, +US-CA-91226,US,CA,91226,9,,,, +US-CA-91301,US,CA,91301,9,,,, +US-CA-91302,US,CA,91302,9,,,, +US-CA-91303,US,CA,91303,9,,,, +US-CA-91304,US,CA,91304,9,,,, +US-CA-91305,US,CA,91305,9,,,, +US-CA-91306,US,CA,91306,9,,,, +US-CA-91307,US,CA,91307,9,,,, +US-CA-91308,US,CA,91308,9,,,, +US-CA-91309,US,CA,91309,9,,,, +US-CA-91310,US,CA,91310,9,,,, +US-CA-91311,US,CA,91311,9,,,, +US-CA-91313,US,CA,91313,9,,,, +US-CA-91316,US,CA,91316,9,,,, +US-CA-91319,US,CA,91319,7.5,,,, +US-CA-91320,US,CA,91320,7.5,,,, +US-CA-91321,US,CA,91321,9,,,, +US-CA-91322,US,CA,91322,9,,,, +US-CA-91324,US,CA,91324,9,,,, +US-CA-91325,US,CA,91325,9,,,, +US-CA-91326,US,CA,91326,9,,,, +US-CA-91327,US,CA,91327,9,,,, +US-CA-91328,US,CA,91328,9,,,, +US-CA-91329,US,CA,91329,9,,,, +US-CA-91330,US,CA,91330,9,,,, +US-CA-91331,US,CA,91331,9,,,, +US-CA-91333,US,CA,91333,9,,,, +US-CA-91334,US,CA,91334,9,,,, +US-CA-91335,US,CA,91335,9,,,, +US-CA-91337,US,CA,91337,9,,,, +US-CA-91340,US,CA,91340,9.5,,,, +US-CA-91341,US,CA,91341,9.5,,,, +US-CA-91342,US,CA,91342,9,,,, +US-CA-91343,US,CA,91343,9,,,, +US-CA-91344,US,CA,91344,9,,,, +US-CA-91345,US,CA,91345,9,,,, +US-CA-91346,US,CA,91346,9,,,, +US-CA-91350,US,CA,91350,9,,,, +US-CA-91351,US,CA,91351,9,,,, +US-CA-91352,US,CA,91352,9,,,, +US-CA-91353,US,CA,91353,9,,,, +US-CA-91354,US,CA,91354,9,,,, +US-CA-91355,US,CA,91355,9,,,, +US-CA-91356,US,CA,91356,9,,,, +US-CA-91357,US,CA,91357,9,,,, +US-CA-91358,US,CA,91358,7.5,,,, +US-CA-91359,US,CA,91359,7.5,,,, +US-CA-91360,US,CA,91360,7.5,,,, +US-CA-91361,US,CA,91361,7.5,,,, +US-CA-91362,US,CA,91362,7.5,,,, +US-CA-91364,US,CA,91364,9,,,, +US-CA-91365,US,CA,91365,9,,,, +US-CA-91367,US,CA,91367,9,,,, +US-CA-91371,US,CA,91371,9,,,, +US-CA-91372,US,CA,91372,9,,,, +US-CA-91376,US,CA,91376,9,,,, +US-CA-91377,US,CA,91377,7.5,,,, +US-CA-91380,US,CA,91380,9,,,, +US-CA-91381,US,CA,91381,9,,,, +US-CA-91382,US,CA,91382,9,,,, +US-CA-91383,US,CA,91383,9,,,, +US-CA-91384,US,CA,91384,9,,,, +US-CA-91385,US,CA,91385,9,,,, +US-CA-91386,US,CA,91386,9,,,, +US-CA-91387,US,CA,91387,9,,,, +US-CA-91390,US,CA,91390,9,,,, +US-CA-91392,US,CA,91392,9,,,, +US-CA-91393,US,CA,91393,9,,,, +US-CA-91394,US,CA,91394,9,,,, +US-CA-91395,US,CA,91395,9,,,, +US-CA-91396,US,CA,91396,9,,,, +US-CA-91401,US,CA,91401,9,,,, +US-CA-91402,US,CA,91402,9,,,, +US-CA-91403,US,CA,91403,9,,,, +US-CA-91404,US,CA,91404,9,,,, +US-CA-91405,US,CA,91405,9,,,, +US-CA-91406,US,CA,91406,9,,,, +US-CA-91407,US,CA,91407,9,,,, +US-CA-91408,US,CA,91408,9,,,, +US-CA-91409,US,CA,91409,9,,,, +US-CA-91410,US,CA,91410,9,,,, +US-CA-91411,US,CA,91411,9,,,, +US-CA-91412,US,CA,91412,9,,,, +US-CA-91413,US,CA,91413,9,,,, +US-CA-91416,US,CA,91416,9,,,, +US-CA-91423,US,CA,91423,9,,,, +US-CA-91426,US,CA,91426,9,,,, +US-CA-91436,US,CA,91436,9,,,, +US-CA-91470,US,CA,91470,9,,,, +US-CA-91482,US,CA,91482,9,,,, +US-CA-91495,US,CA,91495,9,,,, +US-CA-91496,US,CA,91496,9,,,, +US-CA-91499,US,CA,91499,9,,,, +US-CA-91501,US,CA,91501,9,,,, +US-CA-91502,US,CA,91502,9,,,, +US-CA-91503,US,CA,91503,9,,,, +US-CA-91504,US,CA,91504,9,,,, +US-CA-91505,US,CA,91505,9,,,, +US-CA-91506,US,CA,91506,9,,,, +US-CA-91507,US,CA,91507,9,,,, +US-CA-91508,US,CA,91508,9,,,, +US-CA-91510,US,CA,91510,9,,,, +US-CA-91521,US,CA,91521,9,,,, +US-CA-91522,US,CA,91522,9,,,, +US-CA-91523,US,CA,91523,9,,,, +US-CA-91526,US,CA,91526,9,,,, +US-CA-91601,US,CA,91601,9,,,, +US-CA-91602,US,CA,91602,9,,,, +US-CA-91603,US,CA,91603,9,,,, +US-CA-91604,US,CA,91604,9,,,, +US-CA-91605,US,CA,91605,9,,,, +US-CA-91606,US,CA,91606,9,,,, +US-CA-91607,US,CA,91607,9,,,, +US-CA-91608,US,CA,91608,9,,,, +US-CA-91609,US,CA,91609,9,,,, +US-CA-91610,US,CA,91610,9,,,, +US-CA-91611,US,CA,91611,9,,,, +US-CA-91612,US,CA,91612,9,,,, +US-CA-91614,US,CA,91614,9,,,, +US-CA-91615,US,CA,91615,9,,,, +US-CA-91616,US,CA,91616,9,,,, +US-CA-91617,US,CA,91617,9,,,, +US-CA-91618,US,CA,91618,9,,,, +US-CA-91701,US,CA,91701,8,,,, +US-CA-91702,US,CA,91702,9,,,, +US-CA-91706,US,CA,91706,9,,,, +US-CA-91708,US,CA,91708,8,,,, +US-CA-91709,US,CA,91709,8,,,, +US-CA-91710,US,CA,91710,8,,,, +US-CA-91711,US,CA,91711,9,,,, +US-CA-91714,US,CA,91714,9,,,, +US-CA-91715,US,CA,91715,9,,,, +US-CA-91716,US,CA,91716,9,,,, +US-CA-91722,US,CA,91722,9,,,, +US-CA-91723,US,CA,91723,9,,,, +US-CA-91724,US,CA,91724,9,,,, +US-CA-91729,US,CA,91729,8,,,, +US-CA-91730,US,CA,91730,8,,,, +US-CA-91731,US,CA,91731,9.5,,,, +US-CA-91732,US,CA,91732,9.5,,,, +US-CA-91733,US,CA,91733,9.5,,,, +US-CA-91734,US,CA,91734,9.5,,,, +US-CA-91735,US,CA,91735,9.5,,,, +US-CA-91737,US,CA,91737,8,,,, +US-CA-91739,US,CA,91739,8,,,, +US-CA-91740,US,CA,91740,9,,,, +US-CA-91741,US,CA,91741,9,,,, +US-CA-91743,US,CA,91743,8,,,, +US-CA-91744,US,CA,91744,9,,,, +US-CA-91745,US,CA,91745,9,,,, +US-CA-91746,US,CA,91746,9,,,, +US-CA-91747,US,CA,91747,9,,,, +US-CA-91748,US,CA,91748,9,,,, +US-CA-91749,US,CA,91749,9,,,, +US-CA-91750,US,CA,91750,9,,,, +US-CA-91752,US,CA,91752,8,,,, +US-CA-91754,US,CA,91754,9,,,, +US-CA-91755,US,CA,91755,9,,,, +US-CA-91756,US,CA,91756,9,,,, +US-CA-91758,US,CA,91758,8,,,, +US-CA-91759,US,CA,91759,8,,,, +US-CA-91761,US,CA,91761,8,,,, +US-CA-91762,US,CA,91762,8,,,, +US-CA-91763,US,CA,91763,8.25,,,, +US-CA-91764,US,CA,91764,8,,,, +US-CA-91765,US,CA,91765,9,,,, +US-CA-91766,US,CA,91766,9,,,, +US-CA-91767,US,CA,91767,9,,,, +US-CA-91768,US,CA,91768,9,,,, +US-CA-91769,US,CA,91769,9,,,, +US-CA-91770,US,CA,91770,9,,,, +US-CA-91771,US,CA,91771,9,,,, +US-CA-91772,US,CA,91772,9,,,, +US-CA-91773,US,CA,91773,9,,,, +US-CA-91775,US,CA,91775,9,,,, +US-CA-91776,US,CA,91776,9,,,, +US-CA-91778,US,CA,91778,9,,,, +US-CA-91780,US,CA,91780,9,,,, +US-CA-91784,US,CA,91784,8,,,, +US-CA-91785,US,CA,91785,8,,,, +US-CA-91786,US,CA,91786,8,,,, +US-CA-91788,US,CA,91788,9,,,, +US-CA-91789,US,CA,91789,9,,,, +US-CA-91790,US,CA,91790,9,,,, +US-CA-91791,US,CA,91791,9,,,, +US-CA-91792,US,CA,91792,9,,,, +US-CA-91793,US,CA,91793,9,,,, +US-CA-91801,US,CA,91801,9,,,, +US-CA-91802,US,CA,91802,9,,,, +US-CA-91803,US,CA,91803,9,,,, +US-CA-91804,US,CA,91804,9,,,, +US-CA-91896,US,CA,91896,9,,,, +US-CA-91899,US,CA,91899,9,,,, +US-CA-91901,US,CA,91901,8,,,, +US-CA-91902,US,CA,91902,8,,,, +US-CA-91903,US,CA,91903,8,,,, +US-CA-91905,US,CA,91905,8,,,, +US-CA-91906,US,CA,91906,8,,,, +US-CA-91908,US,CA,91908,8,,,, +US-CA-91909,US,CA,91909,8,,,, +US-CA-91910,US,CA,91910,8,,,, +US-CA-91911,US,CA,91911,8,,,, +US-CA-91912,US,CA,91912,8,,,, +US-CA-91913,US,CA,91913,8,,,, +US-CA-91914,US,CA,91914,8,,,, +US-CA-91915,US,CA,91915,8,,,, +US-CA-91916,US,CA,91916,8,,,, +US-CA-91917,US,CA,91917,8,,,, +US-CA-91921,US,CA,91921,8,,,, +US-CA-91931,US,CA,91931,8,,,, +US-CA-91932,US,CA,91932,8,,,, +US-CA-91933,US,CA,91933,8,,,, +US-CA-91934,US,CA,91934,8,,,, +US-CA-91935,US,CA,91935,8,,,, +US-CA-91941,US,CA,91941,8.75,,,, +US-CA-91942,US,CA,91942,8.75,,,, +US-CA-91943,US,CA,91943,8.75,,,, +US-CA-91944,US,CA,91944,8,,,, +US-CA-91945,US,CA,91945,8,,,, +US-CA-91946,US,CA,91946,8,,,, +US-CA-91947,US,CA,91947,8,,,, +US-CA-91948,US,CA,91948,8,,,, +US-CA-91950,US,CA,91950,9,,,, +US-CA-91951,US,CA,91951,9,,,, +US-CA-91962,US,CA,91962,8,,,, +US-CA-91963,US,CA,91963,8,,,, +US-CA-91976,US,CA,91976,8,,,, +US-CA-91977,US,CA,91977,8,,,, +US-CA-91978,US,CA,91978,8,,,, +US-CA-91979,US,CA,91979,8,,,, +US-CA-91980,US,CA,91980,8,,,, +US-CA-91987,US,CA,91987,8,,,, +US-CA-92003,US,CA,92003,8,,,, +US-CA-92004,US,CA,92004,8,,,, +US-CA-92007,US,CA,92007,8,,,, +US-CA-92008,US,CA,92008,8,,,, +US-CA-92009,US,CA,92009,8,,,, +US-CA-92010,US,CA,92010,8,,,, +US-CA-92011,US,CA,92011,8,,,, +US-CA-92013,US,CA,92013,8,,,, +US-CA-92014,US,CA,92014,8,,,, +US-CA-92018,US,CA,92018,8,,,, +US-CA-92019,US,CA,92019,8,,,, +US-CA-92020,US,CA,92020,9,,,, +US-CA-92021,US,CA,92021,8,,,, +US-CA-92022,US,CA,92022,9,,,, +US-CA-92023,US,CA,92023,8,,,, +US-CA-92024,US,CA,92024,8,,,, +US-CA-92025,US,CA,92025,8,,,, +US-CA-92026,US,CA,92026,8,,,, +US-CA-92027,US,CA,92027,8,,,, +US-CA-92028,US,CA,92028,8,,,, +US-CA-92029,US,CA,92029,8,,,, +US-CA-92030,US,CA,92030,8,,,, +US-CA-92033,US,CA,92033,8,,,, +US-CA-92036,US,CA,92036,8,,,, +US-CA-92037,US,CA,92037,8,,,, +US-CA-92038,US,CA,92038,8,,,, +US-CA-92039,US,CA,92039,8,,,, +US-CA-92040,US,CA,92040,8,,,, +US-CA-92046,US,CA,92046,8,,,, +US-CA-92049,US,CA,92049,8,,,, +US-CA-92051,US,CA,92051,8,,,, +US-CA-92052,US,CA,92052,8,,,, +US-CA-92054,US,CA,92054,8,,,, +US-CA-92056,US,CA,92056,8,,,, +US-CA-92057,US,CA,92057,8,,,, +US-CA-92058,US,CA,92058,8,,,, +US-CA-92059,US,CA,92059,8,,,, +US-CA-92060,US,CA,92060,8,,,, +US-CA-92061,US,CA,92061,8,,,, +US-CA-92064,US,CA,92064,8,,,, +US-CA-92065,US,CA,92065,8,,,, +US-CA-92066,US,CA,92066,8,,,, +US-CA-92067,US,CA,92067,8,,,, +US-CA-92068,US,CA,92068,8,,,, +US-CA-92069,US,CA,92069,8,,,, +US-CA-92070,US,CA,92070,8,,,, +US-CA-92071,US,CA,92071,8,,,, +US-CA-92072,US,CA,92072,8,,,, +US-CA-92074,US,CA,92074,8,,,, +US-CA-92075,US,CA,92075,8,,,, +US-CA-92078,US,CA,92078,8,,,, +US-CA-92079,US,CA,92079,8,,,, +US-CA-92081,US,CA,92081,8.5,,,, +US-CA-92082,US,CA,92082,8,,,, +US-CA-92083,US,CA,92083,8.5,,,, +US-CA-92084,US,CA,92084,8.5,,,, +US-CA-92085,US,CA,92085,8.5,,,, +US-CA-92086,US,CA,92086,8,,,, +US-CA-92088,US,CA,92088,8,,,, +US-CA-92091,US,CA,92091,8,,,, +US-CA-92092,US,CA,92092,8,,,, +US-CA-92093,US,CA,92093,8,,,, +US-CA-92096,US,CA,92096,8,,,, +US-CA-92101,US,CA,92101,8,,,, +US-CA-92102,US,CA,92102,8,,,, +US-CA-92103,US,CA,92103,8,,,, +US-CA-92104,US,CA,92104,8,,,, +US-CA-92105,US,CA,92105,8,,,, +US-CA-92106,US,CA,92106,8,,,, +US-CA-92107,US,CA,92107,8,,,, +US-CA-92108,US,CA,92108,8,,,, +US-CA-92109,US,CA,92109,8,,,, +US-CA-92110,US,CA,92110,8,,,, +US-CA-92111,US,CA,92111,8,,,, +US-CA-92112,US,CA,92112,8,,,, +US-CA-92113,US,CA,92113,8,,,, +US-CA-92114,US,CA,92114,8,,,, +US-CA-92115,US,CA,92115,8,,,, +US-CA-92116,US,CA,92116,8,,,, +US-CA-92117,US,CA,92117,8,,,, +US-CA-92118,US,CA,92118,8,,,, +US-CA-92119,US,CA,92119,8,,,, +US-CA-92120,US,CA,92120,8,,,, +US-CA-92121,US,CA,92121,8,,,, +US-CA-92122,US,CA,92122,8,,,, +US-CA-92123,US,CA,92123,8,,,, +US-CA-92124,US,CA,92124,8,,,, +US-CA-92126,US,CA,92126,8,,,, +US-CA-92127,US,CA,92127,8,,,, +US-CA-92128,US,CA,92128,8,,,, +US-CA-92129,US,CA,92129,8,,,, +US-CA-92130,US,CA,92130,8,,,, +US-CA-92131,US,CA,92131,8,,,, +US-CA-92132,US,CA,92132,8,,,, +US-CA-92134,US,CA,92134,8,,,, +US-CA-92135,US,CA,92135,8,,,, +US-CA-92136,US,CA,92136,8,,,, +US-CA-92137,US,CA,92137,8,,,, +US-CA-92138,US,CA,92138,8,,,, +US-CA-92139,US,CA,92139,8,,,, +US-CA-92140,US,CA,92140,8,,,, +US-CA-92142,US,CA,92142,8,,,, +US-CA-92143,US,CA,92143,8,,,, +US-CA-92145,US,CA,92145,8,,,, +US-CA-92147,US,CA,92147,8,,,, +US-CA-92149,US,CA,92149,8,,,, +US-CA-92150,US,CA,92150,8,,,, +US-CA-92152,US,CA,92152,8,,,, +US-CA-92153,US,CA,92153,8,,,, +US-CA-92154,US,CA,92154,8,,,, +US-CA-92155,US,CA,92155,8,,,, +US-CA-92158,US,CA,92158,8,,,, +US-CA-92159,US,CA,92159,8,,,, +US-CA-92160,US,CA,92160,8,,,, +US-CA-92161,US,CA,92161,8,,,, +US-CA-92163,US,CA,92163,8,,,, +US-CA-92164,US,CA,92164,8,,,, +US-CA-92165,US,CA,92165,8,,,, +US-CA-92166,US,CA,92166,8,,,, +US-CA-92167,US,CA,92167,8,,,, +US-CA-92168,US,CA,92168,8,,,, +US-CA-92169,US,CA,92169,8,,,, +US-CA-92170,US,CA,92170,8,,,, +US-CA-92171,US,CA,92171,8,,,, +US-CA-92172,US,CA,92172,8,,,, +US-CA-92173,US,CA,92173,8,,,, +US-CA-92174,US,CA,92174,8,,,, +US-CA-92175,US,CA,92175,8,,,, +US-CA-92176,US,CA,92176,8,,,, +US-CA-92177,US,CA,92177,8,,,, +US-CA-92178,US,CA,92178,8,,,, +US-CA-92179,US,CA,92179,8,,,, +US-CA-92182,US,CA,92182,8,,,, +US-CA-92186,US,CA,92186,8,,,, +US-CA-92187,US,CA,92187,8,,,, +US-CA-92190,US,CA,92190,8,,,, +US-CA-92191,US,CA,92191,8,,,, +US-CA-92192,US,CA,92192,8,,,, +US-CA-92193,US,CA,92193,8,,,, +US-CA-92195,US,CA,92195,8,,,, +US-CA-92196,US,CA,92196,8,,,, +US-CA-92197,US,CA,92197,8,,,, +US-CA-92198,US,CA,92198,8,,,, +US-CA-92199,US,CA,92199,8,,,, +US-CA-92201,US,CA,92201,8,,,, +US-CA-92202,US,CA,92202,8,,,, +US-CA-92203,US,CA,92203,8,,,, +US-CA-92210,US,CA,92210,8,,,, +US-CA-92211,US,CA,92211,8,,,, +US-CA-92220,US,CA,92220,8,,,, +US-CA-92222,US,CA,92222,8,,,, +US-CA-92223,US,CA,92223,8,,,, +US-CA-92225,US,CA,92225,8,,,, +US-CA-92226,US,CA,92226,8,,,, +US-CA-92227,US,CA,92227,8,,,, +US-CA-92230,US,CA,92230,8,,,, +US-CA-92231,US,CA,92231,8.5,,,, +US-CA-92232,US,CA,92232,8.5,,,, +US-CA-92233,US,CA,92233,8,,,, +US-CA-92234,US,CA,92234,9,,,, +US-CA-92235,US,CA,92235,9,,,, +US-CA-92236,US,CA,92236,8,,,, +US-CA-92239,US,CA,92239,8,,,, +US-CA-92240,US,CA,92240,8,,,, +US-CA-92241,US,CA,92241,8,,,, +US-CA-92242,US,CA,92242,8,,,, +US-CA-92243,US,CA,92243,8,,,, +US-CA-92244,US,CA,92244,8,,,, +US-CA-92247,US,CA,92247,8,,,, +US-CA-92248,US,CA,92248,8,,,, +US-CA-92249,US,CA,92249,8,,,, +US-CA-92250,US,CA,92250,8,,,, +US-CA-92251,US,CA,92251,8,,,, +US-CA-92252,US,CA,92252,8,,,, +US-CA-92253,US,CA,92253,8,,,, +US-CA-92254,US,CA,92254,8,,,, +US-CA-92255,US,CA,92255,8,,,, +US-CA-92256,US,CA,92256,8,,,, +US-CA-92257,US,CA,92257,8,,,, +US-CA-92258,US,CA,92258,8,,,, +US-CA-92259,US,CA,92259,8,,,, +US-CA-92260,US,CA,92260,8,,,, +US-CA-92261,US,CA,92261,8,,,, +US-CA-92262,US,CA,92262,9,,,, +US-CA-92263,US,CA,92263,9,,,, +US-CA-92264,US,CA,92264,9,,,, +US-CA-92266,US,CA,92266,8,,,, +US-CA-92267,US,CA,92267,8,,,, +US-CA-92268,US,CA,92268,8,,,, +US-CA-92270,US,CA,92270,8,,,, +US-CA-92273,US,CA,92273,8,,,, +US-CA-92274,US,CA,92274,8,,,, +US-CA-92275,US,CA,92275,8,,,, +US-CA-92276,US,CA,92276,8,,,, +US-CA-92277,US,CA,92277,8,,,, +US-CA-92278,US,CA,92278,8,,,, +US-CA-92280,US,CA,92280,8,,,, +US-CA-92281,US,CA,92281,8,,,, +US-CA-92282,US,CA,92282,8,,,, +US-CA-92283,US,CA,92283,8,,,, +US-CA-92284,US,CA,92284,8,,,, +US-CA-92285,US,CA,92285,8,,,, +US-CA-92286,US,CA,92286,8,,,, +US-CA-92301,US,CA,92301,8,,,, +US-CA-92304,US,CA,92304,8,,,, +US-CA-92305,US,CA,92305,8,,,, +US-CA-92307,US,CA,92307,8,,,, +US-CA-92308,US,CA,92308,8,,,, +US-CA-92309,US,CA,92309,8,,,, +US-CA-92310,US,CA,92310,8,,,, +US-CA-92311,US,CA,92311,8,,,, +US-CA-92312,US,CA,92312,8,,,, +US-CA-92313,US,CA,92313,8,,,, +US-CA-92314,US,CA,92314,8,,,, +US-CA-92315,US,CA,92315,8,,,, +US-CA-92316,US,CA,92316,8,,,, +US-CA-92317,US,CA,92317,8,,,, +US-CA-92318,US,CA,92318,8,,,, +US-CA-92320,US,CA,92320,8,,,, +US-CA-92321,US,CA,92321,8,,,, +US-CA-92322,US,CA,92322,8,,,, +US-CA-92324,US,CA,92324,8,,,, +US-CA-92325,US,CA,92325,8,,,, +US-CA-92326,US,CA,92326,8,,,, +US-CA-92327,US,CA,92327,8,,,, +US-CA-92328,US,CA,92328,8,,,, +US-CA-92329,US,CA,92329,8,,,, +US-CA-92331,US,CA,92331,8,,,, +US-CA-92332,US,CA,92332,8,,,, +US-CA-92333,US,CA,92333,8,,,, +US-CA-92334,US,CA,92334,8,,,, +US-CA-92335,US,CA,92335,8,,,, +US-CA-92336,US,CA,92336,8,,,, +US-CA-92337,US,CA,92337,8,,,, +US-CA-92339,US,CA,92339,8,,,, +US-CA-92340,US,CA,92340,8,,,, +US-CA-92341,US,CA,92341,8,,,, +US-CA-92342,US,CA,92342,8,,,, +US-CA-92344,US,CA,92344,8,,,, +US-CA-92345,US,CA,92345,8,,,, +US-CA-92346,US,CA,92346,8,,,, +US-CA-92347,US,CA,92347,8,,,, +US-CA-92350,US,CA,92350,8,,,, +US-CA-92352,US,CA,92352,8,,,, +US-CA-92354,US,CA,92354,8,,,, +US-CA-92356,US,CA,92356,8,,,, +US-CA-92357,US,CA,92357,8,,,, +US-CA-92358,US,CA,92358,8,,,, +US-CA-92359,US,CA,92359,8,,,, +US-CA-92363,US,CA,92363,8,,,, +US-CA-92364,US,CA,92364,8,,,, +US-CA-92365,US,CA,92365,8,,,, +US-CA-92366,US,CA,92366,8,,,, +US-CA-92368,US,CA,92368,8,,,, +US-CA-92369,US,CA,92369,8,,,, +US-CA-92371,US,CA,92371,8,,,, +US-CA-92372,US,CA,92372,8,,,, +US-CA-92373,US,CA,92373,8,,,, +US-CA-92374,US,CA,92374,8,,,, +US-CA-92375,US,CA,92375,8,,,, +US-CA-92376,US,CA,92376,8,,,, +US-CA-92377,US,CA,92377,8,,,, +US-CA-92378,US,CA,92378,8,,,, +US-CA-92382,US,CA,92382,8,,,, +US-CA-92384,US,CA,92384,8,,,, +US-CA-92385,US,CA,92385,8,,,, +US-CA-92386,US,CA,92386,8,,,, +US-CA-92389,US,CA,92389,8,,,, +US-CA-92391,US,CA,92391,8,,,, +US-CA-92392,US,CA,92392,8,,,, +US-CA-92393,US,CA,92393,8,,,, +US-CA-92394,US,CA,92394,8,,,, +US-CA-92395,US,CA,92395,8,,,, +US-CA-92397,US,CA,92397,8,,,, +US-CA-92398,US,CA,92398,8,,,, +US-CA-92399,US,CA,92399,8,,,, +US-CA-92401,US,CA,92401,8.25,,,, +US-CA-92402,US,CA,92402,8.25,,,, +US-CA-92403,US,CA,92403,8.25,,,, +US-CA-92404,US,CA,92404,8,,,, +US-CA-92405,US,CA,92405,8.25,,,, +US-CA-92406,US,CA,92406,8.25,,,, +US-CA-92407,US,CA,92407,8,,,, +US-CA-92408,US,CA,92408,8.25,,,, +US-CA-92410,US,CA,92410,8.25,,,, +US-CA-92411,US,CA,92411,8.25,,,, +US-CA-92412,US,CA,92412,8.25,,,, +US-CA-92413,US,CA,92413,8.25,,,, +US-CA-92415,US,CA,92415,8.25,,,, +US-CA-92418,US,CA,92418,8.25,,,, +US-CA-92423,US,CA,92423,8.25,,,, +US-CA-92427,US,CA,92427,8,,,, +US-CA-92501,US,CA,92501,8,,,, +US-CA-92502,US,CA,92502,8,,,, +US-CA-92503,US,CA,92503,8,,,, +US-CA-92504,US,CA,92504,8,,,, +US-CA-92505,US,CA,92505,8,,,, +US-CA-92506,US,CA,92506,8,,,, +US-CA-92507,US,CA,92507,8,,,, +US-CA-92508,US,CA,92508,8,,,, +US-CA-92509,US,CA,92509,8,,,, +US-CA-92513,US,CA,92513,8,,,, +US-CA-92514,US,CA,92514,8,,,, +US-CA-92515,US,CA,92515,8,,,, +US-CA-92516,US,CA,92516,8,,,, +US-CA-92517,US,CA,92517,8,,,, +US-CA-92518,US,CA,92518,8,,,, +US-CA-92519,US,CA,92519,8,,,, +US-CA-92521,US,CA,92521,8,,,, +US-CA-92522,US,CA,92522,8,,,, +US-CA-92530,US,CA,92530,8,,,, +US-CA-92531,US,CA,92531,8,,,, +US-CA-92532,US,CA,92532,8,,,, +US-CA-92536,US,CA,92536,8,,,, +US-CA-92539,US,CA,92539,8,,,, +US-CA-92543,US,CA,92543,8,,,, +US-CA-92544,US,CA,92544,8,,,, +US-CA-92545,US,CA,92545,8,,,, +US-CA-92546,US,CA,92546,8,,,, +US-CA-92548,US,CA,92548,8,,,, +US-CA-92549,US,CA,92549,8,,,, +US-CA-92551,US,CA,92551,8,,,, +US-CA-92552,US,CA,92552,8,,,, +US-CA-92553,US,CA,92553,8,,,, +US-CA-92554,US,CA,92554,8,,,, +US-CA-92555,US,CA,92555,8,,,, +US-CA-92556,US,CA,92556,8,,,, +US-CA-92557,US,CA,92557,8,,,, +US-CA-92561,US,CA,92561,8,,,, +US-CA-92562,US,CA,92562,8,,,, +US-CA-92563,US,CA,92563,8,,,, +US-CA-92564,US,CA,92564,8,,,, +US-CA-92567,US,CA,92567,8,,,, +US-CA-92570,US,CA,92570,8,,,, +US-CA-92571,US,CA,92571,8,,,, +US-CA-92572,US,CA,92572,8,,,, +US-CA-92581,US,CA,92581,8,,,, +US-CA-92582,US,CA,92582,8,,,, +US-CA-92583,US,CA,92583,8,,,, +US-CA-92584,US,CA,92584,8,,,, +US-CA-92585,US,CA,92585,8,,,, +US-CA-92586,US,CA,92586,8,,,, +US-CA-92587,US,CA,92587,8,,,, +US-CA-92589,US,CA,92589,8,,,, +US-CA-92590,US,CA,92590,8,,,, +US-CA-92591,US,CA,92591,8,,,, +US-CA-92592,US,CA,92592,8,,,, +US-CA-92593,US,CA,92593,8,,,, +US-CA-92595,US,CA,92595,8,,,, +US-CA-92596,US,CA,92596,8,,,, +US-CA-92599,US,CA,92599,8,,,, +US-CA-92602,US,CA,92602,8,,,, +US-CA-92603,US,CA,92603,8,,,, +US-CA-92604,US,CA,92604,8,,,, +US-CA-92605,US,CA,92605,8,,,, +US-CA-92606,US,CA,92606,8,,,, +US-CA-92607,US,CA,92607,8,,,, +US-CA-92609,US,CA,92609,8,,,, +US-CA-92610,US,CA,92610,8,,,, +US-CA-92612,US,CA,92612,8,,,, +US-CA-92614,US,CA,92614,8,,,, +US-CA-92615,US,CA,92615,8,,,, +US-CA-92616,US,CA,92616,8,,,, +US-CA-92617,US,CA,92617,8,,,, +US-CA-92618,US,CA,92618,8,,,, +US-CA-92619,US,CA,92619,8,,,, +US-CA-92620,US,CA,92620,8,,,, +US-CA-92623,US,CA,92623,8,,,, +US-CA-92624,US,CA,92624,8,,,, +US-CA-92625,US,CA,92625,8,,,, +US-CA-92626,US,CA,92626,8,,,, +US-CA-92627,US,CA,92627,8,,,, +US-CA-92628,US,CA,92628,8,,,, +US-CA-92629,US,CA,92629,8,,,, +US-CA-92630,US,CA,92630,8,,,, +US-CA-92637,US,CA,92637,8,,,, +US-CA-92646,US,CA,92646,8,,,, +US-CA-92647,US,CA,92647,8,,,, +US-CA-92648,US,CA,92648,8,,,, +US-CA-92649,US,CA,92649,8,,,, +US-CA-92650,US,CA,92650,8,,,, +US-CA-92651,US,CA,92651,8,,,, +US-CA-92652,US,CA,92652,8,,,, +US-CA-92653,US,CA,92653,8,,,, +US-CA-92654,US,CA,92654,8,,,, +US-CA-92655,US,CA,92655,8,,,, +US-CA-92656,US,CA,92656,8,,,, +US-CA-92657,US,CA,92657,8,,,, +US-CA-92658,US,CA,92658,8,,,, +US-CA-92659,US,CA,92659,8,,,, +US-CA-92660,US,CA,92660,8,,,, +US-CA-92661,US,CA,92661,8,,,, +US-CA-92662,US,CA,92662,8,,,, +US-CA-92663,US,CA,92663,8,,,, +US-CA-92672,US,CA,92672,8,,,, +US-CA-92673,US,CA,92673,8,,,, +US-CA-92674,US,CA,92674,8,,,, +US-CA-92675,US,CA,92675,8,,,, +US-CA-92676,US,CA,92676,8,,,, +US-CA-92677,US,CA,92677,8,,,, +US-CA-92678,US,CA,92678,8,,,, +US-CA-92679,US,CA,92679,8,,,, +US-CA-92683,US,CA,92683,8,,,, +US-CA-92684,US,CA,92684,8,,,, +US-CA-92685,US,CA,92685,8,,,, +US-CA-92688,US,CA,92688,8,,,, +US-CA-92690,US,CA,92690,8,,,, +US-CA-92691,US,CA,92691,8,,,, +US-CA-92692,US,CA,92692,8,,,, +US-CA-92693,US,CA,92693,8,,,, +US-CA-92694,US,CA,92694,8,,,, +US-CA-92697,US,CA,92697,8,,,, +US-CA-92698,US,CA,92698,8,,,, +US-CA-92701,US,CA,92701,8,,,, +US-CA-92702,US,CA,92702,8,,,, +US-CA-92703,US,CA,92703,8,,,, +US-CA-92704,US,CA,92704,8,,,, +US-CA-92705,US,CA,92705,8,,,, +US-CA-92706,US,CA,92706,8,,,, +US-CA-92707,US,CA,92707,8,,,, +US-CA-92708,US,CA,92708,8,,,, +US-CA-92711,US,CA,92711,8,,,, +US-CA-92712,US,CA,92712,8,,,, +US-CA-92728,US,CA,92728,8,,,, +US-CA-92735,US,CA,92735,8,,,, +US-CA-92780,US,CA,92780,8,,,, +US-CA-92781,US,CA,92781,8,,,, +US-CA-92782,US,CA,92782,8,,,, +US-CA-92799,US,CA,92799,8,,,, +US-CA-92801,US,CA,92801,8,,,, +US-CA-92802,US,CA,92802,8,,,, +US-CA-92803,US,CA,92803,8,,,, +US-CA-92804,US,CA,92804,8,,,, +US-CA-92805,US,CA,92805,8,,,, +US-CA-92806,US,CA,92806,8,,,, +US-CA-92807,US,CA,92807,8,,,, +US-CA-92808,US,CA,92808,8,,,, +US-CA-92809,US,CA,92809,8,,,, +US-CA-92811,US,CA,92811,8,,,, +US-CA-92812,US,CA,92812,8,,,, +US-CA-92814,US,CA,92814,8,,,, +US-CA-92815,US,CA,92815,8,,,, +US-CA-92816,US,CA,92816,8,,,, +US-CA-92817,US,CA,92817,8,,,, +US-CA-92821,US,CA,92821,8,,,, +US-CA-92822,US,CA,92822,8,,,, +US-CA-92823,US,CA,92823,8,,,, +US-CA-92825,US,CA,92825,8,,,, +US-CA-92831,US,CA,92831,8,,,, +US-CA-92832,US,CA,92832,8,,,, +US-CA-92833,US,CA,92833,8,,,, +US-CA-92834,US,CA,92834,8,,,, +US-CA-92835,US,CA,92835,8,,,, +US-CA-92836,US,CA,92836,8,,,, +US-CA-92837,US,CA,92837,8,,,, +US-CA-92838,US,CA,92838,8,,,, +US-CA-92840,US,CA,92840,8,,,, +US-CA-92841,US,CA,92841,8,,,, +US-CA-92842,US,CA,92842,8,,,, +US-CA-92843,US,CA,92843,8,,,, +US-CA-92844,US,CA,92844,8,,,, +US-CA-92845,US,CA,92845,8,,,, +US-CA-92846,US,CA,92846,8,,,, +US-CA-92850,US,CA,92850,8,,,, +US-CA-92856,US,CA,92856,8,,,, +US-CA-92857,US,CA,92857,8,,,, +US-CA-92859,US,CA,92859,8,,,, +US-CA-92860,US,CA,92860,8,,,, +US-CA-92861,US,CA,92861,8,,,, +US-CA-92862,US,CA,92862,8,,,, +US-CA-92863,US,CA,92863,8,,,, +US-CA-92864,US,CA,92864,8,,,, +US-CA-92865,US,CA,92865,8,,,, +US-CA-92866,US,CA,92866,8,,,, +US-CA-92867,US,CA,92867,8,,,, +US-CA-92868,US,CA,92868,8,,,, +US-CA-92869,US,CA,92869,8,,,, +US-CA-92870,US,CA,92870,8,,,, +US-CA-92871,US,CA,92871,8,,,, +US-CA-92877,US,CA,92877,8,,,, +US-CA-92878,US,CA,92878,8,,,, +US-CA-92879,US,CA,92879,8,,,, +US-CA-92880,US,CA,92880,8,,,, +US-CA-92881,US,CA,92881,8,,,, +US-CA-92882,US,CA,92882,8,,,, +US-CA-92883,US,CA,92883,8,,,, +US-CA-92885,US,CA,92885,8,,,, +US-CA-92886,US,CA,92886,8,,,, +US-CA-92887,US,CA,92887,8,,,, +US-CA-92899,US,CA,92899,8,,,, +US-CA-93001,US,CA,93001,7.5,,,, +US-CA-93002,US,CA,93002,7.5,,,, +US-CA-93003,US,CA,93003,7.5,,,, +US-CA-93004,US,CA,93004,7.5,,,, +US-CA-93005,US,CA,93005,7.5,,,, +US-CA-93006,US,CA,93006,7.5,,,, +US-CA-93007,US,CA,93007,7.5,,,, +US-CA-93009,US,CA,93009,7.5,,,, +US-CA-93010,US,CA,93010,7.5,,,, +US-CA-93011,US,CA,93011,7.5,,,, +US-CA-93012,US,CA,93012,7.5,,,, +US-CA-93013,US,CA,93013,8,,,, +US-CA-93014,US,CA,93014,8,,,, +US-CA-93015,US,CA,93015,7.5,,,, +US-CA-93016,US,CA,93016,7.5,,,, +US-CA-93020,US,CA,93020,7.5,,,, +US-CA-93021,US,CA,93021,7.5,,,, +US-CA-93022,US,CA,93022,7.5,,,, +US-CA-93023,US,CA,93023,7.5,,,, +US-CA-93024,US,CA,93024,7.5,,,, +US-CA-93030,US,CA,93030,8,,,, +US-CA-93031,US,CA,93031,8,,,, +US-CA-93032,US,CA,93032,8,,,, +US-CA-93033,US,CA,93033,8,,,, +US-CA-93034,US,CA,93034,8,,,, +US-CA-93035,US,CA,93035,8,,,, +US-CA-93036,US,CA,93036,8,,,, +US-CA-93040,US,CA,93040,7.5,,,, +US-CA-93041,US,CA,93041,8,,,, +US-CA-93042,US,CA,93042,7.5,,,, +US-CA-93043,US,CA,93043,8,,,, +US-CA-93044,US,CA,93044,8,,,, +US-CA-93060,US,CA,93060,7.5,,,, +US-CA-93061,US,CA,93061,7.5,,,, +US-CA-93062,US,CA,93062,7.5,,,, +US-CA-93063,US,CA,93063,7.5,,,, +US-CA-93064,US,CA,93064,7.5,,,, +US-CA-93065,US,CA,93065,7.5,,,, +US-CA-93066,US,CA,93066,7.5,,,, +US-CA-93067,US,CA,93067,8,,,, +US-CA-93094,US,CA,93094,7.5,,,, +US-CA-93099,US,CA,93099,7.5,,,, +US-CA-93101,US,CA,93101,8,,,, +US-CA-93102,US,CA,93102,8,,,, +US-CA-93103,US,CA,93103,8,,,, +US-CA-93105,US,CA,93105,8,,,, +US-CA-93106,US,CA,93106,8,,,, +US-CA-93107,US,CA,93107,8,,,, +US-CA-93108,US,CA,93108,8,,,, +US-CA-93109,US,CA,93109,8,,,, +US-CA-93110,US,CA,93110,8,,,, +US-CA-93111,US,CA,93111,8,,,, +US-CA-93116,US,CA,93116,8,,,, +US-CA-93117,US,CA,93117,8,,,, +US-CA-93118,US,CA,93118,8,,,, +US-CA-93120,US,CA,93120,8,,,, +US-CA-93121,US,CA,93121,8,,,, +US-CA-93130,US,CA,93130,8,,,, +US-CA-93140,US,CA,93140,8,,,, +US-CA-93150,US,CA,93150,8,,,, +US-CA-93160,US,CA,93160,8,,,, +US-CA-93190,US,CA,93190,8,,,, +US-CA-93199,US,CA,93199,8,,,, +US-CA-93201,US,CA,93201,8,,,, +US-CA-93202,US,CA,93202,7.5,,,, +US-CA-93203,US,CA,93203,8.5,,,, +US-CA-93204,US,CA,93204,7.5,,,, +US-CA-93205,US,CA,93205,7.5,,,, +US-CA-93206,US,CA,93206,7.5,,,, +US-CA-93207,US,CA,93207,8,,,, +US-CA-93208,US,CA,93208,8,,,, +US-CA-93210,US,CA,93210,8.225,,,, +US-CA-93212,US,CA,93212,7.5,,,, +US-CA-93215,US,CA,93215,8.5,,,, +US-CA-93216,US,CA,93216,8.5,,,, +US-CA-93218,US,CA,93218,8,,,, +US-CA-93219,US,CA,93219,8,,,, +US-CA-93220,US,CA,93220,7.5,,,, +US-CA-93221,US,CA,93221,8,,,, +US-CA-93222,US,CA,93222,7.5,,,, +US-CA-93223,US,CA,93223,8.5,,,, +US-CA-93224,US,CA,93224,7.5,,,, +US-CA-93225,US,CA,93225,7.5,,,, +US-CA-93226,US,CA,93226,7.5,,,, +US-CA-93227,US,CA,93227,8,,,, +US-CA-93230,US,CA,93230,7.5,,,, +US-CA-93232,US,CA,93232,7.5,,,, +US-CA-93234,US,CA,93234,8.225,,,, +US-CA-93235,US,CA,93235,8,,,, +US-CA-93237,US,CA,93237,8,,,, +US-CA-93238,US,CA,93238,7.5,,,, +US-CA-93239,US,CA,93239,7.5,,,, +US-CA-93240,US,CA,93240,7.5,,,, +US-CA-93241,US,CA,93241,7.5,,,, +US-CA-93242,US,CA,93242,8.225,,,, +US-CA-93243,US,CA,93243,7.5,,,, +US-CA-93244,US,CA,93244,8,,,, +US-CA-93245,US,CA,93245,7.5,,,, +US-CA-93246,US,CA,93246,7.5,,,, +US-CA-93247,US,CA,93247,8,,,, +US-CA-93249,US,CA,93249,7.5,,,, +US-CA-93250,US,CA,93250,7.5,,,, +US-CA-93251,US,CA,93251,7.5,,,, +US-CA-93252,US,CA,93252,7.5,,,, +US-CA-93254,US,CA,93254,8,,,, +US-CA-93255,US,CA,93255,7.5,,,, +US-CA-93256,US,CA,93256,8,,,, +US-CA-93257,US,CA,93257,8.5,,,, +US-CA-93258,US,CA,93258,8.5,,,, +US-CA-93260,US,CA,93260,8,,,, +US-CA-93261,US,CA,93261,8,,,, +US-CA-93262,US,CA,93262,8,,,, +US-CA-93263,US,CA,93263,7.5,,,, +US-CA-93265,US,CA,93265,8,,,, +US-CA-93266,US,CA,93266,7.5,,,, +US-CA-93267,US,CA,93267,8,,,, +US-CA-93268,US,CA,93268,7.5,,,, +US-CA-93270,US,CA,93270,8,,,, +US-CA-93271,US,CA,93271,8,,,, +US-CA-93272,US,CA,93272,8,,,, +US-CA-93274,US,CA,93274,8.5,,,, +US-CA-93275,US,CA,93275,8.5,,,, +US-CA-93276,US,CA,93276,7.5,,,, +US-CA-93277,US,CA,93277,8.25,,,, +US-CA-93278,US,CA,93278,8.25,,,, +US-CA-93279,US,CA,93279,8.25,,,, +US-CA-93280,US,CA,93280,7.5,,,, +US-CA-93282,US,CA,93282,8,,,, +US-CA-93283,US,CA,93283,7.5,,,, +US-CA-93285,US,CA,93285,7.5,,,, +US-CA-93286,US,CA,93286,8,,,, +US-CA-93287,US,CA,93287,7.5,,,, +US-CA-93290,US,CA,93290,8.25,,,, +US-CA-93291,US,CA,93291,8.25,,,, +US-CA-93292,US,CA,93292,8.25,,,, +US-CA-93301,US,CA,93301,7.5,,,, +US-CA-93302,US,CA,93302,7.5,,,, +US-CA-93303,US,CA,93303,7.5,,,, +US-CA-93304,US,CA,93304,7.5,,,, +US-CA-93305,US,CA,93305,7.5,,,, +US-CA-93306,US,CA,93306,7.5,,,, +US-CA-93307,US,CA,93307,7.5,,,, +US-CA-93308,US,CA,93308,7.5,,,, +US-CA-93309,US,CA,93309,7.5,,,, +US-CA-93311,US,CA,93311,7.5,,,, +US-CA-93312,US,CA,93312,7.5,,,, +US-CA-93313,US,CA,93313,7.5,,,, +US-CA-93314,US,CA,93314,7.5,,,, +US-CA-93380,US,CA,93380,7.5,,,, +US-CA-93383,US,CA,93383,7.5,,,, +US-CA-93384,US,CA,93384,7.5,,,, +US-CA-93385,US,CA,93385,7.5,,,, +US-CA-93386,US,CA,93386,7.5,,,, +US-CA-93387,US,CA,93387,7.5,,,, +US-CA-93388,US,CA,93388,7.5,,,, +US-CA-93389,US,CA,93389,7.5,,,, +US-CA-93390,US,CA,93390,7.5,,,, +US-CA-93401,US,CA,93401,8,,,, +US-CA-93402,US,CA,93402,7.5,,,, +US-CA-93403,US,CA,93403,8,,,, +US-CA-93405,US,CA,93405,8,,,, +US-CA-93406,US,CA,93406,8,,,, +US-CA-93407,US,CA,93407,7.5,,,, +US-CA-93408,US,CA,93408,8,,,, +US-CA-93409,US,CA,93409,8,,,, +US-CA-93410,US,CA,93410,8,,,, +US-CA-93412,US,CA,93412,7.5,,,, +US-CA-93420,US,CA,93420,8,,,, +US-CA-93421,US,CA,93421,7.5,,,, +US-CA-93422,US,CA,93422,7.5,,,, +US-CA-93423,US,CA,93423,7.5,,,, +US-CA-93424,US,CA,93424,7.5,,,, +US-CA-93426,US,CA,93426,7.5,,,, +US-CA-93427,US,CA,93427,8,,,, +US-CA-93428,US,CA,93428,7.5,,,, +US-CA-93429,US,CA,93429,8,,,, +US-CA-93430,US,CA,93430,7.5,,,, +US-CA-93432,US,CA,93432,7.5,,,, +US-CA-93433,US,CA,93433,8,,,, +US-CA-93434,US,CA,93434,8,,,, +US-CA-93435,US,CA,93435,7.5,,,, +US-CA-93436,US,CA,93436,8,,,, +US-CA-93437,US,CA,93437,8,,,, +US-CA-93438,US,CA,93438,8,,,, +US-CA-93440,US,CA,93440,8,,,, +US-CA-93441,US,CA,93441,8,,,, +US-CA-93442,US,CA,93442,8,,,, +US-CA-93443,US,CA,93443,8,,,, +US-CA-93444,US,CA,93444,7.5,,,, +US-CA-93445,US,CA,93445,7.5,,,, +US-CA-93446,US,CA,93446,8,,,, +US-CA-93447,US,CA,93447,8,,,, +US-CA-93448,US,CA,93448,8,,,, +US-CA-93449,US,CA,93449,8,,,, +US-CA-93450,US,CA,93450,7.5,,,, +US-CA-93451,US,CA,93451,7.5,,,, +US-CA-93452,US,CA,93452,7.5,,,, +US-CA-93453,US,CA,93453,7.5,,,, +US-CA-93454,US,CA,93454,8.25,,,, +US-CA-93455,US,CA,93455,8,,,, +US-CA-93456,US,CA,93456,8.25,,,, +US-CA-93457,US,CA,93457,8,,,, +US-CA-93458,US,CA,93458,8.25,,,, +US-CA-93460,US,CA,93460,8,,,, +US-CA-93461,US,CA,93461,7.5,,,, +US-CA-93463,US,CA,93463,8,,,, +US-CA-93464,US,CA,93464,8,,,, +US-CA-93465,US,CA,93465,7.5,,,, +US-CA-93475,US,CA,93475,7.5,,,, +US-CA-93483,US,CA,93483,8,,,, +US-CA-93501,US,CA,93501,7.5,,,, +US-CA-93502,US,CA,93502,7.5,,,, +US-CA-93504,US,CA,93504,7.5,,,, +US-CA-93505,US,CA,93505,7.5,,,, +US-CA-93510,US,CA,93510,9,,,, +US-CA-93512,US,CA,93512,7.5,,,, +US-CA-93513,US,CA,93513,8,,,, +US-CA-93514,US,CA,93514,8,,,, +US-CA-93515,US,CA,93515,8,,,, +US-CA-93516,US,CA,93516,7.5,,,, +US-CA-93517,US,CA,93517,7.5,,,, +US-CA-93518,US,CA,93518,7.5,,,, +US-CA-93519,US,CA,93519,7.5,,,, +US-CA-93522,US,CA,93522,8,,,, +US-CA-93523,US,CA,93523,7.5,,,, +US-CA-93524,US,CA,93524,7.5,,,, +US-CA-93526,US,CA,93526,8,,,, +US-CA-93527,US,CA,93527,7.5,,,, +US-CA-93528,US,CA,93528,7.5,,,, +US-CA-93529,US,CA,93529,7.5,,,, +US-CA-93530,US,CA,93530,8,,,, +US-CA-93531,US,CA,93531,7.5,,,, +US-CA-93532,US,CA,93532,9,,,, +US-CA-93534,US,CA,93534,9,,,, +US-CA-93535,US,CA,93535,9,,,, +US-CA-93536,US,CA,93536,9,,,, +US-CA-93539,US,CA,93539,9,,,, +US-CA-93541,US,CA,93541,7.5,,,, +US-CA-93542,US,CA,93542,7.5,,,, +US-CA-93543,US,CA,93543,9,,,, +US-CA-93544,US,CA,93544,9,,,, +US-CA-93545,US,CA,93545,8,,,, +US-CA-93546,US,CA,93546,8,,,, +US-CA-93549,US,CA,93549,8,,,, +US-CA-93550,US,CA,93550,9,,,, +US-CA-93551,US,CA,93551,9,,,, +US-CA-93552,US,CA,93552,9,,,, +US-CA-93553,US,CA,93553,9,,,, +US-CA-93554,US,CA,93554,7.5,,,, +US-CA-93555,US,CA,93555,8.25,,,, +US-CA-93556,US,CA,93556,8.25,,,, +US-CA-93558,US,CA,93558,7.5,,,, +US-CA-93560,US,CA,93560,7.5,,,, +US-CA-93561,US,CA,93561,7.5,,,, +US-CA-93562,US,CA,93562,8,,,, +US-CA-93563,US,CA,93563,9,,,, +US-CA-93581,US,CA,93581,7.5,,,, +US-CA-93584,US,CA,93584,9,,,, +US-CA-93586,US,CA,93586,9,,,, +US-CA-93590,US,CA,93590,9,,,, +US-CA-93591,US,CA,93591,9,,,, +US-CA-93592,US,CA,93592,8,,,, +US-CA-93596,US,CA,93596,7.5,,,, +US-CA-93599,US,CA,93599,9,,,, +US-CA-93601,US,CA,93601,8,,,, +US-CA-93602,US,CA,93602,8.225,,,, +US-CA-93603,US,CA,93603,8,,,, +US-CA-93604,US,CA,93604,8,,,, +US-CA-93605,US,CA,93605,8.225,,,, +US-CA-93606,US,CA,93606,8.225,,,, +US-CA-93607,US,CA,93607,8.225,,,, +US-CA-93608,US,CA,93608,8.225,,,, +US-CA-93609,US,CA,93609,8.225,,,, +US-CA-93610,US,CA,93610,8,,,, +US-CA-93611,US,CA,93611,8.225,,,, +US-CA-93612,US,CA,93612,8.225,,,, +US-CA-93613,US,CA,93613,8.225,,,, +US-CA-93614,US,CA,93614,8,,,, +US-CA-93615,US,CA,93615,8,,,, +US-CA-93616,US,CA,93616,8.225,,,, +US-CA-93618,US,CA,93618,8.75,,,, +US-CA-93619,US,CA,93619,8.225,,,, +US-CA-93620,US,CA,93620,7.5,,,, +US-CA-93621,US,CA,93621,8.225,,,, +US-CA-93622,US,CA,93622,8.225,,,, +US-CA-93623,US,CA,93623,8,,,, +US-CA-93624,US,CA,93624,8.225,,,, +US-CA-93625,US,CA,93625,8.225,,,, +US-CA-93626,US,CA,93626,8,,,, +US-CA-93627,US,CA,93627,8.225,,,, +US-CA-93628,US,CA,93628,8.225,,,, +US-CA-93630,US,CA,93630,8.225,,,, +US-CA-93631,US,CA,93631,8.225,,,, +US-CA-93633,US,CA,93633,8,,,, +US-CA-93634,US,CA,93634,8.225,,,, +US-CA-93635,US,CA,93635,8,,,, +US-CA-93636,US,CA,93636,8,,,, +US-CA-93637,US,CA,93637,8,,,, +US-CA-93638,US,CA,93638,8,,,, +US-CA-93639,US,CA,93639,8,,,, +US-CA-93640,US,CA,93640,8.225,,,, +US-CA-93641,US,CA,93641,8.225,,,, +US-CA-93642,US,CA,93642,8.225,,,, +US-CA-93643,US,CA,93643,8,,,, +US-CA-93644,US,CA,93644,8,,,, +US-CA-93645,US,CA,93645,8,,,, +US-CA-93646,US,CA,93646,8.225,,,, +US-CA-93647,US,CA,93647,8,,,, +US-CA-93648,US,CA,93648,8.225,,,, +US-CA-93649,US,CA,93649,8.225,,,, +US-CA-93650,US,CA,93650,8.225,,,, +US-CA-93651,US,CA,93651,8.225,,,, +US-CA-93652,US,CA,93652,8.225,,,, +US-CA-93653,US,CA,93653,8,,,, +US-CA-93654,US,CA,93654,8.725,,,, +US-CA-93656,US,CA,93656,8.225,,,, +US-CA-93657,US,CA,93657,8.975,,,, +US-CA-93660,US,CA,93660,8.225,,,, +US-CA-93661,US,CA,93661,7.5,,,, +US-CA-93662,US,CA,93662,8.725,,,, +US-CA-93664,US,CA,93664,8.225,,,, +US-CA-93665,US,CA,93665,7.5,,,, +US-CA-93666,US,CA,93666,8,,,, +US-CA-93667,US,CA,93667,8.225,,,, +US-CA-93668,US,CA,93668,8.225,,,, +US-CA-93669,US,CA,93669,8,,,, +US-CA-93670,US,CA,93670,8,,,, +US-CA-93673,US,CA,93673,8,,,, +US-CA-93675,US,CA,93675,8.225,,,, +US-CA-93701,US,CA,93701,8.225,,,, +US-CA-93702,US,CA,93702,8.225,,,, +US-CA-93703,US,CA,93703,8.225,,,, +US-CA-93704,US,CA,93704,8.225,,,, +US-CA-93705,US,CA,93705,8.225,,,, +US-CA-93706,US,CA,93706,8.225,,,, +US-CA-93707,US,CA,93707,8.225,,,, +US-CA-93708,US,CA,93708,8.225,,,, +US-CA-93709,US,CA,93709,8.225,,,, +US-CA-93710,US,CA,93710,8.225,,,, +US-CA-93711,US,CA,93711,8.225,,,, +US-CA-93712,US,CA,93712,8.225,,,, +US-CA-93714,US,CA,93714,8.225,,,, +US-CA-93715,US,CA,93715,8.225,,,, +US-CA-93716,US,CA,93716,8.225,,,, +US-CA-93717,US,CA,93717,8.225,,,, +US-CA-93718,US,CA,93718,8.225,,,, +US-CA-93720,US,CA,93720,8.225,,,, +US-CA-93721,US,CA,93721,8.225,,,, +US-CA-93722,US,CA,93722,8.225,,,, +US-CA-93723,US,CA,93723,8.225,,,, +US-CA-93724,US,CA,93724,8.225,,,, +US-CA-93725,US,CA,93725,8.225,,,, +US-CA-93726,US,CA,93726,8.225,,,, +US-CA-93727,US,CA,93727,8.225,,,, +US-CA-93728,US,CA,93728,8.225,,,, +US-CA-93729,US,CA,93729,8.225,,,, +US-CA-93730,US,CA,93730,8.225,,,, +US-CA-93737,US,CA,93737,8.225,,,, +US-CA-93740,US,CA,93740,8.225,,,, +US-CA-93741,US,CA,93741,8.225,,,, +US-CA-93744,US,CA,93744,8.225,,,, +US-CA-93745,US,CA,93745,8.225,,,, +US-CA-93747,US,CA,93747,8.225,,,, +US-CA-93750,US,CA,93750,8.225,,,, +US-CA-93755,US,CA,93755,8.225,,,, +US-CA-93760,US,CA,93760,8.225,,,, +US-CA-93761,US,CA,93761,8.225,,,, +US-CA-93764,US,CA,93764,8.225,,,, +US-CA-93765,US,CA,93765,8.225,,,, +US-CA-93771,US,CA,93771,8.225,,,, +US-CA-93772,US,CA,93772,8.225,,,, +US-CA-93773,US,CA,93773,8.225,,,, +US-CA-93774,US,CA,93774,8.225,,,, +US-CA-93775,US,CA,93775,8.225,,,, +US-CA-93776,US,CA,93776,8.225,,,, +US-CA-93777,US,CA,93777,8.225,,,, +US-CA-93778,US,CA,93778,8.225,,,, +US-CA-93779,US,CA,93779,8.225,,,, +US-CA-93786,US,CA,93786,8.225,,,, +US-CA-93790,US,CA,93790,8.225,,,, +US-CA-93791,US,CA,93791,8.225,,,, +US-CA-93792,US,CA,93792,8.225,,,, +US-CA-93793,US,CA,93793,8.225,,,, +US-CA-93794,US,CA,93794,8.225,,,, +US-CA-93844,US,CA,93844,8.225,,,, +US-CA-93888,US,CA,93888,8.225,,,, +US-CA-93901,US,CA,93901,8,,,, +US-CA-93902,US,CA,93902,8,,,, +US-CA-93905,US,CA,93905,8,,,, +US-CA-93906,US,CA,93906,8,,,, +US-CA-93907,US,CA,93907,7.5,,,, +US-CA-93908,US,CA,93908,7.5,,,, +US-CA-93912,US,CA,93912,8,,,, +US-CA-93915,US,CA,93915,8,,,, +US-CA-93920,US,CA,93920,7.5,,,, +US-CA-93921,US,CA,93921,7.5,,,, +US-CA-93922,US,CA,93922,7.5,,,, +US-CA-93923,US,CA,93923,7.5,,,, +US-CA-93924,US,CA,93924,7.5,,,, +US-CA-93925,US,CA,93925,7.5,,,, +US-CA-93926,US,CA,93926,7.5,,,, +US-CA-93927,US,CA,93927,8.5,,,, +US-CA-93928,US,CA,93928,7.5,,,, +US-CA-93930,US,CA,93930,7.5,,,, +US-CA-93932,US,CA,93932,7.5,,,, +US-CA-93933,US,CA,93933,8.5,,,, +US-CA-93940,US,CA,93940,7.5,,,, +US-CA-93942,US,CA,93942,7.5,,,, +US-CA-93943,US,CA,93943,7.5,,,, +US-CA-93944,US,CA,93944,7.5,,,, +US-CA-93950,US,CA,93950,8.5,,,, +US-CA-93953,US,CA,93953,7.5,,,, +US-CA-93954,US,CA,93954,7.5,,,, +US-CA-93955,US,CA,93955,8.5,,,, +US-CA-93960,US,CA,93960,8.5,,,, +US-CA-93962,US,CA,93962,7.5,,,, +US-CA-94002,US,CA,94002,9,,,, +US-CA-94005,US,CA,94005,9,,,, +US-CA-94010,US,CA,94010,9,,,, +US-CA-94011,US,CA,94011,9,,,, +US-CA-94014,US,CA,94014,9,,,, +US-CA-94015,US,CA,94015,9,,,, +US-CA-94016,US,CA,94016,9,,,, +US-CA-94017,US,CA,94017,9,,,, +US-CA-94018,US,CA,94018,9,,,, +US-CA-94019,US,CA,94019,9.5,,,, +US-CA-94020,US,CA,94020,9,,,, +US-CA-94021,US,CA,94021,9,,,, +US-CA-94022,US,CA,94022,8.75,,,, +US-CA-94023,US,CA,94023,8.75,,,, +US-CA-94024,US,CA,94024,8.75,,,, +US-CA-94025,US,CA,94025,9,,,, +US-CA-94026,US,CA,94026,9,,,, +US-CA-94027,US,CA,94027,9,,,, +US-CA-94028,US,CA,94028,9,,,, +US-CA-94030,US,CA,94030,9,,,, +US-CA-94035,US,CA,94035,8.75,,,, +US-CA-94037,US,CA,94037,9,,,, +US-CA-94038,US,CA,94038,9,,,, +US-CA-94039,US,CA,94039,8.75,,,, +US-CA-94040,US,CA,94040,8.75,,,, +US-CA-94041,US,CA,94041,8.75,,,, +US-CA-94042,US,CA,94042,8.75,,,, +US-CA-94043,US,CA,94043,8.75,,,, +US-CA-94044,US,CA,94044,9,,,, +US-CA-94060,US,CA,94060,9,,,, +US-CA-94061,US,CA,94061,9,,,, +US-CA-94062,US,CA,94062,9,,,, +US-CA-94063,US,CA,94063,9,,,, +US-CA-94064,US,CA,94064,9,,,, +US-CA-94065,US,CA,94065,9,,,, +US-CA-94066,US,CA,94066,9,,,, +US-CA-94070,US,CA,94070,9,,,, +US-CA-94074,US,CA,94074,9,,,, +US-CA-94080,US,CA,94080,9,,,, +US-CA-94083,US,CA,94083,9,,,, +US-CA-94085,US,CA,94085,8.75,,,, +US-CA-94086,US,CA,94086,8.75,,,, +US-CA-94087,US,CA,94087,8.75,,,, +US-CA-94088,US,CA,94088,8.75,,,, +US-CA-94089,US,CA,94089,8.75,,,, +US-CA-94102,US,CA,94102,8.75,,,, +US-CA-94103,US,CA,94103,8.75,,,, +US-CA-94104,US,CA,94104,8.75,,,, +US-CA-94105,US,CA,94105,8.75,,,, +US-CA-94107,US,CA,94107,8.75,,,, +US-CA-94108,US,CA,94108,8.75,,,, +US-CA-94109,US,CA,94109,8.75,,,, +US-CA-94110,US,CA,94110,8.75,,,, +US-CA-94111,US,CA,94111,8.75,,,, +US-CA-94112,US,CA,94112,8.75,,,, +US-CA-94114,US,CA,94114,8.75,,,, +US-CA-94115,US,CA,94115,8.75,,,, +US-CA-94116,US,CA,94116,8.75,,,, +US-CA-94117,US,CA,94117,8.75,,,, +US-CA-94118,US,CA,94118,8.75,,,, +US-CA-94119,US,CA,94119,8.75,,,, +US-CA-94120,US,CA,94120,8.75,,,, +US-CA-94121,US,CA,94121,8.75,,,, +US-CA-94122,US,CA,94122,8.75,,,, +US-CA-94123,US,CA,94123,8.75,,,, +US-CA-94124,US,CA,94124,8.75,,,, +US-CA-94125,US,CA,94125,8.75,,,, +US-CA-94126,US,CA,94126,8.75,,,, +US-CA-94127,US,CA,94127,8.75,,,, +US-CA-94128,US,CA,94128,9,,,, +US-CA-94129,US,CA,94129,8.75,,,, +US-CA-94130,US,CA,94130,8.75,,,, +US-CA-94131,US,CA,94131,8.75,,,, +US-CA-94132,US,CA,94132,8.75,,,, +US-CA-94133,US,CA,94133,8.75,,,, +US-CA-94134,US,CA,94134,8.75,,,, +US-CA-94137,US,CA,94137,8.75,,,, +US-CA-94139,US,CA,94139,8.75,,,, +US-CA-94140,US,CA,94140,8.75,,,, +US-CA-94141,US,CA,94141,8.75,,,, +US-CA-94142,US,CA,94142,8.75,,,, +US-CA-94143,US,CA,94143,8.75,,,, +US-CA-94144,US,CA,94144,8.75,,,, +US-CA-94145,US,CA,94145,8.75,,,, +US-CA-94146,US,CA,94146,8.75,,,, +US-CA-94147,US,CA,94147,8.75,,,, +US-CA-94151,US,CA,94151,8.75,,,, +US-CA-94153,US,CA,94153,8.75,,,, +US-CA-94154,US,CA,94154,8.75,,,, +US-CA-94158,US,CA,94158,8.75,,,, +US-CA-94159,US,CA,94159,8.75,,,, +US-CA-94160,US,CA,94160,8.75,,,, +US-CA-94161,US,CA,94161,8.75,,,, +US-CA-94163,US,CA,94163,8.75,,,, +US-CA-94164,US,CA,94164,8.75,,,, +US-CA-94171,US,CA,94171,8.75,,,, +US-CA-94172,US,CA,94172,8.75,,,, +US-CA-94177,US,CA,94177,8.75,,,, +US-CA-94188,US,CA,94188,8.75,,,, +US-CA-94203,US,CA,94203,8,,,, +US-CA-94204,US,CA,94204,8.5,,,, +US-CA-94205,US,CA,94205,8,,,, +US-CA-94206,US,CA,94206,8,,,, +US-CA-94207,US,CA,94207,8.5,,,, +US-CA-94208,US,CA,94208,8.5,,,, +US-CA-94209,US,CA,94209,8.5,,,, +US-CA-94211,US,CA,94211,8.5,,,, +US-CA-94229,US,CA,94229,8.5,,,, +US-CA-94230,US,CA,94230,8,,,, +US-CA-94232,US,CA,94232,8,,,, +US-CA-94234,US,CA,94234,8.5,,,, +US-CA-94235,US,CA,94235,8.5,,,, +US-CA-94236,US,CA,94236,8.5,,,, +US-CA-94237,US,CA,94237,8.5,,,, +US-CA-94239,US,CA,94239,8,,,, +US-CA-94240,US,CA,94240,8,,,, +US-CA-94244,US,CA,94244,8,,,, +US-CA-94245,US,CA,94245,8.5,,,, +US-CA-94246,US,CA,94246,8,,,, +US-CA-94247,US,CA,94247,8,,,, +US-CA-94248,US,CA,94248,8.5,,,, +US-CA-94249,US,CA,94249,8.5,,,, +US-CA-94250,US,CA,94250,8,,,, +US-CA-94252,US,CA,94252,8.5,,,, +US-CA-94254,US,CA,94254,8,,,, +US-CA-94256,US,CA,94256,8,,,, +US-CA-94257,US,CA,94257,8,,,, +US-CA-94258,US,CA,94258,8,,,, +US-CA-94259,US,CA,94259,8,,,, +US-CA-94261,US,CA,94261,8,,,, +US-CA-94262,US,CA,94262,8,,,, +US-CA-94263,US,CA,94263,8,,,, +US-CA-94267,US,CA,94267,8,,,, +US-CA-94268,US,CA,94268,8.5,,,, +US-CA-94269,US,CA,94269,8,,,, +US-CA-94271,US,CA,94271,8.5,,,, +US-CA-94273,US,CA,94273,8.5,,,, +US-CA-94274,US,CA,94274,8.5,,,, +US-CA-94277,US,CA,94277,8.5,,,, +US-CA-94278,US,CA,94278,8.5,,,, +US-CA-94279,US,CA,94279,8.5,,,, +US-CA-94280,US,CA,94280,8,,,, +US-CA-94282,US,CA,94282,8,,,, +US-CA-94283,US,CA,94283,8.5,,,, +US-CA-94284,US,CA,94284,8,,,, +US-CA-94285,US,CA,94285,8,,,, +US-CA-94286,US,CA,94286,8.5,,,, +US-CA-94287,US,CA,94287,8,,,, +US-CA-94288,US,CA,94288,8.5,,,, +US-CA-94289,US,CA,94289,8,,,, +US-CA-94290,US,CA,94290,8,,,, +US-CA-94291,US,CA,94291,8.5,,,, +US-CA-94293,US,CA,94293,8,,,, +US-CA-94294,US,CA,94294,8,,,, +US-CA-94295,US,CA,94295,8.5,,,, +US-CA-94296,US,CA,94296,8.5,,,, +US-CA-94297,US,CA,94297,8,,,, +US-CA-94298,US,CA,94298,8,,,, +US-CA-94299,US,CA,94299,8.5,,,, +US-CA-94301,US,CA,94301,8.75,,,, +US-CA-94302,US,CA,94302,8.75,,,, +US-CA-94303,US,CA,94303,8.75,,,, +US-CA-94304,US,CA,94304,8.75,,,, +US-CA-94305,US,CA,94305,8.75,,,, +US-CA-94306,US,CA,94306,8.75,,,, +US-CA-94309,US,CA,94309,8.75,,,, +US-CA-94401,US,CA,94401,9.25,,,, +US-CA-94402,US,CA,94402,9.25,,,, +US-CA-94403,US,CA,94403,9.25,,,, +US-CA-94404,US,CA,94404,9,,,, +US-CA-94497,US,CA,94497,9.25,,,, +US-CA-94501,US,CA,94501,9,,,, +US-CA-94502,US,CA,94502,9,,,, +US-CA-94503,US,CA,94503,8,,,, +US-CA-94505,US,CA,94505,8.5,,,, +US-CA-94506,US,CA,94506,8.5,,,, +US-CA-94507,US,CA,94507,8.5,,,, +US-CA-94508,US,CA,94508,8,,,, +US-CA-94509,US,CA,94509,8.5,,,, +US-CA-94510,US,CA,94510,7.625,,,, +US-CA-94511,US,CA,94511,8.5,,,, +US-CA-94512,US,CA,94512,7.625,,,, +US-CA-94513,US,CA,94513,8.5,,,, +US-CA-94514,US,CA,94514,8.5,,,, +US-CA-94515,US,CA,94515,8,,,, +US-CA-94516,US,CA,94516,8.5,,,, +US-CA-94517,US,CA,94517,8.5,,,, +US-CA-94518,US,CA,94518,9,,,, +US-CA-94519,US,CA,94519,9,,,, +US-CA-94520,US,CA,94520,9,,,, +US-CA-94521,US,CA,94521,9,,,, +US-CA-94522,US,CA,94522,9,,,, +US-CA-94523,US,CA,94523,8.5,,,, +US-CA-94524,US,CA,94524,9,,,, +US-CA-94525,US,CA,94525,8.5,,,, +US-CA-94526,US,CA,94526,8.5,,,, +US-CA-94527,US,CA,94527,9,,,, +US-CA-94528,US,CA,94528,8.5,,,, +US-CA-94529,US,CA,94529,9,,,, +US-CA-94530,US,CA,94530,9.5,,,, +US-CA-94531,US,CA,94531,8.5,,,, +US-CA-94533,US,CA,94533,8.625,,,, +US-CA-94534,US,CA,94534,8.625,,,, +US-CA-94535,US,CA,94535,8.625,,,, +US-CA-94536,US,CA,94536,9,,,, +US-CA-94537,US,CA,94537,9,,,, +US-CA-94538,US,CA,94538,9,,,, +US-CA-94539,US,CA,94539,9,,,, +US-CA-94540,US,CA,94540,9,,,, +US-CA-94541,US,CA,94541,9,,,, +US-CA-94542,US,CA,94542,9,,,, +US-CA-94543,US,CA,94543,9,,,, +US-CA-94544,US,CA,94544,9,,,, +US-CA-94545,US,CA,94545,9,,,, +US-CA-94546,US,CA,94546,9,,,, +US-CA-94547,US,CA,94547,9,,,, +US-CA-94548,US,CA,94548,8.5,,,, +US-CA-94549,US,CA,94549,8.5,,,, +US-CA-94550,US,CA,94550,9,,,, +US-CA-94551,US,CA,94551,9,,,, +US-CA-94552,US,CA,94552,9,,,, +US-CA-94553,US,CA,94553,8.5,,,, +US-CA-94555,US,CA,94555,9,,,, +US-CA-94556,US,CA,94556,9.5,,,, +US-CA-94557,US,CA,94557,9,,,, +US-CA-94558,US,CA,94558,8,,,, +US-CA-94559,US,CA,94559,8,,,, +US-CA-94560,US,CA,94560,9,,,, +US-CA-94561,US,CA,94561,8.5,,,, +US-CA-94562,US,CA,94562,8,,,, +US-CA-94563,US,CA,94563,9,,,, +US-CA-94564,US,CA,94564,9,,,, +US-CA-94565,US,CA,94565,9,,,, +US-CA-94566,US,CA,94566,9,,,, +US-CA-94567,US,CA,94567,8,,,, +US-CA-94568,US,CA,94568,9,,,, +US-CA-94569,US,CA,94569,8.5,,,, +US-CA-94570,US,CA,94570,9.5,,,, +US-CA-94571,US,CA,94571,8.375,,,, +US-CA-94572,US,CA,94572,8.5,,,, +US-CA-94573,US,CA,94573,8,,,, +US-CA-94574,US,CA,94574,8,,,, +US-CA-94575,US,CA,94575,9.5,,,, +US-CA-94576,US,CA,94576,8,,,, +US-CA-94577,US,CA,94577,9.25,,,, +US-CA-94578,US,CA,94578,9.25,,,, +US-CA-94579,US,CA,94579,9.25,,,, +US-CA-94580,US,CA,94580,9,,,, +US-CA-94581,US,CA,94581,8,,,, +US-CA-94582,US,CA,94582,8.5,,,, +US-CA-94583,US,CA,94583,8.5,,,, +US-CA-94585,US,CA,94585,7.625,,,, +US-CA-94586,US,CA,94586,9,,,, +US-CA-94587,US,CA,94587,9.5,,,, +US-CA-94588,US,CA,94588,9,,,, +US-CA-94589,US,CA,94589,8.625,,,, +US-CA-94590,US,CA,94590,8.625,,,, +US-CA-94591,US,CA,94591,8.625,,,, +US-CA-94592,US,CA,94592,8.625,,,, +US-CA-94595,US,CA,94595,8.5,,,, +US-CA-94596,US,CA,94596,8.5,,,, +US-CA-94597,US,CA,94597,8.5,,,, +US-CA-94598,US,CA,94598,8.5,,,, +US-CA-94599,US,CA,94599,8,,,, +US-CA-94601,US,CA,94601,9,,,, +US-CA-94602,US,CA,94602,9,,,, +US-CA-94603,US,CA,94603,9,,,, +US-CA-94604,US,CA,94604,9,,,, +US-CA-94605,US,CA,94605,9,,,, +US-CA-94606,US,CA,94606,9,,,, +US-CA-94607,US,CA,94607,9,,,, +US-CA-94608,US,CA,94608,9,,,, +US-CA-94609,US,CA,94609,9,,,, +US-CA-94610,US,CA,94610,9,,,, +US-CA-94611,US,CA,94611,9,,,, +US-CA-94612,US,CA,94612,9,,,, +US-CA-94613,US,CA,94613,9,,,, +US-CA-94614,US,CA,94614,9,,,, +US-CA-94615,US,CA,94615,9,,,, +US-CA-94617,US,CA,94617,9,,,, +US-CA-94618,US,CA,94618,9,,,, +US-CA-94619,US,CA,94619,9,,,, +US-CA-94620,US,CA,94620,9,,,, +US-CA-94621,US,CA,94621,9,,,, +US-CA-94622,US,CA,94622,9,,,, +US-CA-94623,US,CA,94623,9,,,, +US-CA-94624,US,CA,94624,9,,,, +US-CA-94649,US,CA,94649,9,,,, +US-CA-94659,US,CA,94659,9,,,, +US-CA-94660,US,CA,94660,9,,,, +US-CA-94661,US,CA,94661,9,,,, +US-CA-94662,US,CA,94662,9,,,, +US-CA-94666,US,CA,94666,9,,,, +US-CA-94701,US,CA,94701,9,,,, +US-CA-94702,US,CA,94702,9,,,, +US-CA-94703,US,CA,94703,9,,,, +US-CA-94704,US,CA,94704,9,,,, +US-CA-94705,US,CA,94705,9,,,, +US-CA-94706,US,CA,94706,9.5,,,, +US-CA-94707,US,CA,94707,9,,,, +US-CA-94708,US,CA,94708,9,,,, +US-CA-94709,US,CA,94709,9,,,, +US-CA-94710,US,CA,94710,9,,,, +US-CA-94712,US,CA,94712,9,,,, +US-CA-94720,US,CA,94720,9,,,, +US-CA-94801,US,CA,94801,9,,,, +US-CA-94802,US,CA,94802,9,,,, +US-CA-94803,US,CA,94803,8.5,,,, +US-CA-94804,US,CA,94804,9,,,, +US-CA-94805,US,CA,94805,9,,,, +US-CA-94806,US,CA,94806,9,,,, +US-CA-94807,US,CA,94807,9,,,, +US-CA-94808,US,CA,94808,9,,,, +US-CA-94820,US,CA,94820,8.5,,,, +US-CA-94850,US,CA,94850,9,,,, +US-CA-94901,US,CA,94901,9,,,, +US-CA-94903,US,CA,94903,9,,,, +US-CA-94904,US,CA,94904,8.5,,,, +US-CA-94912,US,CA,94912,9,,,, +US-CA-94913,US,CA,94913,9,,,, +US-CA-94914,US,CA,94914,8.5,,,, +US-CA-94915,US,CA,94915,9,,,, +US-CA-94920,US,CA,94920,8.5,,,, +US-CA-94922,US,CA,94922,8.25,,,, +US-CA-94923,US,CA,94923,8.25,,,, +US-CA-94924,US,CA,94924,8.5,,,, +US-CA-94925,US,CA,94925,8.5,,,, +US-CA-94926,US,CA,94926,8.75,,,, +US-CA-94927,US,CA,94927,8.75,,,, +US-CA-94928,US,CA,94928,8.75,,,, +US-CA-94929,US,CA,94929,8.5,,,, +US-CA-94930,US,CA,94930,9,,,, +US-CA-94931,US,CA,94931,8.75,,,, +US-CA-94933,US,CA,94933,8.5,,,, +US-CA-94937,US,CA,94937,8.5,,,, +US-CA-94938,US,CA,94938,8.5,,,, +US-CA-94939,US,CA,94939,8.5,,,, +US-CA-94940,US,CA,94940,8.5,,,, +US-CA-94941,US,CA,94941,8.5,,,, +US-CA-94942,US,CA,94942,8.5,,,, +US-CA-94945,US,CA,94945,9,,,, +US-CA-94946,US,CA,94946,8.5,,,, +US-CA-94947,US,CA,94947,9,,,, +US-CA-94948,US,CA,94948,9,,,, +US-CA-94949,US,CA,94949,9,,,, +US-CA-94950,US,CA,94950,8.5,,,, +US-CA-94951,US,CA,94951,8.25,,,, +US-CA-94952,US,CA,94952,8.25,,,, +US-CA-94953,US,CA,94953,8.25,,,, +US-CA-94954,US,CA,94954,8.25,,,, +US-CA-94955,US,CA,94955,8.25,,,, +US-CA-94956,US,CA,94956,8.5,,,, +US-CA-94957,US,CA,94957,8.5,,,, +US-CA-94960,US,CA,94960,8.5,,,, +US-CA-94963,US,CA,94963,8.5,,,, +US-CA-94964,US,CA,94964,8.5,,,, +US-CA-94965,US,CA,94965,8.5,,,, +US-CA-94966,US,CA,94966,8.5,,,, +US-CA-94970,US,CA,94970,8.5,,,, +US-CA-94971,US,CA,94971,8.5,,,, +US-CA-94972,US,CA,94972,8.25,,,, +US-CA-94973,US,CA,94973,8.5,,,, +US-CA-94974,US,CA,94974,8.5,,,, +US-CA-94975,US,CA,94975,8.25,,,, +US-CA-94976,US,CA,94976,8.5,,,, +US-CA-94977,US,CA,94977,8.5,,,, +US-CA-94978,US,CA,94978,9,,,, +US-CA-94979,US,CA,94979,8.5,,,, +US-CA-94998,US,CA,94998,9,,,, +US-CA-94999,US,CA,94999,8.25,,,, +US-CA-95001,US,CA,95001,8.25,,,, +US-CA-95002,US,CA,95002,8.75,,,, +US-CA-95003,US,CA,95003,8.25,,,, +US-CA-95004,US,CA,95004,7.5,,,, +US-CA-95005,US,CA,95005,8.25,,,, +US-CA-95006,US,CA,95006,8.25,,,, +US-CA-95007,US,CA,95007,8.25,,,, +US-CA-95008,US,CA,95008,9,,,, +US-CA-95009,US,CA,95009,9,,,, +US-CA-95010,US,CA,95010,8.75,,,, +US-CA-95011,US,CA,95011,9,,,, +US-CA-95012,US,CA,95012,7.5,,,, +US-CA-95013,US,CA,95013,8.75,,,, +US-CA-95014,US,CA,95014,8.75,,,, +US-CA-95015,US,CA,95015,8.75,,,, +US-CA-95017,US,CA,95017,8.25,,,, +US-CA-95018,US,CA,95018,8.25,,,, +US-CA-95019,US,CA,95019,8.5,,,, +US-CA-95020,US,CA,95020,8.75,,,, +US-CA-95021,US,CA,95021,8.75,,,, +US-CA-95023,US,CA,95023,8.5,,,, +US-CA-95024,US,CA,95024,8.5,,,, +US-CA-95026,US,CA,95026,8.75,,,, +US-CA-95030,US,CA,95030,8.75,,,, +US-CA-95031,US,CA,95031,8.75,,,, +US-CA-95032,US,CA,95032,8.75,,,, +US-CA-95033,US,CA,95033,8.25,,,, +US-CA-95035,US,CA,95035,8.75,,,, +US-CA-95036,US,CA,95036,8.75,,,, +US-CA-95037,US,CA,95037,8.75,,,, +US-CA-95038,US,CA,95038,8.75,,,, +US-CA-95039,US,CA,95039,7.5,,,, +US-CA-95041,US,CA,95041,8.25,,,, +US-CA-95042,US,CA,95042,8.75,,,, +US-CA-95043,US,CA,95043,7.5,,,, +US-CA-95044,US,CA,95044,8.75,,,, +US-CA-95045,US,CA,95045,7.5,,,, +US-CA-95046,US,CA,95046,8.75,,,, +US-CA-95050,US,CA,95050,8.75,,,, +US-CA-95051,US,CA,95051,8.75,,,, +US-CA-95052,US,CA,95052,8.75,,,, +US-CA-95053,US,CA,95053,8.75,,,, +US-CA-95054,US,CA,95054,8.75,,,, +US-CA-95055,US,CA,95055,8.75,,,, +US-CA-95056,US,CA,95056,8.75,,,, +US-CA-95060,US,CA,95060,8.75,,,, +US-CA-95061,US,CA,95061,8.75,,,, +US-CA-95062,US,CA,95062,8.25,,,, +US-CA-95063,US,CA,95063,8.75,,,, +US-CA-95064,US,CA,95064,8.75,,,, +US-CA-95065,US,CA,95065,8.25,,,, +US-CA-95066,US,CA,95066,8.25,,,, +US-CA-95067,US,CA,95067,8.25,,,, +US-CA-95070,US,CA,95070,8.75,,,, +US-CA-95071,US,CA,95071,8.75,,,, +US-CA-95073,US,CA,95073,8.25,,,, +US-CA-95075,US,CA,95075,7.5,,,, +US-CA-95076,US,CA,95076,8.5,,,, +US-CA-95077,US,CA,95077,8.5,,,, +US-CA-95101,US,CA,95101,8.75,,,, +US-CA-95103,US,CA,95103,8.75,,,, +US-CA-95106,US,CA,95106,8.75,,,, +US-CA-95108,US,CA,95108,8.75,,,, +US-CA-95109,US,CA,95109,8.75,,,, +US-CA-95110,US,CA,95110,8.75,,,, +US-CA-95111,US,CA,95111,8.75,,,, +US-CA-95112,US,CA,95112,8.75,,,, +US-CA-95113,US,CA,95113,8.75,,,, +US-CA-95115,US,CA,95115,8.75,,,, +US-CA-95116,US,CA,95116,8.75,,,, +US-CA-95117,US,CA,95117,8.75,,,, +US-CA-95118,US,CA,95118,8.75,,,, +US-CA-95119,US,CA,95119,8.75,,,, +US-CA-95120,US,CA,95120,8.75,,,, +US-CA-95121,US,CA,95121,8.75,,,, +US-CA-95122,US,CA,95122,8.75,,,, +US-CA-95123,US,CA,95123,8.75,,,, +US-CA-95124,US,CA,95124,8.75,,,, +US-CA-95125,US,CA,95125,8.75,,,, +US-CA-95126,US,CA,95126,8.75,,,, +US-CA-95127,US,CA,95127,8.75,,,, +US-CA-95128,US,CA,95128,8.75,,,, +US-CA-95129,US,CA,95129,8.75,,,, +US-CA-95130,US,CA,95130,8.75,,,, +US-CA-95131,US,CA,95131,8.75,,,, +US-CA-95132,US,CA,95132,8.75,,,, +US-CA-95133,US,CA,95133,8.75,,,, +US-CA-95134,US,CA,95134,8.75,,,, +US-CA-95135,US,CA,95135,8.75,,,, +US-CA-95136,US,CA,95136,8.75,,,, +US-CA-95138,US,CA,95138,8.75,,,, +US-CA-95139,US,CA,95139,8.75,,,, +US-CA-95140,US,CA,95140,8.75,,,, +US-CA-95141,US,CA,95141,8.75,,,, +US-CA-95148,US,CA,95148,8.75,,,, +US-CA-95150,US,CA,95150,8.75,,,, +US-CA-95151,US,CA,95151,8.75,,,, +US-CA-95152,US,CA,95152,8.75,,,, +US-CA-95153,US,CA,95153,8.75,,,, +US-CA-95154,US,CA,95154,8.75,,,, +US-CA-95155,US,CA,95155,8.75,,,, +US-CA-95156,US,CA,95156,8.75,,,, +US-CA-95157,US,CA,95157,8.75,,,, +US-CA-95158,US,CA,95158,8.75,,,, +US-CA-95159,US,CA,95159,8.75,,,, +US-CA-95160,US,CA,95160,8.75,,,, +US-CA-95161,US,CA,95161,8.75,,,, +US-CA-95164,US,CA,95164,8.75,,,, +US-CA-95170,US,CA,95170,8.75,,,, +US-CA-95172,US,CA,95172,8.75,,,, +US-CA-95173,US,CA,95173,8.75,,,, +US-CA-95190,US,CA,95190,8.75,,,, +US-CA-95191,US,CA,95191,8.75,,,, +US-CA-95192,US,CA,95192,8.75,,,, +US-CA-95193,US,CA,95193,8.75,,,, +US-CA-95194,US,CA,95194,8.75,,,, +US-CA-95196,US,CA,95196,8.75,,,, +US-CA-95201,US,CA,95201,8,,,, +US-CA-95202,US,CA,95202,8.25,,,, +US-CA-95203,US,CA,95203,8.25,,,, +US-CA-95204,US,CA,95204,8.25,,,, +US-CA-95205,US,CA,95205,8.25,,,, +US-CA-95206,US,CA,95206,8.25,,,, +US-CA-95207,US,CA,95207,8.25,,,, +US-CA-95208,US,CA,95208,8,,,, +US-CA-95209,US,CA,95209,8.25,,,, +US-CA-95210,US,CA,95210,8.25,,,, +US-CA-95211,US,CA,95211,8.25,,,, +US-CA-95212,US,CA,95212,8,,,, +US-CA-95213,US,CA,95213,8,,,, +US-CA-95215,US,CA,95215,8,,,, +US-CA-95219,US,CA,95219,8.25,,,, +US-CA-95220,US,CA,95220,8,,,, +US-CA-95221,US,CA,95221,7.5,,,, +US-CA-95222,US,CA,95222,7.5,,,, +US-CA-95223,US,CA,95223,7.5,,,, +US-CA-95224,US,CA,95224,7.5,,,, +US-CA-95225,US,CA,95225,7.5,,,, +US-CA-95226,US,CA,95226,7.5,,,, +US-CA-95227,US,CA,95227,8,,,, +US-CA-95228,US,CA,95228,7.5,,,, +US-CA-95229,US,CA,95229,7.5,,,, +US-CA-95230,US,CA,95230,8,,,, +US-CA-95231,US,CA,95231,8,,,, +US-CA-95232,US,CA,95232,7.5,,,, +US-CA-95233,US,CA,95233,7.5,,,, +US-CA-95234,US,CA,95234,8,,,, +US-CA-95236,US,CA,95236,8,,,, +US-CA-95237,US,CA,95237,8,,,, +US-CA-95240,US,CA,95240,8,,,, +US-CA-95241,US,CA,95241,8,,,, +US-CA-95242,US,CA,95242,8,,,, +US-CA-95245,US,CA,95245,7.5,,,, +US-CA-95246,US,CA,95246,7.5,,,, +US-CA-95247,US,CA,95247,7.5,,,, +US-CA-95248,US,CA,95248,7.5,,,, +US-CA-95249,US,CA,95249,7.5,,,, +US-CA-95251,US,CA,95251,7.5,,,, +US-CA-95252,US,CA,95252,7.5,,,, +US-CA-95253,US,CA,95253,8,,,, +US-CA-95254,US,CA,95254,7.5,,,, +US-CA-95255,US,CA,95255,7.5,,,, +US-CA-95257,US,CA,95257,7.5,,,, +US-CA-95258,US,CA,95258,8,,,, +US-CA-95267,US,CA,95267,8.25,,,, +US-CA-95269,US,CA,95269,8.25,,,, +US-CA-95296,US,CA,95296,8,,,, +US-CA-95297,US,CA,95297,8.25,,,, +US-CA-95301,US,CA,95301,8,,,, +US-CA-95303,US,CA,95303,7.5,,,, +US-CA-95304,US,CA,95304,8,,,, +US-CA-95305,US,CA,95305,7.5,,,, +US-CA-95306,US,CA,95306,8,,,, +US-CA-95307,US,CA,95307,8.125,,,, +US-CA-95309,US,CA,95309,7.5,,,, +US-CA-95310,US,CA,95310,7.5,,,, +US-CA-95311,US,CA,95311,8,,,, +US-CA-95312,US,CA,95312,7.5,,,, +US-CA-95313,US,CA,95313,7.625,,,, +US-CA-95315,US,CA,95315,7.5,,,, +US-CA-95316,US,CA,95316,7.625,,,, +US-CA-95317,US,CA,95317,7.5,,,, +US-CA-95318,US,CA,95318,8,,,, +US-CA-95319,US,CA,95319,7.625,,,, +US-CA-95320,US,CA,95320,8,,,, +US-CA-95321,US,CA,95321,7.5,,,, +US-CA-95322,US,CA,95322,8,,,, +US-CA-95323,US,CA,95323,7.625,,,, +US-CA-95324,US,CA,95324,7.5,,,, +US-CA-95325,US,CA,95325,8,,,, +US-CA-95326,US,CA,95326,7.625,,,, +US-CA-95327,US,CA,95327,7.5,,,, +US-CA-95328,US,CA,95328,7.625,,,, +US-CA-95329,US,CA,95329,7.5,,,, +US-CA-95330,US,CA,95330,9,,,, +US-CA-95333,US,CA,95333,7.5,,,, +US-CA-95334,US,CA,95334,7.5,,,, +US-CA-95335,US,CA,95335,7.5,,,, +US-CA-95336,US,CA,95336,8.5,,,, +US-CA-95337,US,CA,95337,8.5,,,, +US-CA-95338,US,CA,95338,8,,,, +US-CA-95340,US,CA,95340,8,,,, +US-CA-95341,US,CA,95341,8,,,, +US-CA-95343,US,CA,95343,7.5,,,, +US-CA-95344,US,CA,95344,8,,,, +US-CA-95345,US,CA,95345,8,,,, +US-CA-95346,US,CA,95346,7.5,,,, +US-CA-95347,US,CA,95347,7.5,,,, +US-CA-95348,US,CA,95348,8,,,, +US-CA-95350,US,CA,95350,7.625,,,, +US-CA-95351,US,CA,95351,7.625,,,, +US-CA-95352,US,CA,95352,7.625,,,, +US-CA-95353,US,CA,95353,7.625,,,, +US-CA-95354,US,CA,95354,7.625,,,, +US-CA-95355,US,CA,95355,7.625,,,, +US-CA-95356,US,CA,95356,7.625,,,, +US-CA-95357,US,CA,95357,7.625,,,, +US-CA-95358,US,CA,95358,7.625,,,, +US-CA-95360,US,CA,95360,7.625,,,, +US-CA-95361,US,CA,95361,8.125,,,, +US-CA-95363,US,CA,95363,7.625,,,, +US-CA-95364,US,CA,95364,7.5,,,, +US-CA-95365,US,CA,95365,7.5,,,, +US-CA-95366,US,CA,95366,8,,,, +US-CA-95367,US,CA,95367,7.625,,,, +US-CA-95368,US,CA,95368,7.625,,,, +US-CA-95369,US,CA,95369,7.5,,,, +US-CA-95370,US,CA,95370,7.5,,,, +US-CA-95372,US,CA,95372,7.5,,,, +US-CA-95373,US,CA,95373,7.5,,,, +US-CA-95374,US,CA,95374,7.5,,,, +US-CA-95375,US,CA,95375,7.5,,,, +US-CA-95376,US,CA,95376,8.5,,,, +US-CA-95377,US,CA,95377,8.5,,,, +US-CA-95378,US,CA,95378,8.5,,,, +US-CA-95379,US,CA,95379,7.5,,,, +US-CA-95380,US,CA,95380,7.625,,,, +US-CA-95381,US,CA,95381,7.625,,,, +US-CA-95382,US,CA,95382,7.625,,,, +US-CA-95383,US,CA,95383,7.5,,,, +US-CA-95385,US,CA,95385,7.625,,,, +US-CA-95386,US,CA,95386,7.625,,,, +US-CA-95387,US,CA,95387,7.625,,,, +US-CA-95388,US,CA,95388,7.5,,,, +US-CA-95389,US,CA,95389,8,,,, +US-CA-95391,US,CA,95391,8,,,, +US-CA-95397,US,CA,95397,7.625,,,, +US-CA-95401,US,CA,95401,8.75,,,, +US-CA-95402,US,CA,95402,8.75,,,, +US-CA-95403,US,CA,95403,8.75,,,, +US-CA-95404,US,CA,95404,8.75,,,, +US-CA-95405,US,CA,95405,8.75,,,, +US-CA-95406,US,CA,95406,8.75,,,, +US-CA-95407,US,CA,95407,8.75,,,, +US-CA-95409,US,CA,95409,8.75,,,, +US-CA-95410,US,CA,95410,7.625,,,, +US-CA-95412,US,CA,95412,8.25,,,, +US-CA-95415,US,CA,95415,7.625,,,, +US-CA-95416,US,CA,95416,8.25,,,, +US-CA-95417,US,CA,95417,7.625,,,, +US-CA-95418,US,CA,95418,7.625,,,, +US-CA-95419,US,CA,95419,8.25,,,, +US-CA-95420,US,CA,95420,7.625,,,, +US-CA-95421,US,CA,95421,8.25,,,, +US-CA-95422,US,CA,95422,8,,,, +US-CA-95423,US,CA,95423,7.5,,,, +US-CA-95424,US,CA,95424,8,,,, +US-CA-95425,US,CA,95425,8.25,,,, +US-CA-95426,US,CA,95426,7.5,,,, +US-CA-95427,US,CA,95427,7.625,,,, +US-CA-95428,US,CA,95428,7.625,,,, +US-CA-95429,US,CA,95429,7.625,,,, +US-CA-95430,US,CA,95430,8.25,,,, +US-CA-95431,US,CA,95431,8.25,,,, +US-CA-95432,US,CA,95432,7.625,,,, +US-CA-95433,US,CA,95433,8.25,,,, +US-CA-95435,US,CA,95435,7.5,,,, +US-CA-95436,US,CA,95436,8.25,,,, +US-CA-95437,US,CA,95437,8.625,,,, +US-CA-95439,US,CA,95439,8.25,,,, +US-CA-95441,US,CA,95441,8.25,,,, +US-CA-95442,US,CA,95442,8.25,,,, +US-CA-95443,US,CA,95443,7.5,,,, +US-CA-95444,US,CA,95444,8.25,,,, +US-CA-95445,US,CA,95445,7.625,,,, +US-CA-95446,US,CA,95446,8.25,,,, +US-CA-95448,US,CA,95448,8.75,,,, +US-CA-95449,US,CA,95449,7.625,,,, +US-CA-95450,US,CA,95450,8.25,,,, +US-CA-95451,US,CA,95451,7.5,,,, +US-CA-95452,US,CA,95452,8.25,,,, +US-CA-95453,US,CA,95453,8,,,, +US-CA-95454,US,CA,95454,7.625,,,, +US-CA-95456,US,CA,95456,7.625,,,, +US-CA-95457,US,CA,95457,7.5,,,, +US-CA-95458,US,CA,95458,7.5,,,, +US-CA-95459,US,CA,95459,7.625,,,, +US-CA-95460,US,CA,95460,7.625,,,, +US-CA-95461,US,CA,95461,7.5,,,, +US-CA-95462,US,CA,95462,8.25,,,, +US-CA-95463,US,CA,95463,7.625,,,, +US-CA-95464,US,CA,95464,7.5,,,, +US-CA-95465,US,CA,95465,8.25,,,, +US-CA-95466,US,CA,95466,7.625,,,, +US-CA-95467,US,CA,95467,7.5,,,, +US-CA-95468,US,CA,95468,7.625,,,, +US-CA-95469,US,CA,95469,7.625,,,, +US-CA-95470,US,CA,95470,7.625,,,, +US-CA-95471,US,CA,95471,8.25,,,, +US-CA-95472,US,CA,95472,8.25,,,, +US-CA-95473,US,CA,95473,9,,,, +US-CA-95476,US,CA,95476,8.25,,,, +US-CA-95480,US,CA,95480,8.25,,,, +US-CA-95481,US,CA,95481,7.625,,,, +US-CA-95482,US,CA,95482,8.125,,,, +US-CA-95485,US,CA,95485,7.5,,,, +US-CA-95486,US,CA,95486,8.25,,,, +US-CA-95487,US,CA,95487,8.25,,,, +US-CA-95488,US,CA,95488,7.625,,,, +US-CA-95490,US,CA,95490,7.625,,,, +US-CA-95492,US,CA,95492,8.25,,,, +US-CA-95493,US,CA,95493,7.5,,,, +US-CA-95494,US,CA,95494,7.625,,,, +US-CA-95497,US,CA,95497,7.625,,,, +US-CA-95501,US,CA,95501,8.25,,,, +US-CA-95502,US,CA,95502,8.25,,,, +US-CA-95503,US,CA,95503,7.5,,,, +US-CA-95511,US,CA,95511,7.5,,,, +US-CA-95514,US,CA,95514,7.5,,,, +US-CA-95518,US,CA,95518,8.25,,,, +US-CA-95519,US,CA,95519,7.5,,,, +US-CA-95521,US,CA,95521,8.25,,,, +US-CA-95524,US,CA,95524,7.5,,,, +US-CA-95525,US,CA,95525,7.5,,,, +US-CA-95526,US,CA,95526,7.5,,,, +US-CA-95527,US,CA,95527,7.5,,,, +US-CA-95528,US,CA,95528,7.5,,,, +US-CA-95531,US,CA,95531,7.5,,,, +US-CA-95532,US,CA,95532,7.5,,,, +US-CA-95534,US,CA,95534,8.25,,,, +US-CA-95536,US,CA,95536,7.5,,,, +US-CA-95537,US,CA,95537,7.5,,,, +US-CA-95538,US,CA,95538,7.5,,,, +US-CA-95540,US,CA,95540,7.5,,,, +US-CA-95542,US,CA,95542,7.5,,,, +US-CA-95543,US,CA,95543,7.5,,,, +US-CA-95545,US,CA,95545,7.5,,,, +US-CA-95546,US,CA,95546,7.5,,,, +US-CA-95547,US,CA,95547,7.5,,,, +US-CA-95548,US,CA,95548,7.5,,,, +US-CA-95549,US,CA,95549,7.5,,,, +US-CA-95550,US,CA,95550,7.5,,,, +US-CA-95551,US,CA,95551,7.5,,,, +US-CA-95552,US,CA,95552,7.5,,,, +US-CA-95553,US,CA,95553,7.5,,,, +US-CA-95554,US,CA,95554,7.5,,,, +US-CA-95555,US,CA,95555,7.5,,,, +US-CA-95556,US,CA,95556,7.5,,,, +US-CA-95558,US,CA,95558,7.5,,,, +US-CA-95559,US,CA,95559,7.5,,,, +US-CA-95560,US,CA,95560,7.5,,,, +US-CA-95562,US,CA,95562,7.5,,,, +US-CA-95563,US,CA,95563,7.5,,,, +US-CA-95564,US,CA,95564,7.5,,,, +US-CA-95565,US,CA,95565,7.5,,,, +US-CA-95567,US,CA,95567,7.5,,,, +US-CA-95568,US,CA,95568,7.5,,,, +US-CA-95569,US,CA,95569,7.5,,,, +US-CA-95570,US,CA,95570,7.5,,,, +US-CA-95571,US,CA,95571,7.5,,,, +US-CA-95573,US,CA,95573,7.5,,,, +US-CA-95585,US,CA,95585,7.625,,,, +US-CA-95587,US,CA,95587,7.5,,,, +US-CA-95589,US,CA,95589,7.5,,,, +US-CA-95595,US,CA,95595,7.5,,,, +US-CA-95601,US,CA,95601,8,,,, +US-CA-95602,US,CA,95602,7.5,,,, +US-CA-95603,US,CA,95603,7.5,,,, +US-CA-95604,US,CA,95604,7.5,,,, +US-CA-95605,US,CA,95605,8,,,, +US-CA-95606,US,CA,95606,7.5,,,, +US-CA-95607,US,CA,95607,7.5,,,, +US-CA-95608,US,CA,95608,8,,,, +US-CA-95609,US,CA,95609,8,,,, +US-CA-95610,US,CA,95610,8,,,, +US-CA-95611,US,CA,95611,8,,,, +US-CA-95612,US,CA,95612,7.5,,,, +US-CA-95613,US,CA,95613,7.5,,,, +US-CA-95614,US,CA,95614,7.5,,,, +US-CA-95615,US,CA,95615,8,,,, +US-CA-95616,US,CA,95616,8,,,, +US-CA-95617,US,CA,95617,8,,,, +US-CA-95618,US,CA,95618,8,,,, +US-CA-95619,US,CA,95619,7.5,,,, +US-CA-95620,US,CA,95620,7.625,,,, +US-CA-95621,US,CA,95621,8,,,, +US-CA-95623,US,CA,95623,7.5,,,, +US-CA-95624,US,CA,95624,8,,,, +US-CA-95625,US,CA,95625,7.625,,,, +US-CA-95626,US,CA,95626,8,,,, +US-CA-95627,US,CA,95627,7.5,,,, +US-CA-95628,US,CA,95628,8,,,, +US-CA-95629,US,CA,95629,8,,,, +US-CA-95630,US,CA,95630,8,,,, +US-CA-95631,US,CA,95631,7.5,,,, +US-CA-95632,US,CA,95632,8.5,,,, +US-CA-95633,US,CA,95633,7.5,,,, +US-CA-95634,US,CA,95634,7.5,,,, +US-CA-95635,US,CA,95635,7.5,,,, +US-CA-95636,US,CA,95636,7.5,,,, +US-CA-95637,US,CA,95637,7.5,,,, +US-CA-95638,US,CA,95638,8,,,, +US-CA-95639,US,CA,95639,8,,,, +US-CA-95640,US,CA,95640,8,,,, +US-CA-95641,US,CA,95641,8,,,, +US-CA-95642,US,CA,95642,8,,,, +US-CA-95644,US,CA,95644,8,,,, +US-CA-95645,US,CA,95645,7.5,,,, +US-CA-95646,US,CA,95646,8,,,, +US-CA-95648,US,CA,95648,7.5,,,, +US-CA-95650,US,CA,95650,7.5,,,, +US-CA-95651,US,CA,95651,7.5,,,, +US-CA-95652,US,CA,95652,8,,,, +US-CA-95653,US,CA,95653,7.5,,,, +US-CA-95654,US,CA,95654,8,,,, +US-CA-95655,US,CA,95655,8,,,, +US-CA-95656,US,CA,95656,7.5,,,, +US-CA-95658,US,CA,95658,7.5,,,, +US-CA-95659,US,CA,95659,7.5,,,, +US-CA-95660,US,CA,95660,8,,,, +US-CA-95661,US,CA,95661,7.5,,,, +US-CA-95662,US,CA,95662,8,,,, +US-CA-95663,US,CA,95663,7.5,,,, +US-CA-95664,US,CA,95664,7.5,,,, +US-CA-95665,US,CA,95665,8,,,, +US-CA-95666,US,CA,95666,8,,,, +US-CA-95667,US,CA,95667,7.5,,,, +US-CA-95668,US,CA,95668,7.5,,,, +US-CA-95669,US,CA,95669,8,,,, +US-CA-95670,US,CA,95670,8,,,, +US-CA-95671,US,CA,95671,8,,,, +US-CA-95672,US,CA,95672,7.5,,,, +US-CA-95673,US,CA,95673,8,,,, +US-CA-95674,US,CA,95674,7.5,,,, +US-CA-95675,US,CA,95675,7.5,,,, +US-CA-95676,US,CA,95676,7.5,,,, +US-CA-95677,US,CA,95677,7.5,,,, +US-CA-95678,US,CA,95678,7.5,,,, +US-CA-95679,US,CA,95679,7.5,,,, +US-CA-95680,US,CA,95680,8,,,, +US-CA-95681,US,CA,95681,7.5,,,, +US-CA-95682,US,CA,95682,7.5,,,, +US-CA-95683,US,CA,95683,8,,,, +US-CA-95684,US,CA,95684,7.5,,,, +US-CA-95685,US,CA,95685,8,,,, +US-CA-95686,US,CA,95686,8,,,, +US-CA-95687,US,CA,95687,7.875,,,, +US-CA-95688,US,CA,95688,7.875,,,, +US-CA-95689,US,CA,95689,8,,,, +US-CA-95690,US,CA,95690,8,,,, +US-CA-95691,US,CA,95691,8,,,, +US-CA-95692,US,CA,95692,8,,,, +US-CA-95693,US,CA,95693,8,,,, +US-CA-95694,US,CA,95694,7.5,,,, +US-CA-95695,US,CA,95695,8.25,,,, +US-CA-95696,US,CA,95696,7.875,,,, +US-CA-95697,US,CA,95697,7.5,,,, +US-CA-95698,US,CA,95698,7.5,,,, +US-CA-95699,US,CA,95699,8,,,, +US-CA-95701,US,CA,95701,7.5,,,, +US-CA-95703,US,CA,95703,7.5,,,, +US-CA-95709,US,CA,95709,7.5,,,, +US-CA-95712,US,CA,95712,7.625,,,, +US-CA-95713,US,CA,95713,7.5,,,, +US-CA-95714,US,CA,95714,7.5,,,, +US-CA-95715,US,CA,95715,7.5,,,, +US-CA-95717,US,CA,95717,7.5,,,, +US-CA-95720,US,CA,95720,7.5,,,, +US-CA-95721,US,CA,95721,7.5,,,, +US-CA-95722,US,CA,95722,7.5,,,, +US-CA-95724,US,CA,95724,7.625,,,, +US-CA-95726,US,CA,95726,7.5,,,, +US-CA-95728,US,CA,95728,7.625,,,, +US-CA-95735,US,CA,95735,7.5,,,, +US-CA-95736,US,CA,95736,7.5,,,, +US-CA-95741,US,CA,95741,8,,,, +US-CA-95742,US,CA,95742,8,,,, +US-CA-95746,US,CA,95746,7.5,,,, +US-CA-95747,US,CA,95747,7.5,,,, +US-CA-95757,US,CA,95757,8,,,, +US-CA-95758,US,CA,95758,8,,,, +US-CA-95759,US,CA,95759,8,,,, +US-CA-95762,US,CA,95762,7.5,,,, +US-CA-95763,US,CA,95763,8,,,, +US-CA-95765,US,CA,95765,7.5,,,, +US-CA-95776,US,CA,95776,8.25,,,, +US-CA-95798,US,CA,95798,8,,,, +US-CA-95799,US,CA,95799,8,,,, +US-CA-95811,US,CA,95811,8.5,,,, +US-CA-95812,US,CA,95812,8.5,,,, +US-CA-95813,US,CA,95813,8.5,,,, +US-CA-95814,US,CA,95814,8.5,,,, +US-CA-95815,US,CA,95815,8.5,,,, +US-CA-95816,US,CA,95816,8.5,,,, +US-CA-95817,US,CA,95817,8.5,,,, +US-CA-95818,US,CA,95818,8.5,,,, +US-CA-95819,US,CA,95819,8.5,,,, +US-CA-95820,US,CA,95820,8.5,,,, +US-CA-95821,US,CA,95821,8,,,, +US-CA-95822,US,CA,95822,8.5,,,, +US-CA-95823,US,CA,95823,8.5,,,, +US-CA-95824,US,CA,95824,8,,,, +US-CA-95825,US,CA,95825,8,,,, +US-CA-95826,US,CA,95826,8,,,, +US-CA-95827,US,CA,95827,8,,,, +US-CA-95828,US,CA,95828,8,,,, +US-CA-95829,US,CA,95829,8,,,, +US-CA-95830,US,CA,95830,8,,,, +US-CA-95831,US,CA,95831,8.5,,,, +US-CA-95832,US,CA,95832,8.5,,,, +US-CA-95833,US,CA,95833,8.5,,,, +US-CA-95834,US,CA,95834,8.5,,,, +US-CA-95835,US,CA,95835,8.5,,,, +US-CA-95836,US,CA,95836,8,,,, +US-CA-95837,US,CA,95837,8,,,, +US-CA-95838,US,CA,95838,8.5,,,, +US-CA-95840,US,CA,95840,8.5,,,, +US-CA-95841,US,CA,95841,8,,,, +US-CA-95842,US,CA,95842,8,,,, +US-CA-95843,US,CA,95843,8,,,, +US-CA-95851,US,CA,95851,8.5,,,, +US-CA-95852,US,CA,95852,8.5,,,, +US-CA-95853,US,CA,95853,8.5,,,, +US-CA-95860,US,CA,95860,8,,,, +US-CA-95864,US,CA,95864,8,,,, +US-CA-95865,US,CA,95865,8,,,, +US-CA-95866,US,CA,95866,8,,,, +US-CA-95867,US,CA,95867,8.5,,,, +US-CA-95887,US,CA,95887,8.5,,,, +US-CA-95894,US,CA,95894,8.5,,,, +US-CA-95899,US,CA,95899,8.5,,,, +US-CA-95901,US,CA,95901,7.5,,,, +US-CA-95903,US,CA,95903,7.5,,,, +US-CA-95910,US,CA,95910,7.5,,,, +US-CA-95912,US,CA,95912,7.5,,,, +US-CA-95913,US,CA,95913,7.5,,,, +US-CA-95914,US,CA,95914,7.5,,,, +US-CA-95915,US,CA,95915,7.5,,,, +US-CA-95916,US,CA,95916,7.5,,,, +US-CA-95917,US,CA,95917,7.5,,,, +US-CA-95918,US,CA,95918,7.5,,,, +US-CA-95919,US,CA,95919,7.5,,,, +US-CA-95920,US,CA,95920,7.5,,,, +US-CA-95922,US,CA,95922,7.5,,,, +US-CA-95923,US,CA,95923,7.5,,,, +US-CA-95924,US,CA,95924,7.625,,,, +US-CA-95925,US,CA,95925,7.5,,,, +US-CA-95926,US,CA,95926,7.5,,,, +US-CA-95927,US,CA,95927,7.5,,,, +US-CA-95928,US,CA,95928,7.5,,,, +US-CA-95929,US,CA,95929,7.5,,,, +US-CA-95930,US,CA,95930,7.5,,,, +US-CA-95932,US,CA,95932,7.5,,,, +US-CA-95934,US,CA,95934,7.5,,,, +US-CA-95935,US,CA,95935,7.5,,,, +US-CA-95936,US,CA,95936,7.5,,,, +US-CA-95937,US,CA,95937,7.5,,,, +US-CA-95938,US,CA,95938,7.5,,,, +US-CA-95939,US,CA,95939,7.5,,,, +US-CA-95940,US,CA,95940,7.5,,,, +US-CA-95941,US,CA,95941,7.5,,,, +US-CA-95942,US,CA,95942,7.5,,,, +US-CA-95943,US,CA,95943,7.5,,,, +US-CA-95944,US,CA,95944,7.5,,,, +US-CA-95945,US,CA,95945,8.125,,,, +US-CA-95946,US,CA,95946,7.625,,,, +US-CA-95947,US,CA,95947,7.5,,,, +US-CA-95948,US,CA,95948,7.5,,,, +US-CA-95949,US,CA,95949,7.625,,,, +US-CA-95950,US,CA,95950,7.5,,,, +US-CA-95951,US,CA,95951,7.5,,,, +US-CA-95953,US,CA,95953,7.5,,,, +US-CA-95954,US,CA,95954,7.5,,,, +US-CA-95955,US,CA,95955,7.5,,,, +US-CA-95956,US,CA,95956,7.5,,,, +US-CA-95957,US,CA,95957,7.5,,,, +US-CA-95958,US,CA,95958,7.5,,,, +US-CA-95959,US,CA,95959,7.625,,,, +US-CA-95960,US,CA,95960,7.625,,,, +US-CA-95961,US,CA,95961,7.5,,,, +US-CA-95962,US,CA,95962,7.5,,,, +US-CA-95963,US,CA,95963,7.5,,,, +US-CA-95965,US,CA,95965,7.5,,,, +US-CA-95966,US,CA,95966,7.5,,,, +US-CA-95967,US,CA,95967,7.5,,,, +US-CA-95968,US,CA,95968,7.5,,,, +US-CA-95969,US,CA,95969,7.5,,,, +US-CA-95970,US,CA,95970,7.5,,,, +US-CA-95971,US,CA,95971,7.5,,,, +US-CA-95972,US,CA,95972,7.5,,,, +US-CA-95973,US,CA,95973,7.5,,,, +US-CA-95974,US,CA,95974,7.5,,,, +US-CA-95975,US,CA,95975,7.625,,,, +US-CA-95976,US,CA,95976,7.5,,,, +US-CA-95977,US,CA,95977,7.625,,,, +US-CA-95978,US,CA,95978,7.5,,,, +US-CA-95979,US,CA,95979,7.5,,,, +US-CA-95980,US,CA,95980,7.5,,,, +US-CA-95981,US,CA,95981,7.5,,,, +US-CA-95982,US,CA,95982,7.5,,,, +US-CA-95983,US,CA,95983,7.5,,,, +US-CA-95984,US,CA,95984,7.5,,,, +US-CA-95986,US,CA,95986,7.625,,,, +US-CA-95987,US,CA,95987,8,,,, +US-CA-95988,US,CA,95988,7.5,,,, +US-CA-95991,US,CA,95991,7.5,,,, +US-CA-95992,US,CA,95992,7.5,,,, +US-CA-95993,US,CA,95993,7.5,,,, +US-CA-96001,US,CA,96001,7.5,,,, +US-CA-96002,US,CA,96002,7.5,,,, +US-CA-96003,US,CA,96003,7.5,,,, +US-CA-96006,US,CA,96006,7.5,,,, +US-CA-96007,US,CA,96007,7.5,,,, +US-CA-96008,US,CA,96008,7.5,,,, +US-CA-96009,US,CA,96009,7.5,,,, +US-CA-96010,US,CA,96010,7.5,,,, +US-CA-96011,US,CA,96011,7.5,,,, +US-CA-96013,US,CA,96013,7.5,,,, +US-CA-96014,US,CA,96014,7.5,,,, +US-CA-96015,US,CA,96015,7.5,,,, +US-CA-96016,US,CA,96016,7.5,,,, +US-CA-96017,US,CA,96017,7.5,,,, +US-CA-96019,US,CA,96019,7.5,,,, +US-CA-96020,US,CA,96020,7.5,,,, +US-CA-96021,US,CA,96021,7.5,,,, +US-CA-96022,US,CA,96022,7.5,,,, +US-CA-96023,US,CA,96023,7.5,,,, +US-CA-96024,US,CA,96024,7.5,,,, +US-CA-96025,US,CA,96025,7.5,,,, +US-CA-96027,US,CA,96027,7.5,,,, +US-CA-96028,US,CA,96028,7.5,,,, +US-CA-96029,US,CA,96029,7.5,,,, +US-CA-96031,US,CA,96031,7.5,,,, +US-CA-96032,US,CA,96032,7.5,,,, +US-CA-96033,US,CA,96033,7.5,,,, +US-CA-96034,US,CA,96034,7.5,,,, +US-CA-96035,US,CA,96035,7.5,,,, +US-CA-96037,US,CA,96037,7.5,,,, +US-CA-96038,US,CA,96038,7.5,,,, +US-CA-96039,US,CA,96039,7.5,,,, +US-CA-96040,US,CA,96040,7.5,,,, +US-CA-96041,US,CA,96041,7.5,,,, +US-CA-96044,US,CA,96044,7.5,,,, +US-CA-96046,US,CA,96046,7.5,,,, +US-CA-96047,US,CA,96047,7.5,,,, +US-CA-96048,US,CA,96048,7.5,,,, +US-CA-96049,US,CA,96049,7.5,,,, +US-CA-96050,US,CA,96050,7.5,,,, +US-CA-96051,US,CA,96051,7.5,,,, +US-CA-96052,US,CA,96052,7.5,,,, +US-CA-96054,US,CA,96054,7.5,,,, +US-CA-96055,US,CA,96055,7.5,,,, +US-CA-96056,US,CA,96056,7.5,,,, +US-CA-96057,US,CA,96057,7.5,,,, +US-CA-96058,US,CA,96058,7.5,,,, +US-CA-96059,US,CA,96059,7.5,,,, +US-CA-96061,US,CA,96061,7.5,,,, +US-CA-96062,US,CA,96062,7.5,,,, +US-CA-96063,US,CA,96063,7.5,,,, +US-CA-96064,US,CA,96064,7.5,,,, +US-CA-96065,US,CA,96065,7.5,,,, +US-CA-96067,US,CA,96067,7.75,,,, +US-CA-96068,US,CA,96068,7.5,,,, +US-CA-96069,US,CA,96069,7.5,,,, +US-CA-96070,US,CA,96070,7.5,,,, +US-CA-96071,US,CA,96071,7.5,,,, +US-CA-96073,US,CA,96073,7.5,,,, +US-CA-96074,US,CA,96074,7.5,,,, +US-CA-96075,US,CA,96075,7.5,,,, +US-CA-96076,US,CA,96076,7.5,,,, +US-CA-96078,US,CA,96078,7.5,,,, +US-CA-96079,US,CA,96079,7.5,,,, +US-CA-96080,US,CA,96080,7.5,,,, +US-CA-96084,US,CA,96084,7.5,,,, +US-CA-96085,US,CA,96085,7.5,,,, +US-CA-96086,US,CA,96086,7.5,,,, +US-CA-96087,US,CA,96087,7.5,,,, +US-CA-96088,US,CA,96088,7.5,,,, +US-CA-96089,US,CA,96089,7.5,,,, +US-CA-96090,US,CA,96090,7.5,,,, +US-CA-96091,US,CA,96091,7.5,,,, +US-CA-96092,US,CA,96092,7.5,,,, +US-CA-96093,US,CA,96093,7.5,,,, +US-CA-96094,US,CA,96094,7.5,,,, +US-CA-96095,US,CA,96095,7.5,,,, +US-CA-96096,US,CA,96096,7.5,,,, +US-CA-96097,US,CA,96097,7.5,,,, +US-CA-96099,US,CA,96099,7.5,,,, +US-CA-96101,US,CA,96101,7.5,,,, +US-CA-96103,US,CA,96103,7.5,,,, +US-CA-96104,US,CA,96104,7.5,,,, +US-CA-96105,US,CA,96105,7.5,,,, +US-CA-96106,US,CA,96106,7.5,,,, +US-CA-96107,US,CA,96107,7.5,,,, +US-CA-96108,US,CA,96108,7.5,,,, +US-CA-96109,US,CA,96109,7.5,,,, +US-CA-96110,US,CA,96110,7.5,,,, +US-CA-96111,US,CA,96111,7.625,,,, +US-CA-96112,US,CA,96112,7.5,,,, +US-CA-96113,US,CA,96113,7.5,,,, +US-CA-96114,US,CA,96114,7.5,,,, +US-CA-96115,US,CA,96115,7.5,,,, +US-CA-96116,US,CA,96116,7.5,,,, +US-CA-96117,US,CA,96117,7.5,,,, +US-CA-96118,US,CA,96118,7.5,,,, +US-CA-96119,US,CA,96119,7.5,,,, +US-CA-96120,US,CA,96120,7.5,,,, +US-CA-96121,US,CA,96121,7.5,,,, +US-CA-96122,US,CA,96122,7.5,,,, +US-CA-96123,US,CA,96123,7.5,,,, +US-CA-96124,US,CA,96124,7.5,,,, +US-CA-96125,US,CA,96125,7.5,,,, +US-CA-96126,US,CA,96126,7.5,,,, +US-CA-96127,US,CA,96127,7.5,,,, +US-CA-96128,US,CA,96128,7.5,,,, +US-CA-96129,US,CA,96129,7.5,,,, +US-CA-96130,US,CA,96130,7.5,,,, +US-CA-96132,US,CA,96132,7.5,,,, +US-CA-96133,US,CA,96133,7.5,,,, +US-CA-96134,US,CA,96134,7.5,,,, +US-CA-96135,US,CA,96135,7.5,,,, +US-CA-96136,US,CA,96136,7.5,,,, +US-CA-96137,US,CA,96137,7.5,,,, +US-CA-96140,US,CA,96140,7.5,,,, +US-CA-96141,US,CA,96141,7.5,,,, +US-CA-96142,US,CA,96142,7.5,,,, +US-CA-96143,US,CA,96143,7.5,,,, +US-CA-96145,US,CA,96145,7.5,,,, +US-CA-96146,US,CA,96146,7.5,,,, +US-CA-96148,US,CA,96148,7.5,,,, +US-CA-96150,US,CA,96150,8,,,, +US-CA-96151,US,CA,96151,8,,,, +US-CA-96152,US,CA,96152,8,,,, +US-CA-96154,US,CA,96154,8,,,, +US-CA-96155,US,CA,96155,7.5,,,, +US-CA-96156,US,CA,96156,8,,,, +US-CA-96157,US,CA,96157,7.5,,,, +US-CA-96158,US,CA,96158,8,,,, +US-CA-96160,US,CA,96160,8.125,,,, +US-CA-96161,US,CA,96161,8.125,,,, +US-CA-96162,US,CA,96162,8.125,,,, +US-CO-80001,US,CO,80001,7.96,,,, +US-CO-80002,US,CO,80002,7.96,,,, +US-CO-80003,US,CO,80003,7.96,,,, +US-CO-80004,US,CO,80004,7.96,,,, +US-CO-80005,US,CO,80005,7.96,,,, +US-CO-80006,US,CO,80006,7.96,,,, +US-CO-80007,US,CO,80007,7.96,,,, +US-CO-80010,US,CO,80010,8.5,,,, +US-CO-80011,US,CO,80011,8,,,, +US-CO-80012,US,CO,80012,8,,,, +US-CO-80013,US,CO,80013,8,,,, +US-CO-80014,US,CO,80014,8,,,, +US-CO-80015,US,CO,80015,8,,,, +US-CO-80016,US,CO,80016,8,,,, +US-CO-80017,US,CO,80017,8,,,, +US-CO-80018,US,CO,80018,7,,,, +US-CO-80019,US,CO,80019,8.5,,,, +US-CO-80020,US,CO,80020,8.15,,,, +US-CO-80021,US,CO,80021,8.35,,,, +US-CO-80022,US,CO,80022,8.25,,,, +US-CO-80023,US,CO,80023,8.15,,,, +US-CO-80024,US,CO,80024,4.75,,,, +US-CO-80025,US,CO,80025,4.8,,,, +US-CO-80026,US,CO,80026,8.3,,,, +US-CO-80027,US,CO,80027,8.3,,,, +US-CO-80030,US,CO,80030,8.6,,,, +US-CO-80031,US,CO,80031,8.6,,,, +US-CO-80033,US,CO,80033,7.5,,,, +US-CO-80034,US,CO,80034,7.5,,,, +US-CO-80035,US,CO,80035,8.6,,,, +US-CO-80036,US,CO,80036,8.6,,,, +US-CO-80037,US,CO,80037,8.25,,,, +US-CO-80038,US,CO,80038,8.15,,,, +US-CO-80040,US,CO,80040,8.5,,,, +US-CO-80041,US,CO,80041,8,,,, +US-CO-80042,US,CO,80042,8.5,,,, +US-CO-80044,US,CO,80044,8.5,,,, +US-CO-80045,US,CO,80045,8.5,,,, +US-CO-80046,US,CO,80046,6.75,,,, +US-CO-80047,US,CO,80047,8,,,, +US-CO-80101,US,CO,80101,3.9,,,, +US-CO-80102,US,CO,80102,3.75,,,, +US-CO-80103,US,CO,80103,3.25,,,, +US-CO-80104,US,CO,80104,7.9,,,, +US-CO-80105,US,CO,80105,3.25,,,, +US-CO-80106,US,CO,80106,5.13,,,, +US-CO-80107,US,CO,80107,3.9,,,, +US-CO-80108,US,CO,80108,7.9,,,, +US-CO-80109,US,CO,80109,7.9,,,, +US-CO-80110,US,CO,80110,7.75,,,, +US-CO-80111,US,CO,80111,7.25,,,, +US-CO-80112,US,CO,80112,6.75,,,, +US-CO-80113,US,CO,80113,7.75,,,, +US-CO-80116,US,CO,80116,4,,,, +US-CO-80117,US,CO,80117,3.9,,,, +US-CO-80118,US,CO,80118,4,,,, +US-CO-80120,US,CO,80120,7.25,,,, +US-CO-80121,US,CO,80121,6.75,,,, +US-CO-80122,US,CO,80122,6.75,,,, +US-CO-80123,US,CO,80123,5,,,, +US-CO-80124,US,CO,80124,6.8125,,,, +US-CO-80125,US,CO,80125,4,,,, +US-CO-80126,US,CO,80126,5,,,, +US-CO-80127,US,CO,80127,5,,,, +US-CO-80128,US,CO,80128,5,,,, +US-CO-80129,US,CO,80129,5,,,, +US-CO-80130,US,CO,80130,5,,,, +US-CO-80131,US,CO,80131,4,,,, +US-CO-80132,US,CO,80132,5.13,,,, +US-CO-80133,US,CO,80133,7.13,,,, +US-CO-80134,US,CO,80134,5,,,, +US-CO-80135,US,CO,80135,4,,,, +US-CO-80136,US,CO,80136,3.75,,,, +US-CO-80137,US,CO,80137,3.75,,,, +US-CO-80138,US,CO,80138,8,,,, +US-CO-80150,US,CO,80150,7.75,,,, +US-CO-80151,US,CO,80151,7.75,,,, +US-CO-80155,US,CO,80155,6.75,,,, +US-CO-80160,US,CO,80160,7.25,,,, +US-CO-80161,US,CO,80161,7.25,,,, +US-CO-80162,US,CO,80162,5,,,, +US-CO-80163,US,CO,80163,5,,,, +US-CO-80165,US,CO,80165,7.25,,,, +US-CO-80166,US,CO,80166,7.25,,,, +US-CO-80201,US,CO,80201,7.62,,,, +US-CO-80202,US,CO,80202,7.62,,,, +US-CO-80203,US,CO,80203,7.62,,,, +US-CO-80204,US,CO,80204,7.62,,,, +US-CO-80205,US,CO,80205,7.62,,,, +US-CO-80206,US,CO,80206,7.62,,,, +US-CO-80207,US,CO,80207,7.62,,,, +US-CO-80208,US,CO,80208,7.62,,,, +US-CO-80209,US,CO,80209,7.62,,,, +US-CO-80210,US,CO,80210,7.62,,,, +US-CO-80211,US,CO,80211,7.62,,,, +US-CO-80212,US,CO,80212,7.62,,,, +US-CO-80214,US,CO,80214,7.5,,,, +US-CO-80215,US,CO,80215,7.5,,,, +US-CO-80216,US,CO,80216,7.62,,,, +US-CO-80217,US,CO,80217,7.62,,,, +US-CO-80218,US,CO,80218,7.62,,,, +US-CO-80219,US,CO,80219,7.62,,,, +US-CO-80220,US,CO,80220,7.62,,,, +US-CO-80221,US,CO,80221,4.75,,,, +US-CO-80222,US,CO,80222,7.62,,,, +US-CO-80223,US,CO,80223,7.62,,,, +US-CO-80224,US,CO,80224,7.62,,,, +US-CO-80225,US,CO,80225,7.5,,,, +US-CO-80226,US,CO,80226,7.5,,,, +US-CO-80227,US,CO,80227,7.5,,,, +US-CO-80228,US,CO,80228,7.5,,,, +US-CO-80229,US,CO,80229,8.5,,,, +US-CO-80230,US,CO,80230,7.62,,,, +US-CO-80231,US,CO,80231,7.62,,,, +US-CO-80232,US,CO,80232,7.5,,,, +US-CO-80233,US,CO,80233,8.75,,,, +US-CO-80234,US,CO,80234,8.6,,,, +US-CO-80235,US,CO,80235,7.5,,,, +US-CO-80236,US,CO,80236,7.62,,,, +US-CO-80237,US,CO,80237,7.62,,,, +US-CO-80238,US,CO,80238,7.62,,,, +US-CO-80239,US,CO,80239,7.62,,,, +US-CO-80241,US,CO,80241,8.5,,,, +US-CO-80243,US,CO,80243,7.62,,,, +US-CO-80246,US,CO,80246,8,,,, +US-CO-80247,US,CO,80247,7.62,,,, +US-CO-80248,US,CO,80248,7.62,,,, +US-CO-80249,US,CO,80249,7.62,,,, +US-CO-80250,US,CO,80250,7.62,,,, +US-CO-80251,US,CO,80251,7.62,,,, +US-CO-80252,US,CO,80252,7.62,,,, +US-CO-80256,US,CO,80256,7.62,,,, +US-CO-80257,US,CO,80257,7.62,,,, +US-CO-80259,US,CO,80259,7.62,,,, +US-CO-80260,US,CO,80260,8.5,,,, +US-CO-80261,US,CO,80261,7.62,,,, +US-CO-80262,US,CO,80262,7.62,,,, +US-CO-80263,US,CO,80263,7.62,,,, +US-CO-80264,US,CO,80264,7.62,,,, +US-CO-80265,US,CO,80265,7.62,,,, +US-CO-80266,US,CO,80266,7.62,,,, +US-CO-80271,US,CO,80271,7.62,,,, +US-CO-80273,US,CO,80273,7.62,,,, +US-CO-80274,US,CO,80274,7.62,,,, +US-CO-80281,US,CO,80281,7.62,,,, +US-CO-80290,US,CO,80290,7.62,,,, +US-CO-80291,US,CO,80291,7.62,,,, +US-CO-80293,US,CO,80293,7.62,,,, +US-CO-80294,US,CO,80294,7.62,,,, +US-CO-80295,US,CO,80295,7.62,,,, +US-CO-80299,US,CO,80299,7.62,,,, +US-CO-80301,US,CO,80301,8.21,,,, +US-CO-80302,US,CO,80302,8.21,,,, +US-CO-80303,US,CO,80303,8.21,,,, +US-CO-80304,US,CO,80304,8.21,,,, +US-CO-80305,US,CO,80305,8.21,,,, +US-CO-80306,US,CO,80306,8.21,,,, +US-CO-80307,US,CO,80307,8.21,,,, +US-CO-80308,US,CO,80308,8.21,,,, +US-CO-80309,US,CO,80309,8.21,,,, +US-CO-80310,US,CO,80310,4.8,,,, +US-CO-80314,US,CO,80314,4.8,,,, +US-CO-80401,US,CO,80401,4.5,,,, +US-CO-80402,US,CO,80402,7.5,,,, +US-CO-80403,US,CO,80403,4.5,,,, +US-CO-80419,US,CO,80419,7.5,,,, +US-CO-80420,US,CO,80420,6.9,,,, +US-CO-80421,US,CO,80421,3.9,,,, +US-CO-80422,US,CO,80422,2.9,,,, +US-CO-80423,US,CO,80423,4.4,,,, +US-CO-80424,US,CO,80424,8.275,,,, +US-CO-80425,US,CO,80425,4.5,,,, +US-CO-80426,US,CO,80426,4.4,,,, +US-CO-80427,US,CO,80427,6.9,,,, +US-CO-80428,US,CO,80428,3.9,,,, +US-CO-80429,US,CO,80429,6.9,,,, +US-CO-80430,US,CO,80430,6.9,,,, +US-CO-80432,US,CO,80432,7.9,,,, +US-CO-80433,US,CO,80433,4.5,,,, +US-CO-80434,US,CO,80434,6.9,,,, +US-CO-80435,US,CO,80435,5.775,,,, +US-CO-80436,US,CO,80436,3.9,,,, +US-CO-80437,US,CO,80437,4.5,,,, +US-CO-80438,US,CO,80438,6.9,,,, +US-CO-80439,US,CO,80439,4.5,,,, +US-CO-80440,US,CO,80440,7.9,,,, +US-CO-80442,US,CO,80442,7.9,,,, +US-CO-80443,US,CO,80443,7.775,,,, +US-CO-80444,US,CO,80444,6.9,,,, +US-CO-80446,US,CO,80446,3.9,,,, +US-CO-80447,US,CO,80447,3.9,,,, +US-CO-80448,US,CO,80448,3.9,,,, +US-CO-80449,US,CO,80449,3.9,,,, +US-CO-80451,US,CO,80451,7.9,,,, +US-CO-80452,US,CO,80452,3.9,,,, +US-CO-80453,US,CO,80453,4.5,,,, +US-CO-80454,US,CO,80454,4.5,,,, +US-CO-80455,US,CO,80455,4.8,,,, +US-CO-80456,US,CO,80456,3.9,,,, +US-CO-80457,US,CO,80457,4.5,,,, +US-CO-80459,US,CO,80459,3.9,,,, +US-CO-80461,US,CO,80461,6.9,,,, +US-CO-80463,US,CO,80463,4.4,,,, +US-CO-80465,US,CO,80465,4.5,,,, +US-CO-80466,US,CO,80466,4.8,,,, +US-CO-80467,US,CO,80467,3.9,,,, +US-CO-80468,US,CO,80468,3.9,,,, +US-CO-80469,US,CO,80469,3.9,,,, +US-CO-80470,US,CO,80470,4.5,,,, +US-CO-80471,US,CO,80471,4.8,,,, +US-CO-80473,US,CO,80473,6.9,,,, +US-CO-80474,US,CO,80474,2.9,,,, +US-CO-80475,US,CO,80475,3.9,,,, +US-CO-80476,US,CO,80476,6.9,,,, +US-CO-80477,US,CO,80477,8.65,,,, +US-CO-80478,US,CO,80478,3.9,,,, +US-CO-80479,US,CO,80479,3.9,,,, +US-CO-80480,US,CO,80480,6.9,,,, +US-CO-80481,US,CO,80481,4.8,,,, +US-CO-80482,US,CO,80482,8.9,,,, +US-CO-80483,US,CO,80483,5.9,,,, +US-CO-80487,US,CO,80487,8.65,,,, +US-CO-80488,US,CO,80488,8.65,,,, +US-CO-80497,US,CO,80497,7.775,,,, +US-CO-80498,US,CO,80498,5.775,,,, +US-CO-80501,US,CO,80501,8.075,,,, +US-CO-80502,US,CO,80502,8.075,,,, +US-CO-80503,US,CO,80503,8.075,,,, +US-CO-80504,US,CO,80504,8.075,,,, +US-CO-80510,US,CO,80510,4.8,,,, +US-CO-80511,US,CO,80511,7.5,,,, +US-CO-80512,US,CO,80512,3.5,,,, +US-CO-80513,US,CO,80513,3.5,,,, +US-CO-80514,US,CO,80514,5.9,,,, +US-CO-80515,US,CO,80515,3.5,,,, +US-CO-80516,US,CO,80516,7.4,,,, +US-CO-80517,US,CO,80517,7.5,,,, +US-CO-80520,US,CO,80520,4.9,,,, +US-CO-80521,US,CO,80521,7.35,,,, +US-CO-80522,US,CO,80522,7.35,,,, +US-CO-80523,US,CO,80523,7.35,,,, +US-CO-80524,US,CO,80524,7.35,,,, +US-CO-80525,US,CO,80525,7.35,,,, +US-CO-80526,US,CO,80526,7.35,,,, +US-CO-80527,US,CO,80527,7.35,,,, +US-CO-80528,US,CO,80528,7.35,,,, +US-CO-80530,US,CO,80530,5.4,,,, +US-CO-80532,US,CO,80532,3.5,,,, +US-CO-80533,US,CO,80533,4.8,,,, +US-CO-80534,US,CO,80534,5.9,,,, +US-CO-80535,US,CO,80535,3.5,,,, +US-CO-80536,US,CO,80536,3.5,,,, +US-CO-80537,US,CO,80537,6.5,,,, +US-CO-80538,US,CO,80538,6.5,,,, +US-CO-80539,US,CO,80539,6.5,,,, +US-CO-80540,US,CO,80540,3.5,,,, +US-CO-80541,US,CO,80541,3.5,,,, +US-CO-80542,US,CO,80542,4.9,,,, +US-CO-80543,US,CO,80543,5.4,,,, +US-CO-80544,US,CO,80544,5.8,,,, +US-CO-80545,US,CO,80545,3.5,,,, +US-CO-80546,US,CO,80546,5.9,,,, +US-CO-80547,US,CO,80547,6.5,,,, +US-CO-80549,US,CO,80549,6.5,,,, +US-CO-80550,US,CO,80550,6.1,,,, +US-CO-80551,US,CO,80551,6.1,,,, +US-CO-80553,US,CO,80553,7.35,,,, +US-CO-80601,US,CO,80601,8.5,,,, +US-CO-80602,US,CO,80602,8.5,,,, +US-CO-80603,US,CO,80603,4.75,,,, +US-CO-80610,US,CO,80610,2.9,,,, +US-CO-80611,US,CO,80611,2.9,,,, +US-CO-80612,US,CO,80612,2.9,,,, +US-CO-80614,US,CO,80614,8.5,,,, +US-CO-80615,US,CO,80615,5.9,,,, +US-CO-80620,US,CO,80620,6.4,,,, +US-CO-80621,US,CO,80621,6.9,,,, +US-CO-80622,US,CO,80622,2.9,,,, +US-CO-80623,US,CO,80623,6.9,,,, +US-CO-80624,US,CO,80624,2.9,,,, +US-CO-80631,US,CO,80631,6.36,,,, +US-CO-80632,US,CO,80632,6.36,,,, +US-CO-80633,US,CO,80633,6.36,,,, +US-CO-80634,US,CO,80634,6.36,,,, +US-CO-80638,US,CO,80638,6.36,,,, +US-CO-80639,US,CO,80639,6.36,,,, +US-CO-80640,US,CO,80640,8.25,,,, +US-CO-80642,US,CO,80642,2.9,,,, +US-CO-80643,US,CO,80643,2.9,,,, +US-CO-80644,US,CO,80644,2.9,,,, +US-CO-80645,US,CO,80645,2.9,,,, +US-CO-80646,US,CO,80646,2.9,,,, +US-CO-80648,US,CO,80648,2.9,,,, +US-CO-80649,US,CO,80649,2.9,,,, +US-CO-80650,US,CO,80650,2.9,,,, +US-CO-80651,US,CO,80651,2.9,,,, +US-CO-80652,US,CO,80652,2.9,,,, +US-CO-80653,US,CO,80653,2.9,,,, +US-CO-80654,US,CO,80654,2.9,,,, +US-CO-80701,US,CO,80701,5.9,,,, +US-CO-80705,US,CO,80705,5.9,,,, +US-CO-80720,US,CO,80720,4.4,,,, +US-CO-80721,US,CO,80721,3.9,,,, +US-CO-80722,US,CO,80722,3.9,,,, +US-CO-80723,US,CO,80723,6.5,,,, +US-CO-80726,US,CO,80726,3.9,,,, +US-CO-80727,US,CO,80727,2.9,,,, +US-CO-80728,US,CO,80728,3.9,,,, +US-CO-80729,US,CO,80729,2.9,,,, +US-CO-80731,US,CO,80731,6.4,,,, +US-CO-80732,US,CO,80732,2.9,,,, +US-CO-80733,US,CO,80733,2.9,,,, +US-CO-80734,US,CO,80734,5.4,,,, +US-CO-80735,US,CO,80735,2.9,,,, +US-CO-80736,US,CO,80736,3.9,,,, +US-CO-80737,US,CO,80737,5.9,,,, +US-CO-80740,US,CO,80740,4.4,,,, +US-CO-80741,US,CO,80741,3.9,,,, +US-CO-80742,US,CO,80742,2.9,,,, +US-CO-80743,US,CO,80743,4.4,,,, +US-CO-80744,US,CO,80744,4.9,,,, +US-CO-80745,US,CO,80745,3.9,,,, +US-CO-80746,US,CO,80746,3.9,,,, +US-CO-80747,US,CO,80747,3.9,,,, +US-CO-80749,US,CO,80749,4.9,,,, +US-CO-80750,US,CO,80750,2.9,,,, +US-CO-80751,US,CO,80751,7,,,, +US-CO-80754,US,CO,80754,2.9,,,, +US-CO-80755,US,CO,80755,2.9,,,, +US-CO-80757,US,CO,80757,4.4,,,, +US-CO-80758,US,CO,80758,5.4,,,, +US-CO-80759,US,CO,80759,5.9,,,, +US-CO-80801,US,CO,80801,4.4,,,, +US-CO-80802,US,CO,80802,2.9,,,, +US-CO-80804,US,CO,80804,4.9,,,, +US-CO-80805,US,CO,80805,2.9,,,, +US-CO-80807,US,CO,80807,4.9,,,, +US-CO-80808,US,CO,80808,5.13,,,, +US-CO-80809,US,CO,80809,5.13,,,, +US-CO-80810,US,CO,80810,2.9,,,, +US-CO-80812,US,CO,80812,4.4,,,, +US-CO-80813,US,CO,80813,3.9,,,, +US-CO-80814,US,CO,80814,3.9,,,, +US-CO-80815,US,CO,80815,2.9,,,, +US-CO-80816,US,CO,80816,3.9,,,, +US-CO-80817,US,CO,80817,7.88,,,, +US-CO-80818,US,CO,80818,4.9,,,, +US-CO-80819,US,CO,80819,8.13,,,, +US-CO-80820,US,CO,80820,3.9,,,, +US-CO-80821,US,CO,80821,4.9,,,, +US-CO-80822,US,CO,80822,2.9,,,, +US-CO-80823,US,CO,80823,4.9,,,, +US-CO-80824,US,CO,80824,2.9,,,, +US-CO-80825,US,CO,80825,2.9,,,, +US-CO-80826,US,CO,80826,4.9,,,, +US-CO-80827,US,CO,80827,3.9,,,, +US-CO-80828,US,CO,80828,6.9,,,, +US-CO-80829,US,CO,80829,9.03,,,, +US-CO-80830,US,CO,80830,3.9,,,, +US-CO-80831,US,CO,80831,5.13,,,, +US-CO-80832,US,CO,80832,3.9,,,, +US-CO-80833,US,CO,80833,5.13,,,, +US-CO-80834,US,CO,80834,2.9,,,, +US-CO-80835,US,CO,80835,3.9,,,, +US-CO-80836,US,CO,80836,2.9,,,, +US-CO-80840,US,CO,80840,2.9,,,, +US-CO-80841,US,CO,80841,2.9,,,, +US-CO-80860,US,CO,80860,6.9,,,, +US-CO-80861,US,CO,80861,2.9,,,, +US-CO-80862,US,CO,80862,2.9,,,, +US-CO-80863,US,CO,80863,6.9,,,, +US-CO-80864,US,CO,80864,5.13,,,, +US-CO-80866,US,CO,80866,6.9,,,, +US-CO-80901,US,CO,80901,7.63,,,, +US-CO-80902,US,CO,80902,5.13,,,, +US-CO-80903,US,CO,80903,7.63,,,, +US-CO-80904,US,CO,80904,7.63,,,, +US-CO-80905,US,CO,80905,7.63,,,, +US-CO-80906,US,CO,80906,7.63,,,, +US-CO-80907,US,CO,80907,7.63,,,, +US-CO-80908,US,CO,80908,5.13,,,, +US-CO-80909,US,CO,80909,7.63,,,, +US-CO-80910,US,CO,80910,7.63,,,, +US-CO-80911,US,CO,80911,5.13,,,, +US-CO-80912,US,CO,80912,2.9,,,, +US-CO-80913,US,CO,80913,5.13,,,, +US-CO-80914,US,CO,80914,7.63,,,, +US-CO-80915,US,CO,80915,5.13,,,, +US-CO-80916,US,CO,80916,7.63,,,, +US-CO-80917,US,CO,80917,7.63,,,, +US-CO-80918,US,CO,80918,7.63,,,, +US-CO-80919,US,CO,80919,7.63,,,, +US-CO-80920,US,CO,80920,7.63,,,, +US-CO-80921,US,CO,80921,5.13,,,, +US-CO-80922,US,CO,80922,7.63,,,, +US-CO-80923,US,CO,80923,7.63,,,, +US-CO-80924,US,CO,80924,7.63,,,, +US-CO-80925,US,CO,80925,5.13,,,, +US-CO-80926,US,CO,80926,5.13,,,, +US-CO-80927,US,CO,80927,7.63,,,, +US-CO-80928,US,CO,80928,5.13,,,, +US-CO-80929,US,CO,80929,5.13,,,, +US-CO-80930,US,CO,80930,5.13,,,, +US-CO-80931,US,CO,80931,5.13,,,, +US-CO-80932,US,CO,80932,7.63,,,, +US-CO-80933,US,CO,80933,7.63,,,, +US-CO-80934,US,CO,80934,7.63,,,, +US-CO-80935,US,CO,80935,7.63,,,, +US-CO-80936,US,CO,80936,7.63,,,, +US-CO-80937,US,CO,80937,7.63,,,, +US-CO-80938,US,CO,80938,7.63,,,, +US-CO-80939,US,CO,80939,5.13,,,, +US-CO-80941,US,CO,80941,7.63,,,, +US-CO-80942,US,CO,80942,7.63,,,, +US-CO-80944,US,CO,80944,7.63,,,, +US-CO-80946,US,CO,80946,7.63,,,, +US-CO-80947,US,CO,80947,7.63,,,, +US-CO-80949,US,CO,80949,7.63,,,, +US-CO-80950,US,CO,80950,7.63,,,, +US-CO-80951,US,CO,80951,5.13,,,, +US-CO-80960,US,CO,80960,7.63,,,, +US-CO-80962,US,CO,80962,7.63,,,, +US-CO-80970,US,CO,80970,5.13,,,, +US-CO-80977,US,CO,80977,5.13,,,, +US-CO-80995,US,CO,80995,7.63,,,, +US-CO-80997,US,CO,80997,7.63,,,, +US-CO-81001,US,CO,81001,7.4,,,, +US-CO-81002,US,CO,81002,7.4,,,, +US-CO-81003,US,CO,81003,7.4,,,, +US-CO-81004,US,CO,81004,7.4,,,, +US-CO-81005,US,CO,81005,7.4,,,, +US-CO-81006,US,CO,81006,3.9,,,, +US-CO-81007,US,CO,81007,3.9,,,, +US-CO-81008,US,CO,81008,7.4,,,, +US-CO-81009,US,CO,81009,7.4,,,, +US-CO-81010,US,CO,81010,7.4,,,, +US-CO-81011,US,CO,81011,7.4,,,, +US-CO-81012,US,CO,81012,7.4,,,, +US-CO-81019,US,CO,81019,7.4,,,, +US-CO-81020,US,CO,81020,2.9,,,, +US-CO-81021,US,CO,81021,2.9,,,, +US-CO-81022,US,CO,81022,3.9,,,, +US-CO-81023,US,CO,81023,3.9,,,, +US-CO-81024,US,CO,81024,2.9,,,, +US-CO-81025,US,CO,81025,3.9,,,, +US-CO-81027,US,CO,81027,2.9,,,, +US-CO-81029,US,CO,81029,2.9,,,, +US-CO-81030,US,CO,81030,3.9,,,, +US-CO-81033,US,CO,81033,4.9,,,, +US-CO-81034,US,CO,81034,4.9,,,, +US-CO-81036,US,CO,81036,2.9,,,, +US-CO-81038,US,CO,81038,6.9,,,, +US-CO-81039,US,CO,81039,6.9,,,, +US-CO-81040,US,CO,81040,4.9,,,, +US-CO-81041,US,CO,81041,3.9,,,, +US-CO-81043,US,CO,81043,3.9,,,, +US-CO-81044,US,CO,81044,3.9,,,, +US-CO-81045,US,CO,81045,2.9,,,, +US-CO-81046,US,CO,81046,2.9,,,, +US-CO-81047,US,CO,81047,3.9,,,, +US-CO-81049,US,CO,81049,2.9,,,, +US-CO-81050,US,CO,81050,6.9,,,, +US-CO-81052,US,CO,81052,7.15,,,, +US-CO-81054,US,CO,81054,6.9,,,, +US-CO-81055,US,CO,81055,4.9,,,, +US-CO-81057,US,CO,81057,3.9,,,, +US-CO-81058,US,CO,81058,3.9,,,, +US-CO-81059,US,CO,81059,2.9,,,, +US-CO-81062,US,CO,81062,4.9,,,, +US-CO-81063,US,CO,81063,6.9,,,, +US-CO-81064,US,CO,81064,2.9,,,, +US-CO-81067,US,CO,81067,6.9,,,, +US-CO-81069,US,CO,81069,3.9,,,, +US-CO-81071,US,CO,81071,2.9,,,, +US-CO-81073,US,CO,81073,4.9,,,, +US-CO-81076,US,CO,81076,4.9,,,, +US-CO-81077,US,CO,81077,3.9,,,, +US-CO-81081,US,CO,81081,2.9,,,, +US-CO-81082,US,CO,81082,6.9,,,, +US-CO-81084,US,CO,81084,2.9,,,, +US-CO-81087,US,CO,81087,2.9,,,, +US-CO-81089,US,CO,81089,7.9,,,, +US-CO-81090,US,CO,81090,2.9,,,, +US-CO-81091,US,CO,81091,2.9,,,, +US-CO-81092,US,CO,81092,3.9,,,, +US-CO-81101,US,CO,81101,6.9,,,, +US-CO-81102,US,CO,81102,6.9,,,, +US-CO-81120,US,CO,81120,2.9,,,, +US-CO-81121,US,CO,81121,6.9,,,, +US-CO-81122,US,CO,81122,4.9,,,, +US-CO-81123,US,CO,81123,3.9,,,, +US-CO-81124,US,CO,81124,2.9,,,, +US-CO-81125,US,CO,81125,3.9,,,, +US-CO-81126,US,CO,81126,3.9,,,, +US-CO-81128,US,CO,81128,6.9,,,, +US-CO-81129,US,CO,81129,2.9,,,, +US-CO-81130,US,CO,81130,5.5,,,, +US-CO-81131,US,CO,81131,6.9,,,, +US-CO-81132,US,CO,81132,7.5,,,, +US-CO-81133,US,CO,81133,3.9,,,, +US-CO-81135,US,CO,81135,7.5,,,, +US-CO-81136,US,CO,81136,4.9,,,, +US-CO-81137,US,CO,81137,4.9,,,, +US-CO-81138,US,CO,81138,3.9,,,, +US-CO-81140,US,CO,81140,2.9,,,, +US-CO-81141,US,CO,81141,3.9,,,, +US-CO-81143,US,CO,81143,3.9,,,, +US-CO-81144,US,CO,81144,7.5,,,, +US-CO-81146,US,CO,81146,4.9,,,, +US-CO-81147,US,CO,81147,6.9,,,, +US-CO-81148,US,CO,81148,3.9,,,, +US-CO-81149,US,CO,81149,3.9,,,, +US-CO-81151,US,CO,81151,2.9,,,, +US-CO-81152,US,CO,81152,3.9,,,, +US-CO-81154,US,CO,81154,5.5,,,, +US-CO-81155,US,CO,81155,3.9,,,, +US-CO-81157,US,CO,81157,6.9,,,, +US-CO-81201,US,CO,81201,7.9,,,, +US-CO-81210,US,CO,81210,4.5,,,, +US-CO-81211,US,CO,81211,4.9,,,, +US-CO-81212,US,CO,81212,6.4,,,, +US-CO-81215,US,CO,81215,6.4,,,, +US-CO-81220,US,CO,81220,4.5,,,, +US-CO-81221,US,CO,81221,4.4,,,, +US-CO-81222,US,CO,81222,4.4,,,, +US-CO-81223,US,CO,81223,4.4,,,, +US-CO-81224,US,CO,81224,4.5,,,, +US-CO-81225,US,CO,81225,8.5,,,, +US-CO-81226,US,CO,81226,6.9,,,, +US-CO-81227,US,CO,81227,7.9,,,, +US-CO-81228,US,CO,81228,4.9,,,, +US-CO-81230,US,CO,81230,8.25,,,, +US-CO-81231,US,CO,81231,8.25,,,, +US-CO-81232,US,CO,81232,7.9,,,, +US-CO-81233,US,CO,81233,4.4,,,, +US-CO-81235,US,CO,81235,7.9,,,, +US-CO-81236,US,CO,81236,4.9,,,, +US-CO-81237,US,CO,81237,4.5,,,, +US-CO-81239,US,CO,81239,4.5,,,, +US-CO-81240,US,CO,81240,4.4,,,, +US-CO-81241,US,CO,81241,6.9,,,, +US-CO-81242,US,CO,81242,6.9,,,, +US-CO-81243,US,CO,81243,4.5,,,, +US-CO-81244,US,CO,81244,4.4,,,, +US-CO-81247,US,CO,81247,8.25,,,, +US-CO-81248,US,CO,81248,3.9,,,, +US-CO-81251,US,CO,81251,6.9,,,, +US-CO-81252,US,CO,81252,4.9,,,, +US-CO-81253,US,CO,81253,4.9,,,, +US-CO-81290,US,CO,81290,6.9,,,, +US-CO-81301,US,CO,81301,7.9,,,, +US-CO-81302,US,CO,81302,7.9,,,, +US-CO-81303,US,CO,81303,4.9,,,, +US-CO-81320,US,CO,81320,2.9,,,, +US-CO-81321,US,CO,81321,6.95,,,, +US-CO-81323,US,CO,81323,2.9,,,, +US-CO-81324,US,CO,81324,2.9,,,, +US-CO-81325,US,CO,81325,3.9,,,, +US-CO-81326,US,CO,81326,4.9,,,, +US-CO-81327,US,CO,81327,2.9,,,, +US-CO-81328,US,CO,81328,2.9,,,, +US-CO-81329,US,CO,81329,4.9,,,, +US-CO-81330,US,CO,81330,2.9,,,, +US-CO-81331,US,CO,81331,2.9,,,, +US-CO-81332,US,CO,81332,7.9,,,, +US-CO-81334,US,CO,81334,2.9,,,, +US-CO-81335,US,CO,81335,2.9,,,, +US-CO-81401,US,CO,81401,7.65,,,, +US-CO-81402,US,CO,81402,7.65,,,, +US-CO-81403,US,CO,81403,4.65,,,, +US-CO-81410,US,CO,81410,4.9,,,, +US-CO-81411,US,CO,81411,4.65,,,, +US-CO-81413,US,CO,81413,4.9,,,, +US-CO-81414,US,CO,81414,4.9,,,, +US-CO-81415,US,CO,81415,4.9,,,, +US-CO-81416,US,CO,81416,7.9,,,, +US-CO-81418,US,CO,81418,4.9,,,, +US-CO-81419,US,CO,81419,4.9,,,, +US-CO-81420,US,CO,81420,4.9,,,, +US-CO-81422,US,CO,81422,8.65,,,, +US-CO-81423,US,CO,81423,6.9,,,, +US-CO-81424,US,CO,81424,8.65,,,, +US-CO-81425,US,CO,81425,4.65,,,, +US-CO-81426,US,CO,81426,3.9,,,, +US-CO-81427,US,CO,81427,7.9,,,, +US-CO-81428,US,CO,81428,4.9,,,, +US-CO-81429,US,CO,81429,4.65,,,, +US-CO-81430,US,CO,81430,3.9,,,, +US-CO-81431,US,CO,81431,4.65,,,, +US-CO-81432,US,CO,81432,4.9,,,, +US-CO-81433,US,CO,81433,8.9,,,, +US-CO-81434,US,CO,81434,4.5,,,, +US-CO-81435,US,CO,81435,8.4,,,, +US-CO-81501,US,CO,81501,7.65,,,, +US-CO-81502,US,CO,81502,7.65,,,, +US-CO-81503,US,CO,81503,4.9,,,, +US-CO-81504,US,CO,81504,4.9,,,, +US-CO-81505,US,CO,81505,7.65,,,, +US-CO-81506,US,CO,81506,7.65,,,, +US-CO-81507,US,CO,81507,4.9,,,, +US-CO-81520,US,CO,81520,4.9,,,, +US-CO-81521,US,CO,81521,7.9,,,, +US-CO-81522,US,CO,81522,4.9,,,, +US-CO-81523,US,CO,81523,4.9,,,, +US-CO-81524,US,CO,81524,4.9,,,, +US-CO-81525,US,CO,81525,4.9,,,, +US-CO-81526,US,CO,81526,6.9,,,, +US-CO-81527,US,CO,81527,4.9,,,, +US-CO-81601,US,CO,81601,8.6,,,, +US-CO-81602,US,CO,81602,8.6,,,, +US-CO-81610,US,CO,81610,4.9,,,, +US-CO-81611,US,CO,81611,9.3,,,, +US-CO-81612,US,CO,81612,9.3,,,, +US-CO-81615,US,CO,81615,10.4,,,, +US-CO-81620,US,CO,81620,8.4,,,, +US-CO-81621,US,CO,81621,8.2,,,, +US-CO-81623,US,CO,81623,8.4,,,, +US-CO-81624,US,CO,81624,4.9,,,, +US-CO-81625,US,CO,81625,7.15,,,, +US-CO-81626,US,CO,81626,7.15,,,, +US-CO-81630,US,CO,81630,4.9,,,, +US-CO-81631,US,CO,81631,8.4,,,, +US-CO-81632,US,CO,81632,4.4,,,, +US-CO-81633,US,CO,81633,4.9,,,, +US-CO-81635,US,CO,81635,3.9,,,, +US-CO-81636,US,CO,81636,7.65,,,, +US-CO-81637,US,CO,81637,4.4,,,, +US-CO-81638,US,CO,81638,4.9,,,, +US-CO-81639,US,CO,81639,3.9,,,, +US-CO-81640,US,CO,81640,4.9,,,, +US-CO-81641,US,CO,81641,6.5,,,, +US-CO-81642,US,CO,81642,6.9,,,, +US-CO-81643,US,CO,81643,4.9,,,, +US-CO-81645,US,CO,81645,8.4,,,, +US-CO-81646,US,CO,81646,4.9,,,, +US-CO-81647,US,CO,81647,3.9,,,, +US-CO-81648,US,CO,81648,6.5,,,, +US-CO-81649,US,CO,81649,7.4,,,, +US-CO-81650,US,CO,81650,8.15,,,, +US-CO-81652,US,CO,81652,6.9,,,, +US-CO-81653,US,CO,81653,4.9,,,, +US-CO-81654,US,CO,81654,6.9,,,, +US-CO-81655,US,CO,81655,4.4,,,, +US-CO-81656,US,CO,81656,6.9,,,, +US-CO-81657,US,CO,81657,8.4,,,, +US-CO-81658,US,CO,81658,8.4,,,, +US-CT-06001,US,CT,06001,6.35,,,, +US-CT-06002,US,CT,06002,6.35,,,, +US-CT-06006,US,CT,06006,6.35,,,, +US-CT-06010,US,CT,06010,6.35,,,, +US-CT-06011,US,CT,06011,6.35,,,, +US-CT-06013,US,CT,06013,6.35,,,, +US-CT-06016,US,CT,06016,6.35,,,, +US-CT-06018,US,CT,06018,6.35,,,, +US-CT-06019,US,CT,06019,6.35,,,, +US-CT-06020,US,CT,06020,6.35,,,, +US-CT-06021,US,CT,06021,6.35,,,, +US-CT-06022,US,CT,06022,6.35,,,, +US-CT-06023,US,CT,06023,6.35,,,, +US-CT-06024,US,CT,06024,6.35,,,, +US-CT-06025,US,CT,06025,6.35,,,, +US-CT-06026,US,CT,06026,6.35,,,, +US-CT-06027,US,CT,06027,6.35,,,, +US-CT-06028,US,CT,06028,6.35,,,, +US-CT-06029,US,CT,06029,6.35,,,, +US-CT-06030,US,CT,06030,6.35,,,, +US-CT-06031,US,CT,06031,6.35,,,, +US-CT-06032,US,CT,06032,6.35,,,, +US-CT-06033,US,CT,06033,6.35,,,, +US-CT-06034,US,CT,06034,6.35,,,, +US-CT-06035,US,CT,06035,6.35,,,, +US-CT-06037,US,CT,06037,6.35,,,, +US-CT-06039,US,CT,06039,6.35,,,, +US-CT-06040,US,CT,06040,6.35,,,, +US-CT-06041,US,CT,06041,6.35,,,, +US-CT-06042,US,CT,06042,6.35,,,, +US-CT-06043,US,CT,06043,6.35,,,, +US-CT-06045,US,CT,06045,6.35,,,, +US-CT-06050,US,CT,06050,6.35,,,, +US-CT-06051,US,CT,06051,6.35,,,, +US-CT-06052,US,CT,06052,6.35,,,, +US-CT-06053,US,CT,06053,6.35,,,, +US-CT-06057,US,CT,06057,6.35,,,, +US-CT-06058,US,CT,06058,6.35,,,, +US-CT-06059,US,CT,06059,6.35,,,, +US-CT-06060,US,CT,06060,6.35,,,, +US-CT-06061,US,CT,06061,6.35,,,, +US-CT-06062,US,CT,06062,6.35,,,, +US-CT-06063,US,CT,06063,6.35,,,, +US-CT-06064,US,CT,06064,6.35,,,, +US-CT-06065,US,CT,06065,6.35,,,, +US-CT-06066,US,CT,06066,6.35,,,, +US-CT-06067,US,CT,06067,6.35,,,, +US-CT-06068,US,CT,06068,6.35,,,, +US-CT-06069,US,CT,06069,6.35,,,, +US-CT-06070,US,CT,06070,6.35,,,, +US-CT-06071,US,CT,06071,6.35,,,, +US-CT-06072,US,CT,06072,6.35,,,, +US-CT-06073,US,CT,06073,6.35,,,, +US-CT-06074,US,CT,06074,6.35,,,, +US-CT-06075,US,CT,06075,6.35,,,, +US-CT-06076,US,CT,06076,6.35,,,, +US-CT-06077,US,CT,06077,6.35,,,, +US-CT-06078,US,CT,06078,6.35,,,, +US-CT-06079,US,CT,06079,6.35,,,, +US-CT-06080,US,CT,06080,6.35,,,, +US-CT-06081,US,CT,06081,6.35,,,, +US-CT-06082,US,CT,06082,6.35,,,, +US-CT-06083,US,CT,06083,6.35,,,, +US-CT-06084,US,CT,06084,6.35,,,, +US-CT-06085,US,CT,06085,6.35,,,, +US-CT-06087,US,CT,06087,6.35,,,, +US-CT-06088,US,CT,06088,6.35,,,, +US-CT-06089,US,CT,06089,6.35,,,, +US-CT-06090,US,CT,06090,6.35,,,, +US-CT-06091,US,CT,06091,6.35,,,, +US-CT-06092,US,CT,06092,6.35,,,, +US-CT-06093,US,CT,06093,6.35,,,, +US-CT-06094,US,CT,06094,6.35,,,, +US-CT-06095,US,CT,06095,6.35,,,, +US-CT-06096,US,CT,06096,6.35,,,, +US-CT-06098,US,CT,06098,6.35,,,, +US-CT-06101,US,CT,06101,6.35,,,, +US-CT-06102,US,CT,06102,6.35,,,, +US-CT-06103,US,CT,06103,6.35,,,, +US-CT-06104,US,CT,06104,6.35,,,, +US-CT-06105,US,CT,06105,6.35,,,, +US-CT-06106,US,CT,06106,6.35,,,, +US-CT-06107,US,CT,06107,6.35,,,, +US-CT-06108,US,CT,06108,6.35,,,, +US-CT-06109,US,CT,06109,6.35,,,, +US-CT-06110,US,CT,06110,6.35,,,, +US-CT-06111,US,CT,06111,6.35,,,, +US-CT-06112,US,CT,06112,6.35,,,, +US-CT-06114,US,CT,06114,6.35,,,, +US-CT-06115,US,CT,06115,6.35,,,, +US-CT-06117,US,CT,06117,6.35,,,, +US-CT-06118,US,CT,06118,6.35,,,, +US-CT-06119,US,CT,06119,6.35,,,, +US-CT-06120,US,CT,06120,6.35,,,, +US-CT-06123,US,CT,06123,6.35,,,, +US-CT-06126,US,CT,06126,6.35,,,, +US-CT-06127,US,CT,06127,6.35,,,, +US-CT-06128,US,CT,06128,6.35,,,, +US-CT-06129,US,CT,06129,6.35,,,, +US-CT-06131,US,CT,06131,6.35,,,, +US-CT-06132,US,CT,06132,6.35,,,, +US-CT-06133,US,CT,06133,6.35,,,, +US-CT-06134,US,CT,06134,6.35,,,, +US-CT-06137,US,CT,06137,6.35,,,, +US-CT-06138,US,CT,06138,6.35,,,, +US-CT-06140,US,CT,06140,6.35,,,, +US-CT-06141,US,CT,06141,6.35,,,, +US-CT-06142,US,CT,06142,6.35,,,, +US-CT-06143,US,CT,06143,6.35,,,, +US-CT-06144,US,CT,06144,6.35,,,, +US-CT-06145,US,CT,06145,6.35,,,, +US-CT-06146,US,CT,06146,6.35,,,, +US-CT-06147,US,CT,06147,6.35,,,, +US-CT-06150,US,CT,06150,6.35,,,, +US-CT-06151,US,CT,06151,6.35,,,, +US-CT-06152,US,CT,06152,6.35,,,, +US-CT-06153,US,CT,06153,6.35,,,, +US-CT-06154,US,CT,06154,6.35,,,, +US-CT-06155,US,CT,06155,6.35,,,, +US-CT-06156,US,CT,06156,6.35,,,, +US-CT-06160,US,CT,06160,6.35,,,, +US-CT-06161,US,CT,06161,6.35,,,, +US-CT-06167,US,CT,06167,6.35,,,, +US-CT-06176,US,CT,06176,6.35,,,, +US-CT-06180,US,CT,06180,6.35,,,, +US-CT-06183,US,CT,06183,6.35,,,, +US-CT-06199,US,CT,06199,6.35,,,, +US-CT-06226,US,CT,06226,6.35,,,, +US-CT-06230,US,CT,06230,6.35,,,, +US-CT-06231,US,CT,06231,6.35,,,, +US-CT-06232,US,CT,06232,6.35,,,, +US-CT-06233,US,CT,06233,6.35,,,, +US-CT-06234,US,CT,06234,6.35,,,, +US-CT-06235,US,CT,06235,6.35,,,, +US-CT-06237,US,CT,06237,6.35,,,, +US-CT-06238,US,CT,06238,6.35,,,, +US-CT-06239,US,CT,06239,6.35,,,, +US-CT-06241,US,CT,06241,6.35,,,, +US-CT-06242,US,CT,06242,6.35,,,, +US-CT-06243,US,CT,06243,6.35,,,, +US-CT-06244,US,CT,06244,6.35,,,, +US-CT-06245,US,CT,06245,6.35,,,, +US-CT-06246,US,CT,06246,6.35,,,, +US-CT-06247,US,CT,06247,6.35,,,, +US-CT-06248,US,CT,06248,6.35,,,, +US-CT-06249,US,CT,06249,6.35,,,, +US-CT-06250,US,CT,06250,6.35,,,, +US-CT-06251,US,CT,06251,6.35,,,, +US-CT-06254,US,CT,06254,6.35,,,, +US-CT-06255,US,CT,06255,6.35,,,, +US-CT-06256,US,CT,06256,6.35,,,, +US-CT-06258,US,CT,06258,6.35,,,, +US-CT-06259,US,CT,06259,6.35,,,, +US-CT-06260,US,CT,06260,6.35,,,, +US-CT-06262,US,CT,06262,6.35,,,, +US-CT-06263,US,CT,06263,6.35,,,, +US-CT-06264,US,CT,06264,6.35,,,, +US-CT-06265,US,CT,06265,6.35,,,, +US-CT-06266,US,CT,06266,6.35,,,, +US-CT-06267,US,CT,06267,6.35,,,, +US-CT-06268,US,CT,06268,6.35,,,, +US-CT-06269,US,CT,06269,6.35,,,, +US-CT-06277,US,CT,06277,6.35,,,, +US-CT-06278,US,CT,06278,6.35,,,, +US-CT-06279,US,CT,06279,6.35,,,, +US-CT-06280,US,CT,06280,6.35,,,, +US-CT-06281,US,CT,06281,6.35,,,, +US-CT-06282,US,CT,06282,6.35,,,, +US-CT-06320,US,CT,06320,6.35,,,, +US-CT-06330,US,CT,06330,6.35,,,, +US-CT-06331,US,CT,06331,6.35,,,, +US-CT-06332,US,CT,06332,6.35,,,, +US-CT-06333,US,CT,06333,6.35,,,, +US-CT-06334,US,CT,06334,6.35,,,, +US-CT-06335,US,CT,06335,6.35,,,, +US-CT-06336,US,CT,06336,6.35,,,, +US-CT-06338,US,CT,06338,6.35,,,, +US-CT-06339,US,CT,06339,6.35,,,, +US-CT-06340,US,CT,06340,6.35,,,, +US-CT-06349,US,CT,06349,6.35,,,, +US-CT-06350,US,CT,06350,6.35,,,, +US-CT-06351,US,CT,06351,6.35,,,, +US-CT-06353,US,CT,06353,6.35,,,, +US-CT-06354,US,CT,06354,6.35,,,, +US-CT-06355,US,CT,06355,6.35,,,, +US-CT-06357,US,CT,06357,6.35,,,, +US-CT-06359,US,CT,06359,6.35,,,, +US-CT-06360,US,CT,06360,6.35,,,, +US-CT-06365,US,CT,06365,6.35,,,, +US-CT-06370,US,CT,06370,6.35,,,, +US-CT-06371,US,CT,06371,6.35,,,, +US-CT-06372,US,CT,06372,6.35,,,, +US-CT-06373,US,CT,06373,6.35,,,, +US-CT-06374,US,CT,06374,6.35,,,, +US-CT-06375,US,CT,06375,6.35,,,, +US-CT-06376,US,CT,06376,6.35,,,, +US-CT-06377,US,CT,06377,6.35,,,, +US-CT-06378,US,CT,06378,6.35,,,, +US-CT-06379,US,CT,06379,6.35,,,, +US-CT-06380,US,CT,06380,6.35,,,, +US-CT-06382,US,CT,06382,6.35,,,, +US-CT-06383,US,CT,06383,6.35,,,, +US-CT-06384,US,CT,06384,6.35,,,, +US-CT-06385,US,CT,06385,6.35,,,, +US-CT-06387,US,CT,06387,6.35,,,, +US-CT-06388,US,CT,06388,6.35,,,, +US-CT-06389,US,CT,06389,6.35,,,, +US-CT-06401,US,CT,06401,6.35,,,, +US-CT-06403,US,CT,06403,6.35,,,, +US-CT-06404,US,CT,06404,6.35,,,, +US-CT-06405,US,CT,06405,6.35,,,, +US-CT-06408,US,CT,06408,6.35,,,, +US-CT-06409,US,CT,06409,6.35,,,, +US-CT-06410,US,CT,06410,6.35,,,, +US-CT-06411,US,CT,06411,6.35,,,, +US-CT-06412,US,CT,06412,6.35,,,, +US-CT-06413,US,CT,06413,6.35,,,, +US-CT-06414,US,CT,06414,6.35,,,, +US-CT-06415,US,CT,06415,6.35,,,, +US-CT-06416,US,CT,06416,6.35,,,, +US-CT-06417,US,CT,06417,6.35,,,, +US-CT-06418,US,CT,06418,6.35,,,, +US-CT-06419,US,CT,06419,6.35,,,, +US-CT-06420,US,CT,06420,6.35,,,, +US-CT-06422,US,CT,06422,6.35,,,, +US-CT-06423,US,CT,06423,6.35,,,, +US-CT-06424,US,CT,06424,6.35,,,, +US-CT-06426,US,CT,06426,6.35,,,, +US-CT-06437,US,CT,06437,6.35,,,, +US-CT-06438,US,CT,06438,6.35,,,, +US-CT-06439,US,CT,06439,6.35,,,, +US-CT-06440,US,CT,06440,6.35,,,, +US-CT-06441,US,CT,06441,6.35,,,, +US-CT-06442,US,CT,06442,6.35,,,, +US-CT-06443,US,CT,06443,6.35,,,, +US-CT-06444,US,CT,06444,6.35,,,, +US-CT-06447,US,CT,06447,6.35,,,, +US-CT-06450,US,CT,06450,6.35,,,, +US-CT-06451,US,CT,06451,6.35,,,, +US-CT-06455,US,CT,06455,6.35,,,, +US-CT-06456,US,CT,06456,6.35,,,, +US-CT-06457,US,CT,06457,6.35,,,, +US-CT-06459,US,CT,06459,6.35,,,, +US-CT-06460,US,CT,06460,6.35,,,, +US-CT-06461,US,CT,06461,6.35,,,, +US-CT-06467,US,CT,06467,6.35,,,, +US-CT-06468,US,CT,06468,6.35,,,, +US-CT-06469,US,CT,06469,6.35,,,, +US-CT-06470,US,CT,06470,6.35,,,, +US-CT-06471,US,CT,06471,6.35,,,, +US-CT-06472,US,CT,06472,6.35,,,, +US-CT-06473,US,CT,06473,6.35,,,, +US-CT-06474,US,CT,06474,6.35,,,, +US-CT-06475,US,CT,06475,6.35,,,, +US-CT-06477,US,CT,06477,6.35,,,, +US-CT-06478,US,CT,06478,6.35,,,, +US-CT-06479,US,CT,06479,6.35,,,, +US-CT-06480,US,CT,06480,6.35,,,, +US-CT-06481,US,CT,06481,6.35,,,, +US-CT-06482,US,CT,06482,6.35,,,, +US-CT-06483,US,CT,06483,6.35,,,, +US-CT-06484,US,CT,06484,6.35,,,, +US-CT-06487,US,CT,06487,6.35,,,, +US-CT-06488,US,CT,06488,6.35,,,, +US-CT-06489,US,CT,06489,6.35,,,, +US-CT-06491,US,CT,06491,6.35,,,, +US-CT-06492,US,CT,06492,6.35,,,, +US-CT-06493,US,CT,06493,6.35,,,, +US-CT-06494,US,CT,06494,6.35,,,, +US-CT-06495,US,CT,06495,6.35,,,, +US-CT-06498,US,CT,06498,6.35,,,, +US-CT-06501,US,CT,06501,6.35,,,, +US-CT-06502,US,CT,06502,6.35,,,, +US-CT-06503,US,CT,06503,6.35,,,, +US-CT-06504,US,CT,06504,6.35,,,, +US-CT-06505,US,CT,06505,6.35,,,, +US-CT-06506,US,CT,06506,6.35,,,, +US-CT-06507,US,CT,06507,6.35,,,, +US-CT-06508,US,CT,06508,6.35,,,, +US-CT-06509,US,CT,06509,6.35,,,, +US-CT-06510,US,CT,06510,6.35,,,, +US-CT-06511,US,CT,06511,6.35,,,, +US-CT-06512,US,CT,06512,6.35,,,, +US-CT-06513,US,CT,06513,6.35,,,, +US-CT-06514,US,CT,06514,6.35,,,, +US-CT-06515,US,CT,06515,6.35,,,, +US-CT-06516,US,CT,06516,6.35,,,, +US-CT-06517,US,CT,06517,6.35,,,, +US-CT-06518,US,CT,06518,6.35,,,, +US-CT-06519,US,CT,06519,6.35,,,, +US-CT-06520,US,CT,06520,6.35,,,, +US-CT-06521,US,CT,06521,6.35,,,, +US-CT-06524,US,CT,06524,6.35,,,, +US-CT-06525,US,CT,06525,6.35,,,, +US-CT-06530,US,CT,06530,6.35,,,, +US-CT-06531,US,CT,06531,6.35,,,, +US-CT-06532,US,CT,06532,6.35,,,, +US-CT-06533,US,CT,06533,6.35,,,, +US-CT-06534,US,CT,06534,6.35,,,, +US-CT-06535,US,CT,06535,6.35,,,, +US-CT-06536,US,CT,06536,6.35,,,, +US-CT-06537,US,CT,06537,6.35,,,, +US-CT-06538,US,CT,06538,6.35,,,, +US-CT-06540,US,CT,06540,6.35,,,, +US-CT-06601,US,CT,06601,6.35,,,, +US-CT-06602,US,CT,06602,6.35,,,, +US-CT-06604,US,CT,06604,6.35,,,, +US-CT-06605,US,CT,06605,6.35,,,, +US-CT-06606,US,CT,06606,6.35,,,, +US-CT-06607,US,CT,06607,6.35,,,, +US-CT-06608,US,CT,06608,6.35,,,, +US-CT-06610,US,CT,06610,6.35,,,, +US-CT-06611,US,CT,06611,6.35,,,, +US-CT-06612,US,CT,06612,6.35,,,, +US-CT-06614,US,CT,06614,6.35,,,, +US-CT-06615,US,CT,06615,6.35,,,, +US-CT-06650,US,CT,06650,6.35,,,, +US-CT-06673,US,CT,06673,6.35,,,, +US-CT-06699,US,CT,06699,6.35,,,, +US-CT-06701,US,CT,06701,6.35,,,, +US-CT-06702,US,CT,06702,6.35,,,, +US-CT-06703,US,CT,06703,6.35,,,, +US-CT-06704,US,CT,06704,6.35,,,, +US-CT-06705,US,CT,06705,6.35,,,, +US-CT-06706,US,CT,06706,6.35,,,, +US-CT-06708,US,CT,06708,6.35,,,, +US-CT-06710,US,CT,06710,6.35,,,, +US-CT-06712,US,CT,06712,6.35,,,, +US-CT-06716,US,CT,06716,6.35,,,, +US-CT-06720,US,CT,06720,6.35,,,, +US-CT-06721,US,CT,06721,6.35,,,, +US-CT-06722,US,CT,06722,6.35,,,, +US-CT-06723,US,CT,06723,6.35,,,, +US-CT-06724,US,CT,06724,6.35,,,, +US-CT-06725,US,CT,06725,6.35,,,, +US-CT-06726,US,CT,06726,6.35,,,, +US-CT-06749,US,CT,06749,6.35,,,, +US-CT-06750,US,CT,06750,6.35,,,, +US-CT-06751,US,CT,06751,6.35,,,, +US-CT-06752,US,CT,06752,6.35,,,, +US-CT-06753,US,CT,06753,6.35,,,, +US-CT-06754,US,CT,06754,6.35,,,, +US-CT-06755,US,CT,06755,6.35,,,, +US-CT-06756,US,CT,06756,6.35,,,, +US-CT-06757,US,CT,06757,6.35,,,, +US-CT-06758,US,CT,06758,6.35,,,, +US-CT-06759,US,CT,06759,6.35,,,, +US-CT-06762,US,CT,06762,6.35,,,, +US-CT-06763,US,CT,06763,6.35,,,, +US-CT-06770,US,CT,06770,6.35,,,, +US-CT-06776,US,CT,06776,6.35,,,, +US-CT-06777,US,CT,06777,6.35,,,, +US-CT-06778,US,CT,06778,6.35,,,, +US-CT-06779,US,CT,06779,6.35,,,, +US-CT-06781,US,CT,06781,6.35,,,, +US-CT-06782,US,CT,06782,6.35,,,, +US-CT-06783,US,CT,06783,6.35,,,, +US-CT-06784,US,CT,06784,6.35,,,, +US-CT-06785,US,CT,06785,6.35,,,, +US-CT-06786,US,CT,06786,6.35,,,, +US-CT-06787,US,CT,06787,6.35,,,, +US-CT-06790,US,CT,06790,6.35,,,, +US-CT-06791,US,CT,06791,6.35,,,, +US-CT-06792,US,CT,06792,6.35,,,, +US-CT-06793,US,CT,06793,6.35,,,, +US-CT-06794,US,CT,06794,6.35,,,, +US-CT-06795,US,CT,06795,6.35,,,, +US-CT-06796,US,CT,06796,6.35,,,, +US-CT-06798,US,CT,06798,6.35,,,, +US-CT-06801,US,CT,06801,6.35,,,, +US-CT-06804,US,CT,06804,6.35,,,, +US-CT-06807,US,CT,06807,6.35,,,, +US-CT-06810,US,CT,06810,6.35,,,, +US-CT-06811,US,CT,06811,6.35,,,, +US-CT-06812,US,CT,06812,6.35,,,, +US-CT-06813,US,CT,06813,6.35,,,, +US-CT-06814,US,CT,06814,6.35,,,, +US-CT-06816,US,CT,06816,6.35,,,, +US-CT-06817,US,CT,06817,6.35,,,, +US-CT-06820,US,CT,06820,6.35,,,, +US-CT-06824,US,CT,06824,6.35,,,, +US-CT-06825,US,CT,06825,6.35,,,, +US-CT-06828,US,CT,06828,6.35,,,, +US-CT-06829,US,CT,06829,6.35,,,, +US-CT-06830,US,CT,06830,6.35,,,, +US-CT-06831,US,CT,06831,6.35,,,, +US-CT-06836,US,CT,06836,6.35,,,, +US-CT-06838,US,CT,06838,6.35,,,, +US-CT-06840,US,CT,06840,6.35,,,, +US-CT-06850,US,CT,06850,6.35,,,, +US-CT-06851,US,CT,06851,6.35,,,, +US-CT-06852,US,CT,06852,6.35,,,, +US-CT-06853,US,CT,06853,6.35,,,, +US-CT-06854,US,CT,06854,6.35,,,, +US-CT-06855,US,CT,06855,6.35,,,, +US-CT-06856,US,CT,06856,6.35,,,, +US-CT-06857,US,CT,06857,6.35,,,, +US-CT-06858,US,CT,06858,6.35,,,, +US-CT-06859,US,CT,06859,6.35,,,, +US-CT-06860,US,CT,06860,6.35,,,, +US-CT-06870,US,CT,06870,6.35,,,, +US-CT-06875,US,CT,06875,6.35,,,, +US-CT-06876,US,CT,06876,6.35,,,, +US-CT-06877,US,CT,06877,6.35,,,, +US-CT-06878,US,CT,06878,6.35,,,, +US-CT-06879,US,CT,06879,6.35,,,, +US-CT-06880,US,CT,06880,6.35,,,, +US-CT-06881,US,CT,06881,6.35,,,, +US-CT-06883,US,CT,06883,6.35,,,, +US-CT-06888,US,CT,06888,6.35,,,, +US-CT-06889,US,CT,06889,6.35,,,, +US-CT-06890,US,CT,06890,6.35,,,, +US-CT-06896,US,CT,06896,6.35,,,, +US-CT-06897,US,CT,06897,6.35,,,, +US-CT-06901,US,CT,06901,6.35,,,, +US-CT-06902,US,CT,06902,6.35,,,, +US-CT-06903,US,CT,06903,6.35,,,, +US-CT-06904,US,CT,06904,6.35,,,, +US-CT-06905,US,CT,06905,6.35,,,, +US-CT-06906,US,CT,06906,6.35,,,, +US-CT-06907,US,CT,06907,6.35,,,, +US-CT-06910,US,CT,06910,6.35,,,, +US-CT-06911,US,CT,06911,6.35,,,, +US-CT-06912,US,CT,06912,6.35,,,, +US-CT-06913,US,CT,06913,6.35,,,, +US-CT-06914,US,CT,06914,6.35,,,, +US-CT-06920,US,CT,06920,6.35,,,, +US-CT-06921,US,CT,06921,6.35,,,, +US-CT-06922,US,CT,06922,6.35,,,, +US-CT-06925,US,CT,06925,6.35,,,, +US-CT-06926,US,CT,06926,6.35,,,, +US-CT-06927,US,CT,06927,6.35,,,, +US-CT-06928,US,CT,06928,6.35,,,, +US-DC-20001,US,DC,20001,5.75,,,, +US-DC-20002,US,DC,20002,5.75,,,, +US-DC-20003,US,DC,20003,5.75,,,, +US-DC-20004,US,DC,20004,5.75,,,, +US-DC-20005,US,DC,20005,5.75,,,, +US-DC-20006,US,DC,20006,5.75,,,, +US-DC-20007,US,DC,20007,5.75,,,, +US-DC-20008,US,DC,20008,5.75,,,, +US-DC-20009,US,DC,20009,5.75,,,, +US-DC-20010,US,DC,20010,5.75,,,, +US-DC-20011,US,DC,20011,5.75,,,, +US-DC-20012,US,DC,20012,5.75,,,, +US-DC-20013,US,DC,20013,5.75,,,, +US-DC-20015,US,DC,20015,5.75,,,, +US-DC-20016,US,DC,20016,5.75,,,, +US-DC-20017,US,DC,20017,5.75,,,, +US-DC-20018,US,DC,20018,5.75,,,, +US-DC-20019,US,DC,20019,5.75,,,, +US-DC-20020,US,DC,20020,5.75,,,, +US-DC-20022,US,DC,20022,5.75,,,, +US-DC-20023,US,DC,20023,5.75,,,, +US-DC-20024,US,DC,20024,5.75,,,, +US-DC-20026,US,DC,20026,5.75,,,, +US-DC-20027,US,DC,20027,5.75,,,, +US-DC-20029,US,DC,20029,5.75,,,, +US-DC-20030,US,DC,20030,5.75,,,, +US-DC-20032,US,DC,20032,5.75,,,, +US-DC-20033,US,DC,20033,5.75,,,, +US-DC-20035,US,DC,20035,5.75,,,, +US-DC-20036,US,DC,20036,5.75,,,, +US-DC-20037,US,DC,20037,5.75,,,, +US-DC-20038,US,DC,20038,5.75,,,, +US-DC-20039,US,DC,20039,5.75,,,, +US-DC-20040,US,DC,20040,5.75,,,, +US-DC-20042,US,DC,20042,5.75,,,, +US-DC-20043,US,DC,20043,5.75,,,, +US-DC-20044,US,DC,20044,5.75,,,, +US-DC-20045,US,DC,20045,5.75,,,, +US-DC-20046,US,DC,20046,5.75,,,, +US-DC-20047,US,DC,20047,5.75,,,, +US-DC-20049,US,DC,20049,5.75,,,, +US-DC-20050,US,DC,20050,5.75,,,, +US-DC-20051,US,DC,20051,5.75,,,, +US-DC-20052,US,DC,20052,5.75,,,, +US-DC-20053,US,DC,20053,5.75,,,, +US-DC-20055,US,DC,20055,5.75,,,, +US-DC-20056,US,DC,20056,5.75,,,, +US-DC-20057,US,DC,20057,5.75,,,, +US-DC-20058,US,DC,20058,5.75,,,, +US-DC-20059,US,DC,20059,5.75,,,, +US-DC-20060,US,DC,20060,5.75,,,, +US-DC-20061,US,DC,20061,5.75,,,, +US-DC-20062,US,DC,20062,5.75,,,, +US-DC-20063,US,DC,20063,5.75,,,, +US-DC-20064,US,DC,20064,5.75,,,, +US-DC-20065,US,DC,20065,5.75,,,, +US-DC-20066,US,DC,20066,5.75,,,, +US-DC-20067,US,DC,20067,5.75,,,, +US-DC-20068,US,DC,20068,5.75,,,, +US-DC-20069,US,DC,20069,5.75,,,, +US-DC-20070,US,DC,20070,5.75,,,, +US-DC-20071,US,DC,20071,5.75,,,, +US-DC-20073,US,DC,20073,5.75,,,, +US-DC-20074,US,DC,20074,5.75,,,, +US-DC-20075,US,DC,20075,5.75,,,, +US-DC-20076,US,DC,20076,5.75,,,, +US-DC-20077,US,DC,20077,5.75,,,, +US-DC-20078,US,DC,20078,5.75,,,, +US-DC-20080,US,DC,20080,5.75,,,, +US-DC-20081,US,DC,20081,5.75,,,, +US-DC-20082,US,DC,20082,5.75,,,, +US-DC-20088,US,DC,20088,5.75,,,, +US-DC-20090,US,DC,20090,5.75,,,, +US-DC-20091,US,DC,20091,5.75,,,, +US-DC-20097,US,DC,20097,5.75,,,, +US-DC-20098,US,DC,20098,5.75,,,, +US-DC-20201,US,DC,20201,5.75,,,, +US-DC-20202,US,DC,20202,5.75,,,, +US-DC-20203,US,DC,20203,5.75,,,, +US-DC-20204,US,DC,20204,5.75,,,, +US-DC-20206,US,DC,20206,5.75,,,, +US-DC-20207,US,DC,20207,5.75,,,, +US-DC-20208,US,DC,20208,5.75,,,, +US-DC-20210,US,DC,20210,5.75,,,, +US-DC-20211,US,DC,20211,5.75,,,, +US-DC-20212,US,DC,20212,5.75,,,, +US-DC-20213,US,DC,20213,5.75,,,, +US-DC-20214,US,DC,20214,5.75,,,, +US-DC-20215,US,DC,20215,5.75,,,, +US-DC-20216,US,DC,20216,5.75,,,, +US-DC-20217,US,DC,20217,5.75,,,, +US-DC-20218,US,DC,20218,5.75,,,, +US-DC-20219,US,DC,20219,5.75,,,, +US-DC-20220,US,DC,20220,5.75,,,, +US-DC-20221,US,DC,20221,5.75,,,, +US-DC-20222,US,DC,20222,5.75,,,, +US-DC-20223,US,DC,20223,5.75,,,, +US-DC-20224,US,DC,20224,5.75,,,, +US-DC-20226,US,DC,20226,5.75,,,, +US-DC-20227,US,DC,20227,5.75,,,, +US-DC-20228,US,DC,20228,5.75,,,, +US-DC-20229,US,DC,20229,5.75,,,, +US-DC-20230,US,DC,20230,5.75,,,, +US-DC-20232,US,DC,20232,5.75,,,, +US-DC-20233,US,DC,20233,5.75,,,, +US-DC-20235,US,DC,20235,5.75,,,, +US-DC-20237,US,DC,20237,5.75,,,, +US-DC-20238,US,DC,20238,5.75,,,, +US-DC-20239,US,DC,20239,5.75,,,, +US-DC-20240,US,DC,20240,5.75,,,, +US-DC-20241,US,DC,20241,5.75,,,, +US-DC-20242,US,DC,20242,5.75,,,, +US-DC-20244,US,DC,20244,5.75,,,, +US-DC-20245,US,DC,20245,5.75,,,, +US-DC-20250,US,DC,20250,5.75,,,, +US-DC-20251,US,DC,20251,5.75,,,, +US-DC-20254,US,DC,20254,5.75,,,, +US-DC-20260,US,DC,20260,5.75,,,, +US-DC-20261,US,DC,20261,5.75,,,, +US-DC-20262,US,DC,20262,5.75,,,, +US-DC-20265,US,DC,20265,5.75,,,, +US-DC-20266,US,DC,20266,5.75,,,, +US-DC-20268,US,DC,20268,5.75,,,, +US-DC-20270,US,DC,20270,5.75,,,, +US-DC-20277,US,DC,20277,5.75,,,, +US-DC-20289,US,DC,20289,5.75,,,, +US-DC-20299,US,DC,20299,5.75,,,, +US-DC-20301,US,DC,20301,5.75,,,, +US-DC-20303,US,DC,20303,5.75,,,, +US-DC-20306,US,DC,20306,5.75,,,, +US-DC-20307,US,DC,20307,5.75,,,, +US-DC-20310,US,DC,20310,5.75,,,, +US-DC-20314,US,DC,20314,5.75,,,, +US-DC-20317,US,DC,20317,5.75,,,, +US-DC-20318,US,DC,20318,5.75,,,, +US-DC-20319,US,DC,20319,5.75,,,, +US-DC-20330,US,DC,20330,5.75,,,, +US-DC-20340,US,DC,20340,5.75,,,, +US-DC-20350,US,DC,20350,5.75,,,, +US-DC-20355,US,DC,20355,5.75,,,, +US-DC-20370,US,DC,20370,5.75,,,, +US-DC-20372,US,DC,20372,5.75,,,, +US-DC-20373,US,DC,20373,5.75,,,, +US-DC-20374,US,DC,20374,5.75,,,, +US-DC-20375,US,DC,20375,5.75,,,, +US-DC-20376,US,DC,20376,5.75,,,, +US-DC-20380,US,DC,20380,5.75,,,, +US-DC-20388,US,DC,20388,5.75,,,, +US-DC-20389,US,DC,20389,5.75,,,, +US-DC-20390,US,DC,20390,5.75,,,, +US-DC-20391,US,DC,20391,5.75,,,, +US-DC-20392,US,DC,20392,5.75,,,, +US-DC-20393,US,DC,20393,5.75,,,, +US-DC-20394,US,DC,20394,5.75,,,, +US-DC-20395,US,DC,20395,5.75,,,, +US-DC-20398,US,DC,20398,5.75,,,, +US-DC-20401,US,DC,20401,5.75,,,, +US-DC-20402,US,DC,20402,5.75,,,, +US-DC-20403,US,DC,20403,5.75,,,, +US-DC-20404,US,DC,20404,5.75,,,, +US-DC-20405,US,DC,20405,5.75,,,, +US-DC-20406,US,DC,20406,5.75,,,, +US-DC-20407,US,DC,20407,5.75,,,, +US-DC-20408,US,DC,20408,5.75,,,, +US-DC-20409,US,DC,20409,5.75,,,, +US-DC-20410,US,DC,20410,5.75,,,, +US-DC-20411,US,DC,20411,5.75,,,, +US-DC-20412,US,DC,20412,5.75,,,, +US-DC-20413,US,DC,20413,5.75,,,, +US-DC-20414,US,DC,20414,5.75,,,, +US-DC-20415,US,DC,20415,5.75,,,, +US-DC-20416,US,DC,20416,5.75,,,, +US-DC-20417,US,DC,20417,5.75,,,, +US-DC-20418,US,DC,20418,5.75,,,, +US-DC-20419,US,DC,20419,5.75,,,, +US-DC-20420,US,DC,20420,5.75,,,, +US-DC-20421,US,DC,20421,5.75,,,, +US-DC-20422,US,DC,20422,5.75,,,, +US-DC-20423,US,DC,20423,5.75,,,, +US-DC-20424,US,DC,20424,5.75,,,, +US-DC-20425,US,DC,20425,5.75,,,, +US-DC-20426,US,DC,20426,5.75,,,, +US-DC-20427,US,DC,20427,5.75,,,, +US-DC-20428,US,DC,20428,5.75,,,, +US-DC-20429,US,DC,20429,5.75,,,, +US-DC-20431,US,DC,20431,5.75,,,, +US-DC-20433,US,DC,20433,5.75,,,, +US-DC-20434,US,DC,20434,5.75,,,, +US-DC-20435,US,DC,20435,5.75,,,, +US-DC-20436,US,DC,20436,5.75,,,, +US-DC-20437,US,DC,20437,5.75,,,, +US-DC-20439,US,DC,20439,5.75,,,, +US-DC-20440,US,DC,20440,5.75,,,, +US-DC-20441,US,DC,20441,5.75,,,, +US-DC-20442,US,DC,20442,5.75,,,, +US-DC-20444,US,DC,20444,5.75,,,, +US-DC-20447,US,DC,20447,5.75,,,, +US-DC-20451,US,DC,20451,5.75,,,, +US-DC-20453,US,DC,20453,5.75,,,, +US-DC-20456,US,DC,20456,5.75,,,, +US-DC-20460,US,DC,20460,5.75,,,, +US-DC-20463,US,DC,20463,5.75,,,, +US-DC-20468,US,DC,20468,5.75,,,, +US-DC-20469,US,DC,20469,5.75,,,, +US-DC-20470,US,DC,20470,5.75,,,, +US-DC-20472,US,DC,20472,5.75,,,, +US-DC-20500,US,DC,20500,5.75,,,, +US-DC-20501,US,DC,20501,5.75,,,, +US-DC-20502,US,DC,20502,5.75,,,, +US-DC-20503,US,DC,20503,5.75,,,, +US-DC-20504,US,DC,20504,5.75,,,, +US-DC-20505,US,DC,20505,5.75,,,, +US-DC-20506,US,DC,20506,5.75,,,, +US-DC-20507,US,DC,20507,5.75,,,, +US-DC-20508,US,DC,20508,5.75,,,, +US-DC-20509,US,DC,20509,5.75,,,, +US-DC-20510,US,DC,20510,5.75,,,, +US-DC-20511,US,DC,20511,5.75,,,, +US-DC-20515,US,DC,20515,5.75,,,, +US-DC-20520,US,DC,20520,5.75,,,, +US-DC-20521,US,DC,20521,5.75,,,, +US-DC-20522,US,DC,20522,5.75,,,, +US-DC-20523,US,DC,20523,5.75,,,, +US-DC-20524,US,DC,20524,5.75,,,, +US-DC-20525,US,DC,20525,5.75,,,, +US-DC-20526,US,DC,20526,5.75,,,, +US-DC-20527,US,DC,20527,5.75,,,, +US-DC-20528,US,DC,20528,5.75,,,, +US-DC-20529,US,DC,20529,5.75,,,, +US-DC-20530,US,DC,20530,5.75,,,, +US-DC-20531,US,DC,20531,5.75,,,, +US-DC-20532,US,DC,20532,5.75,,,, +US-DC-20533,US,DC,20533,5.75,,,, +US-DC-20534,US,DC,20534,5.75,,,, +US-DC-20535,US,DC,20535,5.75,,,, +US-DC-20536,US,DC,20536,5.75,,,, +US-DC-20537,US,DC,20537,5.75,,,, +US-DC-20538,US,DC,20538,5.75,,,, +US-DC-20539,US,DC,20539,5.75,,,, +US-DC-20540,US,DC,20540,5.75,,,, +US-DC-20541,US,DC,20541,5.75,,,, +US-DC-20542,US,DC,20542,5.75,,,, +US-DC-20543,US,DC,20543,5.75,,,, +US-DC-20544,US,DC,20544,5.75,,,, +US-DC-20546,US,DC,20546,5.75,,,, +US-DC-20547,US,DC,20547,5.75,,,, +US-DC-20548,US,DC,20548,5.75,,,, +US-DC-20549,US,DC,20549,5.75,,,, +US-DC-20551,US,DC,20551,5.75,,,, +US-DC-20552,US,DC,20552,5.75,,,, +US-DC-20553,US,DC,20553,5.75,,,, +US-DC-20554,US,DC,20554,5.75,,,, +US-DC-20555,US,DC,20555,5.75,,,, +US-DC-20557,US,DC,20557,5.75,,,, +US-DC-20558,US,DC,20558,5.75,,,, +US-DC-20559,US,DC,20559,5.75,,,, +US-DC-20560,US,DC,20560,5.75,,,, +US-DC-20565,US,DC,20565,5.75,,,, +US-DC-20566,US,DC,20566,5.75,,,, +US-DC-20570,US,DC,20570,5.75,,,, +US-DC-20571,US,DC,20571,5.75,,,, +US-DC-20572,US,DC,20572,5.75,,,, +US-DC-20573,US,DC,20573,5.75,,,, +US-DC-20575,US,DC,20575,5.75,,,, +US-DC-20576,US,DC,20576,5.75,,,, +US-DC-20577,US,DC,20577,5.75,,,, +US-DC-20578,US,DC,20578,5.75,,,, +US-DC-20579,US,DC,20579,5.75,,,, +US-DC-20580,US,DC,20580,5.75,,,, +US-DC-20581,US,DC,20581,5.75,,,, +US-DC-20585,US,DC,20585,5.75,,,, +US-DC-20586,US,DC,20586,5.75,,,, +US-DC-20590,US,DC,20590,5.75,,,, +US-DC-20591,US,DC,20591,5.75,,,, +US-DC-20593,US,DC,20593,5.75,,,, +US-DC-20594,US,DC,20594,5.75,,,, +US-DC-20597,US,DC,20597,5.75,,,, +US-DC-20599,US,DC,20599,5.75,,,, +US-DC-56901,US,DC,56901,5.75,,,, +US-DC-56902,US,DC,56902,5.75,,,, +US-DC-56904,US,DC,56904,5.75,,,, +US-DC-56915,US,DC,56915,5.75,,,, +US-DC-56920,US,DC,56920,5.75,,,, +US-DC-56933,US,DC,56933,5.75,,,, +US-DC-56944,US,DC,56944,5.75,,,, +US-DC-56945,US,DC,56945,5.75,,,, +US-DC-56950,US,DC,56950,5.75,,,, +US-DC-56965,US,DC,56965,5.75,,,, +US-DC-56967,US,DC,56967,5.75,,,, +US-DC-56972,US,DC,56972,5.75,,,, +US-DC-56999,US,DC,56999,5.75,,,, +US-FL-32003,US,FL,32003,7,,,, +US-FL-32004,US,FL,32004,6,,,, +US-FL-32006,US,FL,32006,7,,,, +US-FL-32007,US,FL,32007,7,,,, +US-FL-32008,US,FL,32008,7,,,, +US-FL-32009,US,FL,32009,7,,,, +US-FL-32011,US,FL,32011,7,,,, +US-FL-32013,US,FL,32013,7,,,, +US-FL-32024,US,FL,32024,7,,,, +US-FL-32025,US,FL,32025,7,,,, +US-FL-32030,US,FL,32030,7,,,, +US-FL-32033,US,FL,32033,6,,,, +US-FL-32034,US,FL,32034,7,,,, +US-FL-32035,US,FL,32035,7,,,, +US-FL-32038,US,FL,32038,7,,,, +US-FL-32040,US,FL,32040,7,,,, +US-FL-32041,US,FL,32041,7,,,, +US-FL-32042,US,FL,32042,7,,,, +US-FL-32043,US,FL,32043,7,,,, +US-FL-32044,US,FL,32044,7,,,, +US-FL-32046,US,FL,32046,7,,,, +US-FL-32050,US,FL,32050,7,,,, +US-FL-32052,US,FL,32052,7,,,, +US-FL-32053,US,FL,32053,7,,,, +US-FL-32054,US,FL,32054,7,,,, +US-FL-32055,US,FL,32055,7,,,, +US-FL-32056,US,FL,32056,7,,,, +US-FL-32058,US,FL,32058,7,,,, +US-FL-32059,US,FL,32059,7.5,,,, +US-FL-32060,US,FL,32060,7,,,, +US-FL-32061,US,FL,32061,7,,,, +US-FL-32062,US,FL,32062,7,,,, +US-FL-32063,US,FL,32063,7,,,, +US-FL-32064,US,FL,32064,7,,,, +US-FL-32065,US,FL,32065,7,,,, +US-FL-32066,US,FL,32066,7,,,, +US-FL-32067,US,FL,32067,7,,,, +US-FL-32068,US,FL,32068,7,,,, +US-FL-32071,US,FL,32071,7,,,, +US-FL-32072,US,FL,32072,7,,,, +US-FL-32073,US,FL,32073,7,,,, +US-FL-32079,US,FL,32079,7,,,, +US-FL-32080,US,FL,32080,6,,,, +US-FL-32081,US,FL,32081,6,,,, +US-FL-32082,US,FL,32082,6,,,, +US-FL-32083,US,FL,32083,7,,,, +US-FL-32084,US,FL,32084,6,,,, +US-FL-32085,US,FL,32085,6,,,, +US-FL-32086,US,FL,32086,6,,,, +US-FL-32087,US,FL,32087,7,,,, +US-FL-32091,US,FL,32091,7,,,, +US-FL-32092,US,FL,32092,6,,,, +US-FL-32094,US,FL,32094,7,,,, +US-FL-32095,US,FL,32095,6,,,, +US-FL-32096,US,FL,32096,7,,,, +US-FL-32097,US,FL,32097,7,,,, +US-FL-32099,US,FL,32099,7,,,, +US-FL-32102,US,FL,32102,7,,,, +US-FL-32105,US,FL,32105,6.5,,,, +US-FL-32110,US,FL,32110,7,,,, +US-FL-32111,US,FL,32111,6,,,, +US-FL-32112,US,FL,32112,7,,,, +US-FL-32113,US,FL,32113,6,,,, +US-FL-32114,US,FL,32114,6.5,,,, +US-FL-32115,US,FL,32115,6.5,,,, +US-FL-32116,US,FL,32116,6.5,,,, +US-FL-32117,US,FL,32117,6.5,,,, +US-FL-32118,US,FL,32118,6.5,,,, +US-FL-32119,US,FL,32119,6.5,,,, +US-FL-32120,US,FL,32120,6.5,,,, +US-FL-32121,US,FL,32121,6.5,,,, +US-FL-32122,US,FL,32122,6.5,,,, +US-FL-32123,US,FL,32123,6.5,,,, +US-FL-32124,US,FL,32124,6.5,,,, +US-FL-32125,US,FL,32125,6.5,,,, +US-FL-32126,US,FL,32126,6.5,,,, +US-FL-32127,US,FL,32127,6.5,,,, +US-FL-32128,US,FL,32128,6.5,,,, +US-FL-32129,US,FL,32129,6.5,,,, +US-FL-32130,US,FL,32130,6.5,,,, +US-FL-32131,US,FL,32131,7,,,, +US-FL-32132,US,FL,32132,6.5,,,, +US-FL-32133,US,FL,32133,6,,,, +US-FL-32134,US,FL,32134,6,,,, +US-FL-32135,US,FL,32135,7,,,, +US-FL-32136,US,FL,32136,7,,,, +US-FL-32137,US,FL,32137,7,,,, +US-FL-32138,US,FL,32138,7,,,, +US-FL-32139,US,FL,32139,7,,,, +US-FL-32140,US,FL,32140,7,,,, +US-FL-32141,US,FL,32141,6.5,,,, +US-FL-32142,US,FL,32142,7,,,, +US-FL-32143,US,FL,32143,7,,,, +US-FL-32145,US,FL,32145,6,,,, +US-FL-32147,US,FL,32147,7,,,, +US-FL-32148,US,FL,32148,7,,,, +US-FL-32149,US,FL,32149,7,,,, +US-FL-32157,US,FL,32157,7,,,, +US-FL-32158,US,FL,32158,7,,,, +US-FL-32159,US,FL,32159,7,,,, +US-FL-32160,US,FL,32160,7,,,, +US-FL-32162,US,FL,32162,7,,,, +US-FL-32163,US,FL,32163,7,,,, +US-FL-32164,US,FL,32164,7,,,, +US-FL-32168,US,FL,32168,6.5,,,, +US-FL-32169,US,FL,32169,6.5,,,, +US-FL-32170,US,FL,32170,6.5,,,, +US-FL-32173,US,FL,32173,6.5,,,, +US-FL-32174,US,FL,32174,6.5,,,, +US-FL-32175,US,FL,32175,6.5,,,, +US-FL-32176,US,FL,32176,6.5,,,, +US-FL-32177,US,FL,32177,7,,,, +US-FL-32178,US,FL,32178,7,,,, +US-FL-32179,US,FL,32179,6,,,, +US-FL-32180,US,FL,32180,6.5,,,, +US-FL-32181,US,FL,32181,7,,,, +US-FL-32182,US,FL,32182,6,,,, +US-FL-32183,US,FL,32183,6,,,, +US-FL-32185,US,FL,32185,7,,,, +US-FL-32187,US,FL,32187,7,,,, +US-FL-32189,US,FL,32189,7,,,, +US-FL-32190,US,FL,32190,6.5,,,, +US-FL-32192,US,FL,32192,6,,,, +US-FL-32193,US,FL,32193,7,,,, +US-FL-32195,US,FL,32195,6,,,, +US-FL-32198,US,FL,32198,6.5,,,, +US-FL-32201,US,FL,32201,7,,,, +US-FL-32202,US,FL,32202,7,,,, +US-FL-32203,US,FL,32203,7,,,, +US-FL-32204,US,FL,32204,7,,,, +US-FL-32205,US,FL,32205,7,,,, +US-FL-32206,US,FL,32206,7,,,, +US-FL-32207,US,FL,32207,7,,,, +US-FL-32208,US,FL,32208,7,,,, +US-FL-32209,US,FL,32209,7,,,, +US-FL-32210,US,FL,32210,7,,,, +US-FL-32211,US,FL,32211,7,,,, +US-FL-32212,US,FL,32212,7,,,, +US-FL-32214,US,FL,32214,7,,,, +US-FL-32216,US,FL,32216,7,,,, +US-FL-32217,US,FL,32217,7,,,, +US-FL-32218,US,FL,32218,7,,,, +US-FL-32219,US,FL,32219,7,,,, +US-FL-32220,US,FL,32220,7,,,, +US-FL-32221,US,FL,32221,7,,,, +US-FL-32222,US,FL,32222,7,,,, +US-FL-32223,US,FL,32223,7,,,, +US-FL-32224,US,FL,32224,7,,,, +US-FL-32225,US,FL,32225,7,,,, +US-FL-32226,US,FL,32226,7,,,, +US-FL-32227,US,FL,32227,7,,,, +US-FL-32228,US,FL,32228,7,,,, +US-FL-32229,US,FL,32229,7,,,, +US-FL-32231,US,FL,32231,7,,,, +US-FL-32232,US,FL,32232,7,,,, +US-FL-32233,US,FL,32233,7,,,, +US-FL-32234,US,FL,32234,7,,,, +US-FL-32235,US,FL,32235,7,,,, +US-FL-32236,US,FL,32236,7,,,, +US-FL-32237,US,FL,32237,7,,,, +US-FL-32238,US,FL,32238,7,,,, +US-FL-32239,US,FL,32239,7,,,, +US-FL-32240,US,FL,32240,7,,,, +US-FL-32241,US,FL,32241,7,,,, +US-FL-32244,US,FL,32244,7,,,, +US-FL-32245,US,FL,32245,7,,,, +US-FL-32246,US,FL,32246,7,,,, +US-FL-32247,US,FL,32247,7,,,, +US-FL-32250,US,FL,32250,7,,,, +US-FL-32254,US,FL,32254,7,,,, +US-FL-32255,US,FL,32255,7,,,, +US-FL-32256,US,FL,32256,7,,,, +US-FL-32257,US,FL,32257,7,,,, +US-FL-32258,US,FL,32258,7,,,, +US-FL-32259,US,FL,32259,6,,,, +US-FL-32260,US,FL,32260,7,,,, +US-FL-32266,US,FL,32266,7,,,, +US-FL-32277,US,FL,32277,7,,,, +US-FL-32301,US,FL,32301,7.5,,,, +US-FL-32302,US,FL,32302,7.5,,,, +US-FL-32303,US,FL,32303,7.5,,,, +US-FL-32304,US,FL,32304,7.5,,,, +US-FL-32305,US,FL,32305,7.5,,,, +US-FL-32306,US,FL,32306,7.5,,,, +US-FL-32307,US,FL,32307,7.5,,,, +US-FL-32308,US,FL,32308,7.5,,,, +US-FL-32309,US,FL,32309,7.5,,,, +US-FL-32310,US,FL,32310,7.5,,,, +US-FL-32311,US,FL,32311,7.5,,,, +US-FL-32312,US,FL,32312,7.5,,,, +US-FL-32313,US,FL,32313,7.5,,,, +US-FL-32314,US,FL,32314,7.5,,,, +US-FL-32315,US,FL,32315,7.5,,,, +US-FL-32316,US,FL,32316,7.5,,,, +US-FL-32317,US,FL,32317,7.5,,,, +US-FL-32318,US,FL,32318,7.5,,,, +US-FL-32320,US,FL,32320,7,,,, +US-FL-32321,US,FL,32321,7.5,,,, +US-FL-32322,US,FL,32322,7,,,, +US-FL-32323,US,FL,32323,7,,,, +US-FL-32324,US,FL,32324,7.5,,,, +US-FL-32326,US,FL,32326,7,,,, +US-FL-32327,US,FL,32327,7,,,, +US-FL-32328,US,FL,32328,7,,,, +US-FL-32329,US,FL,32329,7,,,, +US-FL-32330,US,FL,32330,7.5,,,, +US-FL-32331,US,FL,32331,7.5,,,, +US-FL-32332,US,FL,32332,7.5,,,, +US-FL-32333,US,FL,32333,7.5,,,, +US-FL-32334,US,FL,32334,7.5,,,, +US-FL-32335,US,FL,32335,7.5,,,, +US-FL-32336,US,FL,32336,7,,,, +US-FL-32337,US,FL,32337,7,,,, +US-FL-32340,US,FL,32340,7.5,,,, +US-FL-32341,US,FL,32341,7.5,,,, +US-FL-32343,US,FL,32343,7.5,,,, +US-FL-32344,US,FL,32344,7,,,, +US-FL-32345,US,FL,32345,7,,,, +US-FL-32346,US,FL,32346,7,,,, +US-FL-32347,US,FL,32347,7,,,, +US-FL-32348,US,FL,32348,7,,,, +US-FL-32350,US,FL,32350,7.5,,,, +US-FL-32351,US,FL,32351,7.5,,,, +US-FL-32352,US,FL,32352,7.5,,,, +US-FL-32353,US,FL,32353,7.5,,,, +US-FL-32355,US,FL,32355,7,,,, +US-FL-32356,US,FL,32356,7,,,, +US-FL-32357,US,FL,32357,7.5,,,, +US-FL-32358,US,FL,32358,7,,,, +US-FL-32359,US,FL,32359,7,,,, +US-FL-32360,US,FL,32360,7.5,,,, +US-FL-32361,US,FL,32361,7,,,, +US-FL-32362,US,FL,32362,7.5,,,, +US-FL-32395,US,FL,32395,7.5,,,, +US-FL-32399,US,FL,32399,7.5,,,, +US-FL-32401,US,FL,32401,6.5,,,, +US-FL-32402,US,FL,32402,6.5,,,, +US-FL-32403,US,FL,32403,6.5,,,, +US-FL-32404,US,FL,32404,6.5,,,, +US-FL-32405,US,FL,32405,6.5,,,, +US-FL-32406,US,FL,32406,6.5,,,, +US-FL-32407,US,FL,32407,6.5,,,, +US-FL-32408,US,FL,32408,6.5,,,, +US-FL-32409,US,FL,32409,6.5,,,, +US-FL-32410,US,FL,32410,7,,,, +US-FL-32411,US,FL,32411,6.5,,,, +US-FL-32412,US,FL,32412,6.5,,,, +US-FL-32413,US,FL,32413,6.5,,,, +US-FL-32417,US,FL,32417,6.5,,,, +US-FL-32420,US,FL,32420,7.5,,,, +US-FL-32421,US,FL,32421,7.5,,,, +US-FL-32422,US,FL,32422,7.5,,,, +US-FL-32423,US,FL,32423,7.5,,,, +US-FL-32424,US,FL,32424,7.5,,,, +US-FL-32425,US,FL,32425,7,,,, +US-FL-32426,US,FL,32426,7.5,,,, +US-FL-32427,US,FL,32427,7,,,, +US-FL-32428,US,FL,32428,7,,,, +US-FL-32430,US,FL,32430,7.5,,,, +US-FL-32431,US,FL,32431,7.5,,,, +US-FL-32432,US,FL,32432,7.5,,,, +US-FL-32433,US,FL,32433,7.5,,,, +US-FL-32434,US,FL,32434,7.5,,,, +US-FL-32435,US,FL,32435,7.5,,,, +US-FL-32437,US,FL,32437,7,,,, +US-FL-32438,US,FL,32438,6.5,,,, +US-FL-32439,US,FL,32439,7.5,,,, +US-FL-32440,US,FL,32440,7.5,,,, +US-FL-32442,US,FL,32442,7.5,,,, +US-FL-32443,US,FL,32443,7.5,,,, +US-FL-32444,US,FL,32444,6.5,,,, +US-FL-32445,US,FL,32445,7.5,,,, +US-FL-32446,US,FL,32446,7.5,,,, +US-FL-32447,US,FL,32447,7.5,,,, +US-FL-32448,US,FL,32448,7.5,,,, +US-FL-32449,US,FL,32449,7.5,,,, +US-FL-32452,US,FL,32452,7,,,, +US-FL-32455,US,FL,32455,7.5,,,, +US-FL-32456,US,FL,32456,7,,,, +US-FL-32457,US,FL,32457,7,,,, +US-FL-32459,US,FL,32459,7.5,,,, +US-FL-32460,US,FL,32460,7.5,,,, +US-FL-32461,US,FL,32461,6.5,,,, +US-FL-32462,US,FL,32462,7,,,, +US-FL-32463,US,FL,32463,7,,,, +US-FL-32464,US,FL,32464,7,,,, +US-FL-32465,US,FL,32465,7,,,, +US-FL-32466,US,FL,32466,6.5,,,, +US-FL-32501,US,FL,32501,7.5,,,, +US-FL-32502,US,FL,32502,7.5,,,, +US-FL-32503,US,FL,32503,7.5,,,, +US-FL-32504,US,FL,32504,7.5,,,, +US-FL-32505,US,FL,32505,7.5,,,, +US-FL-32506,US,FL,32506,7.5,,,, +US-FL-32507,US,FL,32507,7.5,,,, +US-FL-32508,US,FL,32508,7.5,,,, +US-FL-32509,US,FL,32509,7.5,,,, +US-FL-32511,US,FL,32511,7.5,,,, +US-FL-32512,US,FL,32512,7.5,,,, +US-FL-32513,US,FL,32513,7.5,,,, +US-FL-32514,US,FL,32514,7.5,,,, +US-FL-32516,US,FL,32516,7.5,,,, +US-FL-32520,US,FL,32520,7.5,,,, +US-FL-32521,US,FL,32521,7.5,,,, +US-FL-32522,US,FL,32522,7.5,,,, +US-FL-32523,US,FL,32523,7.5,,,, +US-FL-32524,US,FL,32524,7.5,,,, +US-FL-32526,US,FL,32526,7.5,,,, +US-FL-32530,US,FL,32530,6.5,,,, +US-FL-32531,US,FL,32531,6,,,, +US-FL-32533,US,FL,32533,7.5,,,, +US-FL-32534,US,FL,32534,7.5,,,, +US-FL-32535,US,FL,32535,7.5,,,, +US-FL-32536,US,FL,32536,6,,,, +US-FL-32538,US,FL,32538,6,,,, +US-FL-32539,US,FL,32539,6,,,, +US-FL-32540,US,FL,32540,6,,,, +US-FL-32541,US,FL,32541,6,,,, +US-FL-32542,US,FL,32542,6,,,, +US-FL-32544,US,FL,32544,6,,,, +US-FL-32547,US,FL,32547,6,,,, +US-FL-32548,US,FL,32548,6,,,, +US-FL-32549,US,FL,32549,6,,,, +US-FL-32550,US,FL,32550,7.5,,,, +US-FL-32559,US,FL,32559,7.5,,,, +US-FL-32560,US,FL,32560,7.5,,,, +US-FL-32561,US,FL,32561,7.5,,,, +US-FL-32562,US,FL,32562,6.5,,,, +US-FL-32563,US,FL,32563,6.5,,,, +US-FL-32564,US,FL,32564,6,,,, +US-FL-32565,US,FL,32565,6.5,,,, +US-FL-32566,US,FL,32566,6.5,,,, +US-FL-32567,US,FL,32567,7.5,,,, +US-FL-32568,US,FL,32568,7.5,,,, +US-FL-32569,US,FL,32569,6,,,, +US-FL-32570,US,FL,32570,6.5,,,, +US-FL-32571,US,FL,32571,6.5,,,, +US-FL-32572,US,FL,32572,6.5,,,, +US-FL-32577,US,FL,32577,7.5,,,, +US-FL-32578,US,FL,32578,6,,,, +US-FL-32579,US,FL,32579,6,,,, +US-FL-32580,US,FL,32580,6,,,, +US-FL-32583,US,FL,32583,6.5,,,, +US-FL-32588,US,FL,32588,6,,,, +US-FL-32591,US,FL,32591,7.5,,,, +US-FL-32601,US,FL,32601,6,,,, +US-FL-32602,US,FL,32602,6,,,, +US-FL-32603,US,FL,32603,6,,,, +US-FL-32604,US,FL,32604,6,,,, +US-FL-32605,US,FL,32605,6,,,, +US-FL-32606,US,FL,32606,6,,,, +US-FL-32607,US,FL,32607,6,,,, +US-FL-32608,US,FL,32608,6,,,, +US-FL-32609,US,FL,32609,6,,,, +US-FL-32610,US,FL,32610,6,,,, +US-FL-32611,US,FL,32611,6,,,, +US-FL-32612,US,FL,32612,6,,,, +US-FL-32614,US,FL,32614,6,,,, +US-FL-32615,US,FL,32615,6,,,, +US-FL-32616,US,FL,32616,6,,,, +US-FL-32617,US,FL,32617,6,,,, +US-FL-32618,US,FL,32618,6,,,, +US-FL-32619,US,FL,32619,7,,,, +US-FL-32621,US,FL,32621,7,,,, +US-FL-32622,US,FL,32622,7,,,, +US-FL-32625,US,FL,32625,7,,,, +US-FL-32626,US,FL,32626,7,,,, +US-FL-32627,US,FL,32627,6,,,, +US-FL-32628,US,FL,32628,7,,,, +US-FL-32631,US,FL,32631,6,,,, +US-FL-32633,US,FL,32633,6,,,, +US-FL-32634,US,FL,32634,6,,,, +US-FL-32635,US,FL,32635,6,,,, +US-FL-32639,US,FL,32639,7,,,, +US-FL-32640,US,FL,32640,6,,,, +US-FL-32641,US,FL,32641,6,,,, +US-FL-32643,US,FL,32643,6,,,, +US-FL-32644,US,FL,32644,7,,,, +US-FL-32648,US,FL,32648,7,,,, +US-FL-32653,US,FL,32653,6,,,, +US-FL-32654,US,FL,32654,6,,,, +US-FL-32655,US,FL,32655,6,,,, +US-FL-32656,US,FL,32656,7,,,, +US-FL-32658,US,FL,32658,6,,,, +US-FL-32662,US,FL,32662,6,,,, +US-FL-32663,US,FL,32663,6,,,, +US-FL-32664,US,FL,32664,6,,,, +US-FL-32666,US,FL,32666,7,,,, +US-FL-32667,US,FL,32667,6,,,, +US-FL-32668,US,FL,32668,7,,,, +US-FL-32669,US,FL,32669,6,,,, +US-FL-32680,US,FL,32680,7,,,, +US-FL-32681,US,FL,32681,6,,,, +US-FL-32683,US,FL,32683,7,,,, +US-FL-32686,US,FL,32686,6,,,, +US-FL-32692,US,FL,32692,7,,,, +US-FL-32693,US,FL,32693,7,,,, +US-FL-32694,US,FL,32694,6,,,, +US-FL-32696,US,FL,32696,7,,,, +US-FL-32697,US,FL,32697,7,,,, +US-FL-32701,US,FL,32701,6,,,, +US-FL-32702,US,FL,32702,7,,,, +US-FL-32703,US,FL,32703,6.5,,,, +US-FL-32704,US,FL,32704,6.5,,,, +US-FL-32706,US,FL,32706,6.5,,,, +US-FL-32707,US,FL,32707,6,,,, +US-FL-32708,US,FL,32708,6,,,, +US-FL-32709,US,FL,32709,6.5,,,, +US-FL-32710,US,FL,32710,6.5,,,, +US-FL-32712,US,FL,32712,6.5,,,, +US-FL-32713,US,FL,32713,6.5,,,, +US-FL-32714,US,FL,32714,6,,,, +US-FL-32715,US,FL,32715,6,,,, +US-FL-32716,US,FL,32716,6,,,, +US-FL-32718,US,FL,32718,6,,,, +US-FL-32719,US,FL,32719,6,,,, +US-FL-32720,US,FL,32720,6.5,,,, +US-FL-32721,US,FL,32721,6.5,,,, +US-FL-32722,US,FL,32722,6.5,,,, +US-FL-32723,US,FL,32723,6.5,,,, +US-FL-32724,US,FL,32724,6.5,,,, +US-FL-32725,US,FL,32725,6.5,,,, +US-FL-32726,US,FL,32726,7,,,, +US-FL-32727,US,FL,32727,7,,,, +US-FL-32728,US,FL,32728,6.5,,,, +US-FL-32730,US,FL,32730,6,,,, +US-FL-32732,US,FL,32732,6,,,, +US-FL-32733,US,FL,32733,6,,,, +US-FL-32735,US,FL,32735,7,,,, +US-FL-32736,US,FL,32736,7,,,, +US-FL-32738,US,FL,32738,6.5,,,, +US-FL-32739,US,FL,32739,6.5,,,, +US-FL-32744,US,FL,32744,6.5,,,, +US-FL-32745,US,FL,32745,6,,,, +US-FL-32746,US,FL,32746,6,,,, +US-FL-32747,US,FL,32747,6,,,, +US-FL-32750,US,FL,32750,6,,,, +US-FL-32751,US,FL,32751,6.5,,,, +US-FL-32752,US,FL,32752,6,,,, +US-FL-32753,US,FL,32753,6.5,,,, +US-FL-32754,US,FL,32754,6,,,, +US-FL-32756,US,FL,32756,7,,,, +US-FL-32757,US,FL,32757,7,,,, +US-FL-32759,US,FL,32759,6.5,,,, +US-FL-32762,US,FL,32762,6,,,, +US-FL-32763,US,FL,32763,6.5,,,, +US-FL-32764,US,FL,32764,6.5,,,, +US-FL-32765,US,FL,32765,6,,,, +US-FL-32766,US,FL,32766,6,,,, +US-FL-32767,US,FL,32767,7,,,, +US-FL-32768,US,FL,32768,6.5,,,, +US-FL-32771,US,FL,32771,6,,,, +US-FL-32772,US,FL,32772,6,,,, +US-FL-32773,US,FL,32773,6,,,, +US-FL-32774,US,FL,32774,6.5,,,, +US-FL-32775,US,FL,32775,6,,,, +US-FL-32776,US,FL,32776,7,,,, +US-FL-32777,US,FL,32777,6.5,,,, +US-FL-32778,US,FL,32778,7,,,, +US-FL-32779,US,FL,32779,6,,,, +US-FL-32780,US,FL,32780,6,,,, +US-FL-32781,US,FL,32781,6,,,, +US-FL-32783,US,FL,32783,6,,,, +US-FL-32784,US,FL,32784,7,,,, +US-FL-32789,US,FL,32789,6.5,,,, +US-FL-32790,US,FL,32790,6.5,,,, +US-FL-32791,US,FL,32791,6,,,, +US-FL-32792,US,FL,32792,6.5,,,, +US-FL-32793,US,FL,32793,6.5,,,, +US-FL-32794,US,FL,32794,6.5,,,, +US-FL-32795,US,FL,32795,6,,,, +US-FL-32796,US,FL,32796,6,,,, +US-FL-32798,US,FL,32798,6.5,,,, +US-FL-32799,US,FL,32799,6,,,, +US-FL-32801,US,FL,32801,6.5,,,, +US-FL-32802,US,FL,32802,6.5,,,, +US-FL-32803,US,FL,32803,6.5,,,, +US-FL-32804,US,FL,32804,6.5,,,, +US-FL-32805,US,FL,32805,6.5,,,, +US-FL-32806,US,FL,32806,6.5,,,, +US-FL-32807,US,FL,32807,6.5,,,, +US-FL-32808,US,FL,32808,6.5,,,, +US-FL-32809,US,FL,32809,6.5,,,, +US-FL-32810,US,FL,32810,6.5,,,, +US-FL-32811,US,FL,32811,6.5,,,, +US-FL-32812,US,FL,32812,6.5,,,, +US-FL-32814,US,FL,32814,6.5,,,, +US-FL-32815,US,FL,32815,6.5,,,, +US-FL-32816,US,FL,32816,6.5,,,, +US-FL-32817,US,FL,32817,6.5,,,, +US-FL-32818,US,FL,32818,6.5,,,, +US-FL-32819,US,FL,32819,6.5,,,, +US-FL-32820,US,FL,32820,6.5,,,, +US-FL-32821,US,FL,32821,6.5,,,, +US-FL-32822,US,FL,32822,6.5,,,, +US-FL-32824,US,FL,32824,6.5,,,, +US-FL-32825,US,FL,32825,6.5,,,, +US-FL-32826,US,FL,32826,6.5,,,, +US-FL-32827,US,FL,32827,6.5,,,, +US-FL-32828,US,FL,32828,6.5,,,, +US-FL-32829,US,FL,32829,6.5,,,, +US-FL-32830,US,FL,32830,6.5,,,, +US-FL-32831,US,FL,32831,6.5,,,, +US-FL-32832,US,FL,32832,6.5,,,, +US-FL-32833,US,FL,32833,6.5,,,, +US-FL-32834,US,FL,32834,6.5,,,, +US-FL-32835,US,FL,32835,6.5,,,, +US-FL-32836,US,FL,32836,6.5,,,, +US-FL-32837,US,FL,32837,6.5,,,, +US-FL-32839,US,FL,32839,6.5,,,, +US-FL-32853,US,FL,32853,6.5,,,, +US-FL-32854,US,FL,32854,6.5,,,, +US-FL-32855,US,FL,32855,6.5,,,, +US-FL-32856,US,FL,32856,6.5,,,, +US-FL-32857,US,FL,32857,6.5,,,, +US-FL-32858,US,FL,32858,6.5,,,, +US-FL-32859,US,FL,32859,6.5,,,, +US-FL-32860,US,FL,32860,6.5,,,, +US-FL-32861,US,FL,32861,6.5,,,, +US-FL-32862,US,FL,32862,6.5,,,, +US-FL-32867,US,FL,32867,6.5,,,, +US-FL-32868,US,FL,32868,6.5,,,, +US-FL-32869,US,FL,32869,6.5,,,, +US-FL-32872,US,FL,32872,6.5,,,, +US-FL-32877,US,FL,32877,6.5,,,, +US-FL-32878,US,FL,32878,6.5,,,, +US-FL-32885,US,FL,32885,6.5,,,, +US-FL-32886,US,FL,32886,6.5,,,, +US-FL-32887,US,FL,32887,6.5,,,, +US-FL-32891,US,FL,32891,6.5,,,, +US-FL-32896,US,FL,32896,6.5,,,, +US-FL-32897,US,FL,32897,6.5,,,, +US-FL-32901,US,FL,32901,6,,,, +US-FL-32902,US,FL,32902,6,,,, +US-FL-32903,US,FL,32903,6,,,, +US-FL-32904,US,FL,32904,6,,,, +US-FL-32905,US,FL,32905,6,,,, +US-FL-32906,US,FL,32906,6,,,, +US-FL-32907,US,FL,32907,6,,,, +US-FL-32908,US,FL,32908,6,,,, +US-FL-32909,US,FL,32909,6,,,, +US-FL-32910,US,FL,32910,6,,,, +US-FL-32911,US,FL,32911,6,,,, +US-FL-32912,US,FL,32912,6,,,, +US-FL-32919,US,FL,32919,6,,,, +US-FL-32920,US,FL,32920,6,,,, +US-FL-32922,US,FL,32922,6,,,, +US-FL-32923,US,FL,32923,6,,,, +US-FL-32924,US,FL,32924,6,,,, +US-FL-32925,US,FL,32925,6,,,, +US-FL-32926,US,FL,32926,6,,,, +US-FL-32927,US,FL,32927,6,,,, +US-FL-32931,US,FL,32931,6,,,, +US-FL-32932,US,FL,32932,6,,,, +US-FL-32934,US,FL,32934,6,,,, +US-FL-32935,US,FL,32935,6,,,, +US-FL-32936,US,FL,32936,6,,,, +US-FL-32937,US,FL,32937,6,,,, +US-FL-32940,US,FL,32940,6,,,, +US-FL-32941,US,FL,32941,6,,,, +US-FL-32948,US,FL,32948,7,,,, +US-FL-32949,US,FL,32949,6,,,, +US-FL-32950,US,FL,32950,6,,,, +US-FL-32951,US,FL,32951,6,,,, +US-FL-32952,US,FL,32952,6,,,, +US-FL-32953,US,FL,32953,6,,,, +US-FL-32954,US,FL,32954,6,,,, +US-FL-32955,US,FL,32955,6,,,, +US-FL-32956,US,FL,32956,6,,,, +US-FL-32957,US,FL,32957,7,,,, +US-FL-32958,US,FL,32958,7,,,, +US-FL-32959,US,FL,32959,6,,,, +US-FL-32960,US,FL,32960,7,,,, +US-FL-32961,US,FL,32961,7,,,, +US-FL-32962,US,FL,32962,7,,,, +US-FL-32963,US,FL,32963,7,,,, +US-FL-32964,US,FL,32964,7,,,, +US-FL-32965,US,FL,32965,7,,,, +US-FL-32966,US,FL,32966,7,,,, +US-FL-32967,US,FL,32967,7,,,, +US-FL-32968,US,FL,32968,7,,,, +US-FL-32969,US,FL,32969,7,,,, +US-FL-32970,US,FL,32970,7,,,, +US-FL-32971,US,FL,32971,7,,,, +US-FL-32976,US,FL,32976,6,,,, +US-FL-32978,US,FL,32978,7,,,, +US-FL-33001,US,FL,33001,7.5,,,, +US-FL-33002,US,FL,33002,7,,,, +US-FL-33004,US,FL,33004,6,,,, +US-FL-33008,US,FL,33008,6,,,, +US-FL-33009,US,FL,33009,6,,,, +US-FL-33010,US,FL,33010,7,,,, +US-FL-33011,US,FL,33011,7,,,, +US-FL-33012,US,FL,33012,7,,,, +US-FL-33013,US,FL,33013,7,,,, +US-FL-33014,US,FL,33014,7,,,, +US-FL-33015,US,FL,33015,7,,,, +US-FL-33016,US,FL,33016,7,,,, +US-FL-33017,US,FL,33017,7,,,, +US-FL-33018,US,FL,33018,7,,,, +US-FL-33019,US,FL,33019,6,,,, +US-FL-33020,US,FL,33020,6,,,, +US-FL-33021,US,FL,33021,6,,,, +US-FL-33022,US,FL,33022,6,,,, +US-FL-33023,US,FL,33023,6,,,, +US-FL-33024,US,FL,33024,6,,,, +US-FL-33025,US,FL,33025,6,,,, +US-FL-33026,US,FL,33026,6,,,, +US-FL-33027,US,FL,33027,6,,,, +US-FL-33028,US,FL,33028,6,,,, +US-FL-33029,US,FL,33029,6,,,, +US-FL-33030,US,FL,33030,7,,,, +US-FL-33031,US,FL,33031,7,,,, +US-FL-33032,US,FL,33032,7,,,, +US-FL-33033,US,FL,33033,7,,,, +US-FL-33034,US,FL,33034,7,,,, +US-FL-33035,US,FL,33035,7,,,, +US-FL-33036,US,FL,33036,7.5,,,, +US-FL-33037,US,FL,33037,7.5,,,, +US-FL-33039,US,FL,33039,7,,,, +US-FL-33040,US,FL,33040,7.5,,,, +US-FL-33041,US,FL,33041,7.5,,,, +US-FL-33042,US,FL,33042,7.5,,,, +US-FL-33043,US,FL,33043,7.5,,,, +US-FL-33045,US,FL,33045,7.5,,,, +US-FL-33050,US,FL,33050,7.5,,,, +US-FL-33051,US,FL,33051,7.5,,,, +US-FL-33052,US,FL,33052,7.5,,,, +US-FL-33054,US,FL,33054,7,,,, +US-FL-33055,US,FL,33055,7,,,, +US-FL-33056,US,FL,33056,7,,,, +US-FL-33060,US,FL,33060,6,,,, +US-FL-33061,US,FL,33061,6,,,, +US-FL-33062,US,FL,33062,6,,,, +US-FL-33063,US,FL,33063,6,,,, +US-FL-33064,US,FL,33064,6,,,, +US-FL-33065,US,FL,33065,6,,,, +US-FL-33066,US,FL,33066,6,,,, +US-FL-33067,US,FL,33067,6,,,, +US-FL-33068,US,FL,33068,6,,,, +US-FL-33069,US,FL,33069,6,,,, +US-FL-33070,US,FL,33070,7.5,,,, +US-FL-33071,US,FL,33071,6,,,, +US-FL-33072,US,FL,33072,6,,,, +US-FL-33073,US,FL,33073,6,,,, +US-FL-33074,US,FL,33074,6,,,, +US-FL-33075,US,FL,33075,6,,,, +US-FL-33076,US,FL,33076,6,,,, +US-FL-33077,US,FL,33077,6,,,, +US-FL-33081,US,FL,33081,6,,,, +US-FL-33082,US,FL,33082,6,,,, +US-FL-33083,US,FL,33083,6,,,, +US-FL-33084,US,FL,33084,6,,,, +US-FL-33090,US,FL,33090,7,,,, +US-FL-33092,US,FL,33092,7,,,, +US-FL-33093,US,FL,33093,6,,,, +US-FL-33097,US,FL,33097,6,,,, +US-FL-33101,US,FL,33101,7,,,, +US-FL-33102,US,FL,33102,7,,,, +US-FL-33106,US,FL,33106,7,,,, +US-FL-33109,US,FL,33109,7,,,, +US-FL-33111,US,FL,33111,7,,,, +US-FL-33112,US,FL,33112,7,,,, +US-FL-33114,US,FL,33114,7,,,, +US-FL-33116,US,FL,33116,7,,,, +US-FL-33119,US,FL,33119,7,,,, +US-FL-33122,US,FL,33122,7,,,, +US-FL-33124,US,FL,33124,7,,,, +US-FL-33125,US,FL,33125,7,,,, +US-FL-33126,US,FL,33126,7,,,, +US-FL-33127,US,FL,33127,7,,,, +US-FL-33128,US,FL,33128,7,,,, +US-FL-33129,US,FL,33129,7,,,, +US-FL-33130,US,FL,33130,7,,,, +US-FL-33131,US,FL,33131,7,,,, +US-FL-33132,US,FL,33132,7,,,, +US-FL-33133,US,FL,33133,7,,,, +US-FL-33134,US,FL,33134,7,,,, +US-FL-33135,US,FL,33135,7,,,, +US-FL-33136,US,FL,33136,7,,,, +US-FL-33137,US,FL,33137,7,,,, +US-FL-33138,US,FL,33138,7,,,, +US-FL-33139,US,FL,33139,7,,,, +US-FL-33140,US,FL,33140,7,,,, +US-FL-33141,US,FL,33141,7,,,, +US-FL-33142,US,FL,33142,7,,,, +US-FL-33143,US,FL,33143,7,,,, +US-FL-33144,US,FL,33144,7,,,, +US-FL-33145,US,FL,33145,7,,,, +US-FL-33146,US,FL,33146,7,,,, +US-FL-33147,US,FL,33147,7,,,, +US-FL-33149,US,FL,33149,7,,,, +US-FL-33150,US,FL,33150,7,,,, +US-FL-33151,US,FL,33151,7,,,, +US-FL-33152,US,FL,33152,7,,,, +US-FL-33153,US,FL,33153,7,,,, +US-FL-33154,US,FL,33154,7,,,, +US-FL-33155,US,FL,33155,7,,,, +US-FL-33156,US,FL,33156,7,,,, +US-FL-33157,US,FL,33157,7,,,, +US-FL-33158,US,FL,33158,7,,,, +US-FL-33159,US,FL,33159,7,,,, +US-FL-33160,US,FL,33160,7,,,, +US-FL-33161,US,FL,33161,7,,,, +US-FL-33162,US,FL,33162,7,,,, +US-FL-33163,US,FL,33163,7,,,, +US-FL-33164,US,FL,33164,7,,,, +US-FL-33165,US,FL,33165,7,,,, +US-FL-33166,US,FL,33166,7,,,, +US-FL-33167,US,FL,33167,7,,,, +US-FL-33168,US,FL,33168,7,,,, +US-FL-33169,US,FL,33169,7,,,, +US-FL-33170,US,FL,33170,7,,,, +US-FL-33172,US,FL,33172,7,,,, +US-FL-33173,US,FL,33173,7,,,, +US-FL-33174,US,FL,33174,7,,,, +US-FL-33175,US,FL,33175,7,,,, +US-FL-33176,US,FL,33176,7,,,, +US-FL-33177,US,FL,33177,7,,,, +US-FL-33178,US,FL,33178,7,,,, +US-FL-33179,US,FL,33179,7,,,, +US-FL-33180,US,FL,33180,7,,,, +US-FL-33181,US,FL,33181,7,,,, +US-FL-33182,US,FL,33182,7,,,, +US-FL-33183,US,FL,33183,7,,,, +US-FL-33184,US,FL,33184,7,,,, +US-FL-33185,US,FL,33185,7,,,, +US-FL-33186,US,FL,33186,7,,,, +US-FL-33187,US,FL,33187,7,,,, +US-FL-33188,US,FL,33188,7,,,, +US-FL-33189,US,FL,33189,7,,,, +US-FL-33190,US,FL,33190,7,,,, +US-FL-33193,US,FL,33193,7,,,, +US-FL-33194,US,FL,33194,7,,,, +US-FL-33196,US,FL,33196,7,,,, +US-FL-33197,US,FL,33197,7,,,, +US-FL-33199,US,FL,33199,7,,,, +US-FL-33222,US,FL,33222,7,,,, +US-FL-33231,US,FL,33231,7,,,, +US-FL-33233,US,FL,33233,7,,,, +US-FL-33234,US,FL,33234,7,,,, +US-FL-33238,US,FL,33238,7,,,, +US-FL-33239,US,FL,33239,7,,,, +US-FL-33242,US,FL,33242,7,,,, +US-FL-33243,US,FL,33243,7,,,, +US-FL-33245,US,FL,33245,7,,,, +US-FL-33247,US,FL,33247,7,,,, +US-FL-33255,US,FL,33255,7,,,, +US-FL-33256,US,FL,33256,7,,,, +US-FL-33257,US,FL,33257,7,,,, +US-FL-33261,US,FL,33261,7,,,, +US-FL-33265,US,FL,33265,7,,,, +US-FL-33266,US,FL,33266,7,,,, +US-FL-33269,US,FL,33269,7,,,, +US-FL-33280,US,FL,33280,7,,,, +US-FL-33283,US,FL,33283,7,,,, +US-FL-33296,US,FL,33296,7,,,, +US-FL-33299,US,FL,33299,7,,,, +US-FL-33301,US,FL,33301,6,,,, +US-FL-33302,US,FL,33302,6,,,, +US-FL-33303,US,FL,33303,6,,,, +US-FL-33304,US,FL,33304,6,,,, +US-FL-33305,US,FL,33305,6,,,, +US-FL-33306,US,FL,33306,6,,,, +US-FL-33307,US,FL,33307,6,,,, +US-FL-33308,US,FL,33308,6,,,, +US-FL-33309,US,FL,33309,6,,,, +US-FL-33310,US,FL,33310,6,,,, +US-FL-33311,US,FL,33311,6,,,, +US-FL-33312,US,FL,33312,6,,,, +US-FL-33313,US,FL,33313,6,,,, +US-FL-33314,US,FL,33314,6,,,, +US-FL-33315,US,FL,33315,6,,,, +US-FL-33316,US,FL,33316,6,,,, +US-FL-33317,US,FL,33317,6,,,, +US-FL-33318,US,FL,33318,6,,,, +US-FL-33319,US,FL,33319,6,,,, +US-FL-33320,US,FL,33320,6,,,, +US-FL-33321,US,FL,33321,6,,,, +US-FL-33322,US,FL,33322,6,,,, +US-FL-33323,US,FL,33323,6,,,, +US-FL-33324,US,FL,33324,6,,,, +US-FL-33325,US,FL,33325,6,,,, +US-FL-33326,US,FL,33326,6,,,, +US-FL-33327,US,FL,33327,6,,,, +US-FL-33328,US,FL,33328,6,,,, +US-FL-33329,US,FL,33329,6,,,, +US-FL-33330,US,FL,33330,6,,,, +US-FL-33331,US,FL,33331,6,,,, +US-FL-33332,US,FL,33332,6,,,, +US-FL-33334,US,FL,33334,6,,,, +US-FL-33335,US,FL,33335,6,,,, +US-FL-33336,US,FL,33336,6,,,, +US-FL-33337,US,FL,33337,6,,,, +US-FL-33338,US,FL,33338,6,,,, +US-FL-33339,US,FL,33339,6,,,, +US-FL-33340,US,FL,33340,6,,,, +US-FL-33345,US,FL,33345,6,,,, +US-FL-33346,US,FL,33346,6,,,, +US-FL-33348,US,FL,33348,6,,,, +US-FL-33349,US,FL,33349,6,,,, +US-FL-33351,US,FL,33351,6,,,, +US-FL-33355,US,FL,33355,6,,,, +US-FL-33359,US,FL,33359,6,,,, +US-FL-33388,US,FL,33388,6,,,, +US-FL-33394,US,FL,33394,6,,,, +US-FL-33401,US,FL,33401,6,,,, +US-FL-33402,US,FL,33402,6,,,, +US-FL-33403,US,FL,33403,6,,,, +US-FL-33404,US,FL,33404,6,,,, +US-FL-33405,US,FL,33405,6,,,, +US-FL-33406,US,FL,33406,6,,,, +US-FL-33407,US,FL,33407,6,,,, +US-FL-33408,US,FL,33408,6,,,, +US-FL-33409,US,FL,33409,6,,,, +US-FL-33410,US,FL,33410,6,,,, +US-FL-33411,US,FL,33411,6,,,, +US-FL-33412,US,FL,33412,6,,,, +US-FL-33413,US,FL,33413,6,,,, +US-FL-33414,US,FL,33414,6,,,, +US-FL-33415,US,FL,33415,6,,,, +US-FL-33416,US,FL,33416,6,,,, +US-FL-33417,US,FL,33417,6,,,, +US-FL-33418,US,FL,33418,6,,,, +US-FL-33419,US,FL,33419,6,,,, +US-FL-33420,US,FL,33420,6,,,, +US-FL-33421,US,FL,33421,6,,,, +US-FL-33422,US,FL,33422,6,,,, +US-FL-33424,US,FL,33424,6,,,, +US-FL-33425,US,FL,33425,6,,,, +US-FL-33426,US,FL,33426,6,,,, +US-FL-33427,US,FL,33427,6,,,, +US-FL-33428,US,FL,33428,6,,,, +US-FL-33429,US,FL,33429,6,,,, +US-FL-33430,US,FL,33430,6,,,, +US-FL-33431,US,FL,33431,6,,,, +US-FL-33432,US,FL,33432,6,,,, +US-FL-33433,US,FL,33433,6,,,, +US-FL-33434,US,FL,33434,6,,,, +US-FL-33435,US,FL,33435,6,,,, +US-FL-33436,US,FL,33436,6,,,, +US-FL-33437,US,FL,33437,6,,,, +US-FL-33438,US,FL,33438,6,,,, +US-FL-33440,US,FL,33440,7,,,, +US-FL-33441,US,FL,33441,6,,,, +US-FL-33442,US,FL,33442,6,,,, +US-FL-33443,US,FL,33443,6,,,, +US-FL-33444,US,FL,33444,6,,,, +US-FL-33445,US,FL,33445,6,,,, +US-FL-33446,US,FL,33446,6,,,, +US-FL-33448,US,FL,33448,6,,,, +US-FL-33449,US,FL,33449,6,,,, +US-FL-33454,US,FL,33454,6,,,, +US-FL-33455,US,FL,33455,6,,,, +US-FL-33458,US,FL,33458,6,,,, +US-FL-33459,US,FL,33459,6,,,, +US-FL-33460,US,FL,33460,6,,,, +US-FL-33461,US,FL,33461,6,,,, +US-FL-33462,US,FL,33462,6,,,, +US-FL-33463,US,FL,33463,6,,,, +US-FL-33464,US,FL,33464,6,,,, +US-FL-33465,US,FL,33465,6,,,, +US-FL-33466,US,FL,33466,6,,,, +US-FL-33467,US,FL,33467,6,,,, +US-FL-33468,US,FL,33468,6,,,, +US-FL-33469,US,FL,33469,6,,,, +US-FL-33470,US,FL,33470,6,,,, +US-FL-33471,US,FL,33471,7,,,, +US-FL-33472,US,FL,33472,6,,,, +US-FL-33473,US,FL,33473,6,,,, +US-FL-33474,US,FL,33474,6,,,, +US-FL-33475,US,FL,33475,6,,,, +US-FL-33476,US,FL,33476,6,,,, +US-FL-33477,US,FL,33477,6,,,, +US-FL-33478,US,FL,33478,6,,,, +US-FL-33480,US,FL,33480,6,,,, +US-FL-33481,US,FL,33481,6,,,, +US-FL-33482,US,FL,33482,6,,,, +US-FL-33483,US,FL,33483,6,,,, +US-FL-33484,US,FL,33484,6,,,, +US-FL-33486,US,FL,33486,6,,,, +US-FL-33487,US,FL,33487,6,,,, +US-FL-33488,US,FL,33488,6,,,, +US-FL-33493,US,FL,33493,6,,,, +US-FL-33496,US,FL,33496,6,,,, +US-FL-33497,US,FL,33497,6,,,, +US-FL-33498,US,FL,33498,6,,,, +US-FL-33499,US,FL,33499,6,,,, +US-FL-33503,US,FL,33503,7,,,, +US-FL-33508,US,FL,33508,7,,,, +US-FL-33509,US,FL,33509,7,,,, +US-FL-33510,US,FL,33510,7,,,, +US-FL-33511,US,FL,33511,7,,,, +US-FL-33513,US,FL,33513,7,,,, +US-FL-33514,US,FL,33514,7,,,, +US-FL-33521,US,FL,33521,7,,,, +US-FL-33523,US,FL,33523,7,,,, +US-FL-33524,US,FL,33524,7,,,, +US-FL-33525,US,FL,33525,7,,,, +US-FL-33526,US,FL,33526,7,,,, +US-FL-33527,US,FL,33527,7,,,, +US-FL-33530,US,FL,33530,7,,,, +US-FL-33534,US,FL,33534,7,,,, +US-FL-33537,US,FL,33537,7,,,, +US-FL-33538,US,FL,33538,7,,,, +US-FL-33540,US,FL,33540,7,,,, +US-FL-33541,US,FL,33541,7,,,, +US-FL-33542,US,FL,33542,7,,,, +US-FL-33543,US,FL,33543,7,,,, +US-FL-33544,US,FL,33544,7,,,, +US-FL-33545,US,FL,33545,7,,,, +US-FL-33547,US,FL,33547,7,,,, +US-FL-33548,US,FL,33548,7,,,, +US-FL-33549,US,FL,33549,7,,,, +US-FL-33550,US,FL,33550,7,,,, +US-FL-33556,US,FL,33556,7,,,, +US-FL-33558,US,FL,33558,7,,,, +US-FL-33559,US,FL,33559,7,,,, +US-FL-33563,US,FL,33563,7,,,, +US-FL-33564,US,FL,33564,7,,,, +US-FL-33565,US,FL,33565,7,,,, +US-FL-33566,US,FL,33566,7,,,, +US-FL-33567,US,FL,33567,7,,,, +US-FL-33568,US,FL,33568,7,,,, +US-FL-33569,US,FL,33569,7,,,, +US-FL-33570,US,FL,33570,7,,,, +US-FL-33571,US,FL,33571,7,,,, +US-FL-33572,US,FL,33572,7,,,, +US-FL-33573,US,FL,33573,7,,,, +US-FL-33574,US,FL,33574,7,,,, +US-FL-33575,US,FL,33575,7,,,, +US-FL-33576,US,FL,33576,7,,,, +US-FL-33578,US,FL,33578,7,,,, +US-FL-33579,US,FL,33579,7,,,, +US-FL-33583,US,FL,33583,7,,,, +US-FL-33584,US,FL,33584,7,,,, +US-FL-33585,US,FL,33585,7,,,, +US-FL-33586,US,FL,33586,7,,,, +US-FL-33587,US,FL,33587,7,,,, +US-FL-33592,US,FL,33592,7,,,, +US-FL-33593,US,FL,33593,7,,,, +US-FL-33594,US,FL,33594,7,,,, +US-FL-33595,US,FL,33595,7,,,, +US-FL-33596,US,FL,33596,7,,,, +US-FL-33597,US,FL,33597,7,,,, +US-FL-33598,US,FL,33598,7,,,, +US-FL-33601,US,FL,33601,7,,,, +US-FL-33602,US,FL,33602,7,,,, +US-FL-33603,US,FL,33603,7,,,, +US-FL-33604,US,FL,33604,7,,,, +US-FL-33605,US,FL,33605,7,,,, +US-FL-33606,US,FL,33606,7,,,, +US-FL-33607,US,FL,33607,7,,,, +US-FL-33608,US,FL,33608,7,,,, +US-FL-33609,US,FL,33609,7,,,, +US-FL-33610,US,FL,33610,7,,,, +US-FL-33611,US,FL,33611,7,,,, +US-FL-33612,US,FL,33612,7,,,, +US-FL-33613,US,FL,33613,7,,,, +US-FL-33614,US,FL,33614,7,,,, +US-FL-33615,US,FL,33615,7,,,, +US-FL-33616,US,FL,33616,7,,,, +US-FL-33617,US,FL,33617,7,,,, +US-FL-33618,US,FL,33618,7,,,, +US-FL-33619,US,FL,33619,7,,,, +US-FL-33620,US,FL,33620,7,,,, +US-FL-33621,US,FL,33621,7,,,, +US-FL-33622,US,FL,33622,7,,,, +US-FL-33623,US,FL,33623,7,,,, +US-FL-33624,US,FL,33624,7,,,, +US-FL-33625,US,FL,33625,7,,,, +US-FL-33626,US,FL,33626,7,,,, +US-FL-33629,US,FL,33629,7,,,, +US-FL-33630,US,FL,33630,7,,,, +US-FL-33631,US,FL,33631,7,,,, +US-FL-33633,US,FL,33633,7,,,, +US-FL-33634,US,FL,33634,7,,,, +US-FL-33635,US,FL,33635,7,,,, +US-FL-33637,US,FL,33637,7,,,, +US-FL-33646,US,FL,33646,7,,,, +US-FL-33647,US,FL,33647,7,,,, +US-FL-33650,US,FL,33650,7,,,, +US-FL-33655,US,FL,33655,7,,,, +US-FL-33660,US,FL,33660,7,,,, +US-FL-33661,US,FL,33661,7,,,, +US-FL-33662,US,FL,33662,7,,,, +US-FL-33663,US,FL,33663,7,,,, +US-FL-33664,US,FL,33664,7,,,, +US-FL-33672,US,FL,33672,7,,,, +US-FL-33673,US,FL,33673,7,,,, +US-FL-33674,US,FL,33674,7,,,, +US-FL-33675,US,FL,33675,7,,,, +US-FL-33677,US,FL,33677,7,,,, +US-FL-33679,US,FL,33679,7,,,, +US-FL-33680,US,FL,33680,7,,,, +US-FL-33681,US,FL,33681,7,,,, +US-FL-33682,US,FL,33682,7,,,, +US-FL-33684,US,FL,33684,7,,,, +US-FL-33685,US,FL,33685,7,,,, +US-FL-33686,US,FL,33686,7,,,, +US-FL-33687,US,FL,33687,7,,,, +US-FL-33688,US,FL,33688,7,,,, +US-FL-33689,US,FL,33689,7,,,, +US-FL-33694,US,FL,33694,7,,,, +US-FL-33701,US,FL,33701,7,,,, +US-FL-33702,US,FL,33702,7,,,, +US-FL-33703,US,FL,33703,7,,,, +US-FL-33704,US,FL,33704,7,,,, +US-FL-33705,US,FL,33705,7,,,, +US-FL-33706,US,FL,33706,7,,,, +US-FL-33707,US,FL,33707,7,,,, +US-FL-33708,US,FL,33708,7,,,, +US-FL-33709,US,FL,33709,7,,,, +US-FL-33710,US,FL,33710,7,,,, +US-FL-33711,US,FL,33711,7,,,, +US-FL-33712,US,FL,33712,7,,,, +US-FL-33713,US,FL,33713,7,,,, +US-FL-33714,US,FL,33714,7,,,, +US-FL-33715,US,FL,33715,7,,,, +US-FL-33716,US,FL,33716,7,,,, +US-FL-33729,US,FL,33729,7,,,, +US-FL-33730,US,FL,33730,7,,,, +US-FL-33731,US,FL,33731,7,,,, +US-FL-33732,US,FL,33732,7,,,, +US-FL-33733,US,FL,33733,7,,,, +US-FL-33734,US,FL,33734,7,,,, +US-FL-33736,US,FL,33736,7,,,, +US-FL-33737,US,FL,33737,7,,,, +US-FL-33738,US,FL,33738,7,,,, +US-FL-33740,US,FL,33740,7,,,, +US-FL-33741,US,FL,33741,7,,,, +US-FL-33742,US,FL,33742,7,,,, +US-FL-33743,US,FL,33743,7,,,, +US-FL-33744,US,FL,33744,7,,,, +US-FL-33747,US,FL,33747,7,,,, +US-FL-33755,US,FL,33755,7,,,, +US-FL-33756,US,FL,33756,7,,,, +US-FL-33757,US,FL,33757,7,,,, +US-FL-33758,US,FL,33758,7,,,, +US-FL-33759,US,FL,33759,7,,,, +US-FL-33760,US,FL,33760,7,,,, +US-FL-33761,US,FL,33761,7,,,, +US-FL-33762,US,FL,33762,7,,,, +US-FL-33763,US,FL,33763,7,,,, +US-FL-33764,US,FL,33764,7,,,, +US-FL-33765,US,FL,33765,7,,,, +US-FL-33766,US,FL,33766,7,,,, +US-FL-33767,US,FL,33767,7,,,, +US-FL-33769,US,FL,33769,7,,,, +US-FL-33770,US,FL,33770,7,,,, +US-FL-33771,US,FL,33771,7,,,, +US-FL-33772,US,FL,33772,7,,,, +US-FL-33773,US,FL,33773,7,,,, +US-FL-33774,US,FL,33774,7,,,, +US-FL-33775,US,FL,33775,7,,,, +US-FL-33776,US,FL,33776,7,,,, +US-FL-33777,US,FL,33777,7,,,, +US-FL-33778,US,FL,33778,7,,,, +US-FL-33779,US,FL,33779,7,,,, +US-FL-33780,US,FL,33780,7,,,, +US-FL-33781,US,FL,33781,7,,,, +US-FL-33782,US,FL,33782,7,,,, +US-FL-33784,US,FL,33784,7,,,, +US-FL-33785,US,FL,33785,7,,,, +US-FL-33786,US,FL,33786,7,,,, +US-FL-33801,US,FL,33801,7,,,, +US-FL-33802,US,FL,33802,7,,,, +US-FL-33803,US,FL,33803,7,,,, +US-FL-33804,US,FL,33804,7,,,, +US-FL-33805,US,FL,33805,7,,,, +US-FL-33806,US,FL,33806,7,,,, +US-FL-33807,US,FL,33807,7,,,, +US-FL-33809,US,FL,33809,7,,,, +US-FL-33810,US,FL,33810,7,,,, +US-FL-33811,US,FL,33811,7,,,, +US-FL-33812,US,FL,33812,7,,,, +US-FL-33813,US,FL,33813,7,,,, +US-FL-33815,US,FL,33815,7,,,, +US-FL-33820,US,FL,33820,7,,,, +US-FL-33823,US,FL,33823,7,,,, +US-FL-33825,US,FL,33825,7,,,, +US-FL-33826,US,FL,33826,7,,,, +US-FL-33827,US,FL,33827,7,,,, +US-FL-33830,US,FL,33830,7,,,, +US-FL-33831,US,FL,33831,7,,,, +US-FL-33834,US,FL,33834,7,,,, +US-FL-33835,US,FL,33835,7,,,, +US-FL-33836,US,FL,33836,7,,,, +US-FL-33837,US,FL,33837,7,,,, +US-FL-33838,US,FL,33838,7,,,, +US-FL-33839,US,FL,33839,7,,,, +US-FL-33840,US,FL,33840,7,,,, +US-FL-33841,US,FL,33841,7,,,, +US-FL-33843,US,FL,33843,7,,,, +US-FL-33844,US,FL,33844,7,,,, +US-FL-33845,US,FL,33845,7,,,, +US-FL-33846,US,FL,33846,7,,,, +US-FL-33847,US,FL,33847,7,,,, +US-FL-33848,US,FL,33848,7,,,, +US-FL-33849,US,FL,33849,7,,,, +US-FL-33850,US,FL,33850,7,,,, +US-FL-33851,US,FL,33851,7,,,, +US-FL-33852,US,FL,33852,7,,,, +US-FL-33853,US,FL,33853,7,,,, +US-FL-33854,US,FL,33854,7,,,, +US-FL-33855,US,FL,33855,7,,,, +US-FL-33856,US,FL,33856,7,,,, +US-FL-33857,US,FL,33857,7,,,, +US-FL-33858,US,FL,33858,7,,,, +US-FL-33859,US,FL,33859,7,,,, +US-FL-33860,US,FL,33860,7,,,, +US-FL-33862,US,FL,33862,7,,,, +US-FL-33863,US,FL,33863,7,,,, +US-FL-33865,US,FL,33865,7,,,, +US-FL-33867,US,FL,33867,7,,,, +US-FL-33868,US,FL,33868,7,,,, +US-FL-33870,US,FL,33870,7,,,, +US-FL-33871,US,FL,33871,7,,,, +US-FL-33872,US,FL,33872,7,,,, +US-FL-33873,US,FL,33873,7,,,, +US-FL-33875,US,FL,33875,7,,,, +US-FL-33876,US,FL,33876,7,,,, +US-FL-33877,US,FL,33877,7,,,, +US-FL-33880,US,FL,33880,7,,,, +US-FL-33881,US,FL,33881,7,,,, +US-FL-33882,US,FL,33882,7,,,, +US-FL-33883,US,FL,33883,7,,,, +US-FL-33884,US,FL,33884,7,,,, +US-FL-33885,US,FL,33885,7,,,, +US-FL-33888,US,FL,33888,7,,,, +US-FL-33890,US,FL,33890,7,,,, +US-FL-33896,US,FL,33896,7,,,, +US-FL-33897,US,FL,33897,7,,,, +US-FL-33898,US,FL,33898,7,,,, +US-FL-33901,US,FL,33901,6,,,, +US-FL-33902,US,FL,33902,6,,,, +US-FL-33903,US,FL,33903,6,,,, +US-FL-33904,US,FL,33904,6,,,, +US-FL-33905,US,FL,33905,6,,,, +US-FL-33906,US,FL,33906,6,,,, +US-FL-33907,US,FL,33907,6,,,, +US-FL-33908,US,FL,33908,6,,,, +US-FL-33909,US,FL,33909,6,,,, +US-FL-33910,US,FL,33910,6,,,, +US-FL-33911,US,FL,33911,6,,,, +US-FL-33912,US,FL,33912,6,,,, +US-FL-33913,US,FL,33913,6,,,, +US-FL-33914,US,FL,33914,6,,,, +US-FL-33915,US,FL,33915,6,,,, +US-FL-33916,US,FL,33916,6,,,, +US-FL-33917,US,FL,33917,6,,,, +US-FL-33918,US,FL,33918,6,,,, +US-FL-33919,US,FL,33919,6,,,, +US-FL-33920,US,FL,33920,6,,,, +US-FL-33921,US,FL,33921,6,,,, +US-FL-33922,US,FL,33922,6,,,, +US-FL-33924,US,FL,33924,6,,,, +US-FL-33927,US,FL,33927,7,,,, +US-FL-33928,US,FL,33928,6,,,, +US-FL-33929,US,FL,33929,6,,,, +US-FL-33930,US,FL,33930,7,,,, +US-FL-33931,US,FL,33931,6,,,, +US-FL-33932,US,FL,33932,6,,,, +US-FL-33935,US,FL,33935,7,,,, +US-FL-33936,US,FL,33936,6,,,, +US-FL-33938,US,FL,33938,7,,,, +US-FL-33944,US,FL,33944,7,,,, +US-FL-33945,US,FL,33945,6,,,, +US-FL-33946,US,FL,33946,7,,,, +US-FL-33947,US,FL,33947,7,,,, +US-FL-33948,US,FL,33948,7,,,, +US-FL-33949,US,FL,33949,7,,,, +US-FL-33950,US,FL,33950,7,,,, +US-FL-33951,US,FL,33951,7,,,, +US-FL-33952,US,FL,33952,7,,,, +US-FL-33953,US,FL,33953,7,,,, +US-FL-33954,US,FL,33954,7,,,, +US-FL-33955,US,FL,33955,7,,,, +US-FL-33956,US,FL,33956,6,,,, +US-FL-33957,US,FL,33957,6,,,, +US-FL-33960,US,FL,33960,7,,,, +US-FL-33965,US,FL,33965,6,,,, +US-FL-33966,US,FL,33966,6,,,, +US-FL-33967,US,FL,33967,6,,,, +US-FL-33970,US,FL,33970,6,,,, +US-FL-33971,US,FL,33971,6,,,, +US-FL-33972,US,FL,33972,6,,,, +US-FL-33973,US,FL,33973,6,,,, +US-FL-33974,US,FL,33974,6,,,, +US-FL-33975,US,FL,33975,7,,,, +US-FL-33976,US,FL,33976,6,,,, +US-FL-33980,US,FL,33980,7,,,, +US-FL-33981,US,FL,33981,7,,,, +US-FL-33982,US,FL,33982,7,,,, +US-FL-33983,US,FL,33983,7,,,, +US-FL-33990,US,FL,33990,6,,,, +US-FL-33991,US,FL,33991,6,,,, +US-FL-33993,US,FL,33993,6,,,, +US-FL-33994,US,FL,33994,6,,,, +US-FL-34101,US,FL,34101,6,,,, +US-FL-34102,US,FL,34102,6,,,, +US-FL-34103,US,FL,34103,6,,,, +US-FL-34104,US,FL,34104,6,,,, +US-FL-34105,US,FL,34105,6,,,, +US-FL-34106,US,FL,34106,6,,,, +US-FL-34107,US,FL,34107,6,,,, +US-FL-34108,US,FL,34108,6,,,, +US-FL-34109,US,FL,34109,6,,,, +US-FL-34110,US,FL,34110,6,,,, +US-FL-34112,US,FL,34112,6,,,, +US-FL-34113,US,FL,34113,6,,,, +US-FL-34114,US,FL,34114,6,,,, +US-FL-34116,US,FL,34116,6,,,, +US-FL-34117,US,FL,34117,6,,,, +US-FL-34119,US,FL,34119,6,,,, +US-FL-34120,US,FL,34120,6,,,, +US-FL-34133,US,FL,34133,6,,,, +US-FL-34134,US,FL,34134,6,,,, +US-FL-34135,US,FL,34135,6,,,, +US-FL-34136,US,FL,34136,6,,,, +US-FL-34137,US,FL,34137,6,,,, +US-FL-34138,US,FL,34138,6,,,, +US-FL-34139,US,FL,34139,6,,,, +US-FL-34140,US,FL,34140,6,,,, +US-FL-34141,US,FL,34141,6,,,, +US-FL-34142,US,FL,34142,6,,,, +US-FL-34143,US,FL,34143,6,,,, +US-FL-34145,US,FL,34145,6,,,, +US-FL-34146,US,FL,34146,6,,,, +US-FL-34201,US,FL,34201,6.5,,,, +US-FL-34202,US,FL,34202,6.5,,,, +US-FL-34203,US,FL,34203,6.5,,,, +US-FL-34204,US,FL,34204,6.5,,,, +US-FL-34205,US,FL,34205,6.5,,,, +US-FL-34206,US,FL,34206,6.5,,,, +US-FL-34207,US,FL,34207,6.5,,,, +US-FL-34208,US,FL,34208,6.5,,,, +US-FL-34209,US,FL,34209,6.5,,,, +US-FL-34210,US,FL,34210,6.5,,,, +US-FL-34211,US,FL,34211,6.5,,,, +US-FL-34212,US,FL,34212,6.5,,,, +US-FL-34215,US,FL,34215,6.5,,,, +US-FL-34216,US,FL,34216,6.5,,,, +US-FL-34217,US,FL,34217,6.5,,,, +US-FL-34218,US,FL,34218,6.5,,,, +US-FL-34219,US,FL,34219,6.5,,,, +US-FL-34220,US,FL,34220,6.5,,,, +US-FL-34221,US,FL,34221,6.5,,,, +US-FL-34222,US,FL,34222,6.5,,,, +US-FL-34223,US,FL,34223,7,,,, +US-FL-34224,US,FL,34224,7,,,, +US-FL-34228,US,FL,34228,7,,,, +US-FL-34229,US,FL,34229,7,,,, +US-FL-34230,US,FL,34230,7,,,, +US-FL-34231,US,FL,34231,7,,,, +US-FL-34232,US,FL,34232,7,,,, +US-FL-34233,US,FL,34233,7,,,, +US-FL-34234,US,FL,34234,7,,,, +US-FL-34235,US,FL,34235,7,,,, +US-FL-34236,US,FL,34236,7,,,, +US-FL-34237,US,FL,34237,7,,,, +US-FL-34238,US,FL,34238,7,,,, +US-FL-34239,US,FL,34239,7,,,, +US-FL-34240,US,FL,34240,7,,,, +US-FL-34241,US,FL,34241,7,,,, +US-FL-34242,US,FL,34242,7,,,, +US-FL-34243,US,FL,34243,6.5,,,, +US-FL-34250,US,FL,34250,6.5,,,, +US-FL-34251,US,FL,34251,6.5,,,, +US-FL-34260,US,FL,34260,6.5,,,, +US-FL-34264,US,FL,34264,6.5,,,, +US-FL-34265,US,FL,34265,7,,,, +US-FL-34266,US,FL,34266,7,,,, +US-FL-34267,US,FL,34267,7,,,, +US-FL-34268,US,FL,34268,7,,,, +US-FL-34269,US,FL,34269,7,,,, +US-FL-34270,US,FL,34270,6.5,,,, +US-FL-34272,US,FL,34272,7,,,, +US-FL-34274,US,FL,34274,7,,,, +US-FL-34275,US,FL,34275,7,,,, +US-FL-34276,US,FL,34276,7,,,, +US-FL-34277,US,FL,34277,7,,,, +US-FL-34278,US,FL,34278,7,,,, +US-FL-34280,US,FL,34280,6.5,,,, +US-FL-34281,US,FL,34281,6.5,,,, +US-FL-34282,US,FL,34282,6.5,,,, +US-FL-34284,US,FL,34284,7,,,, +US-FL-34285,US,FL,34285,7,,,, +US-FL-34286,US,FL,34286,7,,,, +US-FL-34287,US,FL,34287,7,,,, +US-FL-34288,US,FL,34288,7,,,, +US-FL-34289,US,FL,34289,7,,,, +US-FL-34290,US,FL,34290,7,,,, +US-FL-34291,US,FL,34291,7,,,, +US-FL-34292,US,FL,34292,7,,,, +US-FL-34293,US,FL,34293,7,,,, +US-FL-34295,US,FL,34295,7,,,, +US-FL-34420,US,FL,34420,6,,,, +US-FL-34421,US,FL,34421,6,,,, +US-FL-34423,US,FL,34423,6,,,, +US-FL-34428,US,FL,34428,6,,,, +US-FL-34429,US,FL,34429,6,,,, +US-FL-34430,US,FL,34430,6,,,, +US-FL-34431,US,FL,34431,6,,,, +US-FL-34432,US,FL,34432,6,,,, +US-FL-34433,US,FL,34433,6,,,, +US-FL-34434,US,FL,34434,6,,,, +US-FL-34436,US,FL,34436,6,,,, +US-FL-34441,US,FL,34441,6,,,, +US-FL-34442,US,FL,34442,6,,,, +US-FL-34445,US,FL,34445,6,,,, +US-FL-34446,US,FL,34446,6,,,, +US-FL-34447,US,FL,34447,6,,,, +US-FL-34448,US,FL,34448,6,,,, +US-FL-34449,US,FL,34449,7,,,, +US-FL-34450,US,FL,34450,6,,,, +US-FL-34451,US,FL,34451,6,,,, +US-FL-34452,US,FL,34452,6,,,, +US-FL-34453,US,FL,34453,6,,,, +US-FL-34460,US,FL,34460,6,,,, +US-FL-34461,US,FL,34461,6,,,, +US-FL-34464,US,FL,34464,6,,,, +US-FL-34465,US,FL,34465,6,,,, +US-FL-34470,US,FL,34470,6,,,, +US-FL-34471,US,FL,34471,6,,,, +US-FL-34472,US,FL,34472,6,,,, +US-FL-34473,US,FL,34473,6,,,, +US-FL-34474,US,FL,34474,6,,,, +US-FL-34475,US,FL,34475,6,,,, +US-FL-34476,US,FL,34476,6,,,, +US-FL-34477,US,FL,34477,6,,,, +US-FL-34478,US,FL,34478,6,,,, +US-FL-34479,US,FL,34479,6,,,, +US-FL-34480,US,FL,34480,6,,,, +US-FL-34481,US,FL,34481,6,,,, +US-FL-34482,US,FL,34482,6,,,, +US-FL-34483,US,FL,34483,6,,,, +US-FL-34484,US,FL,34484,7,,,, +US-FL-34487,US,FL,34487,6,,,, +US-FL-34488,US,FL,34488,6,,,, +US-FL-34489,US,FL,34489,6,,,, +US-FL-34491,US,FL,34491,6,,,, +US-FL-34492,US,FL,34492,6,,,, +US-FL-34498,US,FL,34498,7,,,, +US-FL-34601,US,FL,34601,6.5,,,, +US-FL-34602,US,FL,34602,6.5,,,, +US-FL-34603,US,FL,34603,6.5,,,, +US-FL-34604,US,FL,34604,6.5,,,, +US-FL-34605,US,FL,34605,6.5,,,, +US-FL-34606,US,FL,34606,6.5,,,, +US-FL-34607,US,FL,34607,6.5,,,, +US-FL-34608,US,FL,34608,6.5,,,, +US-FL-34609,US,FL,34609,6.5,,,, +US-FL-34610,US,FL,34610,7,,,, +US-FL-34611,US,FL,34611,6.5,,,, +US-FL-34613,US,FL,34613,6.5,,,, +US-FL-34614,US,FL,34614,6.5,,,, +US-FL-34636,US,FL,34636,6.5,,,, +US-FL-34637,US,FL,34637,7,,,, +US-FL-34638,US,FL,34638,7,,,, +US-FL-34639,US,FL,34639,7,,,, +US-FL-34652,US,FL,34652,7,,,, +US-FL-34653,US,FL,34653,7,,,, +US-FL-34654,US,FL,34654,7,,,, +US-FL-34655,US,FL,34655,7,,,, +US-FL-34656,US,FL,34656,7,,,, +US-FL-34660,US,FL,34660,7,,,, +US-FL-34661,US,FL,34661,6.5,,,, +US-FL-34667,US,FL,34667,7,,,, +US-FL-34668,US,FL,34668,7,,,, +US-FL-34669,US,FL,34669,7,,,, +US-FL-34673,US,FL,34673,7,,,, +US-FL-34674,US,FL,34674,7,,,, +US-FL-34677,US,FL,34677,7,,,, +US-FL-34679,US,FL,34679,7,,,, +US-FL-34680,US,FL,34680,7,,,, +US-FL-34681,US,FL,34681,7,,,, +US-FL-34682,US,FL,34682,7,,,, +US-FL-34683,US,FL,34683,7,,,, +US-FL-34684,US,FL,34684,7,,,, +US-FL-34685,US,FL,34685,7,,,, +US-FL-34688,US,FL,34688,7,,,, +US-FL-34689,US,FL,34689,7,,,, +US-FL-34690,US,FL,34690,7,,,, +US-FL-34691,US,FL,34691,7,,,, +US-FL-34692,US,FL,34692,7,,,, +US-FL-34695,US,FL,34695,7,,,, +US-FL-34697,US,FL,34697,7,,,, +US-FL-34698,US,FL,34698,7,,,, +US-FL-34705,US,FL,34705,7,,,, +US-FL-34711,US,FL,34711,7,,,, +US-FL-34712,US,FL,34712,7,,,, +US-FL-34713,US,FL,34713,7,,,, +US-FL-34714,US,FL,34714,7,,,, +US-FL-34715,US,FL,34715,7,,,, +US-FL-34729,US,FL,34729,7,,,, +US-FL-34731,US,FL,34731,7,,,, +US-FL-34734,US,FL,34734,6.5,,,, +US-FL-34736,US,FL,34736,7,,,, +US-FL-34737,US,FL,34737,7,,,, +US-FL-34739,US,FL,34739,7,,,, +US-FL-34740,US,FL,34740,6.5,,,, +US-FL-34741,US,FL,34741,7,,,, +US-FL-34742,US,FL,34742,7,,,, +US-FL-34743,US,FL,34743,7,,,, +US-FL-34744,US,FL,34744,7,,,, +US-FL-34745,US,FL,34745,7,,,, +US-FL-34746,US,FL,34746,7,,,, +US-FL-34747,US,FL,34747,7,,,, +US-FL-34748,US,FL,34748,7,,,, +US-FL-34749,US,FL,34749,7,,,, +US-FL-34753,US,FL,34753,7,,,, +US-FL-34755,US,FL,34755,7,,,, +US-FL-34756,US,FL,34756,7,,,, +US-FL-34758,US,FL,34758,7,,,, +US-FL-34759,US,FL,34759,7,,,, +US-FL-34760,US,FL,34760,6.5,,,, +US-FL-34761,US,FL,34761,6.5,,,, +US-FL-34762,US,FL,34762,7,,,, +US-FL-34769,US,FL,34769,7,,,, +US-FL-34770,US,FL,34770,7,,,, +US-FL-34771,US,FL,34771,7,,,, +US-FL-34772,US,FL,34772,7,,,, +US-FL-34773,US,FL,34773,7,,,, +US-FL-34777,US,FL,34777,6.5,,,, +US-FL-34778,US,FL,34778,6.5,,,, +US-FL-34785,US,FL,34785,7,,,, +US-FL-34786,US,FL,34786,6.5,,,, +US-FL-34787,US,FL,34787,6.5,,,, +US-FL-34788,US,FL,34788,7,,,, +US-FL-34789,US,FL,34789,7,,,, +US-FL-34797,US,FL,34797,7,,,, +US-FL-34945,US,FL,34945,6.5,,,, +US-FL-34946,US,FL,34946,6.5,,,, +US-FL-34947,US,FL,34947,6.5,,,, +US-FL-34948,US,FL,34948,6.5,,,, +US-FL-34949,US,FL,34949,6.5,,,, +US-FL-34950,US,FL,34950,6.5,,,, +US-FL-34951,US,FL,34951,6.5,,,, +US-FL-34952,US,FL,34952,6.5,,,, +US-FL-34953,US,FL,34953,6.5,,,, +US-FL-34954,US,FL,34954,6.5,,,, +US-FL-34956,US,FL,34956,6,,,, +US-FL-34957,US,FL,34957,6,,,, +US-FL-34958,US,FL,34958,6,,,, +US-FL-34972,US,FL,34972,7,,,, +US-FL-34973,US,FL,34973,7,,,, +US-FL-34974,US,FL,34974,7,,,, +US-FL-34979,US,FL,34979,6.5,,,, +US-FL-34981,US,FL,34981,6.5,,,, +US-FL-34982,US,FL,34982,6.5,,,, +US-FL-34983,US,FL,34983,6.5,,,, +US-FL-34984,US,FL,34984,6.5,,,, +US-FL-34985,US,FL,34985,6.5,,,, +US-FL-34986,US,FL,34986,6.5,,,, +US-FL-34987,US,FL,34987,6.5,,,, +US-FL-34988,US,FL,34988,6.5,,,, +US-FL-34990,US,FL,34990,6,,,, +US-FL-34991,US,FL,34991,6,,,, +US-FL-34992,US,FL,34992,6,,,, +US-FL-34994,US,FL,34994,6,,,, +US-FL-34995,US,FL,34995,6,,,, +US-FL-34996,US,FL,34996,6,,,, +US-FL-34997,US,FL,34997,6,,,, +US-GA-30002,US,GA,30002,7,,,, +US-GA-30003,US,GA,30003,6,,,, +US-GA-30004,US,GA,30004,7,,,, +US-GA-30005,US,GA,30005,7,,,, +US-GA-30006,US,GA,30006,6,,,, +US-GA-30007,US,GA,30007,6,,,, +US-GA-30008,US,GA,30008,6,,,, +US-GA-30009,US,GA,30009,7,,,, +US-GA-30010,US,GA,30010,6,,,, +US-GA-30011,US,GA,30011,7,,,, +US-GA-30012,US,GA,30012,6,,,, +US-GA-30013,US,GA,30013,6,,,, +US-GA-30014,US,GA,30014,7,,,, +US-GA-30015,US,GA,30015,7,,,, +US-GA-30016,US,GA,30016,7,,,, +US-GA-30017,US,GA,30017,6,,,, +US-GA-30018,US,GA,30018,7,,,, +US-GA-30019,US,GA,30019,6,,,, +US-GA-30021,US,GA,30021,7,,,, +US-GA-30022,US,GA,30022,7,,,, +US-GA-30023,US,GA,30023,7,,,, +US-GA-30024,US,GA,30024,6,,,, +US-GA-30025,US,GA,30025,7,,,, +US-GA-30026,US,GA,30026,6,,,, +US-GA-30028,US,GA,30028,7,,,, +US-GA-30029,US,GA,30029,6,,,, +US-GA-30030,US,GA,30030,7,,,, +US-GA-30031,US,GA,30031,7,,,, +US-GA-30032,US,GA,30032,7,,,, +US-GA-30033,US,GA,30033,7,,,, +US-GA-30034,US,GA,30034,7,,,, +US-GA-30035,US,GA,30035,7,,,, +US-GA-30036,US,GA,30036,7,,,, +US-GA-30037,US,GA,30037,7,,,, +US-GA-30038,US,GA,30038,7,,,, +US-GA-30039,US,GA,30039,6,,,, +US-GA-30040,US,GA,30040,7,,,, +US-GA-30041,US,GA,30041,7,,,, +US-GA-30042,US,GA,30042,6,,,, +US-GA-30043,US,GA,30043,6,,,, +US-GA-30044,US,GA,30044,6,,,, +US-GA-30045,US,GA,30045,6,,,, +US-GA-30046,US,GA,30046,6,,,, +US-GA-30047,US,GA,30047,6,,,, +US-GA-30048,US,GA,30048,6,,,, +US-GA-30049,US,GA,30049,6,,,, +US-GA-30052,US,GA,30052,6,,,, +US-GA-30054,US,GA,30054,7,,,, +US-GA-30055,US,GA,30055,7,,,, +US-GA-30056,US,GA,30056,7,,,, +US-GA-30058,US,GA,30058,7,,,, +US-GA-30060,US,GA,30060,6,,,, +US-GA-30061,US,GA,30061,6,,,, +US-GA-30062,US,GA,30062,6,,,, +US-GA-30063,US,GA,30063,6,,,, +US-GA-30064,US,GA,30064,6,,,, +US-GA-30065,US,GA,30065,6,,,, +US-GA-30066,US,GA,30066,6,,,, +US-GA-30067,US,GA,30067,6,,,, +US-GA-30068,US,GA,30068,6,,,, +US-GA-30069,US,GA,30069,6,,,, +US-GA-30070,US,GA,30070,7,,,, +US-GA-30071,US,GA,30071,6,,,, +US-GA-30072,US,GA,30072,7,,,, +US-GA-30074,US,GA,30074,7,,,, +US-GA-30075,US,GA,30075,7,,,, +US-GA-30076,US,GA,30076,7,,,, +US-GA-30077,US,GA,30077,7,,,, +US-GA-30078,US,GA,30078,6,,,, +US-GA-30079,US,GA,30079,7,,,, +US-GA-30080,US,GA,30080,6,,,, +US-GA-30081,US,GA,30081,6,,,, +US-GA-30082,US,GA,30082,6,,,, +US-GA-30083,US,GA,30083,7,,,, +US-GA-30084,US,GA,30084,7,,,, +US-GA-30085,US,GA,30085,7,,,, +US-GA-30086,US,GA,30086,7,,,, +US-GA-30087,US,GA,30087,7,,,, +US-GA-30088,US,GA,30088,7,,,, +US-GA-30090,US,GA,30090,6,,,, +US-GA-30091,US,GA,30091,6,,,, +US-GA-30092,US,GA,30092,6,,,, +US-GA-30093,US,GA,30093,6,,,, +US-GA-30094,US,GA,30094,6,,,, +US-GA-30095,US,GA,30095,6,,,, +US-GA-30096,US,GA,30096,6,,,, +US-GA-30097,US,GA,30097,6,,,, +US-GA-30098,US,GA,30098,7,,,, +US-GA-30099,US,GA,30099,6,,,, +US-GA-30101,US,GA,30101,6,,,, +US-GA-30102,US,GA,30102,6,,,, +US-GA-30103,US,GA,30103,7,,,, +US-GA-30104,US,GA,30104,7,,,, +US-GA-30105,US,GA,30105,6,,,, +US-GA-30106,US,GA,30106,6,,,, +US-GA-30107,US,GA,30107,6,,,, +US-GA-30108,US,GA,30108,7,,,, +US-GA-30109,US,GA,30109,7,,,, +US-GA-30110,US,GA,30110,7,,,, +US-GA-30111,US,GA,30111,6,,,, +US-GA-30112,US,GA,30112,7,,,, +US-GA-30113,US,GA,30113,7,,,, +US-GA-30114,US,GA,30114,6,,,, +US-GA-30115,US,GA,30115,6,,,, +US-GA-30116,US,GA,30116,7,,,, +US-GA-30117,US,GA,30117,7,,,, +US-GA-30118,US,GA,30118,7,,,, +US-GA-30119,US,GA,30119,7,,,, +US-GA-30120,US,GA,30120,7,,,, +US-GA-30121,US,GA,30121,7,,,, +US-GA-30122,US,GA,30122,7,,,, +US-GA-30123,US,GA,30123,7,,,, +US-GA-30124,US,GA,30124,6,,,, +US-GA-30125,US,GA,30125,7,,,, +US-GA-30126,US,GA,30126,6,,,, +US-GA-30127,US,GA,30127,6,,,, +US-GA-30129,US,GA,30129,6,,,, +US-GA-30132,US,GA,30132,7,,,, +US-GA-30133,US,GA,30133,7,,,, +US-GA-30134,US,GA,30134,7,,,, +US-GA-30135,US,GA,30135,7,,,, +US-GA-30137,US,GA,30137,7,,,, +US-GA-30138,US,GA,30138,7,,,, +US-GA-30139,US,GA,30139,7,,,, +US-GA-30140,US,GA,30140,7,,,, +US-GA-30141,US,GA,30141,7,,,, +US-GA-30142,US,GA,30142,6,,,, +US-GA-30143,US,GA,30143,7,,,, +US-GA-30144,US,GA,30144,6,,,, +US-GA-30145,US,GA,30145,7,,,, +US-GA-30146,US,GA,30146,6,,,, +US-GA-30147,US,GA,30147,6,,,, +US-GA-30148,US,GA,30148,7,,,, +US-GA-30149,US,GA,30149,6,,,, +US-GA-30150,US,GA,30150,7,,,, +US-GA-30151,US,GA,30151,6,,,, +US-GA-30152,US,GA,30152,6,,,, +US-GA-30153,US,GA,30153,7,,,, +US-GA-30154,US,GA,30154,7,,,, +US-GA-30156,US,GA,30156,6,,,, +US-GA-30157,US,GA,30157,7,,,, +US-GA-30160,US,GA,30160,6,,,, +US-GA-30161,US,GA,30161,6,,,, +US-GA-30162,US,GA,30162,6,,,, +US-GA-30163,US,GA,30163,6,,,, +US-GA-30164,US,GA,30164,6,,,, +US-GA-30165,US,GA,30165,6,,,, +US-GA-30168,US,GA,30168,6,,,, +US-GA-30169,US,GA,30169,6,,,, +US-GA-30170,US,GA,30170,7,,,, +US-GA-30171,US,GA,30171,7,,,, +US-GA-30172,US,GA,30172,6,,,, +US-GA-30173,US,GA,30173,6,,,, +US-GA-30175,US,GA,30175,7,,,, +US-GA-30176,US,GA,30176,7,,,, +US-GA-30177,US,GA,30177,7,,,, +US-GA-30178,US,GA,30178,7,,,, +US-GA-30179,US,GA,30179,7,,,, +US-GA-30180,US,GA,30180,7,,,, +US-GA-30182,US,GA,30182,7,,,, +US-GA-30183,US,GA,30183,6,,,, +US-GA-30184,US,GA,30184,7,,,, +US-GA-30185,US,GA,30185,7,,,, +US-GA-30187,US,GA,30187,7,,,, +US-GA-30188,US,GA,30188,6,,,, +US-GA-30189,US,GA,30189,6,,,, +US-GA-30204,US,GA,30204,7,,,, +US-GA-30205,US,GA,30205,7,,,, +US-GA-30206,US,GA,30206,7,,,, +US-GA-30212,US,GA,30212,7,,,, +US-GA-30213,US,GA,30213,7,,,, +US-GA-30214,US,GA,30214,6,,,, +US-GA-30215,US,GA,30215,6,,,, +US-GA-30216,US,GA,30216,7,,,, +US-GA-30217,US,GA,30217,7,,,, +US-GA-30218,US,GA,30218,7,,,, +US-GA-30219,US,GA,30219,7,,,, +US-GA-30220,US,GA,30220,7,,,, +US-GA-30222,US,GA,30222,7,,,, +US-GA-30223,US,GA,30223,7,,,, +US-GA-30224,US,GA,30224,7,,,, +US-GA-30228,US,GA,30228,7,,,, +US-GA-30229,US,GA,30229,7,,,, +US-GA-30230,US,GA,30230,7,,,, +US-GA-30233,US,GA,30233,7,,,, +US-GA-30234,US,GA,30234,7,,,, +US-GA-30236,US,GA,30236,7,,,, +US-GA-30237,US,GA,30237,7,,,, +US-GA-30238,US,GA,30238,7,,,, +US-GA-30240,US,GA,30240,7,,,, +US-GA-30241,US,GA,30241,7,,,, +US-GA-30248,US,GA,30248,7,,,, +US-GA-30250,US,GA,30250,7,,,, +US-GA-30251,US,GA,30251,7,,,, +US-GA-30252,US,GA,30252,7,,,, +US-GA-30253,US,GA,30253,7,,,, +US-GA-30256,US,GA,30256,7,,,, +US-GA-30257,US,GA,30257,7,,,, +US-GA-30258,US,GA,30258,7,,,, +US-GA-30259,US,GA,30259,7,,,, +US-GA-30260,US,GA,30260,7,,,, +US-GA-30261,US,GA,30261,7,,,, +US-GA-30263,US,GA,30263,7,,,, +US-GA-30264,US,GA,30264,7,,,, +US-GA-30265,US,GA,30265,7,,,, +US-GA-30266,US,GA,30266,7,,,, +US-GA-30268,US,GA,30268,7,,,, +US-GA-30269,US,GA,30269,6,,,, +US-GA-30270,US,GA,30270,6,,,, +US-GA-30271,US,GA,30271,7,,,, +US-GA-30272,US,GA,30272,7,,,, +US-GA-30273,US,GA,30273,7,,,, +US-GA-30274,US,GA,30274,7,,,, +US-GA-30275,US,GA,30275,7,,,, +US-GA-30276,US,GA,30276,7,,,, +US-GA-30277,US,GA,30277,7,,,, +US-GA-30281,US,GA,30281,7,,,, +US-GA-30284,US,GA,30284,7,,,, +US-GA-30285,US,GA,30285,7,,,, +US-GA-30286,US,GA,30286,7,,,, +US-GA-30287,US,GA,30287,7,,,, +US-GA-30288,US,GA,30288,7,,,, +US-GA-30289,US,GA,30289,7,,,, +US-GA-30290,US,GA,30290,6,,,, +US-GA-30291,US,GA,30291,7,,,, +US-GA-30292,US,GA,30292,7,,,, +US-GA-30293,US,GA,30293,7,,,, +US-GA-30294,US,GA,30294,7,,,, +US-GA-30295,US,GA,30295,7,,,, +US-GA-30296,US,GA,30296,7,,,, +US-GA-30297,US,GA,30297,7,,,, +US-GA-30298,US,GA,30298,7,,,, +US-GA-30301,US,GA,30301,7,,,, +US-GA-30302,US,GA,30302,7,,,, +US-GA-30303,US,GA,30303,8,,,, +US-GA-30304,US,GA,30304,7,,,, +US-GA-30305,US,GA,30305,8,,,, +US-GA-30306,US,GA,30306,8,,,, +US-GA-30307,US,GA,30307,8,,,, +US-GA-30308,US,GA,30308,8,,,, +US-GA-30309,US,GA,30309,8,,,, +US-GA-30310,US,GA,30310,8,,,, +US-GA-30311,US,GA,30311,8,,,, +US-GA-30312,US,GA,30312,8,,,, +US-GA-30313,US,GA,30313,8,,,, +US-GA-30314,US,GA,30314,8,,,, +US-GA-30315,US,GA,30315,8,,,, +US-GA-30316,US,GA,30316,7,,,, +US-GA-30317,US,GA,30317,8,,,, +US-GA-30318,US,GA,30318,8,,,, +US-GA-30319,US,GA,30319,7,,,, +US-GA-30320,US,GA,30320,7,,,, +US-GA-30321,US,GA,30321,7,,,, +US-GA-30322,US,GA,30322,7,,,, +US-GA-30324,US,GA,30324,8,,,, +US-GA-30325,US,GA,30325,7,,,, +US-GA-30326,US,GA,30326,8,,,, +US-GA-30327,US,GA,30327,8,,,, +US-GA-30328,US,GA,30328,7,,,, +US-GA-30329,US,GA,30329,7,,,, +US-GA-30331,US,GA,30331,8,,,, +US-GA-30332,US,GA,30332,7,,,, +US-GA-30333,US,GA,30333,7,,,, +US-GA-30334,US,GA,30334,8,,,, +US-GA-30336,US,GA,30336,7,,,, +US-GA-30337,US,GA,30337,7,,,, +US-GA-30338,US,GA,30338,7,,,, +US-GA-30339,US,GA,30339,6,,,, +US-GA-30340,US,GA,30340,7,,,, +US-GA-30341,US,GA,30341,7,,,, +US-GA-30342,US,GA,30342,8,,,, +US-GA-30343,US,GA,30343,7,,,, +US-GA-30344,US,GA,30344,8,,,, +US-GA-30345,US,GA,30345,7,,,, +US-GA-30346,US,GA,30346,7,,,, +US-GA-30348,US,GA,30348,7,,,, +US-GA-30349,US,GA,30349,7,,,, +US-GA-30350,US,GA,30350,7,,,, +US-GA-30353,US,GA,30353,7,,,, +US-GA-30354,US,GA,30354,8,,,, +US-GA-30355,US,GA,30355,8,,,, +US-GA-30356,US,GA,30356,7,,,, +US-GA-30357,US,GA,30357,7,,,, +US-GA-30358,US,GA,30358,7,,,, +US-GA-30359,US,GA,30359,7,,,, +US-GA-30360,US,GA,30360,7,,,, +US-GA-30361,US,GA,30361,8,,,, +US-GA-30362,US,GA,30362,7,,,, +US-GA-30363,US,GA,30363,8,,,, +US-GA-30364,US,GA,30364,8,,,, +US-GA-30366,US,GA,30366,7,,,, +US-GA-30368,US,GA,30368,7,,,, +US-GA-30369,US,GA,30369,8,,,, +US-GA-30370,US,GA,30370,7,,,, +US-GA-30371,US,GA,30371,7,,,, +US-GA-30374,US,GA,30374,7,,,, +US-GA-30375,US,GA,30375,8,,,, +US-GA-30377,US,GA,30377,7,,,, +US-GA-30378,US,GA,30378,7,,,, +US-GA-30380,US,GA,30380,7,,,, +US-GA-30384,US,GA,30384,7,,,, +US-GA-30385,US,GA,30385,7,,,, +US-GA-30388,US,GA,30388,7,,,, +US-GA-30392,US,GA,30392,7,,,, +US-GA-30394,US,GA,30394,7,,,, +US-GA-30396,US,GA,30396,7,,,, +US-GA-30398,US,GA,30398,7,,,, +US-GA-30401,US,GA,30401,8,,,, +US-GA-30410,US,GA,30410,8,,,, +US-GA-30411,US,GA,30411,8,,,, +US-GA-30412,US,GA,30412,8,,,, +US-GA-30413,US,GA,30413,8,,,, +US-GA-30414,US,GA,30414,8,,,, +US-GA-30415,US,GA,30415,7,,,, +US-GA-30417,US,GA,30417,8,,,, +US-GA-30420,US,GA,30420,8,,,, +US-GA-30421,US,GA,30421,8,,,, +US-GA-30423,US,GA,30423,8,,,, +US-GA-30424,US,GA,30424,7,,,, +US-GA-30425,US,GA,30425,7,,,, +US-GA-30426,US,GA,30426,7,,,, +US-GA-30427,US,GA,30427,8,,,, +US-GA-30428,US,GA,30428,8,,,, +US-GA-30429,US,GA,30429,8,,,, +US-GA-30434,US,GA,30434,8,,,, +US-GA-30436,US,GA,30436,8,,,, +US-GA-30438,US,GA,30438,8,,,, +US-GA-30439,US,GA,30439,8,,,, +US-GA-30441,US,GA,30441,7,,,, +US-GA-30442,US,GA,30442,8,,,, +US-GA-30445,US,GA,30445,8,,,, +US-GA-30446,US,GA,30446,7,,,, +US-GA-30447,US,GA,30447,8,,,, +US-GA-30448,US,GA,30448,8,,,, +US-GA-30449,US,GA,30449,7,,,, +US-GA-30450,US,GA,30450,7,,,, +US-GA-30451,US,GA,30451,8,,,, +US-GA-30452,US,GA,30452,7,,,, +US-GA-30453,US,GA,30453,8,,,, +US-GA-30454,US,GA,30454,8,,,, +US-GA-30455,US,GA,30455,7,,,, +US-GA-30456,US,GA,30456,7,,,, +US-GA-30457,US,GA,30457,8,,,, +US-GA-30458,US,GA,30458,7,,,, +US-GA-30459,US,GA,30459,7,,,, +US-GA-30460,US,GA,30460,7,,,, +US-GA-30461,US,GA,30461,7,,,, +US-GA-30464,US,GA,30464,8,,,, +US-GA-30467,US,GA,30467,7,,,, +US-GA-30470,US,GA,30470,8,,,, +US-GA-30471,US,GA,30471,8,,,, +US-GA-30473,US,GA,30473,8,,,, +US-GA-30474,US,GA,30474,8,,,, +US-GA-30475,US,GA,30475,8,,,, +US-GA-30477,US,GA,30477,8,,,, +US-GA-30499,US,GA,30499,8,,,, +US-GA-30501,US,GA,30501,7,,,, +US-GA-30502,US,GA,30502,7,,,, +US-GA-30503,US,GA,30503,7,,,, +US-GA-30504,US,GA,30504,7,,,, +US-GA-30506,US,GA,30506,7,,,, +US-GA-30507,US,GA,30507,7,,,, +US-GA-30510,US,GA,30510,7,,,, +US-GA-30511,US,GA,30511,7,,,, +US-GA-30512,US,GA,30512,7,,,, +US-GA-30513,US,GA,30513,7,,,, +US-GA-30514,US,GA,30514,7,,,, +US-GA-30515,US,GA,30515,6,,,, +US-GA-30516,US,GA,30516,7,,,, +US-GA-30517,US,GA,30517,7,,,, +US-GA-30518,US,GA,30518,6,,,, +US-GA-30519,US,GA,30519,6,,,, +US-GA-30520,US,GA,30520,7,,,, +US-GA-30521,US,GA,30521,7,,,, +US-GA-30522,US,GA,30522,7,,,, +US-GA-30523,US,GA,30523,7,,,, +US-GA-30525,US,GA,30525,7,,,, +US-GA-30527,US,GA,30527,7,,,, +US-GA-30528,US,GA,30528,7,,,, +US-GA-30529,US,GA,30529,7,,,, +US-GA-30530,US,GA,30530,7,,,, +US-GA-30531,US,GA,30531,7,,,, +US-GA-30533,US,GA,30533,7,,,, +US-GA-30534,US,GA,30534,7,,,, +US-GA-30535,US,GA,30535,7,,,, +US-GA-30536,US,GA,30536,7,,,, +US-GA-30537,US,GA,30537,7,,,, +US-GA-30538,US,GA,30538,7,,,, +US-GA-30539,US,GA,30539,7,,,, +US-GA-30540,US,GA,30540,7,,,, +US-GA-30541,US,GA,30541,7,,,, +US-GA-30542,US,GA,30542,7,,,, +US-GA-30543,US,GA,30543,7,,,, +US-GA-30545,US,GA,30545,7,,,, +US-GA-30546,US,GA,30546,7,,,, +US-GA-30547,US,GA,30547,7,,,, +US-GA-30548,US,GA,30548,7,,,, +US-GA-30549,US,GA,30549,7,,,, +US-GA-30552,US,GA,30552,7,,,, +US-GA-30553,US,GA,30553,7,,,, +US-GA-30554,US,GA,30554,7,,,, +US-GA-30555,US,GA,30555,7,,,, +US-GA-30557,US,GA,30557,7,,,, +US-GA-30558,US,GA,30558,7,,,, +US-GA-30559,US,GA,30559,7,,,, +US-GA-30560,US,GA,30560,7,,,, +US-GA-30562,US,GA,30562,7,,,, +US-GA-30563,US,GA,30563,7,,,, +US-GA-30564,US,GA,30564,7,,,, +US-GA-30565,US,GA,30565,7,,,, +US-GA-30566,US,GA,30566,7,,,, +US-GA-30567,US,GA,30567,7,,,, +US-GA-30568,US,GA,30568,7,,,, +US-GA-30571,US,GA,30571,7,,,, +US-GA-30572,US,GA,30572,7,,,, +US-GA-30573,US,GA,30573,7,,,, +US-GA-30575,US,GA,30575,7,,,, +US-GA-30576,US,GA,30576,7,,,, +US-GA-30577,US,GA,30577,7,,,, +US-GA-30580,US,GA,30580,7,,,, +US-GA-30581,US,GA,30581,7,,,, +US-GA-30582,US,GA,30582,7,,,, +US-GA-30597,US,GA,30597,7,,,, +US-GA-30598,US,GA,30598,7,,,, +US-GA-30599,US,GA,30599,7,,,, +US-GA-30601,US,GA,30601,7,,,, +US-GA-30602,US,GA,30602,7,,,, +US-GA-30603,US,GA,30603,7,,,, +US-GA-30604,US,GA,30604,7,,,, +US-GA-30605,US,GA,30605,7,,,, +US-GA-30606,US,GA,30606,7,,,, +US-GA-30607,US,GA,30607,7,,,, +US-GA-30608,US,GA,30608,7,,,, +US-GA-30609,US,GA,30609,7,,,, +US-GA-30612,US,GA,30612,7,,,, +US-GA-30619,US,GA,30619,7,,,, +US-GA-30620,US,GA,30620,7,,,, +US-GA-30621,US,GA,30621,7,,,, +US-GA-30622,US,GA,30622,7,,,, +US-GA-30623,US,GA,30623,7,,,, +US-GA-30624,US,GA,30624,7,,,, +US-GA-30625,US,GA,30625,7,,,, +US-GA-30627,US,GA,30627,7,,,, +US-GA-30628,US,GA,30628,7,,,, +US-GA-30629,US,GA,30629,7,,,, +US-GA-30630,US,GA,30630,7,,,, +US-GA-30631,US,GA,30631,8,,,, +US-GA-30633,US,GA,30633,7,,,, +US-GA-30634,US,GA,30634,7,,,, +US-GA-30635,US,GA,30635,7,,,, +US-GA-30638,US,GA,30638,7,,,, +US-GA-30639,US,GA,30639,7,,,, +US-GA-30641,US,GA,30641,7,,,, +US-GA-30642,US,GA,30642,6,,,, +US-GA-30643,US,GA,30643,7,,,, +US-GA-30645,US,GA,30645,7,,,, +US-GA-30646,US,GA,30646,7,,,, +US-GA-30647,US,GA,30647,7,,,, +US-GA-30648,US,GA,30648,7,,,, +US-GA-30650,US,GA,30650,7,,,, +US-GA-30655,US,GA,30655,7,,,, +US-GA-30656,US,GA,30656,7,,,, +US-GA-30660,US,GA,30660,8,,,, +US-GA-30662,US,GA,30662,7,,,, +US-GA-30663,US,GA,30663,7,,,, +US-GA-30664,US,GA,30664,8,,,, +US-GA-30665,US,GA,30665,6,,,, +US-GA-30666,US,GA,30666,7,,,, +US-GA-30667,US,GA,30667,7,,,, +US-GA-30668,US,GA,30668,8,,,, +US-GA-30669,US,GA,30669,6,,,, +US-GA-30671,US,GA,30671,7,,,, +US-GA-30673,US,GA,30673,8,,,, +US-GA-30677,US,GA,30677,7,,,, +US-GA-30678,US,GA,30678,6,,,, +US-GA-30680,US,GA,30680,7,,,, +US-GA-30683,US,GA,30683,7,,,, +US-GA-30701,US,GA,30701,7,,,, +US-GA-30703,US,GA,30703,7,,,, +US-GA-30705,US,GA,30705,7,,,, +US-GA-30707,US,GA,30707,7,,,, +US-GA-30708,US,GA,30708,7,,,, +US-GA-30710,US,GA,30710,6,,,, +US-GA-30711,US,GA,30711,7,,,, +US-GA-30719,US,GA,30719,6,,,, +US-GA-30720,US,GA,30720,6,,,, +US-GA-30721,US,GA,30721,6,,,, +US-GA-30722,US,GA,30722,6,,,, +US-GA-30724,US,GA,30724,7,,,, +US-GA-30725,US,GA,30725,7,,,, +US-GA-30726,US,GA,30726,7,,,, +US-GA-30728,US,GA,30728,7,,,, +US-GA-30730,US,GA,30730,7,,,, +US-GA-30731,US,GA,30731,7,,,, +US-GA-30732,US,GA,30732,7,,,, +US-GA-30733,US,GA,30733,7,,,, +US-GA-30734,US,GA,30734,7,,,, +US-GA-30735,US,GA,30735,7,,,, +US-GA-30736,US,GA,30736,7,,,, +US-GA-30738,US,GA,30738,7,,,, +US-GA-30739,US,GA,30739,7,,,, +US-GA-30740,US,GA,30740,6,,,, +US-GA-30741,US,GA,30741,7,,,, +US-GA-30742,US,GA,30742,7,,,, +US-GA-30746,US,GA,30746,7,,,, +US-GA-30747,US,GA,30747,7,,,, +US-GA-30750,US,GA,30750,7,,,, +US-GA-30751,US,GA,30751,7,,,, +US-GA-30752,US,GA,30752,7,,,, +US-GA-30753,US,GA,30753,7,,,, +US-GA-30755,US,GA,30755,6,,,, +US-GA-30756,US,GA,30756,6,,,, +US-GA-30757,US,GA,30757,7,,,, +US-GA-30802,US,GA,30802,8,,,, +US-GA-30803,US,GA,30803,8,,,, +US-GA-30805,US,GA,30805,7,,,, +US-GA-30806,US,GA,30806,8,,,, +US-GA-30807,US,GA,30807,8,,,, +US-GA-30808,US,GA,30808,8,,,, +US-GA-30809,US,GA,30809,8,,,, +US-GA-30810,US,GA,30810,8,,,, +US-GA-30811,US,GA,30811,7,,,, +US-GA-30812,US,GA,30812,8,,,, +US-GA-30813,US,GA,30813,8,,,, +US-GA-30814,US,GA,30814,8,,,, +US-GA-30815,US,GA,30815,8,,,, +US-GA-30816,US,GA,30816,7,,,, +US-GA-30817,US,GA,30817,8,,,, +US-GA-30818,US,GA,30818,8,,,, +US-GA-30819,US,GA,30819,8,,,, +US-GA-30820,US,GA,30820,8,,,, +US-GA-30821,US,GA,30821,8,,,, +US-GA-30822,US,GA,30822,8,,,, +US-GA-30823,US,GA,30823,8,,,, +US-GA-30824,US,GA,30824,8,,,, +US-GA-30828,US,GA,30828,8,,,, +US-GA-30830,US,GA,30830,7,,,, +US-GA-30833,US,GA,30833,8,,,, +US-GA-30901,US,GA,30901,8,,,, +US-GA-30903,US,GA,30903,8,,,, +US-GA-30904,US,GA,30904,8,,,, +US-GA-30905,US,GA,30905,8,,,, +US-GA-30906,US,GA,30906,8,,,, +US-GA-30907,US,GA,30907,8,,,, +US-GA-30909,US,GA,30909,8,,,, +US-GA-30912,US,GA,30912,8,,,, +US-GA-30914,US,GA,30914,8,,,, +US-GA-30916,US,GA,30916,8,,,, +US-GA-30917,US,GA,30917,8,,,, +US-GA-30919,US,GA,30919,8,,,, +US-GA-30999,US,GA,30999,8,,,, +US-GA-31001,US,GA,31001,8,,,, +US-GA-31002,US,GA,31002,8,,,, +US-GA-31003,US,GA,31003,7,,,, +US-GA-31004,US,GA,31004,7,,,, +US-GA-31005,US,GA,31005,7,,,, +US-GA-31006,US,GA,31006,8,,,, +US-GA-31007,US,GA,31007,8,,,, +US-GA-31008,US,GA,31008,7,,,, +US-GA-31009,US,GA,31009,8,,,, +US-GA-31010,US,GA,31010,8,,,, +US-GA-31011,US,GA,31011,8,,,, +US-GA-31012,US,GA,31012,8,,,, +US-GA-31013,US,GA,31013,7,,,, +US-GA-31014,US,GA,31014,8,,,, +US-GA-31015,US,GA,31015,8,,,, +US-GA-31016,US,GA,31016,7,,,, +US-GA-31017,US,GA,31017,7,,,, +US-GA-31018,US,GA,31018,8,,,, +US-GA-31019,US,GA,31019,8,,,, +US-GA-31020,US,GA,31020,7,,,, +US-GA-31021,US,GA,31021,8,,,, +US-GA-31022,US,GA,31022,8,,,, +US-GA-31023,US,GA,31023,8,,,, +US-GA-31024,US,GA,31024,7,,,, +US-GA-31025,US,GA,31025,7,,,, +US-GA-31026,US,GA,31026,7,,,, +US-GA-31027,US,GA,31027,8,,,, +US-GA-31028,US,GA,31028,7,,,, +US-GA-31029,US,GA,31029,7,,,, +US-GA-31030,US,GA,31030,7,,,, +US-GA-31031,US,GA,31031,7,,,, +US-GA-31032,US,GA,31032,7,,,, +US-GA-31033,US,GA,31033,7,,,, +US-GA-31034,US,GA,31034,7,,,, +US-GA-31035,US,GA,31035,8,,,, +US-GA-31036,US,GA,31036,7,,,, +US-GA-31037,US,GA,31037,8,,,, +US-GA-31038,US,GA,31038,7,,,, +US-GA-31039,US,GA,31039,8,,,, +US-GA-31040,US,GA,31040,8,,,, +US-GA-31041,US,GA,31041,8,,,, +US-GA-31042,US,GA,31042,7,,,, +US-GA-31044,US,GA,31044,7,,,, +US-GA-31045,US,GA,31045,8,,,, +US-GA-31046,US,GA,31046,7,,,, +US-GA-31047,US,GA,31047,7,,,, +US-GA-31049,US,GA,31049,8,,,, +US-GA-31050,US,GA,31050,7,,,, +US-GA-31051,US,GA,31051,8,,,, +US-GA-31052,US,GA,31052,7,,,, +US-GA-31054,US,GA,31054,7,,,, +US-GA-31055,US,GA,31055,8,,,, +US-GA-31057,US,GA,31057,8,,,, +US-GA-31058,US,GA,31058,8,,,, +US-GA-31059,US,GA,31059,7,,,, +US-GA-31060,US,GA,31060,8,,,, +US-GA-31061,US,GA,31061,7,,,, +US-GA-31062,US,GA,31062,7,,,, +US-GA-31063,US,GA,31063,8,,,, +US-GA-31064,US,GA,31064,7,,,, +US-GA-31065,US,GA,31065,8,,,, +US-GA-31066,US,GA,31066,7,,,, +US-GA-31067,US,GA,31067,8,,,, +US-GA-31068,US,GA,31068,8,,,, +US-GA-31069,US,GA,31069,7,,,, +US-GA-31070,US,GA,31070,8,,,, +US-GA-31071,US,GA,31071,8,,,, +US-GA-31072,US,GA,31072,8,,,, +US-GA-31075,US,GA,31075,8,,,, +US-GA-31076,US,GA,31076,8,,,, +US-GA-31077,US,GA,31077,8,,,, +US-GA-31078,US,GA,31078,7,,,, +US-GA-31079,US,GA,31079,8,,,, +US-GA-31081,US,GA,31081,8,,,, +US-GA-31082,US,GA,31082,8,,,, +US-GA-31083,US,GA,31083,8,,,, +US-GA-31084,US,GA,31084,8,,,, +US-GA-31085,US,GA,31085,7,,,, +US-GA-31086,US,GA,31086,7,,,, +US-GA-31087,US,GA,31087,8,,,, +US-GA-31088,US,GA,31088,7,,,, +US-GA-31089,US,GA,31089,8,,,, +US-GA-31090,US,GA,31090,7,,,, +US-GA-31091,US,GA,31091,8,,,, +US-GA-31092,US,GA,31092,8,,,, +US-GA-31093,US,GA,31093,7,,,, +US-GA-31094,US,GA,31094,8,,,, +US-GA-31095,US,GA,31095,7,,,, +US-GA-31096,US,GA,31096,8,,,, +US-GA-31097,US,GA,31097,7,,,, +US-GA-31098,US,GA,31098,7,,,, +US-GA-31099,US,GA,31099,7,,,, +US-GA-31106,US,GA,31106,7,,,, +US-GA-31107,US,GA,31107,7,,,, +US-GA-31119,US,GA,31119,7,,,, +US-GA-31126,US,GA,31126,7,,,, +US-GA-31131,US,GA,31131,7,,,, +US-GA-31136,US,GA,31136,7,,,, +US-GA-31139,US,GA,31139,7,,,, +US-GA-31141,US,GA,31141,7,,,, +US-GA-31144,US,GA,31144,6,,,, +US-GA-31145,US,GA,31145,7,,,, +US-GA-31146,US,GA,31146,7,,,, +US-GA-31150,US,GA,31150,7,,,, +US-GA-31156,US,GA,31156,7,,,, +US-GA-31169,US,GA,31169,6,,,, +US-GA-31192,US,GA,31192,7,,,, +US-GA-31193,US,GA,31193,7,,,, +US-GA-31195,US,GA,31195,7,,,, +US-GA-31196,US,GA,31196,7,,,, +US-GA-31201,US,GA,31201,7,,,, +US-GA-31202,US,GA,31202,7,,,, +US-GA-31203,US,GA,31203,7,,,, +US-GA-31204,US,GA,31204,7,,,, +US-GA-31205,US,GA,31205,7,,,, +US-GA-31206,US,GA,31206,7,,,, +US-GA-31207,US,GA,31207,7,,,, +US-GA-31208,US,GA,31208,7,,,, +US-GA-31209,US,GA,31209,7,,,, +US-GA-31210,US,GA,31210,7,,,, +US-GA-31211,US,GA,31211,7,,,, +US-GA-31213,US,GA,31213,7,,,, +US-GA-31216,US,GA,31216,7,,,, +US-GA-31217,US,GA,31217,7,,,, +US-GA-31220,US,GA,31220,7,,,, +US-GA-31221,US,GA,31221,7,,,, +US-GA-31294,US,GA,31294,7,,,, +US-GA-31295,US,GA,31295,7,,,, +US-GA-31296,US,GA,31296,7,,,, +US-GA-31297,US,GA,31297,7,,,, +US-GA-31301,US,GA,31301,7,,,, +US-GA-31302,US,GA,31302,7,,,, +US-GA-31303,US,GA,31303,7,,,, +US-GA-31304,US,GA,31304,7,,,, +US-GA-31305,US,GA,31305,7,,,, +US-GA-31307,US,GA,31307,7,,,, +US-GA-31308,US,GA,31308,7,,,, +US-GA-31309,US,GA,31309,7,,,, +US-GA-31310,US,GA,31310,7,,,, +US-GA-31312,US,GA,31312,7,,,, +US-GA-31313,US,GA,31313,7,,,, +US-GA-31314,US,GA,31314,7,,,, +US-GA-31315,US,GA,31315,7,,,, +US-GA-31316,US,GA,31316,7,,,, +US-GA-31318,US,GA,31318,7,,,, +US-GA-31319,US,GA,31319,7,,,, +US-GA-31320,US,GA,31320,7,,,, +US-GA-31321,US,GA,31321,7,,,, +US-GA-31322,US,GA,31322,7,,,, +US-GA-31323,US,GA,31323,7,,,, +US-GA-31324,US,GA,31324,7,,,, +US-GA-31326,US,GA,31326,7,,,, +US-GA-31327,US,GA,31327,7,,,, +US-GA-31328,US,GA,31328,7,,,, +US-GA-31329,US,GA,31329,7,,,, +US-GA-31331,US,GA,31331,7,,,, +US-GA-31333,US,GA,31333,7,,,, +US-GA-31401,US,GA,31401,7,,,, +US-GA-31402,US,GA,31402,7,,,, +US-GA-31403,US,GA,31403,7,,,, +US-GA-31404,US,GA,31404,7,,,, +US-GA-31405,US,GA,31405,7,,,, +US-GA-31406,US,GA,31406,7,,,, +US-GA-31407,US,GA,31407,7,,,, +US-GA-31408,US,GA,31408,7,,,, +US-GA-31409,US,GA,31409,7,,,, +US-GA-31410,US,GA,31410,7,,,, +US-GA-31411,US,GA,31411,7,,,, +US-GA-31412,US,GA,31412,7,,,, +US-GA-31414,US,GA,31414,7,,,, +US-GA-31415,US,GA,31415,7,,,, +US-GA-31416,US,GA,31416,7,,,, +US-GA-31418,US,GA,31418,7,,,, +US-GA-31419,US,GA,31419,7,,,, +US-GA-31420,US,GA,31420,7,,,, +US-GA-31421,US,GA,31421,7,,,, +US-GA-31501,US,GA,31501,7,,,, +US-GA-31502,US,GA,31502,7,,,, +US-GA-31503,US,GA,31503,7,,,, +US-GA-31510,US,GA,31510,7,,,, +US-GA-31512,US,GA,31512,7,,,, +US-GA-31513,US,GA,31513,8,,,, +US-GA-31515,US,GA,31515,8,,,, +US-GA-31516,US,GA,31516,6,,,, +US-GA-31518,US,GA,31518,8,,,, +US-GA-31519,US,GA,31519,7,,,, +US-GA-31520,US,GA,31520,6,,,, +US-GA-31521,US,GA,31521,6,,,, +US-GA-31522,US,GA,31522,6,,,, +US-GA-31523,US,GA,31523,6,,,, +US-GA-31524,US,GA,31524,6,,,, +US-GA-31525,US,GA,31525,6,,,, +US-GA-31527,US,GA,31527,6,,,, +US-GA-31532,US,GA,31532,8,,,, +US-GA-31533,US,GA,31533,7,,,, +US-GA-31534,US,GA,31534,7,,,, +US-GA-31535,US,GA,31535,7,,,, +US-GA-31537,US,GA,31537,7,,,, +US-GA-31539,US,GA,31539,8,,,, +US-GA-31542,US,GA,31542,7,,,, +US-GA-31543,US,GA,31543,7,,,, +US-GA-31544,US,GA,31544,8,,,, +US-GA-31545,US,GA,31545,8,,,, +US-GA-31546,US,GA,31546,8,,,, +US-GA-31547,US,GA,31547,7,,,, +US-GA-31548,US,GA,31548,7,,,, +US-GA-31549,US,GA,31549,8,,,, +US-GA-31550,US,GA,31550,7,,,, +US-GA-31551,US,GA,31551,6,,,, +US-GA-31552,US,GA,31552,7,,,, +US-GA-31553,US,GA,31553,7,,,, +US-GA-31554,US,GA,31554,7,,,, +US-GA-31555,US,GA,31555,8,,,, +US-GA-31556,US,GA,31556,6,,,, +US-GA-31557,US,GA,31557,6,,,, +US-GA-31558,US,GA,31558,7,,,, +US-GA-31560,US,GA,31560,8,,,, +US-GA-31561,US,GA,31561,6,,,, +US-GA-31562,US,GA,31562,7,,,, +US-GA-31563,US,GA,31563,8,,,, +US-GA-31564,US,GA,31564,7,,,, +US-GA-31565,US,GA,31565,7,,,, +US-GA-31566,US,GA,31566,7,,,, +US-GA-31567,US,GA,31567,7,,,, +US-GA-31568,US,GA,31568,7,,,, +US-GA-31569,US,GA,31569,7,,,, +US-GA-31598,US,GA,31598,8,,,, +US-GA-31599,US,GA,31599,8,,,, +US-GA-31601,US,GA,31601,7,,,, +US-GA-31602,US,GA,31602,7,,,, +US-GA-31603,US,GA,31603,7,,,, +US-GA-31604,US,GA,31604,7,,,, +US-GA-31605,US,GA,31605,7,,,, +US-GA-31606,US,GA,31606,7,,,, +US-GA-31620,US,GA,31620,7,,,, +US-GA-31622,US,GA,31622,7,,,, +US-GA-31623,US,GA,31623,7,,,, +US-GA-31624,US,GA,31624,7,,,, +US-GA-31625,US,GA,31625,7,,,, +US-GA-31626,US,GA,31626,7,,,, +US-GA-31627,US,GA,31627,7,,,, +US-GA-31629,US,GA,31629,7,,,, +US-GA-31630,US,GA,31630,7,,,, +US-GA-31631,US,GA,31631,7,,,, +US-GA-31632,US,GA,31632,7,,,, +US-GA-31634,US,GA,31634,7,,,, +US-GA-31635,US,GA,31635,7,,,, +US-GA-31636,US,GA,31636,7,,,, +US-GA-31637,US,GA,31637,7,,,, +US-GA-31638,US,GA,31638,7,,,, +US-GA-31639,US,GA,31639,7,,,, +US-GA-31641,US,GA,31641,7,,,, +US-GA-31642,US,GA,31642,7,,,, +US-GA-31643,US,GA,31643,7,,,, +US-GA-31645,US,GA,31645,7,,,, +US-GA-31647,US,GA,31647,7,,,, +US-GA-31648,US,GA,31648,7,,,, +US-GA-31649,US,GA,31649,7,,,, +US-GA-31650,US,GA,31650,7,,,, +US-GA-31698,US,GA,31698,7,,,, +US-GA-31699,US,GA,31699,7,,,, +US-GA-31701,US,GA,31701,7,,,, +US-GA-31702,US,GA,31702,7,,,, +US-GA-31703,US,GA,31703,7,,,, +US-GA-31704,US,GA,31704,7,,,, +US-GA-31705,US,GA,31705,7,,,, +US-GA-31706,US,GA,31706,7,,,, +US-GA-31707,US,GA,31707,7,,,, +US-GA-31708,US,GA,31708,7,,,, +US-GA-31709,US,GA,31709,8,,,, +US-GA-31711,US,GA,31711,8,,,, +US-GA-31712,US,GA,31712,8,,,, +US-GA-31714,US,GA,31714,7,,,, +US-GA-31716,US,GA,31716,7,,,, +US-GA-31719,US,GA,31719,8,,,, +US-GA-31720,US,GA,31720,7,,,, +US-GA-31721,US,GA,31721,7,,,, +US-GA-31722,US,GA,31722,7,,,, +US-GA-31727,US,GA,31727,7,,,, +US-GA-31730,US,GA,31730,7,,,, +US-GA-31733,US,GA,31733,7,,,, +US-GA-31735,US,GA,31735,8,,,, +US-GA-31738,US,GA,31738,7,,,, +US-GA-31739,US,GA,31739,7,,,, +US-GA-31743,US,GA,31743,8,,,, +US-GA-31744,US,GA,31744,7,,,, +US-GA-31747,US,GA,31747,7,,,, +US-GA-31749,US,GA,31749,7,,,, +US-GA-31750,US,GA,31750,7,,,, +US-GA-31753,US,GA,31753,7,,,, +US-GA-31756,US,GA,31756,7,,,, +US-GA-31757,US,GA,31757,7,,,, +US-GA-31758,US,GA,31758,7,,,, +US-GA-31760,US,GA,31760,7,,,, +US-GA-31763,US,GA,31763,7,,,, +US-GA-31764,US,GA,31764,8,,,, +US-GA-31765,US,GA,31765,7,,,, +US-GA-31768,US,GA,31768,7,,,, +US-GA-31769,US,GA,31769,7,,,, +US-GA-31771,US,GA,31771,7,,,, +US-GA-31772,US,GA,31772,7,,,, +US-GA-31773,US,GA,31773,7,,,, +US-GA-31774,US,GA,31774,7,,,, +US-GA-31775,US,GA,31775,7,,,, +US-GA-31776,US,GA,31776,7,,,, +US-GA-31778,US,GA,31778,7,,,, +US-GA-31779,US,GA,31779,7,,,, +US-GA-31780,US,GA,31780,8,,,, +US-GA-31781,US,GA,31781,7,,,, +US-GA-31782,US,GA,31782,7,,,, +US-GA-31783,US,GA,31783,7,,,, +US-GA-31784,US,GA,31784,7,,,, +US-GA-31787,US,GA,31787,7,,,, +US-GA-31788,US,GA,31788,7,,,, +US-GA-31789,US,GA,31789,7,,,, +US-GA-31790,US,GA,31790,7,,,, +US-GA-31791,US,GA,31791,7,,,, +US-GA-31792,US,GA,31792,7,,,, +US-GA-31793,US,GA,31793,7,,,, +US-GA-31794,US,GA,31794,7,,,, +US-GA-31795,US,GA,31795,7,,,, +US-GA-31796,US,GA,31796,7,,,, +US-GA-31798,US,GA,31798,7,,,, +US-GA-31799,US,GA,31799,7,,,, +US-GA-31801,US,GA,31801,8,,,, +US-GA-31803,US,GA,31803,8,,,, +US-GA-31804,US,GA,31804,8,,,, +US-GA-31805,US,GA,31805,8,,,, +US-GA-31806,US,GA,31806,8,,,, +US-GA-31807,US,GA,31807,8,,,, +US-GA-31808,US,GA,31808,8,,,, +US-GA-31810,US,GA,31810,8,,,, +US-GA-31811,US,GA,31811,8,,,, +US-GA-31812,US,GA,31812,8,,,, +US-GA-31814,US,GA,31814,8,,,, +US-GA-31815,US,GA,31815,8,,,, +US-GA-31816,US,GA,31816,7,,,, +US-GA-31820,US,GA,31820,8,,,, +US-GA-31821,US,GA,31821,8,,,, +US-GA-31822,US,GA,31822,8,,,, +US-GA-31823,US,GA,31823,8,,,, +US-GA-31824,US,GA,31824,8,,,, +US-GA-31825,US,GA,31825,8,,,, +US-GA-31826,US,GA,31826,8,,,, +US-GA-31827,US,GA,31827,8,,,, +US-GA-31829,US,GA,31829,8,,,, +US-GA-31830,US,GA,31830,7,,,, +US-GA-31831,US,GA,31831,8,,,, +US-GA-31832,US,GA,31832,8,,,, +US-GA-31833,US,GA,31833,7,,,, +US-GA-31836,US,GA,31836,8,,,, +US-GA-31901,US,GA,31901,8,,,, +US-GA-31902,US,GA,31902,8,,,, +US-GA-31903,US,GA,31903,8,,,, +US-GA-31904,US,GA,31904,8,,,, +US-GA-31905,US,GA,31905,8,,,, +US-GA-31906,US,GA,31906,8,,,, +US-GA-31907,US,GA,31907,8,,,, +US-GA-31908,US,GA,31908,8,,,, +US-GA-31909,US,GA,31909,8,,,, +US-GA-31914,US,GA,31914,8,,,, +US-GA-31917,US,GA,31917,8,,,, +US-GA-31993,US,GA,31993,8,,,, +US-GA-31995,US,GA,31995,8,,,, +US-GA-31997,US,GA,31997,8,,,, +US-GA-31998,US,GA,31998,8,,,, +US-GA-31999,US,GA,31999,8,,,, +US-GA-39813,US,GA,39813,7,,,, +US-GA-39815,US,GA,39815,7,,,, +US-GA-39817,US,GA,39817,7,,,, +US-GA-39818,US,GA,39818,7,,,, +US-GA-39819,US,GA,39819,7,,,, +US-GA-39823,US,GA,39823,7,,,, +US-GA-39824,US,GA,39824,8,,,, +US-GA-39825,US,GA,39825,7,,,, +US-GA-39826,US,GA,39826,7,,,, +US-GA-39827,US,GA,39827,7,,,, +US-GA-39828,US,GA,39828,7,,,, +US-GA-39829,US,GA,39829,7,,,, +US-GA-39832,US,GA,39832,7,,,, +US-GA-39834,US,GA,39834,7,,,, +US-GA-39836,US,GA,39836,8,,,, +US-GA-39837,US,GA,39837,7,,,, +US-GA-39840,US,GA,39840,8,,,, +US-GA-39841,US,GA,39841,7,,,, +US-GA-39842,US,GA,39842,7,,,, +US-GA-39845,US,GA,39845,7,,,, +US-GA-39846,US,GA,39846,7,,,, +US-GA-39851,US,GA,39851,8,,,, +US-GA-39852,US,GA,39852,7,,,, +US-GA-39854,US,GA,39854,8,,,, +US-GA-39859,US,GA,39859,7,,,, +US-GA-39861,US,GA,39861,7,,,, +US-GA-39862,US,GA,39862,7,,,, +US-GA-39866,US,GA,39866,7,,,, +US-GA-39867,US,GA,39867,8,,,, +US-GA-39870,US,GA,39870,7,,,, +US-GA-39877,US,GA,39877,7,,,, +US-GA-39885,US,GA,39885,7,,,, +US-GA-39886,US,GA,39886,8,,,, +US-GA-39897,US,GA,39897,7,,,, +US-GA-39901,US,GA,39901,7,,,, +US-HI-96701,US,HI,96701,4.5,,,, +US-HI-96703,US,HI,96703,4,,,, +US-HI-96704,US,HI,96704,4,,,, +US-HI-96705,US,HI,96705,4,,,, +US-HI-96706,US,HI,96706,4.5,,,, +US-HI-96707,US,HI,96707,4.5,,,, +US-HI-96708,US,HI,96708,4,,,, +US-HI-96709,US,HI,96709,4.5,,,, +US-HI-96710,US,HI,96710,4,,,, +US-HI-96712,US,HI,96712,4.5,,,, +US-HI-96713,US,HI,96713,4,,,, +US-HI-96714,US,HI,96714,4,,,, +US-HI-96715,US,HI,96715,4,,,, +US-HI-96716,US,HI,96716,4,,,, +US-HI-96717,US,HI,96717,4.5,,,, +US-HI-96718,US,HI,96718,4,,,, +US-HI-96719,US,HI,96719,4,,,, +US-HI-96720,US,HI,96720,4,,,, +US-HI-96721,US,HI,96721,4,,,, +US-HI-96722,US,HI,96722,4,,,, +US-HI-96725,US,HI,96725,4,,,, +US-HI-96726,US,HI,96726,4,,,, +US-HI-96727,US,HI,96727,4,,,, +US-HI-96728,US,HI,96728,4,,,, +US-HI-96729,US,HI,96729,4,,,, +US-HI-96730,US,HI,96730,4.5,,,, +US-HI-96731,US,HI,96731,4.5,,,, +US-HI-96732,US,HI,96732,4,,,, +US-HI-96733,US,HI,96733,4,,,, +US-HI-96734,US,HI,96734,4.5,,,, +US-HI-96737,US,HI,96737,4,,,, +US-HI-96738,US,HI,96738,4,,,, +US-HI-96739,US,HI,96739,4,,,, +US-HI-96740,US,HI,96740,4,,,, +US-HI-96741,US,HI,96741,4,,,, +US-HI-96743,US,HI,96743,4,,,, +US-HI-96744,US,HI,96744,4.5,,,, +US-HI-96745,US,HI,96745,4,,,, +US-HI-96746,US,HI,96746,4,,,, +US-HI-96747,US,HI,96747,4,,,, +US-HI-96748,US,HI,96748,4,,,, +US-HI-96749,US,HI,96749,4,,,, +US-HI-96750,US,HI,96750,4,,,, +US-HI-96751,US,HI,96751,4,,,, +US-HI-96752,US,HI,96752,4,,,, +US-HI-96753,US,HI,96753,4,,,, +US-HI-96754,US,HI,96754,4,,,, +US-HI-96755,US,HI,96755,4,,,, +US-HI-96756,US,HI,96756,4,,,, +US-HI-96757,US,HI,96757,4,,,, +US-HI-96759,US,HI,96759,4.5,,,, +US-HI-96760,US,HI,96760,4,,,, +US-HI-96761,US,HI,96761,4,,,, +US-HI-96762,US,HI,96762,4.5,,,, +US-HI-96763,US,HI,96763,4,,,, +US-HI-96764,US,HI,96764,4,,,, +US-HI-96765,US,HI,96765,4,,,, +US-HI-96766,US,HI,96766,4,,,, +US-HI-96767,US,HI,96767,4,,,, +US-HI-96768,US,HI,96768,4,,,, +US-HI-96769,US,HI,96769,4,,,, +US-HI-96770,US,HI,96770,4,,,, +US-HI-96771,US,HI,96771,4,,,, +US-HI-96772,US,HI,96772,4,,,, +US-HI-96773,US,HI,96773,4,,,, +US-HI-96774,US,HI,96774,4,,,, +US-HI-96776,US,HI,96776,4,,,, +US-HI-96777,US,HI,96777,4,,,, +US-HI-96778,US,HI,96778,4,,,, +US-HI-96779,US,HI,96779,4,,,, +US-HI-96780,US,HI,96780,4,,,, +US-HI-96781,US,HI,96781,4,,,, +US-HI-96782,US,HI,96782,4.5,,,, +US-HI-96783,US,HI,96783,4,,,, +US-HI-96784,US,HI,96784,4,,,, +US-HI-96785,US,HI,96785,4,,,, +US-HI-96786,US,HI,96786,4.5,,,, +US-HI-96788,US,HI,96788,4,,,, +US-HI-96789,US,HI,96789,4.5,,,, +US-HI-96790,US,HI,96790,4,,,, +US-HI-96791,US,HI,96791,4.5,,,, +US-HI-96792,US,HI,96792,4.5,,,, +US-HI-96793,US,HI,96793,4,,,, +US-HI-96795,US,HI,96795,4.5,,,, +US-HI-96796,US,HI,96796,4,,,, +US-HI-96797,US,HI,96797,4.5,,,, +US-HI-96801,US,HI,96801,4.5,,,, +US-HI-96802,US,HI,96802,4.5,,,, +US-HI-96803,US,HI,96803,4.5,,,, +US-HI-96804,US,HI,96804,4.5,,,, +US-HI-96805,US,HI,96805,4.5,,,, +US-HI-96806,US,HI,96806,4.5,,,, +US-HI-96807,US,HI,96807,4.5,,,, +US-HI-96808,US,HI,96808,4.5,,,, +US-HI-96809,US,HI,96809,4.5,,,, +US-HI-96810,US,HI,96810,4.5,,,, +US-HI-96811,US,HI,96811,4.5,,,, +US-HI-96812,US,HI,96812,4.5,,,, +US-HI-96813,US,HI,96813,4.5,,,, +US-HI-96814,US,HI,96814,4.5,,,, +US-HI-96815,US,HI,96815,4.5,,,, +US-HI-96816,US,HI,96816,4.5,,,, +US-HI-96817,US,HI,96817,4.5,,,, +US-HI-96818,US,HI,96818,4.5,,,, +US-HI-96819,US,HI,96819,4.5,,,, +US-HI-96820,US,HI,96820,4.5,,,, +US-HI-96821,US,HI,96821,4.5,,,, +US-HI-96822,US,HI,96822,4.5,,,, +US-HI-96823,US,HI,96823,4.5,,,, +US-HI-96824,US,HI,96824,4.5,,,, +US-HI-96825,US,HI,96825,4.5,,,, +US-HI-96826,US,HI,96826,4.5,,,, +US-HI-96828,US,HI,96828,4.5,,,, +US-HI-96830,US,HI,96830,4.5,,,, +US-HI-96836,US,HI,96836,4.5,,,, +US-HI-96837,US,HI,96837,4.5,,,, +US-HI-96838,US,HI,96838,4.5,,,, +US-HI-96839,US,HI,96839,4.5,,,, +US-HI-96840,US,HI,96840,4.5,,,, +US-HI-96841,US,HI,96841,4.5,,,, +US-HI-96843,US,HI,96843,4.5,,,, +US-HI-96844,US,HI,96844,4.5,,,, +US-HI-96846,US,HI,96846,4.5,,,, +US-HI-96847,US,HI,96847,4.5,,,, +US-HI-96848,US,HI,96848,4.5,,,, +US-HI-96849,US,HI,96849,4.5,,,, +US-HI-96850,US,HI,96850,4.5,,,, +US-HI-96853,US,HI,96853,4.5,,,, +US-HI-96854,US,HI,96854,4.5,,,, +US-HI-96857,US,HI,96857,4.5,,,, +US-HI-96858,US,HI,96858,4.5,,,, +US-HI-96859,US,HI,96859,4.5,,,, +US-HI-96860,US,HI,96860,4.5,,,, +US-HI-96861,US,HI,96861,4.5,,,, +US-HI-96863,US,HI,96863,4.5,,,, +US-HI-96898,US,HI,96898,4.5,,,, +US-IA-50001,US,IA,50001,6,,,, +US-IA-50002,US,IA,50002,7,,,, +US-IA-50003,US,IA,50003,6,,,, +US-IA-50005,US,IA,50005,7,,,, +US-IA-50006,US,IA,50006,7,,,, +US-IA-50007,US,IA,50007,6,,,, +US-IA-50008,US,IA,50008,7,,,, +US-IA-50009,US,IA,50009,6,,,, +US-IA-50010,US,IA,50010,7,,,, +US-IA-50011,US,IA,50011,7,,,, +US-IA-50012,US,IA,50012,7,,,, +US-IA-50013,US,IA,50013,7,,,, +US-IA-50014,US,IA,50014,7,,,, +US-IA-50020,US,IA,50020,7,,,, +US-IA-50021,US,IA,50021,6,,,, +US-IA-50022,US,IA,50022,7,,,, +US-IA-50023,US,IA,50023,6,,,, +US-IA-50025,US,IA,50025,7,,,, +US-IA-50026,US,IA,50026,7,,,, +US-IA-50027,US,IA,50027,7,,,, +US-IA-50028,US,IA,50028,7,,,, +US-IA-50029,US,IA,50029,7,,,, +US-IA-50031,US,IA,50031,7,,,, +US-IA-50032,US,IA,50032,6,,,, +US-IA-50033,US,IA,50033,7,,,, +US-IA-50034,US,IA,50034,7,,,, +US-IA-50035,US,IA,50035,6,,,, +US-IA-50036,US,IA,50036,7,,,, +US-IA-50037,US,IA,50037,7,,,, +US-IA-50038,US,IA,50038,6,,,, +US-IA-50039,US,IA,50039,6,,,, +US-IA-50040,US,IA,50040,7,,,, +US-IA-50041,US,IA,50041,7,,,, +US-IA-50042,US,IA,50042,7,,,, +US-IA-50044,US,IA,50044,7,,,, +US-IA-50046,US,IA,50046,7,,,, +US-IA-50047,US,IA,50047,6,,,, +US-IA-50048,US,IA,50048,7,,,, +US-IA-50049,US,IA,50049,7,,,, +US-IA-50050,US,IA,50050,7,,,, +US-IA-50051,US,IA,50051,7,,,, +US-IA-50052,US,IA,50052,7,,,, +US-IA-50054,US,IA,50054,7,,,, +US-IA-50055,US,IA,50055,7,,,, +US-IA-50056,US,IA,50056,7,,,, +US-IA-50057,US,IA,50057,7,,,, +US-IA-50058,US,IA,50058,7,,,, +US-IA-50059,US,IA,50059,7,,,, +US-IA-50060,US,IA,50060,7,,,, +US-IA-50061,US,IA,50061,6,,,, +US-IA-50062,US,IA,50062,7,,,, +US-IA-50063,US,IA,50063,6,,,, +US-IA-50064,US,IA,50064,7,,,, +US-IA-50065,US,IA,50065,7,,,, +US-IA-50066,US,IA,50066,6,,,, +US-IA-50067,US,IA,50067,7,,,, +US-IA-50068,US,IA,50068,7,,,, +US-IA-50069,US,IA,50069,6,,,, +US-IA-50070,US,IA,50070,6,,,, +US-IA-50071,US,IA,50071,7,,,, +US-IA-50072,US,IA,50072,7,,,, +US-IA-50073,US,IA,50073,6,,,, +US-IA-50074,US,IA,50074,7,,,, +US-IA-50075,US,IA,50075,7,,,, +US-IA-50076,US,IA,50076,7,,,, +US-IA-50078,US,IA,50078,7,,,, +US-IA-50099,US,IA,50099,7,,,, +US-IA-50101,US,IA,50101,7,,,, +US-IA-50102,US,IA,50102,7,,,, +US-IA-50103,US,IA,50103,7,,,, +US-IA-50104,US,IA,50104,6,,,, +US-IA-50105,US,IA,50105,7,,,, +US-IA-50106,US,IA,50106,7,,,, +US-IA-50107,US,IA,50107,7,,,, +US-IA-50108,US,IA,50108,7,,,, +US-IA-50109,US,IA,50109,6,,,, +US-IA-50110,US,IA,50110,7,,,, +US-IA-50111,US,IA,50111,6,,,, +US-IA-50112,US,IA,50112,7,,,, +US-IA-50115,US,IA,50115,7,,,, +US-IA-50116,US,IA,50116,7,,,, +US-IA-50117,US,IA,50117,7,,,, +US-IA-50118,US,IA,50118,6,,,, +US-IA-50119,US,IA,50119,7,,,, +US-IA-50120,US,IA,50120,7,,,, +US-IA-50122,US,IA,50122,7,,,, +US-IA-50123,US,IA,50123,7,,,, +US-IA-50124,US,IA,50124,7,,,, +US-IA-50125,US,IA,50125,6,,,, +US-IA-50126,US,IA,50126,7,,,, +US-IA-50127,US,IA,50127,7,,,, +US-IA-50128,US,IA,50128,7,,,, +US-IA-50129,US,IA,50129,7,,,, +US-IA-50130,US,IA,50130,7,,,, +US-IA-50131,US,IA,50131,6,,,, +US-IA-50132,US,IA,50132,7,,,, +US-IA-50133,US,IA,50133,7,,,, +US-IA-50134,US,IA,50134,7,,,, +US-IA-50135,US,IA,50135,7,,,, +US-IA-50136,US,IA,50136,6,,,, +US-IA-50137,US,IA,50137,7,,,, +US-IA-50138,US,IA,50138,7,,,, +US-IA-50139,US,IA,50139,6,,,, +US-IA-50140,US,IA,50140,7,,,, +US-IA-50141,US,IA,50141,7,,,, +US-IA-50142,US,IA,50142,7,,,, +US-IA-50143,US,IA,50143,7,,,, +US-IA-50144,US,IA,50144,7,,,, +US-IA-50145,US,IA,50145,6,,,, +US-IA-50146,US,IA,50146,6,,,, +US-IA-50147,US,IA,50147,7,,,, +US-IA-50148,US,IA,50148,7,,,, +US-IA-50149,US,IA,50149,7,,,, +US-IA-50150,US,IA,50150,7,,,, +US-IA-50151,US,IA,50151,7,,,, +US-IA-50152,US,IA,50152,7,,,, +US-IA-50153,US,IA,50153,7,,,, +US-IA-50154,US,IA,50154,7,,,, +US-IA-50155,US,IA,50155,7,,,, +US-IA-50156,US,IA,50156,7,,,, +US-IA-50157,US,IA,50157,7,,,, +US-IA-50158,US,IA,50158,7,,,, +US-IA-50160,US,IA,50160,6,,,, +US-IA-50161,US,IA,50161,7,,,, +US-IA-50162,US,IA,50162,7,,,, +US-IA-50163,US,IA,50163,7,,,, +US-IA-50164,US,IA,50164,7,,,, +US-IA-50165,US,IA,50165,7,,,, +US-IA-50166,US,IA,50166,6,,,, +US-IA-50167,US,IA,50167,6,,,, +US-IA-50168,US,IA,50168,7,,,, +US-IA-50169,US,IA,50169,6,,,, +US-IA-50170,US,IA,50170,7,,,, +US-IA-50171,US,IA,50171,7,,,, +US-IA-50173,US,IA,50173,7,,,, +US-IA-50174,US,IA,50174,7,,,, +US-IA-50201,US,IA,50201,7,,,, +US-IA-50206,US,IA,50206,7,,,, +US-IA-50207,US,IA,50207,7,,,, +US-IA-50208,US,IA,50208,7,,,, +US-IA-50210,US,IA,50210,6,,,, +US-IA-50211,US,IA,50211,6,,,, +US-IA-50212,US,IA,50212,7,,,, +US-IA-50213,US,IA,50213,7,,,, +US-IA-50214,US,IA,50214,7,,,, +US-IA-50216,US,IA,50216,7,,,, +US-IA-50217,US,IA,50217,7,,,, +US-IA-50218,US,IA,50218,7,,,, +US-IA-50219,US,IA,50219,7,,,, +US-IA-50220,US,IA,50220,7,,,, +US-IA-50222,US,IA,50222,7,,,, +US-IA-50223,US,IA,50223,7,,,, +US-IA-50225,US,IA,50225,7,,,, +US-IA-50226,US,IA,50226,7,,,, +US-IA-50227,US,IA,50227,7,,,, +US-IA-50228,US,IA,50228,7,,,, +US-IA-50229,US,IA,50229,6,,,, +US-IA-50230,US,IA,50230,7,,,, +US-IA-50231,US,IA,50231,7,,,, +US-IA-50232,US,IA,50232,7,,,, +US-IA-50233,US,IA,50233,6,,,, +US-IA-50234,US,IA,50234,7,,,, +US-IA-50235,US,IA,50235,7,,,, +US-IA-50236,US,IA,50236,7,,,, +US-IA-50237,US,IA,50237,6,,,, +US-IA-50238,US,IA,50238,7,,,, +US-IA-50239,US,IA,50239,7,,,, +US-IA-50240,US,IA,50240,7,,,, +US-IA-50241,US,IA,50241,6,,,, +US-IA-50242,US,IA,50242,7,,,, +US-IA-50243,US,IA,50243,7,,,, +US-IA-50244,US,IA,50244,7,,,, +US-IA-50246,US,IA,50246,7,,,, +US-IA-50247,US,IA,50247,7,,,, +US-IA-50248,US,IA,50248,7,,,, +US-IA-50249,US,IA,50249,7,,,, +US-IA-50250,US,IA,50250,7,,,, +US-IA-50251,US,IA,50251,7,,,, +US-IA-50252,US,IA,50252,6,,,, +US-IA-50254,US,IA,50254,7,,,, +US-IA-50255,US,IA,50255,7,,,, +US-IA-50256,US,IA,50256,7,,,, +US-IA-50257,US,IA,50257,7,,,, +US-IA-50258,US,IA,50258,7,,,, +US-IA-50259,US,IA,50259,7,,,, +US-IA-50261,US,IA,50261,6,,,, +US-IA-50262,US,IA,50262,7,,,, +US-IA-50263,US,IA,50263,6,,,, +US-IA-50264,US,IA,50264,7,,,, +US-IA-50265,US,IA,50265,6,,,, +US-IA-50266,US,IA,50266,6,,,, +US-IA-50268,US,IA,50268,7,,,, +US-IA-50269,US,IA,50269,7,,,, +US-IA-50271,US,IA,50271,7,,,, +US-IA-50272,US,IA,50272,7,,,, +US-IA-50273,US,IA,50273,7,,,, +US-IA-50274,US,IA,50274,7,,,, +US-IA-50275,US,IA,50275,6,,,, +US-IA-50276,US,IA,50276,6,,,, +US-IA-50277,US,IA,50277,7,,,, +US-IA-50278,US,IA,50278,7,,,, +US-IA-50301,US,IA,50301,6,,,, +US-IA-50302,US,IA,50302,6,,,, +US-IA-50303,US,IA,50303,6,,,, +US-IA-50304,US,IA,50304,6,,,, +US-IA-50305,US,IA,50305,6,,,, +US-IA-50306,US,IA,50306,6,,,, +US-IA-50307,US,IA,50307,6,,,, +US-IA-50308,US,IA,50308,6,,,, +US-IA-50309,US,IA,50309,6,,,, +US-IA-50310,US,IA,50310,6,,,, +US-IA-50311,US,IA,50311,6,,,, +US-IA-50312,US,IA,50312,6,,,, +US-IA-50313,US,IA,50313,6,,,, +US-IA-50314,US,IA,50314,6,,,, +US-IA-50315,US,IA,50315,6,,,, +US-IA-50316,US,IA,50316,6,,,, +US-IA-50317,US,IA,50317,6,,,, +US-IA-50318,US,IA,50318,6,,,, +US-IA-50319,US,IA,50319,6,,,, +US-IA-50320,US,IA,50320,6,,,, +US-IA-50321,US,IA,50321,6,,,, +US-IA-50322,US,IA,50322,6,,,, +US-IA-50323,US,IA,50323,6,,,, +US-IA-50324,US,IA,50324,6,,,, +US-IA-50325,US,IA,50325,6,,,, +US-IA-50327,US,IA,50327,6,,,, +US-IA-50328,US,IA,50328,6,,,, +US-IA-50329,US,IA,50329,6,,,, +US-IA-50330,US,IA,50330,6,,,, +US-IA-50331,US,IA,50331,6,,,, +US-IA-50332,US,IA,50332,6,,,, +US-IA-50333,US,IA,50333,6,,,, +US-IA-50334,US,IA,50334,6,,,, +US-IA-50335,US,IA,50335,6,,,, +US-IA-50336,US,IA,50336,6,,,, +US-IA-50339,US,IA,50339,6,,,, +US-IA-50340,US,IA,50340,6,,,, +US-IA-50359,US,IA,50359,6,,,, +US-IA-50360,US,IA,50360,6,,,, +US-IA-50361,US,IA,50361,6,,,, +US-IA-50362,US,IA,50362,6,,,, +US-IA-50363,US,IA,50363,6,,,, +US-IA-50364,US,IA,50364,6,,,, +US-IA-50367,US,IA,50367,6,,,, +US-IA-50368,US,IA,50368,6,,,, +US-IA-50369,US,IA,50369,6,,,, +US-IA-50380,US,IA,50380,6,,,, +US-IA-50381,US,IA,50381,6,,,, +US-IA-50391,US,IA,50391,6,,,, +US-IA-50392,US,IA,50392,6,,,, +US-IA-50393,US,IA,50393,6,,,, +US-IA-50394,US,IA,50394,6,,,, +US-IA-50395,US,IA,50395,6,,,, +US-IA-50396,US,IA,50396,6,,,, +US-IA-50398,US,IA,50398,6,,,, +US-IA-50401,US,IA,50401,7,,,, +US-IA-50402,US,IA,50402,7,,,, +US-IA-50420,US,IA,50420,7,,,, +US-IA-50421,US,IA,50421,7,,,, +US-IA-50423,US,IA,50423,7,,,, +US-IA-50424,US,IA,50424,7,,,, +US-IA-50426,US,IA,50426,7,,,, +US-IA-50427,US,IA,50427,7,,,, +US-IA-50428,US,IA,50428,7,,,, +US-IA-50430,US,IA,50430,7,,,, +US-IA-50431,US,IA,50431,7,,,, +US-IA-50432,US,IA,50432,7,,,, +US-IA-50433,US,IA,50433,7,,,, +US-IA-50434,US,IA,50434,7,,,, +US-IA-50435,US,IA,50435,7,,,, +US-IA-50436,US,IA,50436,7,,,, +US-IA-50438,US,IA,50438,7,,,, +US-IA-50439,US,IA,50439,7,,,, +US-IA-50440,US,IA,50440,7,,,, +US-IA-50441,US,IA,50441,7,,,, +US-IA-50444,US,IA,50444,7,,,, +US-IA-50446,US,IA,50446,7,,,, +US-IA-50447,US,IA,50447,7,,,, +US-IA-50448,US,IA,50448,7,,,, +US-IA-50449,US,IA,50449,7,,,, +US-IA-50450,US,IA,50450,7,,,, +US-IA-50451,US,IA,50451,7,,,, +US-IA-50452,US,IA,50452,7,,,, +US-IA-50453,US,IA,50453,7,,,, +US-IA-50454,US,IA,50454,7,,,, +US-IA-50455,US,IA,50455,7,,,, +US-IA-50456,US,IA,50456,7,,,, +US-IA-50457,US,IA,50457,7,,,, +US-IA-50458,US,IA,50458,7,,,, +US-IA-50459,US,IA,50459,7,,,, +US-IA-50460,US,IA,50460,7,,,, +US-IA-50461,US,IA,50461,7,,,, +US-IA-50464,US,IA,50464,7,,,, +US-IA-50465,US,IA,50465,7,,,, +US-IA-50466,US,IA,50466,7,,,, +US-IA-50467,US,IA,50467,7,,,, +US-IA-50468,US,IA,50468,7,,,, +US-IA-50469,US,IA,50469,7,,,, +US-IA-50470,US,IA,50470,7,,,, +US-IA-50471,US,IA,50471,7,,,, +US-IA-50472,US,IA,50472,7,,,, +US-IA-50473,US,IA,50473,7,,,, +US-IA-50475,US,IA,50475,7,,,, +US-IA-50476,US,IA,50476,7,,,, +US-IA-50477,US,IA,50477,7,,,, +US-IA-50478,US,IA,50478,7,,,, +US-IA-50479,US,IA,50479,7,,,, +US-IA-50480,US,IA,50480,7,,,, +US-IA-50481,US,IA,50481,7,,,, +US-IA-50482,US,IA,50482,7,,,, +US-IA-50483,US,IA,50483,7,,,, +US-IA-50484,US,IA,50484,7,,,, +US-IA-50501,US,IA,50501,7,,,, +US-IA-50510,US,IA,50510,7,,,, +US-IA-50511,US,IA,50511,7,,,, +US-IA-50514,US,IA,50514,7,,,, +US-IA-50515,US,IA,50515,7,,,, +US-IA-50516,US,IA,50516,7,,,, +US-IA-50517,US,IA,50517,7,,,, +US-IA-50518,US,IA,50518,7,,,, +US-IA-50519,US,IA,50519,7,,,, +US-IA-50520,US,IA,50520,7,,,, +US-IA-50521,US,IA,50521,7,,,, +US-IA-50522,US,IA,50522,7,,,, +US-IA-50523,US,IA,50523,7,,,, +US-IA-50524,US,IA,50524,7,,,, +US-IA-50525,US,IA,50525,7,,,, +US-IA-50526,US,IA,50526,7,,,, +US-IA-50527,US,IA,50527,7,,,, +US-IA-50528,US,IA,50528,7,,,, +US-IA-50529,US,IA,50529,7,,,, +US-IA-50530,US,IA,50530,7,,,, +US-IA-50531,US,IA,50531,7,,,, +US-IA-50532,US,IA,50532,7,,,, +US-IA-50533,US,IA,50533,7,,,, +US-IA-50535,US,IA,50535,7,,,, +US-IA-50536,US,IA,50536,7,,,, +US-IA-50538,US,IA,50538,7,,,, +US-IA-50539,US,IA,50539,7,,,, +US-IA-50540,US,IA,50540,7,,,, +US-IA-50541,US,IA,50541,7,,,, +US-IA-50542,US,IA,50542,7,,,, +US-IA-50543,US,IA,50543,7,,,, +US-IA-50544,US,IA,50544,7,,,, +US-IA-50545,US,IA,50545,7,,,, +US-IA-50546,US,IA,50546,7,,,, +US-IA-50548,US,IA,50548,7,,,, +US-IA-50551,US,IA,50551,7,,,, +US-IA-50552,US,IA,50552,7,,,, +US-IA-50554,US,IA,50554,7,,,, +US-IA-50556,US,IA,50556,7,,,, +US-IA-50557,US,IA,50557,7,,,, +US-IA-50558,US,IA,50558,7,,,, +US-IA-50559,US,IA,50559,7,,,, +US-IA-50560,US,IA,50560,7,,,, +US-IA-50561,US,IA,50561,7,,,, +US-IA-50562,US,IA,50562,7,,,, +US-IA-50563,US,IA,50563,7,,,, +US-IA-50565,US,IA,50565,7,,,, +US-IA-50566,US,IA,50566,7,,,, +US-IA-50567,US,IA,50567,7,,,, +US-IA-50568,US,IA,50568,7,,,, +US-IA-50569,US,IA,50569,7,,,, +US-IA-50570,US,IA,50570,7,,,, +US-IA-50571,US,IA,50571,7,,,, +US-IA-50573,US,IA,50573,7,,,, +US-IA-50574,US,IA,50574,7,,,, +US-IA-50575,US,IA,50575,7,,,, +US-IA-50576,US,IA,50576,7,,,, +US-IA-50577,US,IA,50577,7,,,, +US-IA-50578,US,IA,50578,7,,,, +US-IA-50579,US,IA,50579,7,,,, +US-IA-50581,US,IA,50581,7,,,, +US-IA-50582,US,IA,50582,7,,,, +US-IA-50583,US,IA,50583,7,,,, +US-IA-50585,US,IA,50585,7,,,, +US-IA-50586,US,IA,50586,7,,,, +US-IA-50588,US,IA,50588,7,,,, +US-IA-50590,US,IA,50590,7,,,, +US-IA-50591,US,IA,50591,7,,,, +US-IA-50592,US,IA,50592,7,,,, +US-IA-50593,US,IA,50593,7,,,, +US-IA-50594,US,IA,50594,7,,,, +US-IA-50595,US,IA,50595,7,,,, +US-IA-50597,US,IA,50597,7,,,, +US-IA-50598,US,IA,50598,7,,,, +US-IA-50599,US,IA,50599,7,,,, +US-IA-50601,US,IA,50601,7,,,, +US-IA-50602,US,IA,50602,7,,,, +US-IA-50603,US,IA,50603,7,,,, +US-IA-50604,US,IA,50604,7,,,, +US-IA-50605,US,IA,50605,7,,,, +US-IA-50606,US,IA,50606,7,,,, +US-IA-50607,US,IA,50607,7,,,, +US-IA-50608,US,IA,50608,7,,,, +US-IA-50609,US,IA,50609,7,,,, +US-IA-50611,US,IA,50611,7,,,, +US-IA-50612,US,IA,50612,7,,,, +US-IA-50613,US,IA,50613,7,,,, +US-IA-50614,US,IA,50614,7,,,, +US-IA-50616,US,IA,50616,7,,,, +US-IA-50619,US,IA,50619,7,,,, +US-IA-50620,US,IA,50620,7,,,, +US-IA-50621,US,IA,50621,7,,,, +US-IA-50622,US,IA,50622,7,,,, +US-IA-50623,US,IA,50623,7,,,, +US-IA-50624,US,IA,50624,7,,,, +US-IA-50625,US,IA,50625,7,,,, +US-IA-50626,US,IA,50626,7,,,, +US-IA-50627,US,IA,50627,7,,,, +US-IA-50628,US,IA,50628,7,,,, +US-IA-50629,US,IA,50629,7,,,, +US-IA-50630,US,IA,50630,7,,,, +US-IA-50631,US,IA,50631,7,,,, +US-IA-50632,US,IA,50632,7,,,, +US-IA-50633,US,IA,50633,7,,,, +US-IA-50634,US,IA,50634,7,,,, +US-IA-50635,US,IA,50635,7,,,, +US-IA-50636,US,IA,50636,7,,,, +US-IA-50638,US,IA,50638,7,,,, +US-IA-50641,US,IA,50641,7,,,, +US-IA-50642,US,IA,50642,7,,,, +US-IA-50643,US,IA,50643,7,,,, +US-IA-50644,US,IA,50644,7,,,, +US-IA-50645,US,IA,50645,7,,,, +US-IA-50647,US,IA,50647,7,,,, +US-IA-50648,US,IA,50648,7,,,, +US-IA-50649,US,IA,50649,7,,,, +US-IA-50650,US,IA,50650,7,,,, +US-IA-50651,US,IA,50651,7,,,, +US-IA-50652,US,IA,50652,7,,,, +US-IA-50653,US,IA,50653,7,,,, +US-IA-50654,US,IA,50654,7,,,, +US-IA-50655,US,IA,50655,7,,,, +US-IA-50657,US,IA,50657,7,,,, +US-IA-50658,US,IA,50658,7,,,, +US-IA-50659,US,IA,50659,7,,,, +US-IA-50660,US,IA,50660,7,,,, +US-IA-50661,US,IA,50661,7,,,, +US-IA-50662,US,IA,50662,7,,,, +US-IA-50664,US,IA,50664,7,,,, +US-IA-50665,US,IA,50665,7,,,, +US-IA-50666,US,IA,50666,7,,,, +US-IA-50667,US,IA,50667,7,,,, +US-IA-50668,US,IA,50668,7,,,, +US-IA-50669,US,IA,50669,6,,,, +US-IA-50670,US,IA,50670,7,,,, +US-IA-50671,US,IA,50671,7,,,, +US-IA-50672,US,IA,50672,7,,,, +US-IA-50673,US,IA,50673,7,,,, +US-IA-50674,US,IA,50674,7,,,, +US-IA-50675,US,IA,50675,7,,,, +US-IA-50676,US,IA,50676,7,,,, +US-IA-50677,US,IA,50677,7,,,, +US-IA-50680,US,IA,50680,7,,,, +US-IA-50681,US,IA,50681,7,,,, +US-IA-50682,US,IA,50682,7,,,, +US-IA-50701,US,IA,50701,7,,,, +US-IA-50702,US,IA,50702,7,,,, +US-IA-50703,US,IA,50703,7,,,, +US-IA-50704,US,IA,50704,7,,,, +US-IA-50707,US,IA,50707,7,,,, +US-IA-50801,US,IA,50801,7,,,, +US-IA-50830,US,IA,50830,7,,,, +US-IA-50831,US,IA,50831,7,,,, +US-IA-50833,US,IA,50833,7,,,, +US-IA-50835,US,IA,50835,7,,,, +US-IA-50836,US,IA,50836,7,,,, +US-IA-50837,US,IA,50837,7,,,, +US-IA-50839,US,IA,50839,7,,,, +US-IA-50840,US,IA,50840,7,,,, +US-IA-50841,US,IA,50841,7,,,, +US-IA-50842,US,IA,50842,7,,,, +US-IA-50843,US,IA,50843,7,,,, +US-IA-50845,US,IA,50845,7,,,, +US-IA-50846,US,IA,50846,7,,,, +US-IA-50847,US,IA,50847,7,,,, +US-IA-50848,US,IA,50848,7,,,, +US-IA-50849,US,IA,50849,7,,,, +US-IA-50851,US,IA,50851,7,,,, +US-IA-50853,US,IA,50853,7,,,, +US-IA-50854,US,IA,50854,7,,,, +US-IA-50857,US,IA,50857,7,,,, +US-IA-50858,US,IA,50858,7,,,, +US-IA-50859,US,IA,50859,7,,,, +US-IA-50860,US,IA,50860,7,,,, +US-IA-50861,US,IA,50861,7,,,, +US-IA-50862,US,IA,50862,7,,,, +US-IA-50863,US,IA,50863,7,,,, +US-IA-50864,US,IA,50864,7,,,, +US-IA-50936,US,IA,50936,6,,,, +US-IA-50940,US,IA,50940,6,,,, +US-IA-50947,US,IA,50947,6,,,, +US-IA-50950,US,IA,50950,6,,,, +US-IA-50980,US,IA,50980,6,,,, +US-IA-50981,US,IA,50981,6,,,, +US-IA-50982,US,IA,50982,6,,,, +US-IA-50983,US,IA,50983,6,,,, +US-IA-51001,US,IA,51001,7,,,, +US-IA-51002,US,IA,51002,7,,,, +US-IA-51003,US,IA,51003,7,,,, +US-IA-51004,US,IA,51004,7,,,, +US-IA-51005,US,IA,51005,7,,,, +US-IA-51006,US,IA,51006,7,,,, +US-IA-51007,US,IA,51007,7,,,, +US-IA-51008,US,IA,51008,7,,,, +US-IA-51009,US,IA,51009,7,,,, +US-IA-51010,US,IA,51010,7,,,, +US-IA-51011,US,IA,51011,7,,,, +US-IA-51012,US,IA,51012,7,,,, +US-IA-51014,US,IA,51014,7,,,, +US-IA-51015,US,IA,51015,7,,,, +US-IA-51016,US,IA,51016,7,,,, +US-IA-51018,US,IA,51018,7,,,, +US-IA-51019,US,IA,51019,7,,,, +US-IA-51020,US,IA,51020,7,,,, +US-IA-51022,US,IA,51022,7,,,, +US-IA-51023,US,IA,51023,7,,,, +US-IA-51024,US,IA,51024,7,,,, +US-IA-51025,US,IA,51025,7,,,, +US-IA-51026,US,IA,51026,7,,,, +US-IA-51027,US,IA,51027,7,,,, +US-IA-51028,US,IA,51028,7,,,, +US-IA-51029,US,IA,51029,7,,,, +US-IA-51030,US,IA,51030,7,,,, +US-IA-51031,US,IA,51031,7,,,, +US-IA-51033,US,IA,51033,7,,,, +US-IA-51034,US,IA,51034,7,,,, +US-IA-51035,US,IA,51035,7,,,, +US-IA-51036,US,IA,51036,7,,,, +US-IA-51037,US,IA,51037,7,,,, +US-IA-51038,US,IA,51038,7,,,, +US-IA-51039,US,IA,51039,7,,,, +US-IA-51040,US,IA,51040,7,,,, +US-IA-51041,US,IA,51041,7,,,, +US-IA-51044,US,IA,51044,7,,,, +US-IA-51045,US,IA,51045,7,,,, +US-IA-51046,US,IA,51046,7,,,, +US-IA-51047,US,IA,51047,7,,,, +US-IA-51048,US,IA,51048,7,,,, +US-IA-51049,US,IA,51049,7,,,, +US-IA-51050,US,IA,51050,7,,,, +US-IA-51051,US,IA,51051,7,,,, +US-IA-51052,US,IA,51052,7,,,, +US-IA-51053,US,IA,51053,7,,,, +US-IA-51054,US,IA,51054,7,,,, +US-IA-51055,US,IA,51055,7,,,, +US-IA-51056,US,IA,51056,7,,,, +US-IA-51058,US,IA,51058,7,,,, +US-IA-51060,US,IA,51060,7,,,, +US-IA-51061,US,IA,51061,7,,,, +US-IA-51062,US,IA,51062,7,,,, +US-IA-51063,US,IA,51063,7,,,, +US-IA-51101,US,IA,51101,7,,,, +US-IA-51102,US,IA,51102,7,,,, +US-IA-51103,US,IA,51103,7,,,, +US-IA-51104,US,IA,51104,7,,,, +US-IA-51105,US,IA,51105,7,,,, +US-IA-51106,US,IA,51106,7,,,, +US-IA-51108,US,IA,51108,7,,,, +US-IA-51109,US,IA,51109,7,,,, +US-IA-51111,US,IA,51111,7,,,, +US-IA-51201,US,IA,51201,7,,,, +US-IA-51230,US,IA,51230,7,,,, +US-IA-51231,US,IA,51231,7,,,, +US-IA-51232,US,IA,51232,6,,,, +US-IA-51234,US,IA,51234,7,,,, +US-IA-51235,US,IA,51235,7,,,, +US-IA-51237,US,IA,51237,7,,,, +US-IA-51238,US,IA,51238,7,,,, +US-IA-51239,US,IA,51239,7,,,, +US-IA-51240,US,IA,51240,7,,,, +US-IA-51241,US,IA,51241,7,,,, +US-IA-51242,US,IA,51242,7,,,, +US-IA-51243,US,IA,51243,7,,,, +US-IA-51244,US,IA,51244,7,,,, +US-IA-51245,US,IA,51245,7,,,, +US-IA-51246,US,IA,51246,7,,,, +US-IA-51247,US,IA,51247,7,,,, +US-IA-51248,US,IA,51248,7,,,, +US-IA-51249,US,IA,51249,7,,,, +US-IA-51250,US,IA,51250,7,,,, +US-IA-51301,US,IA,51301,7,,,, +US-IA-51331,US,IA,51331,7,,,, +US-IA-51333,US,IA,51333,7,,,, +US-IA-51334,US,IA,51334,7,,,, +US-IA-51338,US,IA,51338,7,,,, +US-IA-51340,US,IA,51340,7,,,, +US-IA-51341,US,IA,51341,7,,,, +US-IA-51342,US,IA,51342,7,,,, +US-IA-51343,US,IA,51343,7,,,, +US-IA-51345,US,IA,51345,6,,,, +US-IA-51346,US,IA,51346,7,,,, +US-IA-51347,US,IA,51347,7,,,, +US-IA-51350,US,IA,51350,6,,,, +US-IA-51351,US,IA,51351,7,,,, +US-IA-51354,US,IA,51354,6,,,, +US-IA-51355,US,IA,51355,7,,,, +US-IA-51357,US,IA,51357,7,,,, +US-IA-51358,US,IA,51358,7,,,, +US-IA-51360,US,IA,51360,7,,,, +US-IA-51363,US,IA,51363,7,,,, +US-IA-51364,US,IA,51364,7,,,, +US-IA-51365,US,IA,51365,7,,,, +US-IA-51366,US,IA,51366,7,,,, +US-IA-51401,US,IA,51401,7,,,, +US-IA-51430,US,IA,51430,7,,,, +US-IA-51431,US,IA,51431,7,,,, +US-IA-51432,US,IA,51432,7,,,, +US-IA-51433,US,IA,51433,7,,,, +US-IA-51436,US,IA,51436,7,,,, +US-IA-51439,US,IA,51439,7,,,, +US-IA-51440,US,IA,51440,7,,,, +US-IA-51441,US,IA,51441,7,,,, +US-IA-51442,US,IA,51442,7,,,, +US-IA-51443,US,IA,51443,7,,,, +US-IA-51444,US,IA,51444,7,,,, +US-IA-51445,US,IA,51445,7,,,, +US-IA-51446,US,IA,51446,7,,,, +US-IA-51447,US,IA,51447,7,,,, +US-IA-51448,US,IA,51448,7,,,, +US-IA-51449,US,IA,51449,7,,,, +US-IA-51450,US,IA,51450,7,,,, +US-IA-51451,US,IA,51451,7,,,, +US-IA-51452,US,IA,51452,7,,,, +US-IA-51453,US,IA,51453,7,,,, +US-IA-51454,US,IA,51454,7,,,, +US-IA-51455,US,IA,51455,7,,,, +US-IA-51458,US,IA,51458,7,,,, +US-IA-51459,US,IA,51459,7,,,, +US-IA-51460,US,IA,51460,7,,,, +US-IA-51461,US,IA,51461,7,,,, +US-IA-51462,US,IA,51462,7,,,, +US-IA-51463,US,IA,51463,7,,,, +US-IA-51465,US,IA,51465,7,,,, +US-IA-51466,US,IA,51466,7,,,, +US-IA-51467,US,IA,51467,7,,,, +US-IA-51501,US,IA,51501,7,,,, +US-IA-51502,US,IA,51502,7,,,, +US-IA-51503,US,IA,51503,7,,,, +US-IA-51510,US,IA,51510,7,,,, +US-IA-51520,US,IA,51520,7,,,, +US-IA-51521,US,IA,51521,7,,,, +US-IA-51523,US,IA,51523,7,,,, +US-IA-51525,US,IA,51525,7,,,, +US-IA-51526,US,IA,51526,7,,,, +US-IA-51527,US,IA,51527,7,,,, +US-IA-51528,US,IA,51528,7,,,, +US-IA-51529,US,IA,51529,7,,,, +US-IA-51530,US,IA,51530,7,,,, +US-IA-51531,US,IA,51531,7,,,, +US-IA-51532,US,IA,51532,7,,,, +US-IA-51533,US,IA,51533,7,,,, +US-IA-51534,US,IA,51534,7,,,, +US-IA-51535,US,IA,51535,7,,,, +US-IA-51536,US,IA,51536,7,,,, +US-IA-51537,US,IA,51537,7,,,, +US-IA-51540,US,IA,51540,7,,,, +US-IA-51541,US,IA,51541,7,,,, +US-IA-51542,US,IA,51542,7,,,, +US-IA-51543,US,IA,51543,7,,,, +US-IA-51544,US,IA,51544,7,,,, +US-IA-51545,US,IA,51545,7,,,, +US-IA-51546,US,IA,51546,7,,,, +US-IA-51548,US,IA,51548,7,,,, +US-IA-51549,US,IA,51549,7,,,, +US-IA-51550,US,IA,51550,7,,,, +US-IA-51551,US,IA,51551,7,,,, +US-IA-51552,US,IA,51552,7,,,, +US-IA-51553,US,IA,51553,7,,,, +US-IA-51554,US,IA,51554,7,,,, +US-IA-51555,US,IA,51555,7,,,, +US-IA-51556,US,IA,51556,7,,,, +US-IA-51557,US,IA,51557,7,,,, +US-IA-51558,US,IA,51558,7,,,, +US-IA-51559,US,IA,51559,7,,,, +US-IA-51560,US,IA,51560,7,,,, +US-IA-51561,US,IA,51561,7,,,, +US-IA-51562,US,IA,51562,7,,,, +US-IA-51563,US,IA,51563,7,,,, +US-IA-51564,US,IA,51564,7,,,, +US-IA-51565,US,IA,51565,7,,,, +US-IA-51566,US,IA,51566,7,,,, +US-IA-51570,US,IA,51570,7,,,, +US-IA-51571,US,IA,51571,7,,,, +US-IA-51572,US,IA,51572,7,,,, +US-IA-51573,US,IA,51573,7,,,, +US-IA-51575,US,IA,51575,7,,,, +US-IA-51576,US,IA,51576,7,,,, +US-IA-51577,US,IA,51577,7,,,, +US-IA-51578,US,IA,51578,7,,,, +US-IA-51579,US,IA,51579,7,,,, +US-IA-51591,US,IA,51591,7,,,, +US-IA-51593,US,IA,51593,7,,,, +US-IA-51601,US,IA,51601,7,,,, +US-IA-51603,US,IA,51603,7,,,, +US-IA-51630,US,IA,51630,7,,,, +US-IA-51631,US,IA,51631,7,,,, +US-IA-51632,US,IA,51632,7,,,, +US-IA-51636,US,IA,51636,7,,,, +US-IA-51637,US,IA,51637,7,,,, +US-IA-51638,US,IA,51638,7,,,, +US-IA-51639,US,IA,51639,7,,,, +US-IA-51640,US,IA,51640,7,,,, +US-IA-51645,US,IA,51645,7,,,, +US-IA-51646,US,IA,51646,7,,,, +US-IA-51647,US,IA,51647,7,,,, +US-IA-51648,US,IA,51648,7,,,, +US-IA-51649,US,IA,51649,7,,,, +US-IA-51650,US,IA,51650,7,,,, +US-IA-51651,US,IA,51651,7,,,, +US-IA-51652,US,IA,51652,7,,,, +US-IA-51653,US,IA,51653,7,,,, +US-IA-51654,US,IA,51654,7,,,, +US-IA-51656,US,IA,51656,7,,,, +US-IA-52001,US,IA,52001,7,,,, +US-IA-52002,US,IA,52002,7,,,, +US-IA-52003,US,IA,52003,7,,,, +US-IA-52004,US,IA,52004,7,,,, +US-IA-52030,US,IA,52030,7,,,, +US-IA-52031,US,IA,52031,7,,,, +US-IA-52032,US,IA,52032,7,,,, +US-IA-52033,US,IA,52033,7,,,, +US-IA-52035,US,IA,52035,7,,,, +US-IA-52036,US,IA,52036,7,,,, +US-IA-52037,US,IA,52037,7,,,, +US-IA-52038,US,IA,52038,7,,,, +US-IA-52039,US,IA,52039,7,,,, +US-IA-52040,US,IA,52040,7,,,, +US-IA-52041,US,IA,52041,7,,,, +US-IA-52042,US,IA,52042,7,,,, +US-IA-52043,US,IA,52043,7,,,, +US-IA-52044,US,IA,52044,7,,,, +US-IA-52045,US,IA,52045,7,,,, +US-IA-52046,US,IA,52046,7,,,, +US-IA-52047,US,IA,52047,7,,,, +US-IA-52048,US,IA,52048,7,,,, +US-IA-52049,US,IA,52049,7,,,, +US-IA-52050,US,IA,52050,7,,,, +US-IA-52052,US,IA,52052,7,,,, +US-IA-52053,US,IA,52053,7,,,, +US-IA-52054,US,IA,52054,7,,,, +US-IA-52056,US,IA,52056,7,,,, +US-IA-52057,US,IA,52057,7,,,, +US-IA-52060,US,IA,52060,7,,,, +US-IA-52064,US,IA,52064,7,,,, +US-IA-52065,US,IA,52065,7,,,, +US-IA-52066,US,IA,52066,7,,,, +US-IA-52068,US,IA,52068,7,,,, +US-IA-52069,US,IA,52069,7,,,, +US-IA-52070,US,IA,52070,7,,,, +US-IA-52071,US,IA,52071,7,,,, +US-IA-52072,US,IA,52072,7,,,, +US-IA-52073,US,IA,52073,7,,,, +US-IA-52074,US,IA,52074,7,,,, +US-IA-52075,US,IA,52075,7,,,, +US-IA-52076,US,IA,52076,7,,,, +US-IA-52077,US,IA,52077,7,,,, +US-IA-52078,US,IA,52078,7,,,, +US-IA-52079,US,IA,52079,7,,,, +US-IA-52099,US,IA,52099,7,,,, +US-IA-52101,US,IA,52101,7,,,, +US-IA-52132,US,IA,52132,7,,,, +US-IA-52133,US,IA,52133,7,,,, +US-IA-52134,US,IA,52134,7,,,, +US-IA-52135,US,IA,52135,7,,,, +US-IA-52136,US,IA,52136,7,,,, +US-IA-52140,US,IA,52140,7,,,, +US-IA-52141,US,IA,52141,7,,,, +US-IA-52142,US,IA,52142,7,,,, +US-IA-52144,US,IA,52144,7,,,, +US-IA-52146,US,IA,52146,7,,,, +US-IA-52147,US,IA,52147,7,,,, +US-IA-52149,US,IA,52149,7,,,, +US-IA-52151,US,IA,52151,7,,,, +US-IA-52154,US,IA,52154,7,,,, +US-IA-52155,US,IA,52155,7,,,, +US-IA-52156,US,IA,52156,7,,,, +US-IA-52157,US,IA,52157,7,,,, +US-IA-52158,US,IA,52158,7,,,, +US-IA-52159,US,IA,52159,7,,,, +US-IA-52160,US,IA,52160,7,,,, +US-IA-52161,US,IA,52161,7,,,, +US-IA-52162,US,IA,52162,7,,,, +US-IA-52163,US,IA,52163,7,,,, +US-IA-52164,US,IA,52164,7,,,, +US-IA-52165,US,IA,52165,7,,,, +US-IA-52166,US,IA,52166,7,,,, +US-IA-52168,US,IA,52168,7,,,, +US-IA-52169,US,IA,52169,7,,,, +US-IA-52170,US,IA,52170,7,,,, +US-IA-52171,US,IA,52171,7,,,, +US-IA-52172,US,IA,52172,7,,,, +US-IA-52175,US,IA,52175,7,,,, +US-IA-52201,US,IA,52201,7,,,, +US-IA-52202,US,IA,52202,7,,,, +US-IA-52203,US,IA,52203,7,,,, +US-IA-52204,US,IA,52204,7,,,, +US-IA-52205,US,IA,52205,7,,,, +US-IA-52206,US,IA,52206,7,,,, +US-IA-52207,US,IA,52207,7,,,, +US-IA-52208,US,IA,52208,7,,,, +US-IA-52209,US,IA,52209,7,,,, +US-IA-52210,US,IA,52210,7,,,, +US-IA-52211,US,IA,52211,7,,,, +US-IA-52212,US,IA,52212,7,,,, +US-IA-52213,US,IA,52213,7,,,, +US-IA-52214,US,IA,52214,7,,,, +US-IA-52215,US,IA,52215,7,,,, +US-IA-52216,US,IA,52216,7,,,, +US-IA-52217,US,IA,52217,7,,,, +US-IA-52218,US,IA,52218,7,,,, +US-IA-52219,US,IA,52219,7,,,, +US-IA-52220,US,IA,52220,7,,,, +US-IA-52221,US,IA,52221,7,,,, +US-IA-52222,US,IA,52222,7,,,, +US-IA-52223,US,IA,52223,7,,,, +US-IA-52224,US,IA,52224,7,,,, +US-IA-52225,US,IA,52225,7,,,, +US-IA-52227,US,IA,52227,7,,,, +US-IA-52228,US,IA,52228,7,,,, +US-IA-52229,US,IA,52229,7,,,, +US-IA-52231,US,IA,52231,6,,,, +US-IA-52232,US,IA,52232,7,,,, +US-IA-52233,US,IA,52233,7,,,, +US-IA-52235,US,IA,52235,6,,,, +US-IA-52236,US,IA,52236,7,,,, +US-IA-52237,US,IA,52237,7,,,, +US-IA-52240,US,IA,52240,6,,,, +US-IA-52241,US,IA,52241,6,,,, +US-IA-52242,US,IA,52242,6,,,, +US-IA-52243,US,IA,52243,6,,,, +US-IA-52244,US,IA,52244,6,,,, +US-IA-52245,US,IA,52245,6,,,, +US-IA-52246,US,IA,52246,6,,,, +US-IA-52247,US,IA,52247,7,,,, +US-IA-52248,US,IA,52248,7,,,, +US-IA-52249,US,IA,52249,7,,,, +US-IA-52251,US,IA,52251,7,,,, +US-IA-52252,US,IA,52252,7,,,, +US-IA-52253,US,IA,52253,7,,,, +US-IA-52254,US,IA,52254,7,,,, +US-IA-52255,US,IA,52255,7,,,, +US-IA-52257,US,IA,52257,7,,,, +US-IA-52301,US,IA,52301,7,,,, +US-IA-52302,US,IA,52302,7,,,, +US-IA-52305,US,IA,52305,7,,,, +US-IA-52306,US,IA,52306,7,,,, +US-IA-52307,US,IA,52307,7,,,, +US-IA-52308,US,IA,52308,7,,,, +US-IA-52309,US,IA,52309,7,,,, +US-IA-52310,US,IA,52310,7,,,, +US-IA-52312,US,IA,52312,7,,,, +US-IA-52313,US,IA,52313,7,,,, +US-IA-52314,US,IA,52314,7,,,, +US-IA-52315,US,IA,52315,7,,,, +US-IA-52316,US,IA,52316,7,,,, +US-IA-52317,US,IA,52317,6,,,, +US-IA-52318,US,IA,52318,7,,,, +US-IA-52320,US,IA,52320,7,,,, +US-IA-52321,US,IA,52321,7,,,, +US-IA-52322,US,IA,52322,6,,,, +US-IA-52323,US,IA,52323,7,,,, +US-IA-52324,US,IA,52324,7,,,, +US-IA-52325,US,IA,52325,7,,,, +US-IA-52326,US,IA,52326,7,,,, +US-IA-52327,US,IA,52327,7,,,, +US-IA-52328,US,IA,52328,7,,,, +US-IA-52329,US,IA,52329,7,,,, +US-IA-52330,US,IA,52330,7,,,, +US-IA-52332,US,IA,52332,7,,,, +US-IA-52333,US,IA,52333,6,,,, +US-IA-52334,US,IA,52334,7,,,, +US-IA-52335,US,IA,52335,6,,,, +US-IA-52336,US,IA,52336,7,,,, +US-IA-52337,US,IA,52337,7,,,, +US-IA-52338,US,IA,52338,6,,,, +US-IA-52339,US,IA,52339,7,,,, +US-IA-52340,US,IA,52340,6,,,, +US-IA-52341,US,IA,52341,7,,,, +US-IA-52342,US,IA,52342,7,,,, +US-IA-52344,US,IA,52344,7,,,, +US-IA-52345,US,IA,52345,7,,,, +US-IA-52346,US,IA,52346,7,,,, +US-IA-52347,US,IA,52347,7,,,, +US-IA-52348,US,IA,52348,7,,,, +US-IA-52349,US,IA,52349,7,,,, +US-IA-52351,US,IA,52351,6,,,, +US-IA-52352,US,IA,52352,7,,,, +US-IA-52353,US,IA,52353,7,,,, +US-IA-52354,US,IA,52354,7,,,, +US-IA-52355,US,IA,52355,6,,,, +US-IA-52356,US,IA,52356,7,,,, +US-IA-52358,US,IA,52358,7,,,, +US-IA-52359,US,IA,52359,7,,,, +US-IA-52361,US,IA,52361,7,,,, +US-IA-52362,US,IA,52362,7,,,, +US-IA-52401,US,IA,52401,7,,,, +US-IA-52402,US,IA,52402,7,,,, +US-IA-52403,US,IA,52403,7,,,, +US-IA-52404,US,IA,52404,7,,,, +US-IA-52405,US,IA,52405,7,,,, +US-IA-52406,US,IA,52406,7,,,, +US-IA-52407,US,IA,52407,7,,,, +US-IA-52408,US,IA,52408,7,,,, +US-IA-52409,US,IA,52409,7,,,, +US-IA-52410,US,IA,52410,7,,,, +US-IA-52411,US,IA,52411,7,,,, +US-IA-52497,US,IA,52497,7,,,, +US-IA-52498,US,IA,52498,7,,,, +US-IA-52499,US,IA,52499,7,,,, +US-IA-52501,US,IA,52501,7,,,, +US-IA-52530,US,IA,52530,7,,,, +US-IA-52531,US,IA,52531,7,,,, +US-IA-52533,US,IA,52533,7,,,, +US-IA-52534,US,IA,52534,7,,,, +US-IA-52535,US,IA,52535,6,,,, +US-IA-52536,US,IA,52536,7,,,, +US-IA-52537,US,IA,52537,7,,,, +US-IA-52540,US,IA,52540,7,,,, +US-IA-52542,US,IA,52542,6,,,, +US-IA-52543,US,IA,52543,7,,,, +US-IA-52544,US,IA,52544,7,,,, +US-IA-52548,US,IA,52548,7,,,, +US-IA-52549,US,IA,52549,7,,,, +US-IA-52550,US,IA,52550,6,,,, +US-IA-52551,US,IA,52551,6,,,, +US-IA-52552,US,IA,52552,7,,,, +US-IA-52553,US,IA,52553,7,,,, +US-IA-52554,US,IA,52554,7,,,, +US-IA-52555,US,IA,52555,7,,,, +US-IA-52556,US,IA,52556,7,,,, +US-IA-52557,US,IA,52557,7,,,, +US-IA-52560,US,IA,52560,7,,,, +US-IA-52561,US,IA,52561,7,,,, +US-IA-52562,US,IA,52562,7,,,, +US-IA-52563,US,IA,52563,7,,,, +US-IA-52565,US,IA,52565,6,,,, +US-IA-52566,US,IA,52566,7,,,, +US-IA-52567,US,IA,52567,7,,,, +US-IA-52568,US,IA,52568,7,,,, +US-IA-52569,US,IA,52569,7,,,, +US-IA-52570,US,IA,52570,6,,,, +US-IA-52571,US,IA,52571,7,,,, +US-IA-52572,US,IA,52572,7,,,, +US-IA-52573,US,IA,52573,6,,,, +US-IA-52574,US,IA,52574,7,,,, +US-IA-52576,US,IA,52576,6,,,, +US-IA-52577,US,IA,52577,7,,,, +US-IA-52580,US,IA,52580,7,,,, +US-IA-52581,US,IA,52581,7,,,, +US-IA-52583,US,IA,52583,7,,,, +US-IA-52584,US,IA,52584,7,,,, +US-IA-52585,US,IA,52585,6,,,, +US-IA-52586,US,IA,52586,7,,,, +US-IA-52588,US,IA,52588,6,,,, +US-IA-52590,US,IA,52590,7,,,, +US-IA-52591,US,IA,52591,7,,,, +US-IA-52593,US,IA,52593,7,,,, +US-IA-52594,US,IA,52594,7,,,, +US-IA-52595,US,IA,52595,7,,,, +US-IA-52601,US,IA,52601,7,,,, +US-IA-52619,US,IA,52619,7,,,, +US-IA-52620,US,IA,52620,6,,,, +US-IA-52621,US,IA,52621,7,,,, +US-IA-52623,US,IA,52623,7,,,, +US-IA-52624,US,IA,52624,7,,,, +US-IA-52625,US,IA,52625,7,,,, +US-IA-52626,US,IA,52626,6,,,, +US-IA-52627,US,IA,52627,7,,,, +US-IA-52630,US,IA,52630,7,,,, +US-IA-52631,US,IA,52631,7,,,, +US-IA-52632,US,IA,52632,7,,,, +US-IA-52635,US,IA,52635,7,,,, +US-IA-52637,US,IA,52637,7,,,, +US-IA-52638,US,IA,52638,7,,,, +US-IA-52639,US,IA,52639,7,,,, +US-IA-52640,US,IA,52640,7,,,, +US-IA-52641,US,IA,52641,7,,,, +US-IA-52642,US,IA,52642,7,,,, +US-IA-52644,US,IA,52644,7,,,, +US-IA-52645,US,IA,52645,7,,,, +US-IA-52646,US,IA,52646,7,,,, +US-IA-52647,US,IA,52647,7,,,, +US-IA-52648,US,IA,52648,7,,,, +US-IA-52649,US,IA,52649,7,,,, +US-IA-52650,US,IA,52650,7,,,, +US-IA-52651,US,IA,52651,6,,,, +US-IA-52652,US,IA,52652,7,,,, +US-IA-52653,US,IA,52653,7,,,, +US-IA-52654,US,IA,52654,7,,,, +US-IA-52655,US,IA,52655,7,,,, +US-IA-52656,US,IA,52656,7,,,, +US-IA-52657,US,IA,52657,7,,,, +US-IA-52658,US,IA,52658,7,,,, +US-IA-52659,US,IA,52659,7,,,, +US-IA-52660,US,IA,52660,7,,,, +US-IA-52701,US,IA,52701,7,,,, +US-IA-52720,US,IA,52720,7,,,, +US-IA-52721,US,IA,52721,7,,,, +US-IA-52722,US,IA,52722,7,,,, +US-IA-52726,US,IA,52726,7,,,, +US-IA-52727,US,IA,52727,7,,,, +US-IA-52728,US,IA,52728,7,,,, +US-IA-52729,US,IA,52729,7,,,, +US-IA-52730,US,IA,52730,7,,,, +US-IA-52731,US,IA,52731,7,,,, +US-IA-52732,US,IA,52732,7,,,, +US-IA-52733,US,IA,52733,7,,,, +US-IA-52734,US,IA,52734,7,,,, +US-IA-52736,US,IA,52736,7,,,, +US-IA-52737,US,IA,52737,7,,,, +US-IA-52738,US,IA,52738,7,,,, +US-IA-52739,US,IA,52739,7,,,, +US-IA-52742,US,IA,52742,7,,,, +US-IA-52745,US,IA,52745,7,,,, +US-IA-52746,US,IA,52746,7,,,, +US-IA-52747,US,IA,52747,7,,,, +US-IA-52748,US,IA,52748,7,,,, +US-IA-52749,US,IA,52749,7,,,, +US-IA-52750,US,IA,52750,7,,,, +US-IA-52751,US,IA,52751,7,,,, +US-IA-52752,US,IA,52752,7,,,, +US-IA-52753,US,IA,52753,7,,,, +US-IA-52754,US,IA,52754,7,,,, +US-IA-52755,US,IA,52755,6,,,, +US-IA-52756,US,IA,52756,7,,,, +US-IA-52757,US,IA,52757,7,,,, +US-IA-52758,US,IA,52758,7,,,, +US-IA-52759,US,IA,52759,7,,,, +US-IA-52760,US,IA,52760,7,,,, +US-IA-52761,US,IA,52761,7,,,, +US-IA-52765,US,IA,52765,7,,,, +US-IA-52766,US,IA,52766,7,,,, +US-IA-52767,US,IA,52767,7,,,, +US-IA-52768,US,IA,52768,7,,,, +US-IA-52769,US,IA,52769,7,,,, +US-IA-52771,US,IA,52771,7,,,, +US-IA-52772,US,IA,52772,7,,,, +US-IA-52773,US,IA,52773,7,,,, +US-IA-52774,US,IA,52774,7,,,, +US-IA-52776,US,IA,52776,7,,,, +US-IA-52777,US,IA,52777,7,,,, +US-IA-52778,US,IA,52778,7,,,, +US-IA-52801,US,IA,52801,7,,,, +US-IA-52802,US,IA,52802,7,,,, +US-IA-52803,US,IA,52803,7,,,, +US-IA-52804,US,IA,52804,7,,,, +US-IA-52805,US,IA,52805,7,,,, +US-IA-52806,US,IA,52806,7,,,, +US-IA-52807,US,IA,52807,7,,,, +US-IA-52808,US,IA,52808,7,,,, +US-IA-52809,US,IA,52809,7,,,, +US-ID-83201,US,ID,83201,6,,,, +US-ID-83202,US,ID,83202,6,,,, +US-ID-83203,US,ID,83203,6,,,, +US-ID-83204,US,ID,83204,6,,,, +US-ID-83205,US,ID,83205,6,,,, +US-ID-83206,US,ID,83206,6,,,, +US-ID-83209,US,ID,83209,6,,,, +US-ID-83210,US,ID,83210,6,,,, +US-ID-83211,US,ID,83211,6,,,, +US-ID-83212,US,ID,83212,6,,,, +US-ID-83213,US,ID,83213,6,,,, +US-ID-83214,US,ID,83214,6,,,, +US-ID-83215,US,ID,83215,6,,,, +US-ID-83217,US,ID,83217,6,,,, +US-ID-83218,US,ID,83218,6,,,, +US-ID-83220,US,ID,83220,6,,,, +US-ID-83221,US,ID,83221,6,,,, +US-ID-83223,US,ID,83223,6,,,, +US-ID-83226,US,ID,83226,6,,,, +US-ID-83227,US,ID,83227,6,,,, +US-ID-83228,US,ID,83228,6,,,, +US-ID-83232,US,ID,83232,6,,,, +US-ID-83233,US,ID,83233,6,,,, +US-ID-83234,US,ID,83234,6,,,, +US-ID-83235,US,ID,83235,6,,,, +US-ID-83236,US,ID,83236,6,,,, +US-ID-83237,US,ID,83237,6,,,, +US-ID-83238,US,ID,83238,6,,,, +US-ID-83239,US,ID,83239,6,,,, +US-ID-83241,US,ID,83241,6,,,, +US-ID-83243,US,ID,83243,6,,,, +US-ID-83244,US,ID,83244,6,,,, +US-ID-83245,US,ID,83245,6,,,, +US-ID-83246,US,ID,83246,6,,,, +US-ID-83250,US,ID,83250,6,,,, +US-ID-83251,US,ID,83251,6,,,, +US-ID-83252,US,ID,83252,6,,,, +US-ID-83253,US,ID,83253,6,,,, +US-ID-83254,US,ID,83254,6,,,, +US-ID-83255,US,ID,83255,6,,,, +US-ID-83256,US,ID,83256,6,,,, +US-ID-83261,US,ID,83261,6,,,, +US-ID-83262,US,ID,83262,6,,,, +US-ID-83263,US,ID,83263,6,,,, +US-ID-83271,US,ID,83271,6,,,, +US-ID-83272,US,ID,83272,6,,,, +US-ID-83274,US,ID,83274,6,,,, +US-ID-83276,US,ID,83276,6,,,, +US-ID-83277,US,ID,83277,6,,,, +US-ID-83278,US,ID,83278,8.5,,,, +US-ID-83281,US,ID,83281,6,,,, +US-ID-83283,US,ID,83283,6,,,, +US-ID-83285,US,ID,83285,6,,,, +US-ID-83286,US,ID,83286,6,,,, +US-ID-83287,US,ID,83287,6,,,, +US-ID-83301,US,ID,83301,6,,,, +US-ID-83302,US,ID,83302,6,,,, +US-ID-83303,US,ID,83303,6,,,, +US-ID-83311,US,ID,83311,6,,,, +US-ID-83312,US,ID,83312,6,,,, +US-ID-83313,US,ID,83313,6,,,, +US-ID-83314,US,ID,83314,6,,,, +US-ID-83316,US,ID,83316,6,,,, +US-ID-83318,US,ID,83318,6,,,, +US-ID-83320,US,ID,83320,6,,,, +US-ID-83321,US,ID,83321,6,,,, +US-ID-83322,US,ID,83322,6,,,, +US-ID-83323,US,ID,83323,6,,,, +US-ID-83324,US,ID,83324,6,,,, +US-ID-83325,US,ID,83325,6,,,, +US-ID-83327,US,ID,83327,6,,,, +US-ID-83328,US,ID,83328,6,,,, +US-ID-83330,US,ID,83330,6,,,, +US-ID-83332,US,ID,83332,6,,,, +US-ID-83333,US,ID,83333,6,,,, +US-ID-83334,US,ID,83334,6,,,, +US-ID-83335,US,ID,83335,6,,,, +US-ID-83336,US,ID,83336,6,,,, +US-ID-83337,US,ID,83337,6,,,, +US-ID-83338,US,ID,83338,6,,,, +US-ID-83340,US,ID,83340,7,,,, +US-ID-83341,US,ID,83341,6,,,, +US-ID-83342,US,ID,83342,6,,,, +US-ID-83343,US,ID,83343,6,,,, +US-ID-83344,US,ID,83344,6,,,, +US-ID-83346,US,ID,83346,6,,,, +US-ID-83347,US,ID,83347,6,,,, +US-ID-83348,US,ID,83348,6,,,, +US-ID-83349,US,ID,83349,6,,,, +US-ID-83350,US,ID,83350,6,,,, +US-ID-83352,US,ID,83352,6,,,, +US-ID-83353,US,ID,83353,8,,,, +US-ID-83354,US,ID,83354,8,,,, +US-ID-83355,US,ID,83355,6,,,, +US-ID-83401,US,ID,83401,6,,,, +US-ID-83402,US,ID,83402,6,,,, +US-ID-83403,US,ID,83403,6,,,, +US-ID-83404,US,ID,83404,6,,,, +US-ID-83405,US,ID,83405,6,,,, +US-ID-83406,US,ID,83406,6,,,, +US-ID-83415,US,ID,83415,6,,,, +US-ID-83420,US,ID,83420,6,,,, +US-ID-83421,US,ID,83421,6,,,, +US-ID-83422,US,ID,83422,6,,,, +US-ID-83423,US,ID,83423,6,,,, +US-ID-83424,US,ID,83424,6,,,, +US-ID-83425,US,ID,83425,6,,,, +US-ID-83427,US,ID,83427,6,,,, +US-ID-83428,US,ID,83428,6,,,, +US-ID-83429,US,ID,83429,6,,,, +US-ID-83431,US,ID,83431,6,,,, +US-ID-83433,US,ID,83433,6,,,, +US-ID-83434,US,ID,83434,6,,,, +US-ID-83435,US,ID,83435,6,,,, +US-ID-83436,US,ID,83436,6,,,, +US-ID-83438,US,ID,83438,6,,,, +US-ID-83440,US,ID,83440,6,,,, +US-ID-83441,US,ID,83441,6,,,, +US-ID-83442,US,ID,83442,6,,,, +US-ID-83443,US,ID,83443,6,,,, +US-ID-83444,US,ID,83444,6,,,, +US-ID-83445,US,ID,83445,6,,,, +US-ID-83446,US,ID,83446,6,,,, +US-ID-83448,US,ID,83448,6,,,, +US-ID-83449,US,ID,83449,6,,,, +US-ID-83450,US,ID,83450,6,,,, +US-ID-83451,US,ID,83451,6,,,, +US-ID-83452,US,ID,83452,6,,,, +US-ID-83454,US,ID,83454,6,,,, +US-ID-83455,US,ID,83455,6,,,, +US-ID-83460,US,ID,83460,6,,,, +US-ID-83462,US,ID,83462,6,,,, +US-ID-83463,US,ID,83463,6,,,, +US-ID-83464,US,ID,83464,6,,,, +US-ID-83465,US,ID,83465,6,,,, +US-ID-83466,US,ID,83466,6,,,, +US-ID-83467,US,ID,83467,6,,,, +US-ID-83468,US,ID,83468,6,,,, +US-ID-83469,US,ID,83469,6,,,, +US-ID-83501,US,ID,83501,6.5,,,, +US-ID-83520,US,ID,83520,6,,,, +US-ID-83522,US,ID,83522,6,,,, +US-ID-83523,US,ID,83523,6,,,, +US-ID-83524,US,ID,83524,6.5,,,, +US-ID-83525,US,ID,83525,6,,,, +US-ID-83526,US,ID,83526,6,,,, +US-ID-83530,US,ID,83530,6,,,, +US-ID-83531,US,ID,83531,6,,,, +US-ID-83533,US,ID,83533,6,,,, +US-ID-83535,US,ID,83535,6.5,,,, +US-ID-83536,US,ID,83536,6,,,, +US-ID-83537,US,ID,83537,6,,,, +US-ID-83539,US,ID,83539,6,,,, +US-ID-83540,US,ID,83540,6.5,,,, +US-ID-83541,US,ID,83541,6.5,,,, +US-ID-83542,US,ID,83542,6,,,, +US-ID-83543,US,ID,83543,6,,,, +US-ID-83544,US,ID,83544,6,,,, +US-ID-83545,US,ID,83545,6.5,,,, +US-ID-83546,US,ID,83546,6,,,, +US-ID-83547,US,ID,83547,6,,,, +US-ID-83548,US,ID,83548,6.5,,,, +US-ID-83549,US,ID,83549,6,,,, +US-ID-83552,US,ID,83552,6,,,, +US-ID-83553,US,ID,83553,6,,,, +US-ID-83554,US,ID,83554,6,,,, +US-ID-83555,US,ID,83555,6,,,, +US-ID-83601,US,ID,83601,6,,,, +US-ID-83602,US,ID,83602,6,,,, +US-ID-83604,US,ID,83604,6,,,, +US-ID-83605,US,ID,83605,6,,,, +US-ID-83606,US,ID,83606,6,,,, +US-ID-83607,US,ID,83607,6,,,, +US-ID-83610,US,ID,83610,6,,,, +US-ID-83611,US,ID,83611,6,,,, +US-ID-83612,US,ID,83612,6,,,, +US-ID-83615,US,ID,83615,6,,,, +US-ID-83616,US,ID,83616,6,,,, +US-ID-83617,US,ID,83617,6,,,, +US-ID-83619,US,ID,83619,6,,,, +US-ID-83622,US,ID,83622,6,,,, +US-ID-83623,US,ID,83623,6,,,, +US-ID-83624,US,ID,83624,6,,,, +US-ID-83626,US,ID,83626,6,,,, +US-ID-83627,US,ID,83627,6,,,, +US-ID-83628,US,ID,83628,6,,,, +US-ID-83629,US,ID,83629,6,,,, +US-ID-83630,US,ID,83630,6,,,, +US-ID-83631,US,ID,83631,6,,,, +US-ID-83632,US,ID,83632,6,,,, +US-ID-83633,US,ID,83633,6,,,, +US-ID-83634,US,ID,83634,6,,,, +US-ID-83635,US,ID,83635,6,,,, +US-ID-83636,US,ID,83636,6,,,, +US-ID-83637,US,ID,83637,6,,,, +US-ID-83638,US,ID,83638,6,,,, +US-ID-83639,US,ID,83639,6,,,, +US-ID-83641,US,ID,83641,6,,,, +US-ID-83642,US,ID,83642,6,,,, +US-ID-83643,US,ID,83643,6,,,, +US-ID-83644,US,ID,83644,6,,,, +US-ID-83645,US,ID,83645,6,,,, +US-ID-83646,US,ID,83646,6,,,, +US-ID-83647,US,ID,83647,6,,,, +US-ID-83648,US,ID,83648,6,,,, +US-ID-83650,US,ID,83650,6,,,, +US-ID-83651,US,ID,83651,6,,,, +US-ID-83652,US,ID,83652,6,,,, +US-ID-83653,US,ID,83653,6,,,, +US-ID-83654,US,ID,83654,6,,,, +US-ID-83655,US,ID,83655,6,,,, +US-ID-83656,US,ID,83656,6,,,, +US-ID-83657,US,ID,83657,6,,,, +US-ID-83660,US,ID,83660,6,,,, +US-ID-83661,US,ID,83661,6,,,, +US-ID-83666,US,ID,83666,6,,,, +US-ID-83669,US,ID,83669,6,,,, +US-ID-83670,US,ID,83670,6,,,, +US-ID-83671,US,ID,83671,6,,,, +US-ID-83672,US,ID,83672,6,,,, +US-ID-83676,US,ID,83676,6,,,, +US-ID-83677,US,ID,83677,6,,,, +US-ID-83680,US,ID,83680,6,,,, +US-ID-83686,US,ID,83686,6,,,, +US-ID-83687,US,ID,83687,6,,,, +US-ID-83701,US,ID,83701,6,,,, +US-ID-83702,US,ID,83702,6,,,, +US-ID-83703,US,ID,83703,6,,,, +US-ID-83704,US,ID,83704,6,,,, +US-ID-83705,US,ID,83705,6,,,, +US-ID-83706,US,ID,83706,6,,,, +US-ID-83707,US,ID,83707,6,,,, +US-ID-83708,US,ID,83708,6,,,, +US-ID-83709,US,ID,83709,6,,,, +US-ID-83711,US,ID,83711,6,,,, +US-ID-83712,US,ID,83712,6,,,, +US-ID-83713,US,ID,83713,6,,,, +US-ID-83714,US,ID,83714,6,,,, +US-ID-83715,US,ID,83715,6,,,, +US-ID-83716,US,ID,83716,6,,,, +US-ID-83717,US,ID,83717,6,,,, +US-ID-83719,US,ID,83719,6,,,, +US-ID-83720,US,ID,83720,6,,,, +US-ID-83722,US,ID,83722,6,,,, +US-ID-83724,US,ID,83724,6,,,, +US-ID-83725,US,ID,83725,6,,,, +US-ID-83726,US,ID,83726,6,,,, +US-ID-83728,US,ID,83728,6,,,, +US-ID-83729,US,ID,83729,6,,,, +US-ID-83731,US,ID,83731,6,,,, +US-ID-83732,US,ID,83732,6,,,, +US-ID-83735,US,ID,83735,6,,,, +US-ID-83756,US,ID,83756,6,,,, +US-ID-83799,US,ID,83799,6,,,, +US-ID-83801,US,ID,83801,6,,,, +US-ID-83802,US,ID,83802,6,,,, +US-ID-83803,US,ID,83803,6,,,, +US-ID-83804,US,ID,83804,6,,,, +US-ID-83805,US,ID,83805,6,,,, +US-ID-83806,US,ID,83806,6,,,, +US-ID-83808,US,ID,83808,6,,,, +US-ID-83809,US,ID,83809,6,,,, +US-ID-83810,US,ID,83810,6,,,, +US-ID-83811,US,ID,83811,6,,,, +US-ID-83812,US,ID,83812,6,,,, +US-ID-83813,US,ID,83813,6,,,, +US-ID-83814,US,ID,83814,6,,,, +US-ID-83815,US,ID,83815,6,,,, +US-ID-83816,US,ID,83816,6,,,, +US-ID-83821,US,ID,83821,6,,,, +US-ID-83822,US,ID,83822,6,,,, +US-ID-83823,US,ID,83823,6,,,, +US-ID-83824,US,ID,83824,6,,,, +US-ID-83825,US,ID,83825,6,,,, +US-ID-83826,US,ID,83826,6,,,, +US-ID-83827,US,ID,83827,6,,,, +US-ID-83830,US,ID,83830,6,,,, +US-ID-83832,US,ID,83832,6,,,, +US-ID-83833,US,ID,83833,6,,,, +US-ID-83834,US,ID,83834,6,,,, +US-ID-83835,US,ID,83835,6,,,, +US-ID-83836,US,ID,83836,6,,,, +US-ID-83837,US,ID,83837,6,,,, +US-ID-83839,US,ID,83839,6,,,, +US-ID-83840,US,ID,83840,6,,,, +US-ID-83841,US,ID,83841,6,,,, +US-ID-83842,US,ID,83842,6,,,, +US-ID-83843,US,ID,83843,6,,,, +US-ID-83844,US,ID,83844,6,,,, +US-ID-83845,US,ID,83845,6,,,, +US-ID-83846,US,ID,83846,6,,,, +US-ID-83847,US,ID,83847,6,,,, +US-ID-83848,US,ID,83848,6,,,, +US-ID-83849,US,ID,83849,6,,,, +US-ID-83850,US,ID,83850,6,,,, +US-ID-83851,US,ID,83851,6,,,, +US-ID-83852,US,ID,83852,6,,,, +US-ID-83853,US,ID,83853,6,,,, +US-ID-83854,US,ID,83854,6,,,, +US-ID-83855,US,ID,83855,6,,,, +US-ID-83856,US,ID,83856,6,,,, +US-ID-83857,US,ID,83857,6,,,, +US-ID-83858,US,ID,83858,6,,,, +US-ID-83860,US,ID,83860,6,,,, +US-ID-83861,US,ID,83861,6,,,, +US-ID-83864,US,ID,83864,6,,,, +US-ID-83865,US,ID,83865,6,,,, +US-ID-83866,US,ID,83866,6,,,, +US-ID-83867,US,ID,83867,6,,,, +US-ID-83868,US,ID,83868,6,,,, +US-ID-83869,US,ID,83869,6,,,, +US-ID-83870,US,ID,83870,6,,,, +US-ID-83871,US,ID,83871,6,,,, +US-ID-83872,US,ID,83872,6,,,, +US-ID-83873,US,ID,83873,6,,,, +US-ID-83874,US,ID,83874,6,,,, +US-ID-83876,US,ID,83876,6,,,, +US-ID-83877,US,ID,83877,6,,,, +US-IL-60002,US,IL,60002,7,,,, +US-IL-60004,US,IL,60004,9,,,, +US-IL-60005,US,IL,60005,9,,,, +US-IL-60006,US,IL,60006,9,,,, +US-IL-60007,US,IL,60007,9,,,, +US-IL-60008,US,IL,60008,9,,,, +US-IL-60009,US,IL,60009,9,,,, +US-IL-60010,US,IL,60010,7,,,, +US-IL-60011,US,IL,60011,8,,,, +US-IL-60012,US,IL,60012,7,,,, +US-IL-60013,US,IL,60013,7,,,, +US-IL-60014,US,IL,60014,7.75,,,, +US-IL-60015,US,IL,60015,8,,,, +US-IL-60016,US,IL,60016,9,,,, +US-IL-60017,US,IL,60017,9,,,, +US-IL-60018,US,IL,60018,9,,,, +US-IL-60019,US,IL,60019,9,,,, +US-IL-60020,US,IL,60020,7,,,, +US-IL-60021,US,IL,60021,7,,,, +US-IL-60022,US,IL,60022,8,,,, +US-IL-60025,US,IL,60025,8.75,,,, +US-IL-60026,US,IL,60026,8.75,,,, +US-IL-60029,US,IL,60029,8,,,, +US-IL-60030,US,IL,60030,7,,,, +US-IL-60031,US,IL,60031,7.5,,,, +US-IL-60033,US,IL,60033,7,,,, +US-IL-60034,US,IL,60034,7,,,, +US-IL-60035,US,IL,60035,8,,,, +US-IL-60037,US,IL,60037,7.5,,,, +US-IL-60038,US,IL,60038,9,,,, +US-IL-60039,US,IL,60039,7.75,,,, +US-IL-60040,US,IL,60040,8.5,,,, +US-IL-60041,US,IL,60041,7,,,, +US-IL-60042,US,IL,60042,7,,,, +US-IL-60043,US,IL,60043,8,,,, +US-IL-60044,US,IL,60044,8,,,, +US-IL-60045,US,IL,60045,7.5,,,, +US-IL-60046,US,IL,60046,7,,,, +US-IL-60047,US,IL,60047,7.5,,,, +US-IL-60048,US,IL,60048,7,,,, +US-IL-60050,US,IL,60050,7.5,,,, +US-IL-60051,US,IL,60051,7,,,, +US-IL-60053,US,IL,60053,9,,,, +US-IL-60055,US,IL,60055,9,,,, +US-IL-60056,US,IL,60056,9,,,, +US-IL-60060,US,IL,60060,8,,,, +US-IL-60061,US,IL,60061,7,,,, +US-IL-60062,US,IL,60062,8.75,,,, +US-IL-60064,US,IL,60064,7,,,, +US-IL-60065,US,IL,60065,8.75,,,, +US-IL-60067,US,IL,60067,9,,,, +US-IL-60068,US,IL,60068,9,,,, +US-IL-60069,US,IL,60069,7.5,,,, +US-IL-60070,US,IL,60070,8.5,,,, +US-IL-60071,US,IL,60071,7,,,, +US-IL-60072,US,IL,60072,7,,,, +US-IL-60073,US,IL,60073,7.5,,,, +US-IL-60074,US,IL,60074,9,,,, +US-IL-60075,US,IL,60075,7,,,, +US-IL-60076,US,IL,60076,9,,,, +US-IL-60077,US,IL,60077,9,,,, +US-IL-60078,US,IL,60078,9,,,, +US-IL-60079,US,IL,60079,8,,,, +US-IL-60081,US,IL,60081,7,,,, +US-IL-60082,US,IL,60082,8.75,,,, +US-IL-60083,US,IL,60083,7,,,, +US-IL-60084,US,IL,60084,7,,,, +US-IL-60085,US,IL,60085,8,,,, +US-IL-60086,US,IL,60086,7,,,, +US-IL-60087,US,IL,60087,8,,,, +US-IL-60088,US,IL,60088,7,,,, +US-IL-60089,US,IL,60089,8,,,, +US-IL-60090,US,IL,60090,9,,,, +US-IL-60091,US,IL,60091,8.25,,,, +US-IL-60093,US,IL,60093,8,,,, +US-IL-60094,US,IL,60094,9,,,, +US-IL-60095,US,IL,60095,9,,,, +US-IL-60096,US,IL,60096,7,,,, +US-IL-60097,US,IL,60097,7,,,, +US-IL-60098,US,IL,60098,7,,,, +US-IL-60099,US,IL,60099,7,,,, +US-IL-60101,US,IL,60101,8.25,,,, +US-IL-60102,US,IL,60102,7.75,,,, +US-IL-60103,US,IL,60103,8,,,, +US-IL-60104,US,IL,60104,9.5,,,, +US-IL-60105,US,IL,60105,8.25,,,, +US-IL-60106,US,IL,60106,8.25,,,, +US-IL-60107,US,IL,60107,9,,,, +US-IL-60108,US,IL,60108,7.75,,,, +US-IL-60109,US,IL,60109,7,,,, +US-IL-60110,US,IL,60110,8.5,,,, +US-IL-60111,US,IL,60111,6.25,,,, +US-IL-60112,US,IL,60112,7.25,,,, +US-IL-60113,US,IL,60113,6.25,,,, +US-IL-60115,US,IL,60115,8,,,, +US-IL-60116,US,IL,60116,8,,,, +US-IL-60117,US,IL,60117,7.75,,,, +US-IL-60118,US,IL,60118,8.5,,,, +US-IL-60119,US,IL,60119,7,,,, +US-IL-60120,US,IL,60120,8.25,,,, +US-IL-60121,US,IL,60121,8.25,,,, +US-IL-60122,US,IL,60122,8,,,, +US-IL-60123,US,IL,60123,8.25,,,, +US-IL-60124,US,IL,60124,7,,,, +US-IL-60126,US,IL,60126,8,,,, +US-IL-60128,US,IL,60128,8,,,, +US-IL-60129,US,IL,60129,6.25,,,, +US-IL-60130,US,IL,60130,8.5,,,, +US-IL-60131,US,IL,60131,8,,,, +US-IL-60132,US,IL,60132,8,,,, +US-IL-60133,US,IL,60133,8.75,,,, +US-IL-60134,US,IL,60134,7.5,,,, +US-IL-60135,US,IL,60135,6.25,,,, +US-IL-60136,US,IL,60136,8,,,, +US-IL-60137,US,IL,60137,8.25,,,, +US-IL-60138,US,IL,60138,8.25,,,, +US-IL-60139,US,IL,60139,8.25,,,, +US-IL-60140,US,IL,60140,7,,,, +US-IL-60141,US,IL,60141,8,,,, +US-IL-60142,US,IL,60142,7,,,, +US-IL-60143,US,IL,60143,7.75,,,, +US-IL-60144,US,IL,60144,7,,,, +US-IL-60145,US,IL,60145,6.25,,,, +US-IL-60146,US,IL,60146,6.25,,,, +US-IL-60147,US,IL,60147,7,,,, +US-IL-60148,US,IL,60148,8.25,,,, +US-IL-60150,US,IL,60150,6.25,,,, +US-IL-60151,US,IL,60151,7,,,, +US-IL-60152,US,IL,60152,7,,,, +US-IL-60153,US,IL,60153,9,,,, +US-IL-60154,US,IL,60154,9,,,, +US-IL-60155,US,IL,60155,9,,,, +US-IL-60156,US,IL,60156,7.75,,,, +US-IL-60157,US,IL,60157,7.25,,,, +US-IL-60159,US,IL,60159,9,,,, +US-IL-60160,US,IL,60160,9.25,,,, +US-IL-60161,US,IL,60161,9.25,,,, +US-IL-60162,US,IL,60162,9,,,, +US-IL-60163,US,IL,60163,9,,,, +US-IL-60164,US,IL,60164,9,,,, +US-IL-60165,US,IL,60165,9.25,,,, +US-IL-60168,US,IL,60168,9,,,, +US-IL-60169,US,IL,60169,9,,,, +US-IL-60170,US,IL,60170,8.25,,,, +US-IL-60171,US,IL,60171,10,,,, +US-IL-60172,US,IL,60172,7.25,,,, +US-IL-60173,US,IL,60173,9,,,, +US-IL-60174,US,IL,60174,8,,,, +US-IL-60175,US,IL,60175,7,,,, +US-IL-60176,US,IL,60176,8.75,,,, +US-IL-60177,US,IL,60177,7.5,,,, +US-IL-60178,US,IL,60178,8,,,, +US-IL-60179,US,IL,60179,8,,,, +US-IL-60180,US,IL,60180,7,,,, +US-IL-60181,US,IL,60181,7.75,,,, +US-IL-60183,US,IL,60183,7,,,, +US-IL-60184,US,IL,60184,7.25,,,, +US-IL-60185,US,IL,60185,7.75,,,, +US-IL-60186,US,IL,60186,7.75,,,, +US-IL-60187,US,IL,60187,8.25,,,, +US-IL-60188,US,IL,60188,8,,,, +US-IL-60189,US,IL,60189,8.25,,,, +US-IL-60190,US,IL,60190,7.25,,,, +US-IL-60191,US,IL,60191,8.25,,,, +US-IL-60192,US,IL,60192,9,,,, +US-IL-60193,US,IL,60193,9,,,, +US-IL-60194,US,IL,60194,9,,,, +US-IL-60195,US,IL,60195,9,,,, +US-IL-60196,US,IL,60196,9,,,, +US-IL-60197,US,IL,60197,8,,,, +US-IL-60199,US,IL,60199,8,,,, +US-IL-60201,US,IL,60201,9,,,, +US-IL-60202,US,IL,60202,9,,,, +US-IL-60203,US,IL,60203,9,,,, +US-IL-60204,US,IL,60204,9,,,, +US-IL-60208,US,IL,60208,9,,,, +US-IL-60209,US,IL,60209,9,,,, +US-IL-60290,US,IL,60290,9.25,,,, +US-IL-60301,US,IL,60301,9,,,, +US-IL-60302,US,IL,60302,9,,,, +US-IL-60303,US,IL,60303,9,,,, +US-IL-60304,US,IL,60304,9,,,, +US-IL-60305,US,IL,60305,9,,,, +US-IL-60399,US,IL,60399,8.25,,,, +US-IL-60401,US,IL,60401,7,,,, +US-IL-60402,US,IL,60402,9,,,, +US-IL-60403,US,IL,60403,8,,,, +US-IL-60404,US,IL,60404,8,,,, +US-IL-60406,US,IL,60406,8,,,, +US-IL-60407,US,IL,60407,6.25,,,, +US-IL-60408,US,IL,60408,7,,,, +US-IL-60409,US,IL,60409,9,,,, +US-IL-60410,US,IL,60410,8,,,, +US-IL-60411,US,IL,60411,9,,,, +US-IL-60412,US,IL,60412,9,,,, +US-IL-60415,US,IL,60415,9,,,, +US-IL-60416,US,IL,60416,6.25,,,, +US-IL-60417,US,IL,60417,7,,,, +US-IL-60419,US,IL,60419,8.5,,,, +US-IL-60420,US,IL,60420,6.25,,,, +US-IL-60421,US,IL,60421,7,,,, +US-IL-60422,US,IL,60422,8,,,, +US-IL-60423,US,IL,60423,7,,,, +US-IL-60424,US,IL,60424,6.25,,,, +US-IL-60425,US,IL,60425,8,,,, +US-IL-60426,US,IL,60426,9,,,, +US-IL-60428,US,IL,60428,9,,,, +US-IL-60429,US,IL,60429,9,,,, +US-IL-60430,US,IL,60430,8,,,, +US-IL-60431,US,IL,60431,8.75,,,, +US-IL-60432,US,IL,60432,8.75,,,, +US-IL-60433,US,IL,60433,7,,,, +US-IL-60434,US,IL,60434,8.75,,,, +US-IL-60435,US,IL,60435,8.75,,,, +US-IL-60436,US,IL,60436,8.75,,,, +US-IL-60437,US,IL,60437,6.25,,,, +US-IL-60438,US,IL,60438,8.5,,,, +US-IL-60439,US,IL,60439,8,,,, +US-IL-60440,US,IL,60440,8.5,,,, +US-IL-60441,US,IL,60441,8,,,, +US-IL-60442,US,IL,60442,8,,,, +US-IL-60443,US,IL,60443,8,,,, +US-IL-60444,US,IL,60444,6.25,,,, +US-IL-60445,US,IL,60445,8,,,, +US-IL-60446,US,IL,60446,8.5,,,, +US-IL-60447,US,IL,60447,6.25,,,, +US-IL-60448,US,IL,60448,7.5,,,, +US-IL-60449,US,IL,60449,7,,,, +US-IL-60450,US,IL,60450,6.25,,,, +US-IL-60451,US,IL,60451,8.5,,,, +US-IL-60452,US,IL,60452,9,,,, +US-IL-60453,US,IL,60453,8.75,,,, +US-IL-60454,US,IL,60454,8.75,,,, +US-IL-60455,US,IL,60455,9,,,, +US-IL-60456,US,IL,60456,8,,,, +US-IL-60457,US,IL,60457,8,,,, +US-IL-60458,US,IL,60458,8,,,, +US-IL-60459,US,IL,60459,8.75,,,, +US-IL-60460,US,IL,60460,6.25,,,, +US-IL-60461,US,IL,60461,8,,,, +US-IL-60462,US,IL,60462,8.75,,,, +US-IL-60463,US,IL,60463,8,,,, +US-IL-60464,US,IL,60464,8.5,,,, +US-IL-60465,US,IL,60465,8,,,, +US-IL-60466,US,IL,60466,8,,,, +US-IL-60467,US,IL,60467,8.75,,,, +US-IL-60468,US,IL,60468,7,,,, +US-IL-60469,US,IL,60469,8.5,,,, +US-IL-60470,US,IL,60470,6.5,,,, +US-IL-60471,US,IL,60471,8.5,,,, +US-IL-60472,US,IL,60472,8,,,, +US-IL-60473,US,IL,60473,8.5,,,, +US-IL-60474,US,IL,60474,6.25,,,, +US-IL-60475,US,IL,60475,8,,,, +US-IL-60476,US,IL,60476,8,,,, +US-IL-60477,US,IL,60477,8,,,, +US-IL-60478,US,IL,60478,9.25,,,, +US-IL-60479,US,IL,60479,6.25,,,, +US-IL-60480,US,IL,60480,9,,,, +US-IL-60481,US,IL,60481,7,,,, +US-IL-60482,US,IL,60482,9,,,, +US-IL-60484,US,IL,60484,8,,,, +US-IL-60487,US,IL,60487,8,,,, +US-IL-60490,US,IL,60490,8.5,,,, +US-IL-60491,US,IL,60491,8,,,, +US-IL-60499,US,IL,60499,8.75,,,, +US-IL-60501,US,IL,60501,8,,,, +US-IL-60502,US,IL,60502,8.25,,,, +US-IL-60503,US,IL,60503,8.25,,,, +US-IL-60504,US,IL,60504,8.25,,,, +US-IL-60505,US,IL,60505,8.25,,,, +US-IL-60506,US,IL,60506,8.25,,,, +US-IL-60507,US,IL,60507,8.25,,,, +US-IL-60510,US,IL,60510,7.5,,,, +US-IL-60511,US,IL,60511,7,,,, +US-IL-60512,US,IL,60512,7.25,,,, +US-IL-60513,US,IL,60513,9,,,, +US-IL-60514,US,IL,60514,7.25,,,, +US-IL-60515,US,IL,60515,8.25,,,, +US-IL-60516,US,IL,60516,8.25,,,, +US-IL-60517,US,IL,60517,7.75,,,, +US-IL-60518,US,IL,60518,6.5,,,, +US-IL-60519,US,IL,60519,7.25,,,, +US-IL-60520,US,IL,60520,6.25,,,, +US-IL-60521,US,IL,60521,8.25,,,, +US-IL-60522,US,IL,60522,7.75,,,, +US-IL-60523,US,IL,60523,7.75,,,, +US-IL-60525,US,IL,60525,8.25,,,, +US-IL-60526,US,IL,60526,8,,,, +US-IL-60527,US,IL,60527,7.25,,,, +US-IL-60530,US,IL,60530,6.25,,,, +US-IL-60531,US,IL,60531,6.5,,,, +US-IL-60532,US,IL,60532,7.25,,,, +US-IL-60534,US,IL,60534,8,,,, +US-IL-60536,US,IL,60536,7.25,,,, +US-IL-60537,US,IL,60537,7.25,,,, +US-IL-60538,US,IL,60538,7,,,, +US-IL-60539,US,IL,60539,7,,,, +US-IL-60540,US,IL,60540,7.25,,,, +US-IL-60541,US,IL,60541,7.25,,,, +US-IL-60542,US,IL,60542,7.5,,,, +US-IL-60543,US,IL,60543,7.75,,,, +US-IL-60544,US,IL,60544,8.5,,,, +US-IL-60545,US,IL,60545,7.25,,,, +US-IL-60546,US,IL,60546,9,,,, +US-IL-60548,US,IL,60548,6.25,,,, +US-IL-60549,US,IL,60549,6.5,,,, +US-IL-60550,US,IL,60550,6.25,,,, +US-IL-60551,US,IL,60551,6.5,,,, +US-IL-60552,US,IL,60552,6.25,,,, +US-IL-60553,US,IL,60553,6.25,,,, +US-IL-60554,US,IL,60554,8,,,, +US-IL-60555,US,IL,60555,8.5,,,, +US-IL-60556,US,IL,60556,6.25,,,, +US-IL-60557,US,IL,60557,6.5,,,, +US-IL-60558,US,IL,60558,8,,,, +US-IL-60559,US,IL,60559,7.25,,,, +US-IL-60560,US,IL,60560,8.25,,,, +US-IL-60561,US,IL,60561,8.25,,,, +US-IL-60563,US,IL,60563,7.25,,,, +US-IL-60564,US,IL,60564,7.25,,,, +US-IL-60565,US,IL,60565,7.25,,,, +US-IL-60566,US,IL,60566,7.25,,,, +US-IL-60567,US,IL,60567,7.25,,,, +US-IL-60568,US,IL,60568,8.25,,,, +US-IL-60572,US,IL,60572,8.25,,,, +US-IL-60585,US,IL,60585,8.5,,,, +US-IL-60586,US,IL,60586,8.75,,,, +US-IL-60598,US,IL,60598,8.25,,,, +US-IL-60599,US,IL,60599,8.25,,,, +US-IL-60601,US,IL,60601,9.25,,,, +US-IL-60602,US,IL,60602,9.25,,,, +US-IL-60603,US,IL,60603,9.25,,,, +US-IL-60604,US,IL,60604,9.25,,,, +US-IL-60605,US,IL,60605,9.25,,,, +US-IL-60606,US,IL,60606,9.25,,,, +US-IL-60607,US,IL,60607,9.25,,,, +US-IL-60608,US,IL,60608,9.25,,,, +US-IL-60609,US,IL,60609,9.25,,,, +US-IL-60610,US,IL,60610,9.25,,,, +US-IL-60611,US,IL,60611,9.25,,,, +US-IL-60612,US,IL,60612,9.25,,,, +US-IL-60613,US,IL,60613,9.25,,,, +US-IL-60614,US,IL,60614,9.25,,,, +US-IL-60615,US,IL,60615,9.25,,,, +US-IL-60616,US,IL,60616,9.25,,,, +US-IL-60617,US,IL,60617,9.25,,,, +US-IL-60618,US,IL,60618,9.25,,,, +US-IL-60619,US,IL,60619,9.25,,,, +US-IL-60620,US,IL,60620,9.25,,,, +US-IL-60621,US,IL,60621,9.25,,,, +US-IL-60622,US,IL,60622,9.25,,,, +US-IL-60623,US,IL,60623,9.25,,,, +US-IL-60624,US,IL,60624,9.25,,,, +US-IL-60625,US,IL,60625,9.25,,,, +US-IL-60626,US,IL,60626,9.25,,,, +US-IL-60628,US,IL,60628,9.25,,,, +US-IL-60629,US,IL,60629,9.25,,,, +US-IL-60630,US,IL,60630,9.25,,,, +US-IL-60631,US,IL,60631,9.25,,,, +US-IL-60632,US,IL,60632,9.25,,,, +US-IL-60633,US,IL,60633,9.25,,,, +US-IL-60634,US,IL,60634,9.25,,,, +US-IL-60636,US,IL,60636,9.25,,,, +US-IL-60637,US,IL,60637,9.25,,,, +US-IL-60638,US,IL,60638,9.25,,,, +US-IL-60639,US,IL,60639,9.25,,,, +US-IL-60640,US,IL,60640,9.25,,,, +US-IL-60641,US,IL,60641,9.25,,,, +US-IL-60642,US,IL,60642,9.25,,,, +US-IL-60643,US,IL,60643,9.25,,,, +US-IL-60644,US,IL,60644,9.25,,,, +US-IL-60645,US,IL,60645,9.25,,,, +US-IL-60646,US,IL,60646,9.25,,,, +US-IL-60647,US,IL,60647,9.25,,,, +US-IL-60649,US,IL,60649,9.25,,,, +US-IL-60651,US,IL,60651,9.25,,,, +US-IL-60652,US,IL,60652,9.25,,,, +US-IL-60653,US,IL,60653,9.25,,,, +US-IL-60654,US,IL,60654,9.25,,,, +US-IL-60655,US,IL,60655,9.25,,,, +US-IL-60656,US,IL,60656,9.25,,,, +US-IL-60657,US,IL,60657,9.25,,,, +US-IL-60659,US,IL,60659,9.25,,,, +US-IL-60660,US,IL,60660,9.25,,,, +US-IL-60661,US,IL,60661,9.25,,,, +US-IL-60664,US,IL,60664,9.25,,,, +US-IL-60666,US,IL,60666,9.25,,,, +US-IL-60668,US,IL,60668,9.25,,,, +US-IL-60669,US,IL,60669,9.25,,,, +US-IL-60670,US,IL,60670,9.25,,,, +US-IL-60673,US,IL,60673,9.25,,,, +US-IL-60674,US,IL,60674,9.25,,,, +US-IL-60675,US,IL,60675,9.25,,,, +US-IL-60677,US,IL,60677,9.25,,,, +US-IL-60678,US,IL,60678,9.25,,,, +US-IL-60680,US,IL,60680,9.25,,,, +US-IL-60681,US,IL,60681,9.25,,,, +US-IL-60682,US,IL,60682,9.25,,,, +US-IL-60685,US,IL,60685,9.25,,,, +US-IL-60686,US,IL,60686,9.25,,,, +US-IL-60687,US,IL,60687,9.25,,,, +US-IL-60688,US,IL,60688,9.25,,,, +US-IL-60689,US,IL,60689,9.25,,,, +US-IL-60690,US,IL,60690,9.25,,,, +US-IL-60691,US,IL,60691,9.25,,,, +US-IL-60693,US,IL,60693,9.25,,,, +US-IL-60694,US,IL,60694,9.25,,,, +US-IL-60695,US,IL,60695,9.25,,,, +US-IL-60696,US,IL,60696,9.25,,,, +US-IL-60697,US,IL,60697,9.25,,,, +US-IL-60699,US,IL,60699,9.25,,,, +US-IL-60701,US,IL,60701,8,,,, +US-IL-60706,US,IL,60706,9.25,,,, +US-IL-60707,US,IL,60707,9,,,, +US-IL-60712,US,IL,60712,9,,,, +US-IL-60714,US,IL,60714,9.25,,,, +US-IL-60803,US,IL,60803,8.75,,,, +US-IL-60804,US,IL,60804,9.5,,,, +US-IL-60805,US,IL,60805,8.75,,,, +US-IL-60827,US,IL,60827,9,,,, +US-IL-60901,US,IL,60901,6.25,,,, +US-IL-60910,US,IL,60910,6.25,,,, +US-IL-60911,US,IL,60911,6.25,,,, +US-IL-60912,US,IL,60912,6.25,,,, +US-IL-60913,US,IL,60913,6.25,,,, +US-IL-60914,US,IL,60914,6.25,,,, +US-IL-60915,US,IL,60915,6.25,,,, +US-IL-60917,US,IL,60917,6.25,,,, +US-IL-60918,US,IL,60918,6.25,,,, +US-IL-60919,US,IL,60919,6.25,,,, +US-IL-60920,US,IL,60920,6.25,,,, +US-IL-60921,US,IL,60921,6.25,,,, +US-IL-60922,US,IL,60922,6.25,,,, +US-IL-60924,US,IL,60924,6.25,,,, +US-IL-60926,US,IL,60926,6.25,,,, +US-IL-60927,US,IL,60927,6.25,,,, +US-IL-60928,US,IL,60928,6.25,,,, +US-IL-60929,US,IL,60929,6.25,,,, +US-IL-60930,US,IL,60930,6.25,,,, +US-IL-60931,US,IL,60931,6.25,,,, +US-IL-60932,US,IL,60932,6.5,,,, +US-IL-60933,US,IL,60933,6.25,,,, +US-IL-60934,US,IL,60934,6.25,,,, +US-IL-60935,US,IL,60935,6.25,,,, +US-IL-60936,US,IL,60936,6.25,,,, +US-IL-60938,US,IL,60938,6.25,,,, +US-IL-60939,US,IL,60939,6.25,,,, +US-IL-60940,US,IL,60940,6.25,,,, +US-IL-60941,US,IL,60941,6.25,,,, +US-IL-60942,US,IL,60942,6.5,,,, +US-IL-60944,US,IL,60944,9.25,,,, +US-IL-60945,US,IL,60945,6.25,,,, +US-IL-60946,US,IL,60946,6.25,,,, +US-IL-60948,US,IL,60948,6.25,,,, +US-IL-60949,US,IL,60949,7.5,,,, +US-IL-60950,US,IL,60950,6.25,,,, +US-IL-60951,US,IL,60951,6.25,,,, +US-IL-60952,US,IL,60952,6.25,,,, +US-IL-60953,US,IL,60953,6.25,,,, +US-IL-60954,US,IL,60954,6.25,,,, +US-IL-60955,US,IL,60955,6.25,,,, +US-IL-60956,US,IL,60956,6.25,,,, +US-IL-60957,US,IL,60957,6.25,,,, +US-IL-60958,US,IL,60958,6.25,,,, +US-IL-60959,US,IL,60959,6.25,,,, +US-IL-60960,US,IL,60960,6.25,,,, +US-IL-60961,US,IL,60961,6.25,,,, +US-IL-60962,US,IL,60962,6.25,,,, +US-IL-60963,US,IL,60963,6.5,,,, +US-IL-60964,US,IL,60964,6.25,,,, +US-IL-60966,US,IL,60966,6.25,,,, +US-IL-60967,US,IL,60967,6.25,,,, +US-IL-60968,US,IL,60968,6.25,,,, +US-IL-60969,US,IL,60969,6.25,,,, +US-IL-60970,US,IL,60970,7,,,, +US-IL-60973,US,IL,60973,6.25,,,, +US-IL-60974,US,IL,60974,6.25,,,, +US-IL-61001,US,IL,61001,6.75,,,, +US-IL-61006,US,IL,61006,6.25,,,, +US-IL-61007,US,IL,61007,6.25,,,, +US-IL-61008,US,IL,61008,6.75,,,, +US-IL-61010,US,IL,61010,7.25,,,, +US-IL-61011,US,IL,61011,6.75,,,, +US-IL-61012,US,IL,61012,6.75,,,, +US-IL-61013,US,IL,61013,6.75,,,, +US-IL-61014,US,IL,61014,6.5,,,, +US-IL-61015,US,IL,61015,6.25,,,, +US-IL-61016,US,IL,61016,7.25,,,, +US-IL-61018,US,IL,61018,6.75,,,, +US-IL-61019,US,IL,61019,6.75,,,, +US-IL-61020,US,IL,61020,6.25,,,, +US-IL-61021,US,IL,61021,6.75,,,, +US-IL-61024,US,IL,61024,7.25,,,, +US-IL-61025,US,IL,61025,7.25,,,, +US-IL-61027,US,IL,61027,6.75,,,, +US-IL-61028,US,IL,61028,6.75,,,, +US-IL-61030,US,IL,61030,6.25,,,, +US-IL-61031,US,IL,61031,6.25,,,, +US-IL-61032,US,IL,61032,8,,,, +US-IL-61036,US,IL,61036,6.75,,,, +US-IL-61037,US,IL,61037,6.25,,,, +US-IL-61038,US,IL,61038,6.75,,,, +US-IL-61039,US,IL,61039,6.75,,,, +US-IL-61041,US,IL,61041,6.75,,,, +US-IL-61042,US,IL,61042,6.25,,,, +US-IL-61043,US,IL,61043,6.25,,,, +US-IL-61044,US,IL,61044,6.75,,,, +US-IL-61046,US,IL,61046,6.5,,,, +US-IL-61047,US,IL,61047,6.25,,,, +US-IL-61048,US,IL,61048,6.75,,,, +US-IL-61049,US,IL,61049,6.25,,,, +US-IL-61050,US,IL,61050,6.75,,,, +US-IL-61051,US,IL,61051,6.5,,,, +US-IL-61052,US,IL,61052,6.25,,,, +US-IL-61053,US,IL,61053,6.5,,,, +US-IL-61054,US,IL,61054,6.25,,,, +US-IL-61057,US,IL,61057,6.25,,,, +US-IL-61059,US,IL,61059,6.75,,,, +US-IL-61060,US,IL,61060,6.75,,,, +US-IL-61061,US,IL,61061,7.25,,,, +US-IL-61062,US,IL,61062,6.75,,,, +US-IL-61063,US,IL,61063,7.25,,,, +US-IL-61064,US,IL,61064,6.25,,,, +US-IL-61065,US,IL,61065,6.75,,,, +US-IL-61067,US,IL,61067,6.75,,,, +US-IL-61068,US,IL,61068,7,,,, +US-IL-61070,US,IL,61070,6.75,,,, +US-IL-61071,US,IL,61071,6.75,,,, +US-IL-61072,US,IL,61072,7.25,,,, +US-IL-61073,US,IL,61073,7.25,,,, +US-IL-61074,US,IL,61074,6.5,,,, +US-IL-61075,US,IL,61075,6.75,,,, +US-IL-61077,US,IL,61077,7.25,,,, +US-IL-61078,US,IL,61078,6.5,,,, +US-IL-61079,US,IL,61079,7.25,,,, +US-IL-61080,US,IL,61080,7.25,,,, +US-IL-61081,US,IL,61081,6.75,,,, +US-IL-61084,US,IL,61084,6.25,,,, +US-IL-61085,US,IL,61085,6.75,,,, +US-IL-61087,US,IL,61087,6.75,,,, +US-IL-61088,US,IL,61088,7.25,,,, +US-IL-61089,US,IL,61089,6.75,,,, +US-IL-61091,US,IL,61091,6.25,,,, +US-IL-61101,US,IL,61101,8.25,,,, +US-IL-61102,US,IL,61102,8.25,,,, +US-IL-61103,US,IL,61103,8.25,,,, +US-IL-61104,US,IL,61104,8.25,,,, +US-IL-61105,US,IL,61105,8.25,,,, +US-IL-61106,US,IL,61106,8.25,,,, +US-IL-61107,US,IL,61107,8.25,,,, +US-IL-61108,US,IL,61108,8.25,,,, +US-IL-61109,US,IL,61109,8.25,,,, +US-IL-61110,US,IL,61110,8.25,,,, +US-IL-61111,US,IL,61111,7.25,,,, +US-IL-61112,US,IL,61112,8.25,,,, +US-IL-61114,US,IL,61114,8.25,,,, +US-IL-61115,US,IL,61115,8.25,,,, +US-IL-61125,US,IL,61125,8.25,,,, +US-IL-61126,US,IL,61126,8.25,,,, +US-IL-61130,US,IL,61130,7.25,,,, +US-IL-61131,US,IL,61131,7.25,,,, +US-IL-61132,US,IL,61132,7.25,,,, +US-IL-61201,US,IL,61201,7.5,,,, +US-IL-61204,US,IL,61204,7.5,,,, +US-IL-61230,US,IL,61230,6.25,,,, +US-IL-61231,US,IL,61231,6.25,,,, +US-IL-61232,US,IL,61232,6.25,,,, +US-IL-61233,US,IL,61233,6.25,,,, +US-IL-61234,US,IL,61234,6.25,,,, +US-IL-61235,US,IL,61235,6.25,,,, +US-IL-61236,US,IL,61236,6.75,,,, +US-IL-61237,US,IL,61237,6.25,,,, +US-IL-61238,US,IL,61238,6.25,,,, +US-IL-61239,US,IL,61239,6.75,,,, +US-IL-61240,US,IL,61240,6.25,,,, +US-IL-61241,US,IL,61241,6.75,,,, +US-IL-61242,US,IL,61242,6.25,,,, +US-IL-61243,US,IL,61243,6.25,,,, +US-IL-61244,US,IL,61244,6.75,,,, +US-IL-61250,US,IL,61250,6.25,,,, +US-IL-61251,US,IL,61251,6.25,,,, +US-IL-61252,US,IL,61252,7,,,, +US-IL-61254,US,IL,61254,6.75,,,, +US-IL-61256,US,IL,61256,6.75,,,, +US-IL-61257,US,IL,61257,6.25,,,, +US-IL-61258,US,IL,61258,6.25,,,, +US-IL-61259,US,IL,61259,6.25,,,, +US-IL-61260,US,IL,61260,6.25,,,, +US-IL-61261,US,IL,61261,6.25,,,, +US-IL-61262,US,IL,61262,6.25,,,, +US-IL-61263,US,IL,61263,6.25,,,, +US-IL-61264,US,IL,61264,6.25,,,, +US-IL-61265,US,IL,61265,7.5,,,, +US-IL-61266,US,IL,61266,7.5,,,, +US-IL-61270,US,IL,61270,6.25,,,, +US-IL-61272,US,IL,61272,6.25,,,, +US-IL-61273,US,IL,61273,6.25,,,, +US-IL-61274,US,IL,61274,6.25,,,, +US-IL-61275,US,IL,61275,6.25,,,, +US-IL-61276,US,IL,61276,6.25,,,, +US-IL-61277,US,IL,61277,6.25,,,, +US-IL-61278,US,IL,61278,6.25,,,, +US-IL-61279,US,IL,61279,6.25,,,, +US-IL-61281,US,IL,61281,6.25,,,, +US-IL-61282,US,IL,61282,6.75,,,, +US-IL-61283,US,IL,61283,6.75,,,, +US-IL-61284,US,IL,61284,6.25,,,, +US-IL-61285,US,IL,61285,6.5,,,, +US-IL-61299,US,IL,61299,7.5,,,, +US-IL-61301,US,IL,61301,7,,,, +US-IL-61310,US,IL,61310,6.25,,,, +US-IL-61311,US,IL,61311,6.25,,,, +US-IL-61312,US,IL,61312,6.75,,,, +US-IL-61313,US,IL,61313,6.25,,,, +US-IL-61314,US,IL,61314,6.75,,,, +US-IL-61315,US,IL,61315,6.75,,,, +US-IL-61316,US,IL,61316,6.5,,,, +US-IL-61317,US,IL,61317,6.75,,,, +US-IL-61318,US,IL,61318,6.25,,,, +US-IL-61319,US,IL,61319,6.25,,,, +US-IL-61320,US,IL,61320,6.75,,,, +US-IL-61321,US,IL,61321,6.5,,,, +US-IL-61322,US,IL,61322,6.75,,,, +US-IL-61323,US,IL,61323,6.75,,,, +US-IL-61324,US,IL,61324,6.25,,,, +US-IL-61325,US,IL,61325,6.5,,,, +US-IL-61326,US,IL,61326,6.25,,,, +US-IL-61327,US,IL,61327,6.25,,,, +US-IL-61328,US,IL,61328,6.75,,,, +US-IL-61329,US,IL,61329,6.75,,,, +US-IL-61330,US,IL,61330,6.75,,,, +US-IL-61331,US,IL,61331,6.25,,,, +US-IL-61332,US,IL,61332,6.5,,,, +US-IL-61333,US,IL,61333,6.25,,,, +US-IL-61334,US,IL,61334,6.5,,,, +US-IL-61335,US,IL,61335,6.25,,,, +US-IL-61336,US,IL,61336,6.25,,,, +US-IL-61337,US,IL,61337,6.75,,,, +US-IL-61338,US,IL,61338,6.75,,,, +US-IL-61340,US,IL,61340,6.25,,,, +US-IL-61341,US,IL,61341,6.5,,,, +US-IL-61342,US,IL,61342,6.5,,,, +US-IL-61344,US,IL,61344,6.75,,,, +US-IL-61345,US,IL,61345,6.75,,,, +US-IL-61346,US,IL,61346,6.75,,,, +US-IL-61348,US,IL,61348,6.5,,,, +US-IL-61349,US,IL,61349,6.75,,,, +US-IL-61350,US,IL,61350,7,,,, +US-IL-61353,US,IL,61353,6.25,,,, +US-IL-61354,US,IL,61354,7.5,,,, +US-IL-61356,US,IL,61356,7.25,,,, +US-IL-61358,US,IL,61358,6.5,,,, +US-IL-61359,US,IL,61359,6.75,,,, +US-IL-61360,US,IL,61360,6.5,,,, +US-IL-61361,US,IL,61361,6.75,,,, +US-IL-61362,US,IL,61362,6.75,,,, +US-IL-61363,US,IL,61363,6.25,,,, +US-IL-61364,US,IL,61364,7.5,,,, +US-IL-61367,US,IL,61367,6.25,,,, +US-IL-61368,US,IL,61368,6.75,,,, +US-IL-61369,US,IL,61369,6.25,,,, +US-IL-61370,US,IL,61370,6.5,,,, +US-IL-61371,US,IL,61371,6.5,,,, +US-IL-61372,US,IL,61372,6.5,,,, +US-IL-61373,US,IL,61373,6.5,,,, +US-IL-61374,US,IL,61374,6.75,,,, +US-IL-61375,US,IL,61375,6.25,,,, +US-IL-61376,US,IL,61376,6.75,,,, +US-IL-61377,US,IL,61377,6.25,,,, +US-IL-61378,US,IL,61378,6.25,,,, +US-IL-61379,US,IL,61379,6.75,,,, +US-IL-61401,US,IL,61401,8.5,,,, +US-IL-61402,US,IL,61402,8.5,,,, +US-IL-61410,US,IL,61410,7.5,,,, +US-IL-61411,US,IL,61411,6.75,,,, +US-IL-61412,US,IL,61412,7.25,,,, +US-IL-61413,US,IL,61413,6.25,,,, +US-IL-61414,US,IL,61414,7.5,,,, +US-IL-61415,US,IL,61415,6.75,,,, +US-IL-61416,US,IL,61416,6.75,,,, +US-IL-61417,US,IL,61417,7.25,,,, +US-IL-61418,US,IL,61418,7.25,,,, +US-IL-61419,US,IL,61419,6.25,,,, +US-IL-61420,US,IL,61420,6.75,,,, +US-IL-61421,US,IL,61421,6.75,,,, +US-IL-61422,US,IL,61422,7.25,,,, +US-IL-61423,US,IL,61423,7.25,,,, +US-IL-61424,US,IL,61424,6.25,,,, +US-IL-61425,US,IL,61425,7.25,,,, +US-IL-61426,US,IL,61426,6.75,,,, +US-IL-61427,US,IL,61427,6.75,,,, +US-IL-61428,US,IL,61428,7.5,,,, +US-IL-61430,US,IL,61430,7.5,,,, +US-IL-61431,US,IL,61431,6.75,,,, +US-IL-61432,US,IL,61432,6.75,,,, +US-IL-61433,US,IL,61433,6.75,,,, +US-IL-61434,US,IL,61434,6.25,,,, +US-IL-61435,US,IL,61435,7.25,,,, +US-IL-61436,US,IL,61436,7.5,,,, +US-IL-61437,US,IL,61437,7.25,,,, +US-IL-61438,US,IL,61438,6.75,,,, +US-IL-61439,US,IL,61439,7.5,,,, +US-IL-61440,US,IL,61440,6.75,,,, +US-IL-61441,US,IL,61441,6.75,,,, +US-IL-61442,US,IL,61442,6.25,,,, +US-IL-61443,US,IL,61443,6.75,,,, +US-IL-61447,US,IL,61447,7.25,,,, +US-IL-61448,US,IL,61448,7.5,,,, +US-IL-61449,US,IL,61449,6.75,,,, +US-IL-61450,US,IL,61450,6.25,,,, +US-IL-61451,US,IL,61451,6.75,,,, +US-IL-61452,US,IL,61452,7.25,,,, +US-IL-61453,US,IL,61453,7.25,,,, +US-IL-61454,US,IL,61454,7.25,,,, +US-IL-61455,US,IL,61455,7.75,,,, +US-IL-61458,US,IL,61458,7.5,,,, +US-IL-61459,US,IL,61459,6.75,,,, +US-IL-61460,US,IL,61460,7.25,,,, +US-IL-61462,US,IL,61462,9.25,,,, +US-IL-61465,US,IL,61465,6.25,,,, +US-IL-61466,US,IL,61466,6.25,,,, +US-IL-61467,US,IL,61467,7.5,,,, +US-IL-61468,US,IL,61468,6.25,,,, +US-IL-61469,US,IL,61469,7.25,,,, +US-IL-61470,US,IL,61470,6.75,,,, +US-IL-61471,US,IL,61471,7.25,,,, +US-IL-61472,US,IL,61472,7.5,,,, +US-IL-61473,US,IL,61473,7.25,,,, +US-IL-61474,US,IL,61474,7.5,,,, +US-IL-61475,US,IL,61475,6.75,,,, +US-IL-61476,US,IL,61476,6.25,,,, +US-IL-61477,US,IL,61477,6.75,,,, +US-IL-61478,US,IL,61478,7.25,,,, +US-IL-61479,US,IL,61479,6.75,,,, +US-IL-61480,US,IL,61480,7.25,,,, +US-IL-61482,US,IL,61482,6.75,,,, +US-IL-61483,US,IL,61483,6.75,,,, +US-IL-61484,US,IL,61484,6.75,,,, +US-IL-61485,US,IL,61485,7.5,,,, +US-IL-61486,US,IL,61486,6.25,,,, +US-IL-61488,US,IL,61488,7.5,,,, +US-IL-61489,US,IL,61489,7.5,,,, +US-IL-61490,US,IL,61490,6.25,,,, +US-IL-61491,US,IL,61491,6.75,,,, +US-IL-61501,US,IL,61501,6.75,,,, +US-IL-61516,US,IL,61516,7.25,,,, +US-IL-61517,US,IL,61517,6.75,,,, +US-IL-61519,US,IL,61519,6.75,,,, +US-IL-61520,US,IL,61520,7.25,,,, +US-IL-61523,US,IL,61523,7.25,,,, +US-IL-61524,US,IL,61524,6.75,,,, +US-IL-61525,US,IL,61525,6.75,,,, +US-IL-61526,US,IL,61526,6.75,,,, +US-IL-61528,US,IL,61528,6.75,,,, +US-IL-61529,US,IL,61529,6.75,,,, +US-IL-61530,US,IL,61530,7.25,,,, +US-IL-61531,US,IL,61531,6.75,,,, +US-IL-61532,US,IL,61532,6.25,,,, +US-IL-61533,US,IL,61533,6.75,,,, +US-IL-61534,US,IL,61534,6.75,,,, +US-IL-61535,US,IL,61535,6.75,,,, +US-IL-61536,US,IL,61536,6.75,,,, +US-IL-61537,US,IL,61537,6.25,,,, +US-IL-61539,US,IL,61539,6.75,,,, +US-IL-61540,US,IL,61540,6.25,,,, +US-IL-61541,US,IL,61541,6.25,,,, +US-IL-61542,US,IL,61542,6.75,,,, +US-IL-61543,US,IL,61543,6.75,,,, +US-IL-61544,US,IL,61544,6.75,,,, +US-IL-61545,US,IL,61545,7.25,,,, +US-IL-61546,US,IL,61546,6.75,,,, +US-IL-61547,US,IL,61547,6.75,,,, +US-IL-61548,US,IL,61548,7.25,,,, +US-IL-61550,US,IL,61550,6.75,,,, +US-IL-61552,US,IL,61552,6.75,,,, +US-IL-61553,US,IL,61553,6.75,,,, +US-IL-61554,US,IL,61554,8,,,, +US-IL-61555,US,IL,61555,8,,,, +US-IL-61558,US,IL,61558,8,,,, +US-IL-61559,US,IL,61559,6.75,,,, +US-IL-61560,US,IL,61560,6.25,,,, +US-IL-61561,US,IL,61561,7.25,,,, +US-IL-61562,US,IL,61562,6.75,,,, +US-IL-61563,US,IL,61563,6.75,,,, +US-IL-61564,US,IL,61564,7,,,, +US-IL-61565,US,IL,61565,6.25,,,, +US-IL-61567,US,IL,61567,6.25,,,, +US-IL-61568,US,IL,61568,6.75,,,, +US-IL-61569,US,IL,61569,6.75,,,, +US-IL-61570,US,IL,61570,7.25,,,, +US-IL-61571,US,IL,61571,8,,,, +US-IL-61572,US,IL,61572,7.5,,,, +US-IL-61601,US,IL,61601,8.25,,,, +US-IL-61602,US,IL,61602,8.25,,,, +US-IL-61603,US,IL,61603,8.25,,,, +US-IL-61604,US,IL,61604,8.25,,,, +US-IL-61605,US,IL,61605,8.25,,,, +US-IL-61606,US,IL,61606,8.25,,,, +US-IL-61607,US,IL,61607,7.25,,,, +US-IL-61610,US,IL,61610,7.75,,,, +US-IL-61611,US,IL,61611,8,,,, +US-IL-61612,US,IL,61612,8.25,,,, +US-IL-61613,US,IL,61613,8.25,,,, +US-IL-61614,US,IL,61614,8.25,,,, +US-IL-61615,US,IL,61615,8.25,,,, +US-IL-61616,US,IL,61616,8.25,,,, +US-IL-61625,US,IL,61625,8.25,,,, +US-IL-61629,US,IL,61629,8.25,,,, +US-IL-61630,US,IL,61630,8.25,,,, +US-IL-61633,US,IL,61633,8.25,,,, +US-IL-61634,US,IL,61634,8.25,,,, +US-IL-61635,US,IL,61635,8,,,, +US-IL-61636,US,IL,61636,8.25,,,, +US-IL-61637,US,IL,61637,8.25,,,, +US-IL-61638,US,IL,61638,8.25,,,, +US-IL-61639,US,IL,61639,8.25,,,, +US-IL-61641,US,IL,61641,7.25,,,, +US-IL-61643,US,IL,61643,8.25,,,, +US-IL-61650,US,IL,61650,8.25,,,, +US-IL-61651,US,IL,61651,8.25,,,, +US-IL-61652,US,IL,61652,8.25,,,, +US-IL-61653,US,IL,61653,8.25,,,, +US-IL-61654,US,IL,61654,8.25,,,, +US-IL-61655,US,IL,61655,8.25,,,, +US-IL-61656,US,IL,61656,8.25,,,, +US-IL-61701,US,IL,61701,7.75,,,, +US-IL-61702,US,IL,61702,7.75,,,, +US-IL-61704,US,IL,61704,7.75,,,, +US-IL-61705,US,IL,61705,6.25,,,, +US-IL-61709,US,IL,61709,7.75,,,, +US-IL-61710,US,IL,61710,7.75,,,, +US-IL-61720,US,IL,61720,6.25,,,, +US-IL-61721,US,IL,61721,6.75,,,, +US-IL-61722,US,IL,61722,6.25,,,, +US-IL-61723,US,IL,61723,7.75,,,, +US-IL-61724,US,IL,61724,6.25,,,, +US-IL-61725,US,IL,61725,6.75,,,, +US-IL-61726,US,IL,61726,6.25,,,, +US-IL-61727,US,IL,61727,6.75,,,, +US-IL-61728,US,IL,61728,6.25,,,, +US-IL-61729,US,IL,61729,7.25,,,, +US-IL-61730,US,IL,61730,6.25,,,, +US-IL-61731,US,IL,61731,6.25,,,, +US-IL-61732,US,IL,61732,6.25,,,, +US-IL-61733,US,IL,61733,6.75,,,, +US-IL-61734,US,IL,61734,6.75,,,, +US-IL-61735,US,IL,61735,6.25,,,, +US-IL-61736,US,IL,61736,6.25,,,, +US-IL-61737,US,IL,61737,6.25,,,, +US-IL-61738,US,IL,61738,7.25,,,, +US-IL-61739,US,IL,61739,6.25,,,, +US-IL-61740,US,IL,61740,6.25,,,, +US-IL-61741,US,IL,61741,6.25,,,, +US-IL-61742,US,IL,61742,7.25,,,, +US-IL-61743,US,IL,61743,6.25,,,, +US-IL-61744,US,IL,61744,6.25,,,, +US-IL-61745,US,IL,61745,6.25,,,, +US-IL-61747,US,IL,61747,6.75,,,, +US-IL-61748,US,IL,61748,6.25,,,, +US-IL-61749,US,IL,61749,6.25,,,, +US-IL-61750,US,IL,61750,6.25,,,, +US-IL-61751,US,IL,61751,7.75,,,, +US-IL-61752,US,IL,61752,6.75,,,, +US-IL-61753,US,IL,61753,6.75,,,, +US-IL-61754,US,IL,61754,6.75,,,, +US-IL-61755,US,IL,61755,6.75,,,, +US-IL-61756,US,IL,61756,7.5,,,, +US-IL-61758,US,IL,61758,6.25,,,, +US-IL-61759,US,IL,61759,6.75,,,, +US-IL-61760,US,IL,61760,7.25,,,, +US-IL-61761,US,IL,61761,7.75,,,, +US-IL-61764,US,IL,61764,6.25,,,, +US-IL-61769,US,IL,61769,6.25,,,, +US-IL-61770,US,IL,61770,6.25,,,, +US-IL-61771,US,IL,61771,7.25,,,, +US-IL-61772,US,IL,61772,6.25,,,, +US-IL-61773,US,IL,61773,6.25,,,, +US-IL-61774,US,IL,61774,6.25,,,, +US-IL-61775,US,IL,61775,6.25,,,, +US-IL-61776,US,IL,61776,6.25,,,, +US-IL-61777,US,IL,61777,6.25,,,, +US-IL-61778,US,IL,61778,6.25,,,, +US-IL-61790,US,IL,61790,7.75,,,, +US-IL-61791,US,IL,61791,7.75,,,, +US-IL-61799,US,IL,61799,7.75,,,, +US-IL-61801,US,IL,61801,8.75,,,, +US-IL-61802,US,IL,61802,8.75,,,, +US-IL-61803,US,IL,61803,8.75,,,, +US-IL-61810,US,IL,61810,6.5,,,, +US-IL-61811,US,IL,61811,6.5,,,, +US-IL-61812,US,IL,61812,6.5,,,, +US-IL-61813,US,IL,61813,6.25,,,, +US-IL-61814,US,IL,61814,6.5,,,, +US-IL-61815,US,IL,61815,7.5,,,, +US-IL-61816,US,IL,61816,7.5,,,, +US-IL-61817,US,IL,61817,6.5,,,, +US-IL-61818,US,IL,61818,6.25,,,, +US-IL-61820,US,IL,61820,8.75,,,, +US-IL-61821,US,IL,61821,8.75,,,, +US-IL-61822,US,IL,61822,8.75,,,, +US-IL-61824,US,IL,61824,8.75,,,, +US-IL-61825,US,IL,61825,8.75,,,, +US-IL-61826,US,IL,61826,8.75,,,, +US-IL-61830,US,IL,61830,6.25,,,, +US-IL-61831,US,IL,61831,6.5,,,, +US-IL-61832,US,IL,61832,8.75,,,, +US-IL-61833,US,IL,61833,7.5,,,, +US-IL-61834,US,IL,61834,6.5,,,, +US-IL-61839,US,IL,61839,6.25,,,, +US-IL-61840,US,IL,61840,7.5,,,, +US-IL-61841,US,IL,61841,6.5,,,, +US-IL-61842,US,IL,61842,6.25,,,, +US-IL-61843,US,IL,61843,7.5,,,, +US-IL-61844,US,IL,61844,6.5,,,, +US-IL-61845,US,IL,61845,7.5,,,, +US-IL-61846,US,IL,61846,6.5,,,, +US-IL-61847,US,IL,61847,7.5,,,, +US-IL-61848,US,IL,61848,6.5,,,, +US-IL-61849,US,IL,61849,7.5,,,, +US-IL-61850,US,IL,61850,6.5,,,, +US-IL-61851,US,IL,61851,7.5,,,, +US-IL-61852,US,IL,61852,7.5,,,, +US-IL-61853,US,IL,61853,7.5,,,, +US-IL-61854,US,IL,61854,6.25,,,, +US-IL-61855,US,IL,61855,6.25,,,, +US-IL-61856,US,IL,61856,6.25,,,, +US-IL-61857,US,IL,61857,6.5,,,, +US-IL-61858,US,IL,61858,6.5,,,, +US-IL-61859,US,IL,61859,8.5,,,, +US-IL-61862,US,IL,61862,7.5,,,, +US-IL-61863,US,IL,61863,7.5,,,, +US-IL-61864,US,IL,61864,7.5,,,, +US-IL-61865,US,IL,61865,6.5,,,, +US-IL-61866,US,IL,61866,8.75,,,, +US-IL-61870,US,IL,61870,6.5,,,, +US-IL-61871,US,IL,61871,7.5,,,, +US-IL-61872,US,IL,61872,7.5,,,, +US-IL-61873,US,IL,61873,8,,,, +US-IL-61874,US,IL,61874,8,,,, +US-IL-61875,US,IL,61875,7.5,,,, +US-IL-61876,US,IL,61876,6.5,,,, +US-IL-61877,US,IL,61877,7.5,,,, +US-IL-61878,US,IL,61878,7.5,,,, +US-IL-61880,US,IL,61880,7.5,,,, +US-IL-61882,US,IL,61882,6.25,,,, +US-IL-61883,US,IL,61883,6.5,,,, +US-IL-61884,US,IL,61884,6.25,,,, +US-IL-61910,US,IL,61910,6.75,,,, +US-IL-61911,US,IL,61911,6.25,,,, +US-IL-61912,US,IL,61912,6.25,,,, +US-IL-61913,US,IL,61913,6.25,,,, +US-IL-61914,US,IL,61914,6.75,,,, +US-IL-61917,US,IL,61917,6.25,,,, +US-IL-61919,US,IL,61919,6.25,,,, +US-IL-61920,US,IL,61920,6.75,,,, +US-IL-61924,US,IL,61924,6.25,,,, +US-IL-61925,US,IL,61925,7.5,,,, +US-IL-61928,US,IL,61928,6.75,,,, +US-IL-61929,US,IL,61929,6.25,,,, +US-IL-61930,US,IL,61930,6.25,,,, +US-IL-61931,US,IL,61931,6.25,,,, +US-IL-61932,US,IL,61932,6.25,,,, +US-IL-61933,US,IL,61933,6.25,,,, +US-IL-61936,US,IL,61936,6.25,,,, +US-IL-61937,US,IL,61937,6.75,,,, +US-IL-61938,US,IL,61938,6.75,,,, +US-IL-61940,US,IL,61940,6.25,,,, +US-IL-61941,US,IL,61941,6.25,,,, +US-IL-61942,US,IL,61942,6.25,,,, +US-IL-61943,US,IL,61943,6.25,,,, +US-IL-61944,US,IL,61944,6.75,,,, +US-IL-61949,US,IL,61949,6.25,,,, +US-IL-61951,US,IL,61951,6.75,,,, +US-IL-61953,US,IL,61953,7.25,,,, +US-IL-61955,US,IL,61955,6.25,,,, +US-IL-61956,US,IL,61956,7.25,,,, +US-IL-61957,US,IL,61957,6.25,,,, +US-IL-62001,US,IL,62001,6.6,,,, +US-IL-62002,US,IL,62002,7.85,,,, +US-IL-62006,US,IL,62006,7,,,, +US-IL-62009,US,IL,62009,6.25,,,, +US-IL-62010,US,IL,62010,6.85,,,, +US-IL-62011,US,IL,62011,6.25,,,, +US-IL-62012,US,IL,62012,7,,,, +US-IL-62013,US,IL,62013,7,,,, +US-IL-62014,US,IL,62014,6.25,,,, +US-IL-62015,US,IL,62015,6.25,,,, +US-IL-62016,US,IL,62016,6.25,,,, +US-IL-62017,US,IL,62017,6.25,,,, +US-IL-62018,US,IL,62018,6.85,,,, +US-IL-62019,US,IL,62019,6.25,,,, +US-IL-62021,US,IL,62021,6.85,,,, +US-IL-62022,US,IL,62022,7,,,, +US-IL-62023,US,IL,62023,6.25,,,, +US-IL-62024,US,IL,62024,6.85,,,, +US-IL-62025,US,IL,62025,6.85,,,, +US-IL-62026,US,IL,62026,6.85,,,, +US-IL-62027,US,IL,62027,6.25,,,, +US-IL-62028,US,IL,62028,7,,,, +US-IL-62030,US,IL,62030,7,,,, +US-IL-62031,US,IL,62031,7,,,, +US-IL-62032,US,IL,62032,6.25,,,, +US-IL-62033,US,IL,62033,6.25,,,, +US-IL-62034,US,IL,62034,6.85,,,, +US-IL-62035,US,IL,62035,6.85,,,, +US-IL-62036,US,IL,62036,7,,,, +US-IL-62037,US,IL,62037,7,,,, +US-IL-62040,US,IL,62040,8.35,,,, +US-IL-62044,US,IL,62044,6.25,,,, +US-IL-62045,US,IL,62045,7,,,, +US-IL-62046,US,IL,62046,6.6,,,, +US-IL-62047,US,IL,62047,7,,,, +US-IL-62048,US,IL,62048,6.85,,,, +US-IL-62049,US,IL,62049,6.25,,,, +US-IL-62050,US,IL,62050,6.25,,,, +US-IL-62051,US,IL,62051,6.25,,,, +US-IL-62052,US,IL,62052,7.5,,,, +US-IL-62053,US,IL,62053,7,,,, +US-IL-62054,US,IL,62054,6.25,,,, +US-IL-62056,US,IL,62056,7.25,,,, +US-IL-62058,US,IL,62058,6.6,,,, +US-IL-62059,US,IL,62059,7.35,,,, +US-IL-62060,US,IL,62060,6.85,,,, +US-IL-62061,US,IL,62061,6.6,,,, +US-IL-62062,US,IL,62062,6.85,,,, +US-IL-62063,US,IL,62063,6.25,,,, +US-IL-62067,US,IL,62067,6.85,,,, +US-IL-62069,US,IL,62069,6.25,,,, +US-IL-62071,US,IL,62071,7.35,,,, +US-IL-62074,US,IL,62074,6.6,,,, +US-IL-62075,US,IL,62075,6.25,,,, +US-IL-62076,US,IL,62076,6.25,,,, +US-IL-62077,US,IL,62077,6.25,,,, +US-IL-62078,US,IL,62078,6.25,,,, +US-IL-62079,US,IL,62079,6.25,,,, +US-IL-62080,US,IL,62080,6.25,,,, +US-IL-62081,US,IL,62081,6.25,,,, +US-IL-62082,US,IL,62082,6.25,,,, +US-IL-62083,US,IL,62083,6.25,,,, +US-IL-62084,US,IL,62084,6.85,,,, +US-IL-62085,US,IL,62085,6.25,,,, +US-IL-62086,US,IL,62086,6.25,,,, +US-IL-62087,US,IL,62087,6.85,,,, +US-IL-62088,US,IL,62088,6.25,,,, +US-IL-62089,US,IL,62089,6.25,,,, +US-IL-62090,US,IL,62090,6.85,,,, +US-IL-62091,US,IL,62091,6.25,,,, +US-IL-62092,US,IL,62092,6.25,,,, +US-IL-62093,US,IL,62093,6.25,,,, +US-IL-62094,US,IL,62094,6.25,,,, +US-IL-62095,US,IL,62095,6.85,,,, +US-IL-62097,US,IL,62097,6.6,,,, +US-IL-62098,US,IL,62098,6.25,,,, +US-IL-62201,US,IL,62201,8.85,,,, +US-IL-62202,US,IL,62202,8.85,,,, +US-IL-62203,US,IL,62203,8.85,,,, +US-IL-62204,US,IL,62204,8.85,,,, +US-IL-62205,US,IL,62205,8.85,,,, +US-IL-62206,US,IL,62206,8.1,,,, +US-IL-62207,US,IL,62207,7.35,,,, +US-IL-62208,US,IL,62208,8.35,,,, +US-IL-62214,US,IL,62214,6.25,,,, +US-IL-62215,US,IL,62215,6.25,,,, +US-IL-62216,US,IL,62216,6.25,,,, +US-IL-62217,US,IL,62217,6.25,,,, +US-IL-62218,US,IL,62218,6.25,,,, +US-IL-62219,US,IL,62219,6.25,,,, +US-IL-62220,US,IL,62220,8.1,,,, +US-IL-62221,US,IL,62221,7.35,,,, +US-IL-62222,US,IL,62222,8.1,,,, +US-IL-62223,US,IL,62223,7.35,,,, +US-IL-62225,US,IL,62225,7.35,,,, +US-IL-62226,US,IL,62226,8.1,,,, +US-IL-62230,US,IL,62230,6.25,,,, +US-IL-62231,US,IL,62231,6.25,,,, +US-IL-62232,US,IL,62232,7.35,,,, +US-IL-62233,US,IL,62233,6.25,,,, +US-IL-62234,US,IL,62234,8.1,,,, +US-IL-62236,US,IL,62236,6.5,,,, +US-IL-62237,US,IL,62237,6.25,,,, +US-IL-62238,US,IL,62238,6.75,,,, +US-IL-62239,US,IL,62239,7.35,,,, +US-IL-62240,US,IL,62240,7.35,,,, +US-IL-62241,US,IL,62241,6.25,,,, +US-IL-62242,US,IL,62242,6.25,,,, +US-IL-62243,US,IL,62243,6.6,,,, +US-IL-62244,US,IL,62244,6.5,,,, +US-IL-62245,US,IL,62245,6.25,,,, +US-IL-62246,US,IL,62246,6.75,,,, +US-IL-62247,US,IL,62247,6.75,,,, +US-IL-62248,US,IL,62248,6.5,,,, +US-IL-62249,US,IL,62249,7.85,,,, +US-IL-62250,US,IL,62250,6.25,,,, +US-IL-62252,US,IL,62252,6.25,,,, +US-IL-62253,US,IL,62253,6.75,,,, +US-IL-62254,US,IL,62254,7.35,,,, +US-IL-62255,US,IL,62255,7.35,,,, +US-IL-62256,US,IL,62256,6.5,,,, +US-IL-62257,US,IL,62257,6.6,,,, +US-IL-62258,US,IL,62258,7.6,,,, +US-IL-62259,US,IL,62259,6.25,,,, +US-IL-62260,US,IL,62260,6.6,,,, +US-IL-62261,US,IL,62261,6.25,,,, +US-IL-62262,US,IL,62262,6.25,,,, +US-IL-62263,US,IL,62263,6.25,,,, +US-IL-62264,US,IL,62264,7.35,,,, +US-IL-62265,US,IL,62265,6.5,,,, +US-IL-62266,US,IL,62266,6.25,,,, +US-IL-62268,US,IL,62268,6.25,,,, +US-IL-62269,US,IL,62269,7.85,,,, +US-IL-62271,US,IL,62271,6.25,,,, +US-IL-62272,US,IL,62272,6.25,,,, +US-IL-62273,US,IL,62273,6.25,,,, +US-IL-62274,US,IL,62274,6.75,,,, +US-IL-62275,US,IL,62275,6.25,,,, +US-IL-62277,US,IL,62277,6.5,,,, +US-IL-62278,US,IL,62278,6.25,,,, +US-IL-62279,US,IL,62279,6.5,,,, +US-IL-62280,US,IL,62280,6.25,,,, +US-IL-62281,US,IL,62281,6.85,,,, +US-IL-62282,US,IL,62282,6.6,,,, +US-IL-62284,US,IL,62284,6.25,,,, +US-IL-62285,US,IL,62285,7.35,,,, +US-IL-62286,US,IL,62286,6.75,,,, +US-IL-62288,US,IL,62288,6.25,,,, +US-IL-62289,US,IL,62289,7.35,,,, +US-IL-62292,US,IL,62292,6.25,,,, +US-IL-62293,US,IL,62293,6.25,,,, +US-IL-62294,US,IL,62294,6.85,,,, +US-IL-62295,US,IL,62295,6.5,,,, +US-IL-62297,US,IL,62297,6.25,,,, +US-IL-62298,US,IL,62298,6.5,,,, +US-IL-62301,US,IL,62301,7.75,,,, +US-IL-62305,US,IL,62305,6.25,,,, +US-IL-62306,US,IL,62306,6.25,,,, +US-IL-62311,US,IL,62311,6.25,,,, +US-IL-62312,US,IL,62312,6.75,,,, +US-IL-62313,US,IL,62313,6.25,,,, +US-IL-62314,US,IL,62314,6.75,,,, +US-IL-62316,US,IL,62316,6.25,,,, +US-IL-62319,US,IL,62319,7.25,,,, +US-IL-62320,US,IL,62320,6.25,,,, +US-IL-62321,US,IL,62321,6.75,,,, +US-IL-62323,US,IL,62323,6.75,,,, +US-IL-62324,US,IL,62324,6.25,,,, +US-IL-62325,US,IL,62325,6.25,,,, +US-IL-62326,US,IL,62326,6.75,,,, +US-IL-62329,US,IL,62329,6.25,,,, +US-IL-62330,US,IL,62330,6.25,,,, +US-IL-62334,US,IL,62334,6.25,,,, +US-IL-62336,US,IL,62336,6.25,,,, +US-IL-62338,US,IL,62338,6.25,,,, +US-IL-62339,US,IL,62339,6.25,,,, +US-IL-62340,US,IL,62340,6.75,,,, +US-IL-62341,US,IL,62341,6.25,,,, +US-IL-62343,US,IL,62343,6.75,,,, +US-IL-62345,US,IL,62345,6.75,,,, +US-IL-62346,US,IL,62346,6.25,,,, +US-IL-62347,US,IL,62347,6.25,,,, +US-IL-62348,US,IL,62348,6.25,,,, +US-IL-62349,US,IL,62349,6.25,,,, +US-IL-62351,US,IL,62351,6.25,,,, +US-IL-62352,US,IL,62352,6.75,,,, +US-IL-62353,US,IL,62353,6.5,,,, +US-IL-62354,US,IL,62354,7,,,, +US-IL-62355,US,IL,62355,6.75,,,, +US-IL-62356,US,IL,62356,6.75,,,, +US-IL-62357,US,IL,62357,6.75,,,, +US-IL-62358,US,IL,62358,6.25,,,, +US-IL-62359,US,IL,62359,6.25,,,, +US-IL-62360,US,IL,62360,6.25,,,, +US-IL-62361,US,IL,62361,6.75,,,, +US-IL-62362,US,IL,62362,6.75,,,, +US-IL-62363,US,IL,62363,6.75,,,, +US-IL-62365,US,IL,62365,6.25,,,, +US-IL-62366,US,IL,62366,6.75,,,, +US-IL-62367,US,IL,62367,6.25,,,, +US-IL-62370,US,IL,62370,6.75,,,, +US-IL-62373,US,IL,62373,6.25,,,, +US-IL-62374,US,IL,62374,6.75,,,, +US-IL-62375,US,IL,62375,6.5,,,, +US-IL-62376,US,IL,62376,6.25,,,, +US-IL-62378,US,IL,62378,6.5,,,, +US-IL-62379,US,IL,62379,6.25,,,, +US-IL-62380,US,IL,62380,6.25,,,, +US-IL-62401,US,IL,62401,6.5,,,, +US-IL-62410,US,IL,62410,6.25,,,, +US-IL-62411,US,IL,62411,6.5,,,, +US-IL-62413,US,IL,62413,6.25,,,, +US-IL-62414,US,IL,62414,6.5,,,, +US-IL-62417,US,IL,62417,7.25,,,, +US-IL-62418,US,IL,62418,6.25,,,, +US-IL-62419,US,IL,62419,6.75,,,, +US-IL-62420,US,IL,62420,7.25,,,, +US-IL-62421,US,IL,62421,6.75,,,, +US-IL-62422,US,IL,62422,6.25,,,, +US-IL-62423,US,IL,62423,7.25,,,, +US-IL-62424,US,IL,62424,6.5,,,, +US-IL-62425,US,IL,62425,6.75,,,, +US-IL-62426,US,IL,62426,6.5,,,, +US-IL-62427,US,IL,62427,6.25,,,, +US-IL-62428,US,IL,62428,6.75,,,, +US-IL-62431,US,IL,62431,6.25,,,, +US-IL-62432,US,IL,62432,6.25,,,, +US-IL-62433,US,IL,62433,6.25,,,, +US-IL-62434,US,IL,62434,6.75,,,, +US-IL-62435,US,IL,62435,6.25,,,, +US-IL-62436,US,IL,62436,6.25,,,, +US-IL-62439,US,IL,62439,7.25,,,, +US-IL-62440,US,IL,62440,6.25,,,, +US-IL-62441,US,IL,62441,7.25,,,, +US-IL-62442,US,IL,62442,7.25,,,, +US-IL-62443,US,IL,62443,6.5,,,, +US-IL-62445,US,IL,62445,6.5,,,, +US-IL-62446,US,IL,62446,7,,,, +US-IL-62447,US,IL,62447,6.25,,,, +US-IL-62448,US,IL,62448,6.25,,,, +US-IL-62449,US,IL,62449,6.25,,,, +US-IL-62450,US,IL,62450,6.75,,,, +US-IL-62451,US,IL,62451,6.25,,,, +US-IL-62452,US,IL,62452,6.75,,,, +US-IL-62454,US,IL,62454,6.25,,,, +US-IL-62458,US,IL,62458,6.25,,,, +US-IL-62459,US,IL,62459,6.25,,,, +US-IL-62460,US,IL,62460,7.25,,,, +US-IL-62461,US,IL,62461,6.5,,,, +US-IL-62462,US,IL,62462,6.25,,,, +US-IL-62463,US,IL,62463,6.25,,,, +US-IL-62464,US,IL,62464,6.25,,,, +US-IL-62465,US,IL,62465,6.25,,,, +US-IL-62466,US,IL,62466,7.25,,,, +US-IL-62467,US,IL,62467,6.5,,,, +US-IL-62468,US,IL,62468,6.25,,,, +US-IL-62469,US,IL,62469,6.25,,,, +US-IL-62471,US,IL,62471,6.75,,,, +US-IL-62473,US,IL,62473,6.5,,,, +US-IL-62474,US,IL,62474,7.25,,,, +US-IL-62475,US,IL,62475,6.25,,,, +US-IL-62476,US,IL,62476,6.25,,,, +US-IL-62477,US,IL,62477,7.25,,,, +US-IL-62478,US,IL,62478,6.25,,,, +US-IL-62479,US,IL,62479,6.25,,,, +US-IL-62480,US,IL,62480,6.25,,,, +US-IL-62481,US,IL,62481,6.25,,,, +US-IL-62501,US,IL,62501,7.5,,,, +US-IL-62510,US,IL,62510,6.25,,,, +US-IL-62512,US,IL,62512,7.75,,,, +US-IL-62513,US,IL,62513,7.5,,,, +US-IL-62514,US,IL,62514,7.5,,,, +US-IL-62515,US,IL,62515,6.25,,,, +US-IL-62517,US,IL,62517,6.25,,,, +US-IL-62518,US,IL,62518,7.75,,,, +US-IL-62519,US,IL,62519,7.75,,,, +US-IL-62520,US,IL,62520,6.25,,,, +US-IL-62521,US,IL,62521,9,,,, +US-IL-62522,US,IL,62522,9,,,, +US-IL-62523,US,IL,62523,9,,,, +US-IL-62524,US,IL,62524,9,,,, +US-IL-62525,US,IL,62525,9,,,, +US-IL-62526,US,IL,62526,9,,,, +US-IL-62530,US,IL,62530,6.25,,,, +US-IL-62531,US,IL,62531,6.25,,,, +US-IL-62532,US,IL,62532,7.5,,,, +US-IL-62533,US,IL,62533,7.25,,,, +US-IL-62534,US,IL,62534,6.25,,,, +US-IL-62535,US,IL,62535,8.5,,,, +US-IL-62536,US,IL,62536,6.25,,,, +US-IL-62537,US,IL,62537,7.5,,,, +US-IL-62538,US,IL,62538,6.25,,,, +US-IL-62539,US,IL,62539,6.25,,,, +US-IL-62540,US,IL,62540,6.25,,,, +US-IL-62541,US,IL,62541,7.75,,,, +US-IL-62543,US,IL,62543,7.75,,,, +US-IL-62544,US,IL,62544,7.5,,,, +US-IL-62545,US,IL,62545,6.25,,,, +US-IL-62546,US,IL,62546,6.25,,,, +US-IL-62547,US,IL,62547,6.25,,,, +US-IL-62548,US,IL,62548,7.75,,,, +US-IL-62549,US,IL,62549,7.5,,,, +US-IL-62550,US,IL,62550,6.25,,,, +US-IL-62551,US,IL,62551,7.5,,,, +US-IL-62553,US,IL,62553,6.25,,,, +US-IL-62554,US,IL,62554,7.5,,,, +US-IL-62555,US,IL,62555,6.25,,,, +US-IL-62556,US,IL,62556,6.25,,,, +US-IL-62557,US,IL,62557,6.25,,,, +US-IL-62558,US,IL,62558,6.25,,,, +US-IL-62560,US,IL,62560,6.25,,,, +US-IL-62561,US,IL,62561,6.25,,,, +US-IL-62563,US,IL,62563,6.25,,,, +US-IL-62565,US,IL,62565,7.25,,,, +US-IL-62567,US,IL,62567,6.25,,,, +US-IL-62568,US,IL,62568,7,,,, +US-IL-62570,US,IL,62570,6.25,,,, +US-IL-62571,US,IL,62571,6.25,,,, +US-IL-62572,US,IL,62572,6.25,,,, +US-IL-62573,US,IL,62573,7.5,,,, +US-IL-62601,US,IL,62601,6.25,,,, +US-IL-62610,US,IL,62610,6.25,,,, +US-IL-62611,US,IL,62611,8.25,,,, +US-IL-62612,US,IL,62612,8.25,,,, +US-IL-62613,US,IL,62613,7.25,,,, +US-IL-62615,US,IL,62615,6.25,,,, +US-IL-62617,US,IL,62617,6.25,,,, +US-IL-62618,US,IL,62618,8.25,,,, +US-IL-62621,US,IL,62621,6.25,,,, +US-IL-62622,US,IL,62622,8.25,,,, +US-IL-62624,US,IL,62624,7.25,,,, +US-IL-62625,US,IL,62625,6.25,,,, +US-IL-62626,US,IL,62626,6.25,,,, +US-IL-62627,US,IL,62627,8.25,,,, +US-IL-62628,US,IL,62628,6.25,,,, +US-IL-62629,US,IL,62629,6.25,,,, +US-IL-62630,US,IL,62630,6.25,,,, +US-IL-62631,US,IL,62631,6.25,,,, +US-IL-62633,US,IL,62633,6.25,,,, +US-IL-62634,US,IL,62634,7.75,,,, +US-IL-62635,US,IL,62635,7.75,,,, +US-IL-62638,US,IL,62638,6.25,,,, +US-IL-62639,US,IL,62639,7.25,,,, +US-IL-62640,US,IL,62640,6.25,,,, +US-IL-62642,US,IL,62642,7.25,,,, +US-IL-62643,US,IL,62643,7.75,,,, +US-IL-62644,US,IL,62644,6.75,,,, +US-IL-62649,US,IL,62649,6.25,,,, +US-IL-62650,US,IL,62650,7,,,, +US-IL-62651,US,IL,62651,7,,,, +US-IL-62655,US,IL,62655,6.25,,,, +US-IL-62656,US,IL,62656,8.25,,,, +US-IL-62659,US,IL,62659,7.25,,,, +US-IL-62661,US,IL,62661,6.25,,,, +US-IL-62662,US,IL,62662,6.25,,,, +US-IL-62663,US,IL,62663,6.25,,,, +US-IL-62664,US,IL,62664,6.25,,,, +US-IL-62665,US,IL,62665,6.25,,,, +US-IL-62666,US,IL,62666,7.75,,,, +US-IL-62667,US,IL,62667,6.25,,,, +US-IL-62668,US,IL,62668,6.25,,,, +US-IL-62670,US,IL,62670,6.25,,,, +US-IL-62671,US,IL,62671,7.75,,,, +US-IL-62672,US,IL,62672,6.25,,,, +US-IL-62673,US,IL,62673,7.25,,,, +US-IL-62674,US,IL,62674,6.25,,,, +US-IL-62675,US,IL,62675,7.25,,,, +US-IL-62677,US,IL,62677,6.25,,,, +US-IL-62681,US,IL,62681,7.25,,,, +US-IL-62682,US,IL,62682,6.25,,,, +US-IL-62683,US,IL,62683,6.25,,,, +US-IL-62684,US,IL,62684,6.75,,,, +US-IL-62685,US,IL,62685,6.25,,,, +US-IL-62688,US,IL,62688,7.25,,,, +US-IL-62689,US,IL,62689,6.25,,,, +US-IL-62690,US,IL,62690,6.25,,,, +US-IL-62691,US,IL,62691,8.25,,,, +US-IL-62692,US,IL,62692,6.25,,,, +US-IL-62693,US,IL,62693,6.25,,,, +US-IL-62694,US,IL,62694,6.25,,,, +US-IL-62695,US,IL,62695,6.25,,,, +US-IL-62701,US,IL,62701,8,,,, +US-IL-62702,US,IL,62702,8,,,, +US-IL-62703,US,IL,62703,8,,,, +US-IL-62704,US,IL,62704,8,,,, +US-IL-62705,US,IL,62705,8,,,, +US-IL-62706,US,IL,62706,8,,,, +US-IL-62707,US,IL,62707,6.25,,,, +US-IL-62708,US,IL,62708,8,,,, +US-IL-62711,US,IL,62711,8,,,, +US-IL-62712,US,IL,62712,8,,,, +US-IL-62715,US,IL,62715,8,,,, +US-IL-62716,US,IL,62716,6.25,,,, +US-IL-62719,US,IL,62719,8,,,, +US-IL-62721,US,IL,62721,8,,,, +US-IL-62722,US,IL,62722,8,,,, +US-IL-62723,US,IL,62723,8,,,, +US-IL-62726,US,IL,62726,8,,,, +US-IL-62736,US,IL,62736,8,,,, +US-IL-62739,US,IL,62739,8,,,, +US-IL-62756,US,IL,62756,8,,,, +US-IL-62757,US,IL,62757,8,,,, +US-IL-62761,US,IL,62761,8,,,, +US-IL-62762,US,IL,62762,8,,,, +US-IL-62763,US,IL,62763,8,,,, +US-IL-62764,US,IL,62764,8,,,, +US-IL-62765,US,IL,62765,8,,,, +US-IL-62766,US,IL,62766,8,,,, +US-IL-62767,US,IL,62767,8,,,, +US-IL-62769,US,IL,62769,8,,,, +US-IL-62776,US,IL,62776,8,,,, +US-IL-62777,US,IL,62777,8,,,, +US-IL-62781,US,IL,62781,8,,,, +US-IL-62786,US,IL,62786,8,,,, +US-IL-62791,US,IL,62791,8,,,, +US-IL-62794,US,IL,62794,8,,,, +US-IL-62796,US,IL,62796,8,,,, +US-IL-62801,US,IL,62801,6.5,,,, +US-IL-62803,US,IL,62803,6.25,,,, +US-IL-62806,US,IL,62806,6.25,,,, +US-IL-62807,US,IL,62807,6.5,,,, +US-IL-62808,US,IL,62808,6.25,,,, +US-IL-62809,US,IL,62809,7,,,, +US-IL-62810,US,IL,62810,6.5,,,, +US-IL-62811,US,IL,62811,6.25,,,, +US-IL-62812,US,IL,62812,8.5,,,, +US-IL-62814,US,IL,62814,6.5,,,, +US-IL-62815,US,IL,62815,6.25,,,, +US-IL-62816,US,IL,62816,6.5,,,, +US-IL-62817,US,IL,62817,6.25,,,, +US-IL-62818,US,IL,62818,6.25,,,, +US-IL-62819,US,IL,62819,7.25,,,, +US-IL-62820,US,IL,62820,6.25,,,, +US-IL-62821,US,IL,62821,7,,,, +US-IL-62822,US,IL,62822,8.25,,,, +US-IL-62823,US,IL,62823,7,,,, +US-IL-62824,US,IL,62824,6.75,,,, +US-IL-62825,US,IL,62825,7.25,,,, +US-IL-62827,US,IL,62827,6.25,,,, +US-IL-62828,US,IL,62828,6.25,,,, +US-IL-62829,US,IL,62829,6.25,,,, +US-IL-62830,US,IL,62830,6.5,,,, +US-IL-62831,US,IL,62831,6.25,,,, +US-IL-62832,US,IL,62832,8.25,,,, +US-IL-62833,US,IL,62833,6.25,,,, +US-IL-62834,US,IL,62834,6.25,,,, +US-IL-62835,US,IL,62835,6.25,,,, +US-IL-62836,US,IL,62836,7.25,,,, +US-IL-62837,US,IL,62837,7,,,, +US-IL-62838,US,IL,62838,6.25,,,, +US-IL-62839,US,IL,62839,7.25,,,, +US-IL-62840,US,IL,62840,8.25,,,, +US-IL-62841,US,IL,62841,7.25,,,, +US-IL-62842,US,IL,62842,7,,,, +US-IL-62843,US,IL,62843,6.25,,,, +US-IL-62844,US,IL,62844,6.25,,,, +US-IL-62846,US,IL,62846,6.5,,,, +US-IL-62848,US,IL,62848,6.25,,,, +US-IL-62849,US,IL,62849,6.5,,,, +US-IL-62850,US,IL,62850,7,,,, +US-IL-62851,US,IL,62851,7,,,, +US-IL-62852,US,IL,62852,6.25,,,, +US-IL-62853,US,IL,62853,6.5,,,, +US-IL-62854,US,IL,62854,6.5,,,, +US-IL-62855,US,IL,62855,6.25,,,, +US-IL-62856,US,IL,62856,7.25,,,, +US-IL-62858,US,IL,62858,6.75,,,, +US-IL-62859,US,IL,62859,6.25,,,, +US-IL-62860,US,IL,62860,7.25,,,, +US-IL-62861,US,IL,62861,6.25,,,, +US-IL-62862,US,IL,62862,6.25,,,, +US-IL-62863,US,IL,62863,6.25,,,, +US-IL-62864,US,IL,62864,8,,,, +US-IL-62865,US,IL,62865,7.25,,,, +US-IL-62866,US,IL,62866,6.5,,,, +US-IL-62867,US,IL,62867,6.25,,,, +US-IL-62868,US,IL,62868,6.75,,,, +US-IL-62869,US,IL,62869,6.25,,,, +US-IL-62870,US,IL,62870,6.5,,,, +US-IL-62871,US,IL,62871,6.25,,,, +US-IL-62872,US,IL,62872,6.5,,,, +US-IL-62874,US,IL,62874,8.25,,,, +US-IL-62875,US,IL,62875,6.5,,,, +US-IL-62876,US,IL,62876,6.25,,,, +US-IL-62877,US,IL,62877,6.25,,,, +US-IL-62878,US,IL,62878,7,,,, +US-IL-62879,US,IL,62879,6.75,,,, +US-IL-62880,US,IL,62880,6.25,,,, +US-IL-62881,US,IL,62881,7.5,,,, +US-IL-62882,US,IL,62882,6.5,,,, +US-IL-62883,US,IL,62883,6.5,,,, +US-IL-62884,US,IL,62884,9,,,, +US-IL-62885,US,IL,62885,6.25,,,, +US-IL-62886,US,IL,62886,7,,,, +US-IL-62887,US,IL,62887,6.25,,,, +US-IL-62888,US,IL,62888,6.75,,,, +US-IL-62889,US,IL,62889,6.5,,,, +US-IL-62890,US,IL,62890,7.25,,,, +US-IL-62891,US,IL,62891,7.25,,,, +US-IL-62892,US,IL,62892,6.5,,,, +US-IL-62893,US,IL,62893,6.5,,,, +US-IL-62894,US,IL,62894,6.5,,,, +US-IL-62895,US,IL,62895,7,,,, +US-IL-62896,US,IL,62896,8.25,,,, +US-IL-62897,US,IL,62897,7.25,,,, +US-IL-62898,US,IL,62898,6.5,,,, +US-IL-62899,US,IL,62899,6.75,,,, +US-IL-62901,US,IL,62901,8.25,,,, +US-IL-62902,US,IL,62902,6.25,,,, +US-IL-62903,US,IL,62903,6.25,,,, +US-IL-62905,US,IL,62905,7.5,,,, +US-IL-62906,US,IL,62906,7.5,,,, +US-IL-62907,US,IL,62907,6.25,,,, +US-IL-62908,US,IL,62908,6.25,,,, +US-IL-62909,US,IL,62909,6.75,,,, +US-IL-62910,US,IL,62910,6.25,,,, +US-IL-62912,US,IL,62912,6.75,,,, +US-IL-62914,US,IL,62914,6.25,,,, +US-IL-62915,US,IL,62915,8.75,,,, +US-IL-62916,US,IL,62916,6.25,,,, +US-IL-62917,US,IL,62917,8,,,, +US-IL-62918,US,IL,62918,8.75,,,, +US-IL-62919,US,IL,62919,6.25,,,, +US-IL-62920,US,IL,62920,7.5,,,, +US-IL-62921,US,IL,62921,7.25,,,, +US-IL-62922,US,IL,62922,7.25,,,, +US-IL-62923,US,IL,62923,6.75,,,, +US-IL-62924,US,IL,62924,6.25,,,, +US-IL-62926,US,IL,62926,7.5,,,, +US-IL-62927,US,IL,62927,6.25,,,, +US-IL-62928,US,IL,62928,6.25,,,, +US-IL-62930,US,IL,62930,8,,,, +US-IL-62931,US,IL,62931,6.25,,,, +US-IL-62932,US,IL,62932,6.25,,,, +US-IL-62933,US,IL,62933,7.25,,,, +US-IL-62934,US,IL,62934,6.25,,,, +US-IL-62935,US,IL,62935,8,,,, +US-IL-62938,US,IL,62938,6.25,,,, +US-IL-62939,US,IL,62939,6.75,,,, +US-IL-62940,US,IL,62940,6.25,,,, +US-IL-62941,US,IL,62941,6.25,,,, +US-IL-62942,US,IL,62942,6.25,,,, +US-IL-62943,US,IL,62943,6.75,,,, +US-IL-62946,US,IL,62946,8,,,, +US-IL-62947,US,IL,62947,6.25,,,, +US-IL-62948,US,IL,62948,8.5,,,, +US-IL-62949,US,IL,62949,8.25,,,, +US-IL-62950,US,IL,62950,6.25,,,, +US-IL-62951,US,IL,62951,8.75,,,, +US-IL-62952,US,IL,62952,7.5,,,, +US-IL-62953,US,IL,62953,6.25,,,, +US-IL-62954,US,IL,62954,6.25,,,, +US-IL-62955,US,IL,62955,6.25,,,, +US-IL-62956,US,IL,62956,6.25,,,, +US-IL-62957,US,IL,62957,6.25,,,, +US-IL-62958,US,IL,62958,6.25,,,, +US-IL-62959,US,IL,62959,8.5,,,, +US-IL-62960,US,IL,62960,6.25,,,, +US-IL-62961,US,IL,62961,7.5,,,, +US-IL-62962,US,IL,62962,6.25,,,, +US-IL-62963,US,IL,62963,6.25,,,, +US-IL-62964,US,IL,62964,6.25,,,, +US-IL-62965,US,IL,62965,8,,,, +US-IL-62966,US,IL,62966,6.25,,,, +US-IL-62967,US,IL,62967,6.75,,,, +US-IL-62969,US,IL,62969,6.25,,,, +US-IL-62970,US,IL,62970,6.25,,,, +US-IL-62971,US,IL,62971,6.25,,,, +US-IL-62972,US,IL,62972,6.75,,,, +US-IL-62973,US,IL,62973,6.25,,,, +US-IL-62974,US,IL,62974,7.25,,,, +US-IL-62975,US,IL,62975,6.25,,,, +US-IL-62976,US,IL,62976,6.25,,,, +US-IL-62977,US,IL,62977,8,,,, +US-IL-62979,US,IL,62979,6.25,,,, +US-IL-62982,US,IL,62982,6.25,,,, +US-IL-62983,US,IL,62983,7.25,,,, +US-IL-62984,US,IL,62984,6.25,,,, +US-IL-62985,US,IL,62985,6.75,,,, +US-IL-62987,US,IL,62987,8,,,, +US-IL-62988,US,IL,62988,6.25,,,, +US-IL-62990,US,IL,62990,6.25,,,, +US-IL-62992,US,IL,62992,6.25,,,, +US-IL-62994,US,IL,62994,6.25,,,, +US-IL-62995,US,IL,62995,6.75,,,, +US-IL-62996,US,IL,62996,6.25,,,, +US-IL-62997,US,IL,62997,6.75,,,, +US-IL-62998,US,IL,62998,7.5,,,, +US-IL-62999,US,IL,62999,7.25,,,, +US-IN-46001,US,IN,46001,7,,,, +US-IN-46011,US,IN,46011,7,,,, +US-IN-46012,US,IN,46012,7,,,, +US-IN-46013,US,IN,46013,7,,,, +US-IN-46014,US,IN,46014,7,,,, +US-IN-46015,US,IN,46015,7,,,, +US-IN-46016,US,IN,46016,7,,,, +US-IN-46017,US,IN,46017,7,,,, +US-IN-46018,US,IN,46018,7,,,, +US-IN-46030,US,IN,46030,7,,,, +US-IN-46031,US,IN,46031,7,,,, +US-IN-46032,US,IN,46032,7,,,, +US-IN-46033,US,IN,46033,7,,,, +US-IN-46034,US,IN,46034,7,,,, +US-IN-46035,US,IN,46035,7,,,, +US-IN-46036,US,IN,46036,7,,,, +US-IN-46037,US,IN,46037,7,,,, +US-IN-46038,US,IN,46038,7,,,, +US-IN-46039,US,IN,46039,7,,,, +US-IN-46040,US,IN,46040,7,,,, +US-IN-46041,US,IN,46041,7,,,, +US-IN-46044,US,IN,46044,7,,,, +US-IN-46045,US,IN,46045,7,,,, +US-IN-46047,US,IN,46047,7,,,, +US-IN-46048,US,IN,46048,7,,,, +US-IN-46049,US,IN,46049,7,,,, +US-IN-46050,US,IN,46050,7,,,, +US-IN-46051,US,IN,46051,7,,,, +US-IN-46052,US,IN,46052,7,,,, +US-IN-46055,US,IN,46055,7,,,, +US-IN-46056,US,IN,46056,7,,,, +US-IN-46057,US,IN,46057,7,,,, +US-IN-46058,US,IN,46058,7,,,, +US-IN-46060,US,IN,46060,7,,,, +US-IN-46061,US,IN,46061,7,,,, +US-IN-46062,US,IN,46062,7,,,, +US-IN-46063,US,IN,46063,7,,,, +US-IN-46064,US,IN,46064,7,,,, +US-IN-46065,US,IN,46065,7,,,, +US-IN-46067,US,IN,46067,7,,,, +US-IN-46068,US,IN,46068,7,,,, +US-IN-46069,US,IN,46069,7,,,, +US-IN-46070,US,IN,46070,7,,,, +US-IN-46071,US,IN,46071,7,,,, +US-IN-46072,US,IN,46072,7,,,, +US-IN-46074,US,IN,46074,7,,,, +US-IN-46075,US,IN,46075,7,,,, +US-IN-46076,US,IN,46076,7,,,, +US-IN-46077,US,IN,46077,7,,,, +US-IN-46082,US,IN,46082,7,,,, +US-IN-46085,US,IN,46085,7,,,, +US-IN-46102,US,IN,46102,7,,,, +US-IN-46103,US,IN,46103,7,,,, +US-IN-46104,US,IN,46104,7,,,, +US-IN-46105,US,IN,46105,7,,,, +US-IN-46106,US,IN,46106,7,,,, +US-IN-46107,US,IN,46107,7,,,, +US-IN-46110,US,IN,46110,7,,,, +US-IN-46111,US,IN,46111,7,,,, +US-IN-46112,US,IN,46112,7,,,, +US-IN-46113,US,IN,46113,7,,,, +US-IN-46115,US,IN,46115,7,,,, +US-IN-46117,US,IN,46117,7,,,, +US-IN-46118,US,IN,46118,7,,,, +US-IN-46120,US,IN,46120,7,,,, +US-IN-46121,US,IN,46121,7,,,, +US-IN-46122,US,IN,46122,7,,,, +US-IN-46123,US,IN,46123,7,,,, +US-IN-46124,US,IN,46124,7,,,, +US-IN-46125,US,IN,46125,7,,,, +US-IN-46126,US,IN,46126,7,,,, +US-IN-46127,US,IN,46127,7,,,, +US-IN-46128,US,IN,46128,7,,,, +US-IN-46129,US,IN,46129,7,,,, +US-IN-46130,US,IN,46130,7,,,, +US-IN-46131,US,IN,46131,7,,,, +US-IN-46133,US,IN,46133,7,,,, +US-IN-46135,US,IN,46135,7,,,, +US-IN-46140,US,IN,46140,7,,,, +US-IN-46142,US,IN,46142,7,,,, +US-IN-46143,US,IN,46143,7,,,, +US-IN-46144,US,IN,46144,7,,,, +US-IN-46146,US,IN,46146,7,,,, +US-IN-46147,US,IN,46147,7,,,, +US-IN-46148,US,IN,46148,7,,,, +US-IN-46149,US,IN,46149,7,,,, +US-IN-46150,US,IN,46150,7,,,, +US-IN-46151,US,IN,46151,7,,,, +US-IN-46154,US,IN,46154,7,,,, +US-IN-46155,US,IN,46155,7,,,, +US-IN-46156,US,IN,46156,7,,,, +US-IN-46157,US,IN,46157,7,,,, +US-IN-46158,US,IN,46158,7,,,, +US-IN-46160,US,IN,46160,7,,,, +US-IN-46161,US,IN,46161,7,,,, +US-IN-46162,US,IN,46162,7,,,, +US-IN-46163,US,IN,46163,7,,,, +US-IN-46164,US,IN,46164,7,,,, +US-IN-46165,US,IN,46165,7,,,, +US-IN-46166,US,IN,46166,7,,,, +US-IN-46167,US,IN,46167,7,,,, +US-IN-46168,US,IN,46168,7,,,, +US-IN-46170,US,IN,46170,7,,,, +US-IN-46171,US,IN,46171,7,,,, +US-IN-46172,US,IN,46172,7,,,, +US-IN-46173,US,IN,46173,7,,,, +US-IN-46175,US,IN,46175,7,,,, +US-IN-46176,US,IN,46176,7,,,, +US-IN-46180,US,IN,46180,7,,,, +US-IN-46181,US,IN,46181,7,,,, +US-IN-46182,US,IN,46182,7,,,, +US-IN-46183,US,IN,46183,7,,,, +US-IN-46184,US,IN,46184,7,,,, +US-IN-46186,US,IN,46186,7,,,, +US-IN-46197,US,IN,46197,7,,,, +US-IN-46201,US,IN,46201,7,,,, +US-IN-46202,US,IN,46202,7,,,, +US-IN-46203,US,IN,46203,7,,,, +US-IN-46204,US,IN,46204,7,,,, +US-IN-46205,US,IN,46205,7,,,, +US-IN-46206,US,IN,46206,7,,,, +US-IN-46207,US,IN,46207,7,,,, +US-IN-46208,US,IN,46208,7,,,, +US-IN-46209,US,IN,46209,7,,,, +US-IN-46211,US,IN,46211,7,,,, +US-IN-46213,US,IN,46213,7,,,, +US-IN-46214,US,IN,46214,7,,,, +US-IN-46216,US,IN,46216,7,,,, +US-IN-46217,US,IN,46217,7,,,, +US-IN-46218,US,IN,46218,7,,,, +US-IN-46219,US,IN,46219,7,,,, +US-IN-46220,US,IN,46220,7,,,, +US-IN-46221,US,IN,46221,7,,,, +US-IN-46222,US,IN,46222,7,,,, +US-IN-46224,US,IN,46224,7,,,, +US-IN-46225,US,IN,46225,7,,,, +US-IN-46226,US,IN,46226,7,,,, +US-IN-46227,US,IN,46227,7,,,, +US-IN-46228,US,IN,46228,7,,,, +US-IN-46229,US,IN,46229,7,,,, +US-IN-46230,US,IN,46230,7,,,, +US-IN-46231,US,IN,46231,7,,,, +US-IN-46234,US,IN,46234,7,,,, +US-IN-46235,US,IN,46235,7,,,, +US-IN-46236,US,IN,46236,7,,,, +US-IN-46237,US,IN,46237,7,,,, +US-IN-46239,US,IN,46239,7,,,, +US-IN-46240,US,IN,46240,7,,,, +US-IN-46241,US,IN,46241,7,,,, +US-IN-46242,US,IN,46242,7,,,, +US-IN-46244,US,IN,46244,7,,,, +US-IN-46247,US,IN,46247,7,,,, +US-IN-46249,US,IN,46249,7,,,, +US-IN-46250,US,IN,46250,7,,,, +US-IN-46251,US,IN,46251,7,,,, +US-IN-46253,US,IN,46253,7,,,, +US-IN-46254,US,IN,46254,7,,,, +US-IN-46255,US,IN,46255,7,,,, +US-IN-46256,US,IN,46256,7,,,, +US-IN-46259,US,IN,46259,7,,,, +US-IN-46260,US,IN,46260,7,,,, +US-IN-46262,US,IN,46262,7,,,, +US-IN-46266,US,IN,46266,7,,,, +US-IN-46268,US,IN,46268,7,,,, +US-IN-46274,US,IN,46274,7,,,, +US-IN-46275,US,IN,46275,7,,,, +US-IN-46277,US,IN,46277,7,,,, +US-IN-46278,US,IN,46278,7,,,, +US-IN-46280,US,IN,46280,7,,,, +US-IN-46282,US,IN,46282,7,,,, +US-IN-46283,US,IN,46283,7,,,, +US-IN-46285,US,IN,46285,7,,,, +US-IN-46290,US,IN,46290,7,,,, +US-IN-46291,US,IN,46291,7,,,, +US-IN-46295,US,IN,46295,7,,,, +US-IN-46296,US,IN,46296,7,,,, +US-IN-46298,US,IN,46298,7,,,, +US-IN-46301,US,IN,46301,7,,,, +US-IN-46302,US,IN,46302,7,,,, +US-IN-46303,US,IN,46303,7,,,, +US-IN-46304,US,IN,46304,7,,,, +US-IN-46307,US,IN,46307,7,,,, +US-IN-46308,US,IN,46308,7,,,, +US-IN-46310,US,IN,46310,7,,,, +US-IN-46311,US,IN,46311,7,,,, +US-IN-46312,US,IN,46312,7,,,, +US-IN-46319,US,IN,46319,7,,,, +US-IN-46320,US,IN,46320,7,,,, +US-IN-46321,US,IN,46321,7,,,, +US-IN-46322,US,IN,46322,7,,,, +US-IN-46323,US,IN,46323,7,,,, +US-IN-46324,US,IN,46324,7,,,, +US-IN-46325,US,IN,46325,7,,,, +US-IN-46327,US,IN,46327,7,,,, +US-IN-46340,US,IN,46340,7,,,, +US-IN-46341,US,IN,46341,7,,,, +US-IN-46342,US,IN,46342,7,,,, +US-IN-46345,US,IN,46345,7,,,, +US-IN-46346,US,IN,46346,7,,,, +US-IN-46347,US,IN,46347,7,,,, +US-IN-46348,US,IN,46348,7,,,, +US-IN-46349,US,IN,46349,7,,,, +US-IN-46350,US,IN,46350,7,,,, +US-IN-46352,US,IN,46352,7,,,, +US-IN-46355,US,IN,46355,7,,,, +US-IN-46356,US,IN,46356,7,,,, +US-IN-46360,US,IN,46360,7,,,, +US-IN-46361,US,IN,46361,7,,,, +US-IN-46365,US,IN,46365,7,,,, +US-IN-46366,US,IN,46366,7,,,, +US-IN-46368,US,IN,46368,7,,,, +US-IN-46371,US,IN,46371,7,,,, +US-IN-46372,US,IN,46372,7,,,, +US-IN-46373,US,IN,46373,7,,,, +US-IN-46374,US,IN,46374,7,,,, +US-IN-46375,US,IN,46375,7,,,, +US-IN-46376,US,IN,46376,7,,,, +US-IN-46377,US,IN,46377,7,,,, +US-IN-46379,US,IN,46379,7,,,, +US-IN-46380,US,IN,46380,7,,,, +US-IN-46381,US,IN,46381,7,,,, +US-IN-46382,US,IN,46382,7,,,, +US-IN-46383,US,IN,46383,7,,,, +US-IN-46384,US,IN,46384,7,,,, +US-IN-46385,US,IN,46385,7,,,, +US-IN-46390,US,IN,46390,7,,,, +US-IN-46391,US,IN,46391,7,,,, +US-IN-46392,US,IN,46392,7,,,, +US-IN-46393,US,IN,46393,7,,,, +US-IN-46394,US,IN,46394,7,,,, +US-IN-46401,US,IN,46401,7,,,, +US-IN-46402,US,IN,46402,7,,,, +US-IN-46403,US,IN,46403,7,,,, +US-IN-46404,US,IN,46404,7,,,, +US-IN-46405,US,IN,46405,7,,,, +US-IN-46406,US,IN,46406,7,,,, +US-IN-46407,US,IN,46407,7,,,, +US-IN-46408,US,IN,46408,7,,,, +US-IN-46409,US,IN,46409,7,,,, +US-IN-46410,US,IN,46410,7,,,, +US-IN-46411,US,IN,46411,7,,,, +US-IN-46501,US,IN,46501,7,,,, +US-IN-46502,US,IN,46502,7,,,, +US-IN-46504,US,IN,46504,7,,,, +US-IN-46506,US,IN,46506,7,,,, +US-IN-46507,US,IN,46507,7,,,, +US-IN-46508,US,IN,46508,7,,,, +US-IN-46510,US,IN,46510,7,,,, +US-IN-46511,US,IN,46511,7,,,, +US-IN-46513,US,IN,46513,7,,,, +US-IN-46514,US,IN,46514,7,,,, +US-IN-46515,US,IN,46515,7,,,, +US-IN-46516,US,IN,46516,7,,,, +US-IN-46517,US,IN,46517,7,,,, +US-IN-46524,US,IN,46524,7,,,, +US-IN-46526,US,IN,46526,7,,,, +US-IN-46527,US,IN,46527,7,,,, +US-IN-46528,US,IN,46528,7,,,, +US-IN-46530,US,IN,46530,7,,,, +US-IN-46531,US,IN,46531,7,,,, +US-IN-46532,US,IN,46532,7,,,, +US-IN-46534,US,IN,46534,7,,,, +US-IN-46536,US,IN,46536,7,,,, +US-IN-46537,US,IN,46537,7,,,, +US-IN-46538,US,IN,46538,7,,,, +US-IN-46539,US,IN,46539,7,,,, +US-IN-46540,US,IN,46540,7,,,, +US-IN-46542,US,IN,46542,7,,,, +US-IN-46543,US,IN,46543,7,,,, +US-IN-46544,US,IN,46544,7,,,, +US-IN-46545,US,IN,46545,7,,,, +US-IN-46546,US,IN,46546,7,,,, +US-IN-46550,US,IN,46550,7,,,, +US-IN-46552,US,IN,46552,7,,,, +US-IN-46553,US,IN,46553,7,,,, +US-IN-46554,US,IN,46554,7,,,, +US-IN-46555,US,IN,46555,7,,,, +US-IN-46556,US,IN,46556,7,,,, +US-IN-46561,US,IN,46561,7,,,, +US-IN-46562,US,IN,46562,7,,,, +US-IN-46563,US,IN,46563,7,,,, +US-IN-46565,US,IN,46565,7,,,, +US-IN-46567,US,IN,46567,7,,,, +US-IN-46570,US,IN,46570,7,,,, +US-IN-46571,US,IN,46571,7,,,, +US-IN-46572,US,IN,46572,7,,,, +US-IN-46573,US,IN,46573,7,,,, +US-IN-46574,US,IN,46574,7,,,, +US-IN-46580,US,IN,46580,7,,,, +US-IN-46581,US,IN,46581,7,,,, +US-IN-46582,US,IN,46582,7,,,, +US-IN-46590,US,IN,46590,7,,,, +US-IN-46595,US,IN,46595,7,,,, +US-IN-46601,US,IN,46601,7,,,, +US-IN-46613,US,IN,46613,7,,,, +US-IN-46614,US,IN,46614,7,,,, +US-IN-46615,US,IN,46615,7,,,, +US-IN-46616,US,IN,46616,7,,,, +US-IN-46617,US,IN,46617,7,,,, +US-IN-46619,US,IN,46619,7,,,, +US-IN-46624,US,IN,46624,7,,,, +US-IN-46626,US,IN,46626,7,,,, +US-IN-46628,US,IN,46628,7,,,, +US-IN-46634,US,IN,46634,7,,,, +US-IN-46635,US,IN,46635,7,,,, +US-IN-46637,US,IN,46637,7,,,, +US-IN-46660,US,IN,46660,7,,,, +US-IN-46680,US,IN,46680,7,,,, +US-IN-46699,US,IN,46699,7,,,, +US-IN-46701,US,IN,46701,7,,,, +US-IN-46702,US,IN,46702,7,,,, +US-IN-46703,US,IN,46703,7,,,, +US-IN-46704,US,IN,46704,7,,,, +US-IN-46705,US,IN,46705,7,,,, +US-IN-46706,US,IN,46706,7,,,, +US-IN-46710,US,IN,46710,7,,,, +US-IN-46711,US,IN,46711,7,,,, +US-IN-46713,US,IN,46713,7,,,, +US-IN-46714,US,IN,46714,7,,,, +US-IN-46721,US,IN,46721,7,,,, +US-IN-46723,US,IN,46723,7,,,, +US-IN-46725,US,IN,46725,7,,,, +US-IN-46730,US,IN,46730,7,,,, +US-IN-46731,US,IN,46731,7,,,, +US-IN-46732,US,IN,46732,7,,,, +US-IN-46733,US,IN,46733,7,,,, +US-IN-46737,US,IN,46737,7,,,, +US-IN-46738,US,IN,46738,7,,,, +US-IN-46740,US,IN,46740,7,,,, +US-IN-46741,US,IN,46741,7,,,, +US-IN-46742,US,IN,46742,7,,,, +US-IN-46743,US,IN,46743,7,,,, +US-IN-46745,US,IN,46745,7,,,, +US-IN-46746,US,IN,46746,7,,,, +US-IN-46747,US,IN,46747,7,,,, +US-IN-46748,US,IN,46748,7,,,, +US-IN-46750,US,IN,46750,7,,,, +US-IN-46755,US,IN,46755,7,,,, +US-IN-46759,US,IN,46759,7,,,, +US-IN-46760,US,IN,46760,7,,,, +US-IN-46761,US,IN,46761,7,,,, +US-IN-46763,US,IN,46763,7,,,, +US-IN-46764,US,IN,46764,7,,,, +US-IN-46765,US,IN,46765,7,,,, +US-IN-46766,US,IN,46766,7,,,, +US-IN-46767,US,IN,46767,7,,,, +US-IN-46769,US,IN,46769,7,,,, +US-IN-46770,US,IN,46770,7,,,, +US-IN-46771,US,IN,46771,7,,,, +US-IN-46772,US,IN,46772,7,,,, +US-IN-46773,US,IN,46773,7,,,, +US-IN-46774,US,IN,46774,7,,,, +US-IN-46776,US,IN,46776,7,,,, +US-IN-46777,US,IN,46777,7,,,, +US-IN-46778,US,IN,46778,7,,,, +US-IN-46779,US,IN,46779,7,,,, +US-IN-46780,US,IN,46780,7,,,, +US-IN-46781,US,IN,46781,7,,,, +US-IN-46782,US,IN,46782,7,,,, +US-IN-46783,US,IN,46783,7,,,, +US-IN-46784,US,IN,46784,7,,,, +US-IN-46785,US,IN,46785,7,,,, +US-IN-46786,US,IN,46786,7,,,, +US-IN-46787,US,IN,46787,7,,,, +US-IN-46788,US,IN,46788,7,,,, +US-IN-46789,US,IN,46789,7,,,, +US-IN-46791,US,IN,46791,7,,,, +US-IN-46792,US,IN,46792,7,,,, +US-IN-46793,US,IN,46793,7,,,, +US-IN-46794,US,IN,46794,7,,,, +US-IN-46795,US,IN,46795,7,,,, +US-IN-46796,US,IN,46796,7,,,, +US-IN-46797,US,IN,46797,7,,,, +US-IN-46798,US,IN,46798,7,,,, +US-IN-46799,US,IN,46799,7,,,, +US-IN-46801,US,IN,46801,7,,,, +US-IN-46802,US,IN,46802,7,,,, +US-IN-46803,US,IN,46803,7,,,, +US-IN-46804,US,IN,46804,7,,,, +US-IN-46805,US,IN,46805,7,,,, +US-IN-46806,US,IN,46806,7,,,, +US-IN-46807,US,IN,46807,7,,,, +US-IN-46808,US,IN,46808,7,,,, +US-IN-46809,US,IN,46809,7,,,, +US-IN-46814,US,IN,46814,7,,,, +US-IN-46815,US,IN,46815,7,,,, +US-IN-46816,US,IN,46816,7,,,, +US-IN-46818,US,IN,46818,7,,,, +US-IN-46819,US,IN,46819,7,,,, +US-IN-46825,US,IN,46825,7,,,, +US-IN-46835,US,IN,46835,7,,,, +US-IN-46845,US,IN,46845,7,,,, +US-IN-46850,US,IN,46850,7,,,, +US-IN-46851,US,IN,46851,7,,,, +US-IN-46852,US,IN,46852,7,,,, +US-IN-46853,US,IN,46853,7,,,, +US-IN-46854,US,IN,46854,7,,,, +US-IN-46855,US,IN,46855,7,,,, +US-IN-46856,US,IN,46856,7,,,, +US-IN-46857,US,IN,46857,7,,,, +US-IN-46858,US,IN,46858,7,,,, +US-IN-46859,US,IN,46859,7,,,, +US-IN-46860,US,IN,46860,7,,,, +US-IN-46861,US,IN,46861,7,,,, +US-IN-46862,US,IN,46862,7,,,, +US-IN-46863,US,IN,46863,7,,,, +US-IN-46864,US,IN,46864,7,,,, +US-IN-46865,US,IN,46865,7,,,, +US-IN-46866,US,IN,46866,7,,,, +US-IN-46867,US,IN,46867,7,,,, +US-IN-46868,US,IN,46868,7,,,, +US-IN-46869,US,IN,46869,7,,,, +US-IN-46885,US,IN,46885,7,,,, +US-IN-46895,US,IN,46895,7,,,, +US-IN-46896,US,IN,46896,7,,,, +US-IN-46897,US,IN,46897,7,,,, +US-IN-46898,US,IN,46898,7,,,, +US-IN-46899,US,IN,46899,7,,,, +US-IN-46901,US,IN,46901,7,,,, +US-IN-46902,US,IN,46902,7,,,, +US-IN-46903,US,IN,46903,7,,,, +US-IN-46904,US,IN,46904,7,,,, +US-IN-46910,US,IN,46910,7,,,, +US-IN-46911,US,IN,46911,7,,,, +US-IN-46912,US,IN,46912,7,,,, +US-IN-46913,US,IN,46913,7,,,, +US-IN-46914,US,IN,46914,7,,,, +US-IN-46915,US,IN,46915,7,,,, +US-IN-46916,US,IN,46916,7,,,, +US-IN-46917,US,IN,46917,7,,,, +US-IN-46919,US,IN,46919,7,,,, +US-IN-46920,US,IN,46920,7,,,, +US-IN-46921,US,IN,46921,7,,,, +US-IN-46922,US,IN,46922,7,,,, +US-IN-46923,US,IN,46923,7,,,, +US-IN-46926,US,IN,46926,7,,,, +US-IN-46928,US,IN,46928,7,,,, +US-IN-46929,US,IN,46929,7,,,, +US-IN-46930,US,IN,46930,7,,,, +US-IN-46931,US,IN,46931,7,,,, +US-IN-46932,US,IN,46932,7,,,, +US-IN-46933,US,IN,46933,7,,,, +US-IN-46935,US,IN,46935,7,,,, +US-IN-46936,US,IN,46936,7,,,, +US-IN-46937,US,IN,46937,7,,,, +US-IN-46938,US,IN,46938,7,,,, +US-IN-46939,US,IN,46939,7,,,, +US-IN-46940,US,IN,46940,7,,,, +US-IN-46941,US,IN,46941,7,,,, +US-IN-46942,US,IN,46942,7,,,, +US-IN-46943,US,IN,46943,7,,,, +US-IN-46945,US,IN,46945,7,,,, +US-IN-46946,US,IN,46946,7,,,, +US-IN-46947,US,IN,46947,7,,,, +US-IN-46950,US,IN,46950,7,,,, +US-IN-46951,US,IN,46951,7,,,, +US-IN-46952,US,IN,46952,7,,,, +US-IN-46953,US,IN,46953,7,,,, +US-IN-46957,US,IN,46957,7,,,, +US-IN-46958,US,IN,46958,7,,,, +US-IN-46959,US,IN,46959,7,,,, +US-IN-46960,US,IN,46960,7,,,, +US-IN-46961,US,IN,46961,7,,,, +US-IN-46962,US,IN,46962,7,,,, +US-IN-46965,US,IN,46965,7,,,, +US-IN-46967,US,IN,46967,7,,,, +US-IN-46968,US,IN,46968,7,,,, +US-IN-46970,US,IN,46970,7,,,, +US-IN-46971,US,IN,46971,7,,,, +US-IN-46974,US,IN,46974,7,,,, +US-IN-46975,US,IN,46975,7,,,, +US-IN-46977,US,IN,46977,7,,,, +US-IN-46978,US,IN,46978,7,,,, +US-IN-46979,US,IN,46979,7,,,, +US-IN-46980,US,IN,46980,7,,,, +US-IN-46982,US,IN,46982,7,,,, +US-IN-46984,US,IN,46984,7,,,, +US-IN-46985,US,IN,46985,7,,,, +US-IN-46986,US,IN,46986,7,,,, +US-IN-46987,US,IN,46987,7,,,, +US-IN-46988,US,IN,46988,7,,,, +US-IN-46989,US,IN,46989,7,,,, +US-IN-46990,US,IN,46990,7,,,, +US-IN-46991,US,IN,46991,7,,,, +US-IN-46992,US,IN,46992,7,,,, +US-IN-46994,US,IN,46994,7,,,, +US-IN-46995,US,IN,46995,7,,,, +US-IN-46996,US,IN,46996,7,,,, +US-IN-46998,US,IN,46998,7,,,, +US-IN-47001,US,IN,47001,7,,,, +US-IN-47003,US,IN,47003,7,,,, +US-IN-47006,US,IN,47006,7,,,, +US-IN-47010,US,IN,47010,7,,,, +US-IN-47011,US,IN,47011,7,,,, +US-IN-47012,US,IN,47012,7,,,, +US-IN-47016,US,IN,47016,7,,,, +US-IN-47017,US,IN,47017,7,,,, +US-IN-47018,US,IN,47018,7,,,, +US-IN-47019,US,IN,47019,7,,,, +US-IN-47020,US,IN,47020,7,,,, +US-IN-47021,US,IN,47021,7,,,, +US-IN-47022,US,IN,47022,7,,,, +US-IN-47023,US,IN,47023,7,,,, +US-IN-47024,US,IN,47024,7,,,, +US-IN-47025,US,IN,47025,7,,,, +US-IN-47030,US,IN,47030,7,,,, +US-IN-47031,US,IN,47031,7,,,, +US-IN-47032,US,IN,47032,7,,,, +US-IN-47033,US,IN,47033,7,,,, +US-IN-47034,US,IN,47034,7,,,, +US-IN-47035,US,IN,47035,7,,,, +US-IN-47036,US,IN,47036,7,,,, +US-IN-47037,US,IN,47037,7,,,, +US-IN-47038,US,IN,47038,7,,,, +US-IN-47039,US,IN,47039,7,,,, +US-IN-47040,US,IN,47040,7,,,, +US-IN-47041,US,IN,47041,7,,,, +US-IN-47042,US,IN,47042,7,,,, +US-IN-47043,US,IN,47043,7,,,, +US-IN-47060,US,IN,47060,7,,,, +US-IN-47102,US,IN,47102,7,,,, +US-IN-47104,US,IN,47104,7,,,, +US-IN-47106,US,IN,47106,7,,,, +US-IN-47107,US,IN,47107,7,,,, +US-IN-47108,US,IN,47108,7,,,, +US-IN-47110,US,IN,47110,7,,,, +US-IN-47111,US,IN,47111,7,,,, +US-IN-47112,US,IN,47112,7,,,, +US-IN-47114,US,IN,47114,7,,,, +US-IN-47115,US,IN,47115,7,,,, +US-IN-47116,US,IN,47116,7,,,, +US-IN-47117,US,IN,47117,7,,,, +US-IN-47118,US,IN,47118,7,,,, +US-IN-47119,US,IN,47119,7,,,, +US-IN-47120,US,IN,47120,7,,,, +US-IN-47122,US,IN,47122,7,,,, +US-IN-47123,US,IN,47123,7,,,, +US-IN-47124,US,IN,47124,7,,,, +US-IN-47125,US,IN,47125,7,,,, +US-IN-47126,US,IN,47126,7,,,, +US-IN-47129,US,IN,47129,7,,,, +US-IN-47130,US,IN,47130,7,,,, +US-IN-47131,US,IN,47131,7,,,, +US-IN-47132,US,IN,47132,7,,,, +US-IN-47133,US,IN,47133,7,,,, +US-IN-47134,US,IN,47134,7,,,, +US-IN-47135,US,IN,47135,7,,,, +US-IN-47136,US,IN,47136,7,,,, +US-IN-47137,US,IN,47137,7,,,, +US-IN-47138,US,IN,47138,7,,,, +US-IN-47140,US,IN,47140,7,,,, +US-IN-47141,US,IN,47141,7,,,, +US-IN-47142,US,IN,47142,7,,,, +US-IN-47143,US,IN,47143,7,,,, +US-IN-47144,US,IN,47144,7,,,, +US-IN-47145,US,IN,47145,7,,,, +US-IN-47146,US,IN,47146,7,,,, +US-IN-47147,US,IN,47147,7,,,, +US-IN-47150,US,IN,47150,7,,,, +US-IN-47151,US,IN,47151,7,,,, +US-IN-47160,US,IN,47160,7,,,, +US-IN-47161,US,IN,47161,7,,,, +US-IN-47162,US,IN,47162,7,,,, +US-IN-47163,US,IN,47163,7,,,, +US-IN-47164,US,IN,47164,7,,,, +US-IN-47165,US,IN,47165,7,,,, +US-IN-47166,US,IN,47166,7,,,, +US-IN-47167,US,IN,47167,7,,,, +US-IN-47170,US,IN,47170,7,,,, +US-IN-47172,US,IN,47172,7,,,, +US-IN-47174,US,IN,47174,7,,,, +US-IN-47175,US,IN,47175,7,,,, +US-IN-47177,US,IN,47177,7,,,, +US-IN-47190,US,IN,47190,7,,,, +US-IN-47199,US,IN,47199,7,,,, +US-IN-47201,US,IN,47201,7,,,, +US-IN-47202,US,IN,47202,7,,,, +US-IN-47203,US,IN,47203,7,,,, +US-IN-47220,US,IN,47220,7,,,, +US-IN-47223,US,IN,47223,7,,,, +US-IN-47224,US,IN,47224,7,,,, +US-IN-47225,US,IN,47225,7,,,, +US-IN-47226,US,IN,47226,7,,,, +US-IN-47227,US,IN,47227,7,,,, +US-IN-47228,US,IN,47228,7,,,, +US-IN-47229,US,IN,47229,7,,,, +US-IN-47230,US,IN,47230,7,,,, +US-IN-47231,US,IN,47231,7,,,, +US-IN-47232,US,IN,47232,7,,,, +US-IN-47234,US,IN,47234,7,,,, +US-IN-47235,US,IN,47235,7,,,, +US-IN-47236,US,IN,47236,7,,,, +US-IN-47240,US,IN,47240,7,,,, +US-IN-47243,US,IN,47243,7,,,, +US-IN-47244,US,IN,47244,7,,,, +US-IN-47245,US,IN,47245,7,,,, +US-IN-47246,US,IN,47246,7,,,, +US-IN-47247,US,IN,47247,7,,,, +US-IN-47249,US,IN,47249,7,,,, +US-IN-47250,US,IN,47250,7,,,, +US-IN-47260,US,IN,47260,7,,,, +US-IN-47261,US,IN,47261,7,,,, +US-IN-47263,US,IN,47263,7,,,, +US-IN-47264,US,IN,47264,7,,,, +US-IN-47265,US,IN,47265,7,,,, +US-IN-47270,US,IN,47270,7,,,, +US-IN-47272,US,IN,47272,7,,,, +US-IN-47273,US,IN,47273,7,,,, +US-IN-47274,US,IN,47274,7,,,, +US-IN-47280,US,IN,47280,7,,,, +US-IN-47281,US,IN,47281,7,,,, +US-IN-47282,US,IN,47282,7,,,, +US-IN-47283,US,IN,47283,7,,,, +US-IN-47302,US,IN,47302,7,,,, +US-IN-47303,US,IN,47303,7,,,, +US-IN-47304,US,IN,47304,7,,,, +US-IN-47305,US,IN,47305,7,,,, +US-IN-47306,US,IN,47306,7,,,, +US-IN-47307,US,IN,47307,7,,,, +US-IN-47308,US,IN,47308,7,,,, +US-IN-47320,US,IN,47320,7,,,, +US-IN-47322,US,IN,47322,7,,,, +US-IN-47324,US,IN,47324,7,,,, +US-IN-47325,US,IN,47325,7,,,, +US-IN-47326,US,IN,47326,7,,,, +US-IN-47327,US,IN,47327,7,,,, +US-IN-47330,US,IN,47330,7,,,, +US-IN-47331,US,IN,47331,7,,,, +US-IN-47334,US,IN,47334,7,,,, +US-IN-47335,US,IN,47335,7,,,, +US-IN-47336,US,IN,47336,7,,,, +US-IN-47337,US,IN,47337,7,,,, +US-IN-47338,US,IN,47338,7,,,, +US-IN-47339,US,IN,47339,7,,,, +US-IN-47340,US,IN,47340,7,,,, +US-IN-47341,US,IN,47341,7,,,, +US-IN-47342,US,IN,47342,7,,,, +US-IN-47344,US,IN,47344,7,,,, +US-IN-47345,US,IN,47345,7,,,, +US-IN-47346,US,IN,47346,7,,,, +US-IN-47348,US,IN,47348,7,,,, +US-IN-47351,US,IN,47351,7,,,, +US-IN-47352,US,IN,47352,7,,,, +US-IN-47353,US,IN,47353,7,,,, +US-IN-47354,US,IN,47354,7,,,, +US-IN-47355,US,IN,47355,7,,,, +US-IN-47356,US,IN,47356,7,,,, +US-IN-47357,US,IN,47357,7,,,, +US-IN-47358,US,IN,47358,7,,,, +US-IN-47359,US,IN,47359,7,,,, +US-IN-47360,US,IN,47360,7,,,, +US-IN-47361,US,IN,47361,7,,,, +US-IN-47362,US,IN,47362,7,,,, +US-IN-47366,US,IN,47366,7,,,, +US-IN-47367,US,IN,47367,7,,,, +US-IN-47368,US,IN,47368,7,,,, +US-IN-47369,US,IN,47369,7,,,, +US-IN-47370,US,IN,47370,7,,,, +US-IN-47371,US,IN,47371,7,,,, +US-IN-47373,US,IN,47373,7,,,, +US-IN-47374,US,IN,47374,7,,,, +US-IN-47375,US,IN,47375,7,,,, +US-IN-47380,US,IN,47380,7,,,, +US-IN-47381,US,IN,47381,7,,,, +US-IN-47382,US,IN,47382,7,,,, +US-IN-47383,US,IN,47383,7,,,, +US-IN-47384,US,IN,47384,7,,,, +US-IN-47385,US,IN,47385,7,,,, +US-IN-47386,US,IN,47386,7,,,, +US-IN-47387,US,IN,47387,7,,,, +US-IN-47388,US,IN,47388,7,,,, +US-IN-47390,US,IN,47390,7,,,, +US-IN-47392,US,IN,47392,7,,,, +US-IN-47393,US,IN,47393,7,,,, +US-IN-47394,US,IN,47394,7,,,, +US-IN-47396,US,IN,47396,7,,,, +US-IN-47401,US,IN,47401,7,,,, +US-IN-47402,US,IN,47402,7,,,, +US-IN-47403,US,IN,47403,7,,,, +US-IN-47404,US,IN,47404,7,,,, +US-IN-47405,US,IN,47405,7,,,, +US-IN-47406,US,IN,47406,7,,,, +US-IN-47407,US,IN,47407,7,,,, +US-IN-47408,US,IN,47408,7,,,, +US-IN-47420,US,IN,47420,7,,,, +US-IN-47421,US,IN,47421,7,,,, +US-IN-47424,US,IN,47424,7,,,, +US-IN-47426,US,IN,47426,7,,,, +US-IN-47427,US,IN,47427,7,,,, +US-IN-47429,US,IN,47429,7,,,, +US-IN-47431,US,IN,47431,7,,,, +US-IN-47432,US,IN,47432,7,,,, +US-IN-47433,US,IN,47433,7,,,, +US-IN-47434,US,IN,47434,7,,,, +US-IN-47435,US,IN,47435,7,,,, +US-IN-47436,US,IN,47436,7,,,, +US-IN-47437,US,IN,47437,7,,,, +US-IN-47438,US,IN,47438,7,,,, +US-IN-47439,US,IN,47439,7,,,, +US-IN-47441,US,IN,47441,7,,,, +US-IN-47443,US,IN,47443,7,,,, +US-IN-47445,US,IN,47445,7,,,, +US-IN-47446,US,IN,47446,7,,,, +US-IN-47448,US,IN,47448,7,,,, +US-IN-47449,US,IN,47449,7,,,, +US-IN-47451,US,IN,47451,7,,,, +US-IN-47452,US,IN,47452,7,,,, +US-IN-47453,US,IN,47453,7,,,, +US-IN-47454,US,IN,47454,7,,,, +US-IN-47455,US,IN,47455,7,,,, +US-IN-47456,US,IN,47456,7,,,, +US-IN-47457,US,IN,47457,7,,,, +US-IN-47458,US,IN,47458,7,,,, +US-IN-47459,US,IN,47459,7,,,, +US-IN-47460,US,IN,47460,7,,,, +US-IN-47462,US,IN,47462,7,,,, +US-IN-47463,US,IN,47463,7,,,, +US-IN-47464,US,IN,47464,7,,,, +US-IN-47465,US,IN,47465,7,,,, +US-IN-47467,US,IN,47467,7,,,, +US-IN-47468,US,IN,47468,7,,,, +US-IN-47469,US,IN,47469,7,,,, +US-IN-47470,US,IN,47470,7,,,, +US-IN-47471,US,IN,47471,7,,,, +US-IN-47501,US,IN,47501,7,,,, +US-IN-47512,US,IN,47512,7,,,, +US-IN-47513,US,IN,47513,7,,,, +US-IN-47514,US,IN,47514,7,,,, +US-IN-47515,US,IN,47515,7,,,, +US-IN-47516,US,IN,47516,7,,,, +US-IN-47519,US,IN,47519,7,,,, +US-IN-47520,US,IN,47520,7,,,, +US-IN-47521,US,IN,47521,7,,,, +US-IN-47522,US,IN,47522,7,,,, +US-IN-47523,US,IN,47523,7,,,, +US-IN-47524,US,IN,47524,7,,,, +US-IN-47525,US,IN,47525,7,,,, +US-IN-47527,US,IN,47527,7,,,, +US-IN-47528,US,IN,47528,7,,,, +US-IN-47529,US,IN,47529,7,,,, +US-IN-47531,US,IN,47531,7,,,, +US-IN-47532,US,IN,47532,7,,,, +US-IN-47535,US,IN,47535,7,,,, +US-IN-47536,US,IN,47536,7,,,, +US-IN-47537,US,IN,47537,7,,,, +US-IN-47541,US,IN,47541,7,,,, +US-IN-47542,US,IN,47542,7,,,, +US-IN-47545,US,IN,47545,7,,,, +US-IN-47546,US,IN,47546,7,,,, +US-IN-47547,US,IN,47547,7,,,, +US-IN-47549,US,IN,47549,7,,,, +US-IN-47550,US,IN,47550,7,,,, +US-IN-47551,US,IN,47551,7,,,, +US-IN-47552,US,IN,47552,7,,,, +US-IN-47553,US,IN,47553,7,,,, +US-IN-47556,US,IN,47556,7,,,, +US-IN-47557,US,IN,47557,7,,,, +US-IN-47558,US,IN,47558,7,,,, +US-IN-47561,US,IN,47561,7,,,, +US-IN-47562,US,IN,47562,7,,,, +US-IN-47564,US,IN,47564,7,,,, +US-IN-47567,US,IN,47567,7,,,, +US-IN-47568,US,IN,47568,7,,,, +US-IN-47573,US,IN,47573,7,,,, +US-IN-47574,US,IN,47574,7,,,, +US-IN-47575,US,IN,47575,7,,,, +US-IN-47576,US,IN,47576,7,,,, +US-IN-47577,US,IN,47577,7,,,, +US-IN-47578,US,IN,47578,7,,,, +US-IN-47579,US,IN,47579,7,,,, +US-IN-47580,US,IN,47580,7,,,, +US-IN-47581,US,IN,47581,7,,,, +US-IN-47584,US,IN,47584,7,,,, +US-IN-47585,US,IN,47585,7,,,, +US-IN-47586,US,IN,47586,7,,,, +US-IN-47588,US,IN,47588,7,,,, +US-IN-47590,US,IN,47590,7,,,, +US-IN-47591,US,IN,47591,7,,,, +US-IN-47596,US,IN,47596,7,,,, +US-IN-47597,US,IN,47597,7,,,, +US-IN-47598,US,IN,47598,7,,,, +US-IN-47601,US,IN,47601,7,,,, +US-IN-47610,US,IN,47610,7,,,, +US-IN-47611,US,IN,47611,7,,,, +US-IN-47612,US,IN,47612,7,,,, +US-IN-47613,US,IN,47613,7,,,, +US-IN-47615,US,IN,47615,7,,,, +US-IN-47616,US,IN,47616,7,,,, +US-IN-47617,US,IN,47617,7,,,, +US-IN-47618,US,IN,47618,7,,,, +US-IN-47619,US,IN,47619,7,,,, +US-IN-47620,US,IN,47620,7,,,, +US-IN-47629,US,IN,47629,7,,,, +US-IN-47630,US,IN,47630,7,,,, +US-IN-47631,US,IN,47631,7,,,, +US-IN-47633,US,IN,47633,7,,,, +US-IN-47634,US,IN,47634,7,,,, +US-IN-47635,US,IN,47635,7,,,, +US-IN-47637,US,IN,47637,7,,,, +US-IN-47638,US,IN,47638,7,,,, +US-IN-47639,US,IN,47639,7,,,, +US-IN-47640,US,IN,47640,7,,,, +US-IN-47647,US,IN,47647,7,,,, +US-IN-47648,US,IN,47648,7,,,, +US-IN-47649,US,IN,47649,7,,,, +US-IN-47654,US,IN,47654,7,,,, +US-IN-47660,US,IN,47660,7,,,, +US-IN-47665,US,IN,47665,7,,,, +US-IN-47666,US,IN,47666,7,,,, +US-IN-47670,US,IN,47670,7,,,, +US-IN-47683,US,IN,47683,7,,,, +US-IN-47701,US,IN,47701,7,,,, +US-IN-47702,US,IN,47702,7,,,, +US-IN-47703,US,IN,47703,7,,,, +US-IN-47704,US,IN,47704,7,,,, +US-IN-47705,US,IN,47705,7,,,, +US-IN-47706,US,IN,47706,7,,,, +US-IN-47708,US,IN,47708,7,,,, +US-IN-47710,US,IN,47710,7,,,, +US-IN-47711,US,IN,47711,7,,,, +US-IN-47712,US,IN,47712,7,,,, +US-IN-47713,US,IN,47713,7,,,, +US-IN-47714,US,IN,47714,7,,,, +US-IN-47715,US,IN,47715,7,,,, +US-IN-47716,US,IN,47716,7,,,, +US-IN-47719,US,IN,47719,7,,,, +US-IN-47720,US,IN,47720,7,,,, +US-IN-47721,US,IN,47721,7,,,, +US-IN-47722,US,IN,47722,7,,,, +US-IN-47724,US,IN,47724,7,,,, +US-IN-47725,US,IN,47725,7,,,, +US-IN-47728,US,IN,47728,7,,,, +US-IN-47730,US,IN,47730,7,,,, +US-IN-47731,US,IN,47731,7,,,, +US-IN-47732,US,IN,47732,7,,,, +US-IN-47733,US,IN,47733,7,,,, +US-IN-47734,US,IN,47734,7,,,, +US-IN-47735,US,IN,47735,7,,,, +US-IN-47736,US,IN,47736,7,,,, +US-IN-47737,US,IN,47737,7,,,, +US-IN-47740,US,IN,47740,7,,,, +US-IN-47747,US,IN,47747,7,,,, +US-IN-47750,US,IN,47750,7,,,, +US-IN-47801,US,IN,47801,7,,,, +US-IN-47802,US,IN,47802,7,,,, +US-IN-47803,US,IN,47803,7,,,, +US-IN-47804,US,IN,47804,7,,,, +US-IN-47805,US,IN,47805,7,,,, +US-IN-47807,US,IN,47807,7,,,, +US-IN-47808,US,IN,47808,7,,,, +US-IN-47809,US,IN,47809,7,,,, +US-IN-47830,US,IN,47830,7,,,, +US-IN-47831,US,IN,47831,7,,,, +US-IN-47832,US,IN,47832,7,,,, +US-IN-47833,US,IN,47833,7,,,, +US-IN-47834,US,IN,47834,7,,,, +US-IN-47836,US,IN,47836,7,,,, +US-IN-47837,US,IN,47837,7,,,, +US-IN-47838,US,IN,47838,7,,,, +US-IN-47840,US,IN,47840,7,,,, +US-IN-47841,US,IN,47841,7,,,, +US-IN-47842,US,IN,47842,7,,,, +US-IN-47845,US,IN,47845,7,,,, +US-IN-47846,US,IN,47846,7,,,, +US-IN-47847,US,IN,47847,7,,,, +US-IN-47848,US,IN,47848,7,,,, +US-IN-47849,US,IN,47849,7,,,, +US-IN-47850,US,IN,47850,7,,,, +US-IN-47851,US,IN,47851,7,,,, +US-IN-47852,US,IN,47852,7,,,, +US-IN-47853,US,IN,47853,7,,,, +US-IN-47854,US,IN,47854,7,,,, +US-IN-47855,US,IN,47855,7,,,, +US-IN-47857,US,IN,47857,7,,,, +US-IN-47858,US,IN,47858,7,,,, +US-IN-47859,US,IN,47859,7,,,, +US-IN-47860,US,IN,47860,7,,,, +US-IN-47861,US,IN,47861,7,,,, +US-IN-47862,US,IN,47862,7,,,, +US-IN-47863,US,IN,47863,7,,,, +US-IN-47865,US,IN,47865,7,,,, +US-IN-47866,US,IN,47866,7,,,, +US-IN-47868,US,IN,47868,7,,,, +US-IN-47869,US,IN,47869,7,,,, +US-IN-47870,US,IN,47870,7,,,, +US-IN-47871,US,IN,47871,7,,,, +US-IN-47872,US,IN,47872,7,,,, +US-IN-47874,US,IN,47874,7,,,, +US-IN-47875,US,IN,47875,7,,,, +US-IN-47876,US,IN,47876,7,,,, +US-IN-47878,US,IN,47878,7,,,, +US-IN-47879,US,IN,47879,7,,,, +US-IN-47880,US,IN,47880,7,,,, +US-IN-47881,US,IN,47881,7,,,, +US-IN-47882,US,IN,47882,7,,,, +US-IN-47884,US,IN,47884,7,,,, +US-IN-47885,US,IN,47885,7,,,, +US-IN-47901,US,IN,47901,7,,,, +US-IN-47902,US,IN,47902,7,,,, +US-IN-47903,US,IN,47903,7,,,, +US-IN-47904,US,IN,47904,7,,,, +US-IN-47905,US,IN,47905,7,,,, +US-IN-47906,US,IN,47906,7,,,, +US-IN-47907,US,IN,47907,7,,,, +US-IN-47909,US,IN,47909,7,,,, +US-IN-47916,US,IN,47916,7,,,, +US-IN-47917,US,IN,47917,7,,,, +US-IN-47918,US,IN,47918,7,,,, +US-IN-47920,US,IN,47920,7,,,, +US-IN-47921,US,IN,47921,7,,,, +US-IN-47922,US,IN,47922,7,,,, +US-IN-47923,US,IN,47923,7,,,, +US-IN-47924,US,IN,47924,7,,,, +US-IN-47925,US,IN,47925,7,,,, +US-IN-47926,US,IN,47926,7,,,, +US-IN-47928,US,IN,47928,7,,,, +US-IN-47929,US,IN,47929,7,,,, +US-IN-47930,US,IN,47930,7,,,, +US-IN-47932,US,IN,47932,7,,,, +US-IN-47933,US,IN,47933,7,,,, +US-IN-47940,US,IN,47940,7,,,, +US-IN-47941,US,IN,47941,7,,,, +US-IN-47942,US,IN,47942,7,,,, +US-IN-47943,US,IN,47943,7,,,, +US-IN-47944,US,IN,47944,7,,,, +US-IN-47946,US,IN,47946,7,,,, +US-IN-47948,US,IN,47948,7,,,, +US-IN-47949,US,IN,47949,7,,,, +US-IN-47950,US,IN,47950,7,,,, +US-IN-47951,US,IN,47951,7,,,, +US-IN-47952,US,IN,47952,7,,,, +US-IN-47954,US,IN,47954,7,,,, +US-IN-47955,US,IN,47955,7,,,, +US-IN-47957,US,IN,47957,7,,,, +US-IN-47958,US,IN,47958,7,,,, +US-IN-47959,US,IN,47959,7,,,, +US-IN-47960,US,IN,47960,7,,,, +US-IN-47962,US,IN,47962,7,,,, +US-IN-47963,US,IN,47963,7,,,, +US-IN-47964,US,IN,47964,7,,,, +US-IN-47965,US,IN,47965,7,,,, +US-IN-47966,US,IN,47966,7,,,, +US-IN-47967,US,IN,47967,7,,,, +US-IN-47968,US,IN,47968,7,,,, +US-IN-47969,US,IN,47969,7,,,, +US-IN-47970,US,IN,47970,7,,,, +US-IN-47971,US,IN,47971,7,,,, +US-IN-47974,US,IN,47974,7,,,, +US-IN-47975,US,IN,47975,7,,,, +US-IN-47977,US,IN,47977,7,,,, +US-IN-47978,US,IN,47978,7,,,, +US-IN-47980,US,IN,47980,7,,,, +US-IN-47981,US,IN,47981,7,,,, +US-IN-47982,US,IN,47982,7,,,, +US-IN-47983,US,IN,47983,7,,,, +US-IN-47984,US,IN,47984,7,,,, +US-IN-47986,US,IN,47986,7,,,, +US-IN-47987,US,IN,47987,7,,,, +US-IN-47988,US,IN,47988,7,,,, +US-IN-47989,US,IN,47989,7,,,, +US-IN-47990,US,IN,47990,7,,,, +US-IN-47991,US,IN,47991,7,,,, +US-IN-47992,US,IN,47992,7,,,, +US-IN-47993,US,IN,47993,7,,,, +US-IN-47994,US,IN,47994,7,,,, +US-IN-47995,US,IN,47995,7,,,, +US-IN-47996,US,IN,47996,7,,,, +US-IN-47997,US,IN,47997,7,,,, +US-KS-66002,US,KS,66002,8.4,,,, +US-KS-66006,US,KS,66006,8.4,,,, +US-KS-66007,US,KS,66007,8.15,,,, +US-KS-66008,US,KS,66008,7.15,,,, +US-KS-66010,US,KS,66010,6.15,,,, +US-KS-66012,US,KS,66012,8.9,,,, +US-KS-66013,US,KS,66013,7.65,,,, +US-KS-66014,US,KS,66014,6.15,,,, +US-KS-66015,US,KS,66015,7.65,,,, +US-KS-66016,US,KS,66016,7.4,,,, +US-KS-66017,US,KS,66017,7.15,,,, +US-KS-66018,US,KS,66018,9.125,,,, +US-KS-66019,US,KS,66019,9.125,,,, +US-KS-66020,US,KS,66020,7.15,,,, +US-KS-66021,US,KS,66021,8.375,,,, +US-KS-66023,US,KS,66023,7.4,,,, +US-KS-66024,US,KS,66024,8.15,,,, +US-KS-66025,US,KS,66025,8.15,,,, +US-KS-66026,US,KS,66026,7.65,,,, +US-KS-66027,US,KS,66027,8.15,,,, +US-KS-66030,US,KS,66030,8.875,,,, +US-KS-66031,US,KS,66031,7.375,,,, +US-KS-66032,US,KS,66032,7.65,,,, +US-KS-66033,US,KS,66033,7.65,,,, +US-KS-66035,US,KS,66035,8.15,,,, +US-KS-66036,US,KS,66036,7.65,,,, +US-KS-66039,US,KS,66039,7.65,,,, +US-KS-66040,US,KS,66040,6.15,,,, +US-KS-66041,US,KS,66041,7.4,,,, +US-KS-66042,US,KS,66042,7.65,,,, +US-KS-66043,US,KS,66043,8.15,,,, +US-KS-66044,US,KS,66044,8.7,,,, +US-KS-66045,US,KS,66045,8.7,,,, +US-KS-66046,US,KS,66046,8.7,,,, +US-KS-66047,US,KS,66047,8.7,,,, +US-KS-66048,US,KS,66048,8.15,,,, +US-KS-66049,US,KS,66049,8.7,,,, +US-KS-66050,US,KS,66050,7.15,,,, +US-KS-66051,US,KS,66051,8.5,,,, +US-KS-66052,US,KS,66052,7.15,,,, +US-KS-66053,US,KS,66053,7.65,,,, +US-KS-66054,US,KS,66054,7.15,,,, +US-KS-66056,US,KS,66056,6.15,,,, +US-KS-66058,US,KS,66058,7.4,,,, +US-KS-66060,US,KS,66060,7.15,,,, +US-KS-66061,US,KS,66061,8.5,,,, +US-KS-66062,US,KS,66062,8.5,,,, +US-KS-66063,US,KS,66063,8.5,,,, +US-KS-66064,US,KS,66064,7.65,,,, +US-KS-66066,US,KS,66066,7.15,,,, +US-KS-66067,US,KS,66067,8.75,,,, +US-KS-66070,US,KS,66070,7.15,,,, +US-KS-66071,US,KS,66071,7.65,,,, +US-KS-66072,US,KS,66072,6.15,,,, +US-KS-66073,US,KS,66073,7.15,,,, +US-KS-66075,US,KS,66075,7.15,,,, +US-KS-66076,US,KS,66076,7.65,,,, +US-KS-66078,US,KS,66078,7.65,,,, +US-KS-66079,US,KS,66079,7.65,,,, +US-KS-66080,US,KS,66080,7.65,,,, +US-KS-66083,US,KS,66083,7.65,,,, +US-KS-66085,US,KS,66085,7.375,,,, +US-KS-66086,US,KS,66086,7.15,,,, +US-KS-66087,US,KS,66087,7.15,,,, +US-KS-66088,US,KS,66088,7.15,,,, +US-KS-66090,US,KS,66090,8.15,,,, +US-KS-66091,US,KS,66091,7.65,,,, +US-KS-66092,US,KS,66092,7.65,,,, +US-KS-66093,US,KS,66093,7.65,,,, +US-KS-66094,US,KS,66094,7.15,,,, +US-KS-66095,US,KS,66095,7.65,,,, +US-KS-66097,US,KS,66097,7.15,,,, +US-KS-66101,US,KS,66101,8.775,,,, +US-KS-66102,US,KS,66102,8.775,,,, +US-KS-66103,US,KS,66103,8.775,,,, +US-KS-66104,US,KS,66104,8.775,,,, +US-KS-66105,US,KS,66105,8.775,,,, +US-KS-66106,US,KS,66106,8.775,,,, +US-KS-66109,US,KS,66109,8.775,,,, +US-KS-66110,US,KS,66110,8.775,,,, +US-KS-66111,US,KS,66111,8.775,,,, +US-KS-66112,US,KS,66112,8.775,,,, +US-KS-66113,US,KS,66113,8.15,,,, +US-KS-66115,US,KS,66115,8.775,,,, +US-KS-66117,US,KS,66117,8.775,,,, +US-KS-66118,US,KS,66118,8.775,,,, +US-KS-66119,US,KS,66119,8.775,,,, +US-KS-66160,US,KS,66160,8.775,,,, +US-KS-66201,US,KS,66201,9,,,, +US-KS-66202,US,KS,66202,9,,,, +US-KS-66203,US,KS,66203,8.625,,,, +US-KS-66204,US,KS,66204,8.5,,,, +US-KS-66205,US,KS,66205,8.625,,,, +US-KS-66206,US,KS,66206,8.5,,,, +US-KS-66207,US,KS,66207,8.5,,,, +US-KS-66208,US,KS,66208,8.375,,,, +US-KS-66209,US,KS,66209,8.5,,,, +US-KS-66210,US,KS,66210,8.5,,,, +US-KS-66211,US,KS,66211,8.5,,,, +US-KS-66212,US,KS,66212,8.5,,,, +US-KS-66213,US,KS,66213,8.5,,,, +US-KS-66214,US,KS,66214,8.5,,,, +US-KS-66215,US,KS,66215,8.75,,,, +US-KS-66216,US,KS,66216,8.625,,,, +US-KS-66217,US,KS,66217,8.625,,,, +US-KS-66218,US,KS,66218,8.625,,,, +US-KS-66219,US,KS,66219,8.75,,,, +US-KS-66220,US,KS,66220,8.75,,,, +US-KS-66221,US,KS,66221,8.5,,,, +US-KS-66222,US,KS,66222,9,,,, +US-KS-66223,US,KS,66223,8.5,,,, +US-KS-66224,US,KS,66224,8.5,,,, +US-KS-66225,US,KS,66225,8.5,,,, +US-KS-66226,US,KS,66226,8.625,,,, +US-KS-66227,US,KS,66227,8.75,,,, +US-KS-66250,US,KS,66250,8.75,,,, +US-KS-66251,US,KS,66251,8.5,,,, +US-KS-66276,US,KS,66276,10,,,, +US-KS-66282,US,KS,66282,8.5,,,, +US-KS-66283,US,KS,66283,8.5,,,, +US-KS-66285,US,KS,66285,8.75,,,, +US-KS-66286,US,KS,66286,8.625,,,, +US-KS-66401,US,KS,66401,7.65,,,, +US-KS-66402,US,KS,66402,7.3,,,, +US-KS-66403,US,KS,66403,7.15,,,, +US-KS-66404,US,KS,66404,7.15,,,, +US-KS-66406,US,KS,66406,6.15,,,, +US-KS-66407,US,KS,66407,7.15,,,, +US-KS-66408,US,KS,66408,7.15,,,, +US-KS-66409,US,KS,66409,7.3,,,, +US-KS-66411,US,KS,66411,7.65,,,, +US-KS-66412,US,KS,66412,6.15,,,, +US-KS-66413,US,KS,66413,7.15,,,, +US-KS-66414,US,KS,66414,7.15,,,, +US-KS-66415,US,KS,66415,7.15,,,, +US-KS-66416,US,KS,66416,7.55,,,, +US-KS-66417,US,KS,66417,7.15,,,, +US-KS-66418,US,KS,66418,7.55,,,, +US-KS-66419,US,KS,66419,7.55,,,, +US-KS-66420,US,KS,66420,7.3,,,, +US-KS-66422,US,KS,66422,7.15,,,, +US-KS-66423,US,KS,66423,7.65,,,, +US-KS-66424,US,KS,66424,7.65,,,, +US-KS-66425,US,KS,66425,7.65,,,, +US-KS-66426,US,KS,66426,7.15,,,, +US-KS-66427,US,KS,66427,7.15,,,, +US-KS-66428,US,KS,66428,7.15,,,, +US-KS-66429,US,KS,66429,7.15,,,, +US-KS-66431,US,KS,66431,7.65,,,, +US-KS-66432,US,KS,66432,7.15,,,, +US-KS-66434,US,KS,66434,8.65,,,, +US-KS-66436,US,KS,66436,7.55,,,, +US-KS-66438,US,KS,66438,6.15,,,, +US-KS-66439,US,KS,66439,8.65,,,, +US-KS-66440,US,KS,66440,7.55,,,, +US-KS-66441,US,KS,66441,9.4,,,, +US-KS-66442,US,KS,66442,7.15,,,, +US-KS-66449,US,KS,66449,7.15,,,, +US-KS-66451,US,KS,66451,7.15,,,, +US-KS-66501,US,KS,66501,7.65,,,, +US-KS-66502,US,KS,66502,8.4,,,, +US-KS-66503,US,KS,66503,8.4,,,, +US-KS-66505,US,KS,66505,8.4,,,, +US-KS-66506,US,KS,66506,8.4,,,, +US-KS-66507,US,KS,66507,7.65,,,, +US-KS-66508,US,KS,66508,7.75,,,, +US-KS-66509,US,KS,66509,7.55,,,, +US-KS-66510,US,KS,66510,7.15,,,, +US-KS-66512,US,KS,66512,7.15,,,, +US-KS-66514,US,KS,66514,7.4,,,, +US-KS-66515,US,KS,66515,7.65,,,, +US-KS-66516,US,KS,66516,7.55,,,, +US-KS-66517,US,KS,66517,8.15,,,, +US-KS-66518,US,KS,66518,6.15,,,, +US-KS-66520,US,KS,66520,7.15,,,, +US-KS-66521,US,KS,66521,7.15,,,, +US-KS-66522,US,KS,66522,7.15,,,, +US-KS-66523,US,KS,66523,8.65,,,, +US-KS-66524,US,KS,66524,7.15,,,, +US-KS-66526,US,KS,66526,7.65,,,, +US-KS-66527,US,KS,66527,7.65,,,, +US-KS-66528,US,KS,66528,7.15,,,, +US-KS-66531,US,KS,66531,8.15,,,, +US-KS-66532,US,KS,66532,7.65,,,, +US-KS-66533,US,KS,66533,7.3,,,, +US-KS-66534,US,KS,66534,8.15,,,, +US-KS-66535,US,KS,66535,7.15,,,, +US-KS-66536,US,KS,66536,8.15,,,, +US-KS-66537,US,KS,66537,7.15,,,, +US-KS-66538,US,KS,66538,8.15,,,, +US-KS-66539,US,KS,66539,7.3,,,, +US-KS-66540,US,KS,66540,7.55,,,, +US-KS-66541,US,KS,66541,6.15,,,, +US-KS-66542,US,KS,66542,7.3,,,, +US-KS-66543,US,KS,66543,7.15,,,, +US-KS-66544,US,KS,66544,6.15,,,, +US-KS-66546,US,KS,66546,7.3,,,, +US-KS-66547,US,KS,66547,8.9,,,, +US-KS-66548,US,KS,66548,7.65,,,, +US-KS-66549,US,KS,66549,7.15,,,, +US-KS-66550,US,KS,66550,7.15,,,, +US-KS-66552,US,KS,66552,7.55,,,, +US-KS-66554,US,KS,66554,7.15,,,, +US-KS-66601,US,KS,66601,8.8,,,, +US-KS-66603,US,KS,66603,8.8,,,, +US-KS-66604,US,KS,66604,8.8,,,, +US-KS-66605,US,KS,66605,8.8,,,, +US-KS-66606,US,KS,66606,8.8,,,, +US-KS-66607,US,KS,66607,8.8,,,, +US-KS-66608,US,KS,66608,8.8,,,, +US-KS-66609,US,KS,66609,8.8,,,, +US-KS-66610,US,KS,66610,7.3,,,, +US-KS-66611,US,KS,66611,8.8,,,, +US-KS-66612,US,KS,66612,8.8,,,, +US-KS-66614,US,KS,66614,8.8,,,, +US-KS-66615,US,KS,66615,7.3,,,, +US-KS-66616,US,KS,66616,8.8,,,, +US-KS-66617,US,KS,66617,7.3,,,, +US-KS-66618,US,KS,66618,7.3,,,, +US-KS-66619,US,KS,66619,7.3,,,, +US-KS-66620,US,KS,66620,8.8,,,, +US-KS-66621,US,KS,66621,8.8,,,, +US-KS-66622,US,KS,66622,8.8,,,, +US-KS-66624,US,KS,66624,8.8,,,, +US-KS-66625,US,KS,66625,8.8,,,, +US-KS-66626,US,KS,66626,8.8,,,, +US-KS-66629,US,KS,66629,8.8,,,, +US-KS-66636,US,KS,66636,8.8,,,, +US-KS-66647,US,KS,66647,8.8,,,, +US-KS-66667,US,KS,66667,8.8,,,, +US-KS-66675,US,KS,66675,8.8,,,, +US-KS-66683,US,KS,66683,8.8,,,, +US-KS-66699,US,KS,66699,8.8,,,, +US-KS-66701,US,KS,66701,8.65,,,, +US-KS-66710,US,KS,66710,6.15,,,, +US-KS-66711,US,KS,66711,7.15,,,, +US-KS-66712,US,KS,66712,8.15,,,, +US-KS-66713,US,KS,66713,8.65,,,, +US-KS-66714,US,KS,66714,6.15,,,, +US-KS-66716,US,KS,66716,8.15,,,, +US-KS-66717,US,KS,66717,6.15,,,, +US-KS-66720,US,KS,66720,8.4,,,, +US-KS-66724,US,KS,66724,7.15,,,, +US-KS-66725,US,KS,66725,7.65,,,, +US-KS-66728,US,KS,66728,7.65,,,, +US-KS-66732,US,KS,66732,7.4,,,, +US-KS-66733,US,KS,66733,7.15,,,, +US-KS-66734,US,KS,66734,7.15,,,, +US-KS-66735,US,KS,66735,7.15,,,, +US-KS-66736,US,KS,66736,8.65,,,, +US-KS-66738,US,KS,66738,7.15,,,, +US-KS-66739,US,KS,66739,8.65,,,, +US-KS-66740,US,KS,66740,7.15,,,, +US-KS-66741,US,KS,66741,7.15,,,, +US-KS-66742,US,KS,66742,8.4,,,, +US-KS-66743,US,KS,66743,8.15,,,, +US-KS-66746,US,KS,66746,7.15,,,, +US-KS-66748,US,KS,66748,8.65,,,, +US-KS-66749,US,KS,66749,8.4,,,, +US-KS-66751,US,KS,66751,7.4,,,, +US-KS-66753,US,KS,66753,7.15,,,, +US-KS-66754,US,KS,66754,7.15,,,, +US-KS-66755,US,KS,66755,7.4,,,, +US-KS-66756,US,KS,66756,7.15,,,, +US-KS-66757,US,KS,66757,9.15,,,, +US-KS-66758,US,KS,66758,7.15,,,, +US-KS-66759,US,KS,66759,6.15,,,, +US-KS-66760,US,KS,66760,7.15,,,, +US-KS-66761,US,KS,66761,7.15,,,, +US-KS-66762,US,KS,66762,8.4,,,, +US-KS-66763,US,KS,66763,8.4,,,, +US-KS-66767,US,KS,66767,6.15,,,, +US-KS-66769,US,KS,66769,7.15,,,, +US-KS-66770,US,KS,66770,7.65,,,, +US-KS-66771,US,KS,66771,7.15,,,, +US-KS-66772,US,KS,66772,7.4,,,, +US-KS-66773,US,KS,66773,8.65,,,, +US-KS-66775,US,KS,66775,7.15,,,, +US-KS-66776,US,KS,66776,7.15,,,, +US-KS-66777,US,KS,66777,7.65,,,, +US-KS-66778,US,KS,66778,8.65,,,, +US-KS-66779,US,KS,66779,8.15,,,, +US-KS-66780,US,KS,66780,7.15,,,, +US-KS-66781,US,KS,66781,7.65,,,, +US-KS-66782,US,KS,66782,7.65,,,, +US-KS-66783,US,KS,66783,8.9,,,, +US-KS-66801,US,KS,66801,8.15,,,, +US-KS-66830,US,KS,66830,7.15,,,, +US-KS-66833,US,KS,66833,7.15,,,, +US-KS-66834,US,KS,66834,7.65,,,, +US-KS-66835,US,KS,66835,7.65,,,, +US-KS-66838,US,KS,66838,7.15,,,, +US-KS-66839,US,KS,66839,8.15,,,, +US-KS-66840,US,KS,66840,6.4,,,, +US-KS-66842,US,KS,66842,6.4,,,, +US-KS-66843,US,KS,66843,6.15,,,, +US-KS-66845,US,KS,66845,7.15,,,, +US-KS-66846,US,KS,66846,8.85,,,, +US-KS-66849,US,KS,66849,7.15,,,, +US-KS-66850,US,KS,66850,6.15,,,, +US-KS-66851,US,KS,66851,8.65,,,, +US-KS-66852,US,KS,66852,6.15,,,, +US-KS-66853,US,KS,66853,7.15,,,, +US-KS-66854,US,KS,66854,7.15,,,, +US-KS-66855,US,KS,66855,7.15,,,, +US-KS-66856,US,KS,66856,7.15,,,, +US-KS-66857,US,KS,66857,7.15,,,, +US-KS-66858,US,KS,66858,7.65,,,, +US-KS-66859,US,KS,66859,7.65,,,, +US-KS-66860,US,KS,66860,7.15,,,, +US-KS-66861,US,KS,66861,8.4,,,, +US-KS-66862,US,KS,66862,6.15,,,, +US-KS-66863,US,KS,66863,7.15,,,, +US-KS-66864,US,KS,66864,8.15,,,, +US-KS-66865,US,KS,66865,7.15,,,, +US-KS-66866,US,KS,66866,8.65,,,, +US-KS-66868,US,KS,66868,7.15,,,, +US-KS-66869,US,KS,66869,7.15,,,, +US-KS-66870,US,KS,66870,7.15,,,, +US-KS-66871,US,KS,66871,6.15,,,, +US-KS-66872,US,KS,66872,7.15,,,, +US-KS-66873,US,KS,66873,7.15,,,, +US-KS-66901,US,KS,66901,8.15,,,, +US-KS-66930,US,KS,66930,8.15,,,, +US-KS-66932,US,KS,66932,7.15,,,, +US-KS-66933,US,KS,66933,7.15,,,, +US-KS-66935,US,KS,66935,8.15,,,, +US-KS-66936,US,KS,66936,7.15,,,, +US-KS-66937,US,KS,66937,7.15,,,, +US-KS-66938,US,KS,66938,7.15,,,, +US-KS-66939,US,KS,66939,8.15,,,, +US-KS-66940,US,KS,66940,8.15,,,, +US-KS-66941,US,KS,66941,7.15,,,, +US-KS-66942,US,KS,66942,7.15,,,, +US-KS-66943,US,KS,66943,7.15,,,, +US-KS-66944,US,KS,66944,7.15,,,, +US-KS-66945,US,KS,66945,7.15,,,, +US-KS-66946,US,KS,66946,7.15,,,, +US-KS-66948,US,KS,66948,7.15,,,, +US-KS-66949,US,KS,66949,7.15,,,, +US-KS-66951,US,KS,66951,7.15,,,, +US-KS-66952,US,KS,66952,7.15,,,, +US-KS-66953,US,KS,66953,7.15,,,, +US-KS-66955,US,KS,66955,7.15,,,, +US-KS-66956,US,KS,66956,7.9,,,, +US-KS-66958,US,KS,66958,7.15,,,, +US-KS-66959,US,KS,66959,8.15,,,, +US-KS-66960,US,KS,66960,8.15,,,, +US-KS-66961,US,KS,66961,8.15,,,, +US-KS-66962,US,KS,66962,7.15,,,, +US-KS-66963,US,KS,66963,7.15,,,, +US-KS-66964,US,KS,66964,8.15,,,, +US-KS-66966,US,KS,66966,8.15,,,, +US-KS-66967,US,KS,66967,7.65,,,, +US-KS-66968,US,KS,66968,8.15,,,, +US-KS-66970,US,KS,66970,7.15,,,, +US-KS-67001,US,KS,67001,7.15,,,, +US-KS-67002,US,KS,67002,7.4,,,, +US-KS-67003,US,KS,67003,6.65,,,, +US-KS-67004,US,KS,67004,7.65,,,, +US-KS-67005,US,KS,67005,8.4,,,, +US-KS-67008,US,KS,67008,6.4,,,, +US-KS-67009,US,KS,67009,7.15,,,, +US-KS-67010,US,KS,67010,6.4,,,, +US-KS-67012,US,KS,67012,6.4,,,, +US-KS-67013,US,KS,67013,7.65,,,, +US-KS-67016,US,KS,67016,7.15,,,, +US-KS-67017,US,KS,67017,6.4,,,, +US-KS-67018,US,KS,67018,6.15,,,, +US-KS-67019,US,KS,67019,6.4,,,, +US-KS-67020,US,KS,67020,8.15,,,, +US-KS-67021,US,KS,67021,7.9,,,, +US-KS-67022,US,KS,67022,7.65,,,, +US-KS-67023,US,KS,67023,6.4,,,, +US-KS-67024,US,KS,67024,8.15,,,, +US-KS-67025,US,KS,67025,7.15,,,, +US-KS-67026,US,KS,67026,7.15,,,, +US-KS-67028,US,KS,67028,7.9,,,, +US-KS-67029,US,KS,67029,8.15,,,, +US-KS-67030,US,KS,67030,7.15,,,, +US-KS-67031,US,KS,67031,6.65,,,, +US-KS-67035,US,KS,67035,6.9,,,, +US-KS-67036,US,KS,67036,6.15,,,, +US-KS-67037,US,KS,67037,7.65,,,, +US-KS-67038,US,KS,67038,6.4,,,, +US-KS-67039,US,KS,67039,6.4,,,, +US-KS-67041,US,KS,67041,6.4,,,, +US-KS-67042,US,KS,67042,7.4,,,, +US-KS-67045,US,KS,67045,8.15,,,, +US-KS-67047,US,KS,67047,7.15,,,, +US-KS-67049,US,KS,67049,6.15,,,, +US-KS-67050,US,KS,67050,7.15,,,, +US-KS-67051,US,KS,67051,6.65,,,, +US-KS-67052,US,KS,67052,7.15,,,, +US-KS-67053,US,KS,67053,7.65,,,, +US-KS-67054,US,KS,67054,8.15,,,, +US-KS-67055,US,KS,67055,7.15,,,, +US-KS-67056,US,KS,67056,8.15,,,, +US-KS-67057,US,KS,67057,7.15,,,, +US-KS-67058,US,KS,67058,7.65,,,, +US-KS-67059,US,KS,67059,7.15,,,, +US-KS-67060,US,KS,67060,7.15,,,, +US-KS-67061,US,KS,67061,7.15,,,, +US-KS-67062,US,KS,67062,8.15,,,, +US-KS-67063,US,KS,67063,8.65,,,, +US-KS-67065,US,KS,67065,7.15,,,, +US-KS-67066,US,KS,67066,7.9,,,, +US-KS-67067,US,KS,67067,7.15,,,, +US-KS-67068,US,KS,67068,7.9,,,, +US-KS-67070,US,KS,67070,7.15,,,, +US-KS-67071,US,KS,67071,7.15,,,, +US-KS-67072,US,KS,67072,6.4,,,, +US-KS-67073,US,KS,67073,7.65,,,, +US-KS-67074,US,KS,67074,6.4,,,, +US-KS-67101,US,KS,67101,7.15,,,, +US-KS-67102,US,KS,67102,6.4,,,, +US-KS-67103,US,KS,67103,6.65,,,, +US-KS-67104,US,KS,67104,7.9,,,, +US-KS-67105,US,KS,67105,6.65,,,, +US-KS-67106,US,KS,67106,6.65,,,, +US-KS-67107,US,KS,67107,8.15,,,, +US-KS-67108,US,KS,67108,7.15,,,, +US-KS-67109,US,KS,67109,7.15,,,, +US-KS-67110,US,KS,67110,7.15,,,, +US-KS-67111,US,KS,67111,6.9,,,, +US-KS-67112,US,KS,67112,6.9,,,, +US-KS-67114,US,KS,67114,8.15,,,, +US-KS-67117,US,KS,67117,8.15,,,, +US-KS-67118,US,KS,67118,6.9,,,, +US-KS-67119,US,KS,67119,7.65,,,, +US-KS-67120,US,KS,67120,7.15,,,, +US-KS-67122,US,KS,67122,7.15,,,, +US-KS-67123,US,KS,67123,6.4,,,, +US-KS-67124,US,KS,67124,8.65,,,, +US-KS-67127,US,KS,67127,6.15,,,, +US-KS-67131,US,KS,67131,6.4,,,, +US-KS-67132,US,KS,67132,6.4,,,, +US-KS-67133,US,KS,67133,6.4,,,, +US-KS-67134,US,KS,67134,7.9,,,, +US-KS-67135,US,KS,67135,8.15,,,, +US-KS-67137,US,KS,67137,7.15,,,, +US-KS-67138,US,KS,67138,7.15,,,, +US-KS-67140,US,KS,67140,6.65,,,, +US-KS-67142,US,KS,67142,6.9,,,, +US-KS-67143,US,KS,67143,7.15,,,, +US-KS-67144,US,KS,67144,6.4,,,, +US-KS-67146,US,KS,67146,6.4,,,, +US-KS-67147,US,KS,67147,7.15,,,, +US-KS-67149,US,KS,67149,7.15,,,, +US-KS-67150,US,KS,67150,6.15,,,, +US-KS-67151,US,KS,67151,8.15,,,, +US-KS-67152,US,KS,67152,8.4,,,, +US-KS-67154,US,KS,67154,6.4,,,, +US-KS-67155,US,KS,67155,6.15,,,, +US-KS-67156,US,KS,67156,7.4,,,, +US-KS-67159,US,KS,67159,6.9,,,, +US-KS-67201,US,KS,67201,7.15,,,, +US-KS-67202,US,KS,67202,7.15,,,, +US-KS-67203,US,KS,67203,7.15,,,, +US-KS-67204,US,KS,67204,7.15,,,, +US-KS-67205,US,KS,67205,7.15,,,, +US-KS-67206,US,KS,67206,7.15,,,, +US-KS-67207,US,KS,67207,7.15,,,, +US-KS-67208,US,KS,67208,7.15,,,, +US-KS-67209,US,KS,67209,7.15,,,, +US-KS-67210,US,KS,67210,7.15,,,, +US-KS-67211,US,KS,67211,7.15,,,, +US-KS-67212,US,KS,67212,7.15,,,, +US-KS-67213,US,KS,67213,7.15,,,, +US-KS-67214,US,KS,67214,7.15,,,, +US-KS-67215,US,KS,67215,7.15,,,, +US-KS-67216,US,KS,67216,7.15,,,, +US-KS-67217,US,KS,67217,7.15,,,, +US-KS-67218,US,KS,67218,7.15,,,, +US-KS-67219,US,KS,67219,7.15,,,, +US-KS-67220,US,KS,67220,7.15,,,, +US-KS-67221,US,KS,67221,7.15,,,, +US-KS-67223,US,KS,67223,7.15,,,, +US-KS-67226,US,KS,67226,7.15,,,, +US-KS-67227,US,KS,67227,7.15,,,, +US-KS-67228,US,KS,67228,7.15,,,, +US-KS-67230,US,KS,67230,7.15,,,, +US-KS-67232,US,KS,67232,7.15,,,, +US-KS-67235,US,KS,67235,7.15,,,, +US-KS-67260,US,KS,67260,7.15,,,, +US-KS-67275,US,KS,67275,7.15,,,, +US-KS-67276,US,KS,67276,7.15,,,, +US-KS-67277,US,KS,67277,7.15,,,, +US-KS-67278,US,KS,67278,7.15,,,, +US-KS-67301,US,KS,67301,9.15,,,, +US-KS-67330,US,KS,67330,8.4,,,, +US-KS-67332,US,KS,67332,7.4,,,, +US-KS-67333,US,KS,67333,8.9,,,, +US-KS-67334,US,KS,67334,8.15,,,, +US-KS-67335,US,KS,67335,8.9,,,, +US-KS-67336,US,KS,67336,8.9,,,, +US-KS-67337,US,KS,67337,9.15,,,, +US-KS-67340,US,KS,67340,7.15,,,, +US-KS-67341,US,KS,67341,7.4,,,, +US-KS-67342,US,KS,67342,7.4,,,, +US-KS-67344,US,KS,67344,6.15,,,, +US-KS-67345,US,KS,67345,7.15,,,, +US-KS-67346,US,KS,67346,7.15,,,, +US-KS-67347,US,KS,67347,6.15,,,, +US-KS-67349,US,KS,67349,7.15,,,, +US-KS-67351,US,KS,67351,6.15,,,, +US-KS-67352,US,KS,67352,7.15,,,, +US-KS-67353,US,KS,67353,7.15,,,, +US-KS-67354,US,KS,67354,7.9,,,, +US-KS-67355,US,KS,67355,8.15,,,, +US-KS-67356,US,KS,67356,8.4,,,, +US-KS-67357,US,KS,67357,8.4,,,, +US-KS-67360,US,KS,67360,8.15,,,, +US-KS-67361,US,KS,67361,9.65,,,, +US-KS-67363,US,KS,67363,6.15,,,, +US-KS-67364,US,KS,67364,6.15,,,, +US-KS-67401,US,KS,67401,8.05,,,, +US-KS-67402,US,KS,67402,8.05,,,, +US-KS-67410,US,KS,67410,8.25,,,, +US-KS-67416,US,KS,67416,7.15,,,, +US-KS-67417,US,KS,67417,7.15,,,, +US-KS-67418,US,KS,67418,7.15,,,, +US-KS-67420,US,KS,67420,8.15,,,, +US-KS-67422,US,KS,67422,7.15,,,, +US-KS-67423,US,KS,67423,7.15,,,, +US-KS-67425,US,KS,67425,7.15,,,, +US-KS-67427,US,KS,67427,7.15,,,, +US-KS-67428,US,KS,67428,7.15,,,, +US-KS-67430,US,KS,67430,7.15,,,, +US-KS-67431,US,KS,67431,7.15,,,, +US-KS-67432,US,KS,67432,8.65,,,, +US-KS-67436,US,KS,67436,8.15,,,, +US-KS-67437,US,KS,67437,7.65,,,, +US-KS-67438,US,KS,67438,7.65,,,, +US-KS-67439,US,KS,67439,8.4,,,, +US-KS-67441,US,KS,67441,7.15,,,, +US-KS-67442,US,KS,67442,7.15,,,, +US-KS-67443,US,KS,67443,7.15,,,, +US-KS-67444,US,KS,67444,9.15,,,, +US-KS-67445,US,KS,67445,8.15,,,, +US-KS-67446,US,KS,67446,7.15,,,, +US-KS-67447,US,KS,67447,7.15,,,, +US-KS-67448,US,KS,67448,7.15,,,, +US-KS-67449,US,KS,67449,8.65,,,, +US-KS-67450,US,KS,67450,7.15,,,, +US-KS-67451,US,KS,67451,7.15,,,, +US-KS-67452,US,KS,67452,7.15,,,, +US-KS-67454,US,KS,67454,8.15,,,, +US-KS-67455,US,KS,67455,8.15,,,, +US-KS-67456,US,KS,67456,8.65,,,, +US-KS-67457,US,KS,67457,7.15,,,, +US-KS-67458,US,KS,67458,7.15,,,, +US-KS-67459,US,KS,67459,7.15,,,, +US-KS-67460,US,KS,67460,8.15,,,, +US-KS-67464,US,KS,67464,7.15,,,, +US-KS-67466,US,KS,67466,8.15,,,, +US-KS-67467,US,KS,67467,8.15,,,, +US-KS-67468,US,KS,67468,7.15,,,, +US-KS-67470,US,KS,67470,7.15,,,, +US-KS-67473,US,KS,67473,7.65,,,, +US-KS-67474,US,KS,67474,7.65,,,, +US-KS-67475,US,KS,67475,7.65,,,, +US-KS-67476,US,KS,67476,7.15,,,, +US-KS-67478,US,KS,67478,7.15,,,, +US-KS-67480,US,KS,67480,7.15,,,, +US-KS-67481,US,KS,67481,7.15,,,, +US-KS-67482,US,KS,67482,7.15,,,, +US-KS-67483,US,KS,67483,7.65,,,, +US-KS-67484,US,KS,67484,7.15,,,, +US-KS-67485,US,KS,67485,7.15,,,, +US-KS-67487,US,KS,67487,7.15,,,, +US-KS-67490,US,KS,67490,8.15,,,, +US-KS-67491,US,KS,67491,7.15,,,, +US-KS-67492,US,KS,67492,7.15,,,, +US-KS-67501,US,KS,67501,8.4,,,, +US-KS-67502,US,KS,67502,8.4,,,, +US-KS-67504,US,KS,67504,8.4,,,, +US-KS-67505,US,KS,67505,8.4,,,, +US-KS-67510,US,KS,67510,7.65,,,, +US-KS-67511,US,KS,67511,7.15,,,, +US-KS-67512,US,KS,67512,7.15,,,, +US-KS-67513,US,KS,67513,6.15,,,, +US-KS-67514,US,KS,67514,7.65,,,, +US-KS-67515,US,KS,67515,6.15,,,, +US-KS-67516,US,KS,67516,6.15,,,, +US-KS-67518,US,KS,67518,6.15,,,, +US-KS-67519,US,KS,67519,7.15,,,, +US-KS-67520,US,KS,67520,6.15,,,, +US-KS-67521,US,KS,67521,6.15,,,, +US-KS-67522,US,KS,67522,7.65,,,, +US-KS-67523,US,KS,67523,8.15,,,, +US-KS-67524,US,KS,67524,7.65,,,, +US-KS-67525,US,KS,67525,7.15,,,, +US-KS-67526,US,KS,67526,7.65,,,, +US-KS-67529,US,KS,67529,8.15,,,, +US-KS-67530,US,KS,67530,7.9,,,, +US-KS-67543,US,KS,67543,7.65,,,, +US-KS-67544,US,KS,67544,7.65,,,, +US-KS-67545,US,KS,67545,7.15,,,, +US-KS-67546,US,KS,67546,7.15,,,, +US-KS-67547,US,KS,67547,8.15,,,, +US-KS-67548,US,KS,67548,7.15,,,, +US-KS-67550,US,KS,67550,8.65,,,, +US-KS-67552,US,KS,67552,7.15,,,, +US-KS-67553,US,KS,67553,6.15,,,, +US-KS-67554,US,KS,67554,8.15,,,, +US-KS-67556,US,KS,67556,6.15,,,, +US-KS-67557,US,KS,67557,7.15,,,, +US-KS-67559,US,KS,67559,6.15,,,, +US-KS-67560,US,KS,67560,7.15,,,, +US-KS-67561,US,KS,67561,7.65,,,, +US-KS-67563,US,KS,67563,7.15,,,, +US-KS-67564,US,KS,67564,7.15,,,, +US-KS-67565,US,KS,67565,6.15,,,, +US-KS-67566,US,KS,67566,7.65,,,, +US-KS-67567,US,KS,67567,7.15,,,, +US-KS-67568,US,KS,67568,7.65,,,, +US-KS-67570,US,KS,67570,7.65,,,, +US-KS-67572,US,KS,67572,6.15,,,, +US-KS-67573,US,KS,67573,7.15,,,, +US-KS-67574,US,KS,67574,8.15,,,, +US-KS-67575,US,KS,67575,6.15,,,, +US-KS-67576,US,KS,67576,7.15,,,, +US-KS-67578,US,KS,67578,8.15,,,, +US-KS-67579,US,KS,67579,8.15,,,, +US-KS-67581,US,KS,67581,7.65,,,, +US-KS-67583,US,KS,67583,7.65,,,, +US-KS-67584,US,KS,67584,6.15,,,, +US-KS-67585,US,KS,67585,7.65,,,, +US-KS-67601,US,KS,67601,8.4,,,, +US-KS-67621,US,KS,67621,6.65,,,, +US-KS-67622,US,KS,67622,7.4,,,, +US-KS-67623,US,KS,67623,7.65,,,, +US-KS-67625,US,KS,67625,7.15,,,, +US-KS-67626,US,KS,67626,8.15,,,, +US-KS-67627,US,KS,67627,6.65,,,, +US-KS-67628,US,KS,67628,7.15,,,, +US-KS-67629,US,KS,67629,6.9,,,, +US-KS-67631,US,KS,67631,8.65,,,, +US-KS-67632,US,KS,67632,6.15,,,, +US-KS-67634,US,KS,67634,8.15,,,, +US-KS-67635,US,KS,67635,8.15,,,, +US-KS-67637,US,KS,67637,8.65,,,, +US-KS-67638,US,KS,67638,7.15,,,, +US-KS-67639,US,KS,67639,6.65,,,, +US-KS-67640,US,KS,67640,8.15,,,, +US-KS-67642,US,KS,67642,8.15,,,, +US-KS-67643,US,KS,67643,7.15,,,, +US-KS-67644,US,KS,67644,6.65,,,, +US-KS-67645,US,KS,67645,6.9,,,, +US-KS-67646,US,KS,67646,7.65,,,, +US-KS-67647,US,KS,67647,6.65,,,, +US-KS-67648,US,KS,67648,8.15,,,, +US-KS-67649,US,KS,67649,8.15,,,, +US-KS-67650,US,KS,67650,7.15,,,, +US-KS-67651,US,KS,67651,7.65,,,, +US-KS-67653,US,KS,67653,7.15,,,, +US-KS-67654,US,KS,67654,8.15,,,, +US-KS-67656,US,KS,67656,7.65,,,, +US-KS-67657,US,KS,67657,6.15,,,, +US-KS-67658,US,KS,67658,8.15,,,, +US-KS-67659,US,KS,67659,7.15,,,, +US-KS-67660,US,KS,67660,6.65,,,, +US-KS-67661,US,KS,67661,8.65,,,, +US-KS-67663,US,KS,67663,8.15,,,, +US-KS-67664,US,KS,67664,6.65,,,, +US-KS-67665,US,KS,67665,8.15,,,, +US-KS-67667,US,KS,67667,6.65,,,, +US-KS-67669,US,KS,67669,7.65,,,, +US-KS-67671,US,KS,67671,7.65,,,, +US-KS-67672,US,KS,67672,8.65,,,, +US-KS-67673,US,KS,67673,8.15,,,, +US-KS-67674,US,KS,67674,6.65,,,, +US-KS-67675,US,KS,67675,6.15,,,, +US-KS-67701,US,KS,67701,7.9,,,, +US-KS-67730,US,KS,67730,7.9,,,, +US-KS-67731,US,KS,67731,8.15,,,, +US-KS-67732,US,KS,67732,7.15,,,, +US-KS-67733,US,KS,67733,8.4,,,, +US-KS-67734,US,KS,67734,7.15,,,, +US-KS-67735,US,KS,67735,8.65,,,, +US-KS-67736,US,KS,67736,7.9,,,, +US-KS-67737,US,KS,67737,7.9,,,, +US-KS-67738,US,KS,67738,8.15,,,, +US-KS-67739,US,KS,67739,7.9,,,, +US-KS-67740,US,KS,67740,8.15,,,, +US-KS-67741,US,KS,67741,8.4,,,, +US-KS-67743,US,KS,67743,7.15,,,, +US-KS-67744,US,KS,67744,7.9,,,, +US-KS-67745,US,KS,67745,7.9,,,, +US-KS-67747,US,KS,67747,7.65,,,, +US-KS-67748,US,KS,67748,8.15,,,, +US-KS-67749,US,KS,67749,8.65,,,, +US-KS-67751,US,KS,67751,7.9,,,, +US-KS-67752,US,KS,67752,7.9,,,, +US-KS-67753,US,KS,67753,7.15,,,, +US-KS-67756,US,KS,67756,8.15,,,, +US-KS-67757,US,KS,67757,8.15,,,, +US-KS-67758,US,KS,67758,6.15,,,, +US-KS-67761,US,KS,67761,7.65,,,, +US-KS-67762,US,KS,67762,6.15,,,, +US-KS-67764,US,KS,67764,7.65,,,, +US-KS-67801,US,KS,67801,8.8,,,, +US-KS-67831,US,KS,67831,6.15,,,, +US-KS-67834,US,KS,67834,7.8,,,, +US-KS-67835,US,KS,67835,7.3,,,, +US-KS-67836,US,KS,67836,8.15,,,, +US-KS-67837,US,KS,67837,7.3,,,, +US-KS-67838,US,KS,67838,7.15,,,, +US-KS-67839,US,KS,67839,7.15,,,, +US-KS-67840,US,KS,67840,6.15,,,, +US-KS-67841,US,KS,67841,7.3,,,, +US-KS-67842,US,KS,67842,7.8,,,, +US-KS-67843,US,KS,67843,7.8,,,, +US-KS-67844,US,KS,67844,7.15,,,, +US-KS-67846,US,KS,67846,8.3,,,, +US-KS-67849,US,KS,67849,7.3,,,, +US-KS-67850,US,KS,67850,7.15,,,, +US-KS-67851,US,KS,67851,7.8,,,, +US-KS-67853,US,KS,67853,7.3,,,, +US-KS-67854,US,KS,67854,8.3,,,, +US-KS-67855,US,KS,67855,7.15,,,, +US-KS-67857,US,KS,67857,7.15,,,, +US-KS-67859,US,KS,67859,7.4,,,, +US-KS-67860,US,KS,67860,7.15,,,, +US-KS-67861,US,KS,67861,8.15,,,, +US-KS-67862,US,KS,67862,7.15,,,, +US-KS-67863,US,KS,67863,8.15,,,, +US-KS-67864,US,KS,67864,8.15,,,, +US-KS-67865,US,KS,67865,7.15,,,, +US-KS-67867,US,KS,67867,7.3,,,, +US-KS-67868,US,KS,67868,7.3,,,, +US-KS-67869,US,KS,67869,7.15,,,, +US-KS-67870,US,KS,67870,7.65,,,, +US-KS-67871,US,KS,67871,8.65,,,, +US-KS-67876,US,KS,67876,7.8,,,, +US-KS-67877,US,KS,67877,7.9,,,, +US-KS-67878,US,KS,67878,8.15,,,, +US-KS-67879,US,KS,67879,7.15,,,, +US-KS-67880,US,KS,67880,8.15,,,, +US-KS-67882,US,KS,67882,7.8,,,, +US-KS-67901,US,KS,67901,8.4,,,, +US-KS-67905,US,KS,67905,8.4,,,, +US-KS-67950,US,KS,67950,7.15,,,, +US-KS-67951,US,KS,67951,7.65,,,, +US-KS-67952,US,KS,67952,8.15,,,, +US-KS-67953,US,KS,67953,6.15,,,, +US-KS-67954,US,KS,67954,8.15,,,, +US-KY-40003,US,KY,40003,6,,,, +US-KY-40004,US,KY,40004,6,,,, +US-KY-40006,US,KY,40006,6,,,, +US-KY-40007,US,KY,40007,6,,,, +US-KY-40008,US,KY,40008,6,,,, +US-KY-40009,US,KY,40009,6,,,, +US-KY-40010,US,KY,40010,6,,,, +US-KY-40011,US,KY,40011,6,,,, +US-KY-40012,US,KY,40012,6,,,, +US-KY-40013,US,KY,40013,6,,,, +US-KY-40014,US,KY,40014,6,,,, +US-KY-40018,US,KY,40018,6,,,, +US-KY-40019,US,KY,40019,6,,,, +US-KY-40020,US,KY,40020,6,,,, +US-KY-40022,US,KY,40022,6,,,, +US-KY-40023,US,KY,40023,6,,,, +US-KY-40025,US,KY,40025,6,,,, +US-KY-40026,US,KY,40026,6,,,, +US-KY-40027,US,KY,40027,6,,,, +US-KY-40031,US,KY,40031,6,,,, +US-KY-40032,US,KY,40032,6,,,, +US-KY-40033,US,KY,40033,6,,,, +US-KY-40036,US,KY,40036,6,,,, +US-KY-40037,US,KY,40037,6,,,, +US-KY-40040,US,KY,40040,6,,,, +US-KY-40041,US,KY,40041,6,,,, +US-KY-40045,US,KY,40045,6,,,, +US-KY-40046,US,KY,40046,6,,,, +US-KY-40047,US,KY,40047,6,,,, +US-KY-40048,US,KY,40048,6,,,, +US-KY-40049,US,KY,40049,6,,,, +US-KY-40050,US,KY,40050,6,,,, +US-KY-40051,US,KY,40051,6,,,, +US-KY-40052,US,KY,40052,6,,,, +US-KY-40055,US,KY,40055,6,,,, +US-KY-40056,US,KY,40056,6,,,, +US-KY-40057,US,KY,40057,6,,,, +US-KY-40058,US,KY,40058,6,,,, +US-KY-40059,US,KY,40059,6,,,, +US-KY-40060,US,KY,40060,6,,,, +US-KY-40061,US,KY,40061,6,,,, +US-KY-40062,US,KY,40062,6,,,, +US-KY-40063,US,KY,40063,6,,,, +US-KY-40065,US,KY,40065,6,,,, +US-KY-40066,US,KY,40066,6,,,, +US-KY-40067,US,KY,40067,6,,,, +US-KY-40068,US,KY,40068,6,,,, +US-KY-40069,US,KY,40069,6,,,, +US-KY-40070,US,KY,40070,6,,,, +US-KY-40071,US,KY,40071,6,,,, +US-KY-40075,US,KY,40075,6,,,, +US-KY-40076,US,KY,40076,6,,,, +US-KY-40077,US,KY,40077,6,,,, +US-KY-40078,US,KY,40078,6,,,, +US-KY-40104,US,KY,40104,6,,,, +US-KY-40107,US,KY,40107,6,,,, +US-KY-40108,US,KY,40108,6,,,, +US-KY-40109,US,KY,40109,6,,,, +US-KY-40110,US,KY,40110,6,,,, +US-KY-40111,US,KY,40111,6,,,, +US-KY-40115,US,KY,40115,6,,,, +US-KY-40117,US,KY,40117,6,,,, +US-KY-40118,US,KY,40118,6,,,, +US-KY-40119,US,KY,40119,6,,,, +US-KY-40121,US,KY,40121,6,,,, +US-KY-40122,US,KY,40122,6,,,, +US-KY-40129,US,KY,40129,6,,,, +US-KY-40140,US,KY,40140,6,,,, +US-KY-40142,US,KY,40142,6,,,, +US-KY-40143,US,KY,40143,6,,,, +US-KY-40144,US,KY,40144,6,,,, +US-KY-40145,US,KY,40145,6,,,, +US-KY-40146,US,KY,40146,6,,,, +US-KY-40150,US,KY,40150,6,,,, +US-KY-40152,US,KY,40152,6,,,, +US-KY-40153,US,KY,40153,6,,,, +US-KY-40155,US,KY,40155,6,,,, +US-KY-40157,US,KY,40157,6,,,, +US-KY-40159,US,KY,40159,6,,,, +US-KY-40160,US,KY,40160,6,,,, +US-KY-40161,US,KY,40161,6,,,, +US-KY-40162,US,KY,40162,6,,,, +US-KY-40165,US,KY,40165,6,,,, +US-KY-40166,US,KY,40166,6,,,, +US-KY-40170,US,KY,40170,6,,,, +US-KY-40171,US,KY,40171,6,,,, +US-KY-40175,US,KY,40175,6,,,, +US-KY-40176,US,KY,40176,6,,,, +US-KY-40177,US,KY,40177,6,,,, +US-KY-40178,US,KY,40178,6,,,, +US-KY-40201,US,KY,40201,6,,,, +US-KY-40202,US,KY,40202,6,,,, +US-KY-40203,US,KY,40203,6,,,, +US-KY-40204,US,KY,40204,6,,,, +US-KY-40205,US,KY,40205,6,,,, +US-KY-40206,US,KY,40206,6,,,, +US-KY-40207,US,KY,40207,6,,,, +US-KY-40208,US,KY,40208,6,,,, +US-KY-40209,US,KY,40209,6,,,, +US-KY-40210,US,KY,40210,6,,,, +US-KY-40211,US,KY,40211,6,,,, +US-KY-40212,US,KY,40212,6,,,, +US-KY-40213,US,KY,40213,6,,,, +US-KY-40214,US,KY,40214,6,,,, +US-KY-40215,US,KY,40215,6,,,, +US-KY-40216,US,KY,40216,6,,,, +US-KY-40217,US,KY,40217,6,,,, +US-KY-40218,US,KY,40218,6,,,, +US-KY-40219,US,KY,40219,6,,,, +US-KY-40220,US,KY,40220,6,,,, +US-KY-40221,US,KY,40221,6,,,, +US-KY-40222,US,KY,40222,6,,,, +US-KY-40223,US,KY,40223,6,,,, +US-KY-40224,US,KY,40224,6,,,, +US-KY-40225,US,KY,40225,6,,,, +US-KY-40228,US,KY,40228,6,,,, +US-KY-40229,US,KY,40229,6,,,, +US-KY-40231,US,KY,40231,6,,,, +US-KY-40232,US,KY,40232,6,,,, +US-KY-40233,US,KY,40233,6,,,, +US-KY-40241,US,KY,40241,6,,,, +US-KY-40242,US,KY,40242,6,,,, +US-KY-40243,US,KY,40243,6,,,, +US-KY-40245,US,KY,40245,6,,,, +US-KY-40250,US,KY,40250,6,,,, +US-KY-40251,US,KY,40251,6,,,, +US-KY-40252,US,KY,40252,6,,,, +US-KY-40253,US,KY,40253,6,,,, +US-KY-40255,US,KY,40255,6,,,, +US-KY-40256,US,KY,40256,6,,,, +US-KY-40257,US,KY,40257,6,,,, +US-KY-40258,US,KY,40258,6,,,, +US-KY-40259,US,KY,40259,6,,,, +US-KY-40261,US,KY,40261,6,,,, +US-KY-40266,US,KY,40266,6,,,, +US-KY-40268,US,KY,40268,6,,,, +US-KY-40269,US,KY,40269,6,,,, +US-KY-40270,US,KY,40270,6,,,, +US-KY-40272,US,KY,40272,6,,,, +US-KY-40280,US,KY,40280,6,,,, +US-KY-40281,US,KY,40281,6,,,, +US-KY-40282,US,KY,40282,6,,,, +US-KY-40283,US,KY,40283,6,,,, +US-KY-40285,US,KY,40285,6,,,, +US-KY-40287,US,KY,40287,6,,,, +US-KY-40289,US,KY,40289,6,,,, +US-KY-40290,US,KY,40290,6,,,, +US-KY-40291,US,KY,40291,6,,,, +US-KY-40292,US,KY,40292,6,,,, +US-KY-40293,US,KY,40293,6,,,, +US-KY-40294,US,KY,40294,6,,,, +US-KY-40295,US,KY,40295,6,,,, +US-KY-40296,US,KY,40296,6,,,, +US-KY-40297,US,KY,40297,6,,,, +US-KY-40298,US,KY,40298,6,,,, +US-KY-40299,US,KY,40299,6,,,, +US-KY-40310,US,KY,40310,6,,,, +US-KY-40311,US,KY,40311,6,,,, +US-KY-40312,US,KY,40312,6,,,, +US-KY-40313,US,KY,40313,6,,,, +US-KY-40316,US,KY,40316,6,,,, +US-KY-40317,US,KY,40317,6,,,, +US-KY-40319,US,KY,40319,6,,,, +US-KY-40322,US,KY,40322,6,,,, +US-KY-40324,US,KY,40324,6,,,, +US-KY-40328,US,KY,40328,6,,,, +US-KY-40330,US,KY,40330,6,,,, +US-KY-40334,US,KY,40334,6,,,, +US-KY-40336,US,KY,40336,6,,,, +US-KY-40337,US,KY,40337,6,,,, +US-KY-40339,US,KY,40339,6,,,, +US-KY-40340,US,KY,40340,6,,,, +US-KY-40342,US,KY,40342,6,,,, +US-KY-40346,US,KY,40346,6,,,, +US-KY-40347,US,KY,40347,6,,,, +US-KY-40348,US,KY,40348,6,,,, +US-KY-40350,US,KY,40350,6,,,, +US-KY-40351,US,KY,40351,6,,,, +US-KY-40353,US,KY,40353,6,,,, +US-KY-40355,US,KY,40355,6,,,, +US-KY-40356,US,KY,40356,6,,,, +US-KY-40357,US,KY,40357,6,,,, +US-KY-40358,US,KY,40358,6,,,, +US-KY-40359,US,KY,40359,6,,,, +US-KY-40360,US,KY,40360,6,,,, +US-KY-40361,US,KY,40361,6,,,, +US-KY-40362,US,KY,40362,6,,,, +US-KY-40363,US,KY,40363,6,,,, +US-KY-40366,US,KY,40366,6,,,, +US-KY-40370,US,KY,40370,6,,,, +US-KY-40371,US,KY,40371,6,,,, +US-KY-40372,US,KY,40372,6,,,, +US-KY-40374,US,KY,40374,6,,,, +US-KY-40376,US,KY,40376,6,,,, +US-KY-40379,US,KY,40379,6,,,, +US-KY-40380,US,KY,40380,6,,,, +US-KY-40383,US,KY,40383,6,,,, +US-KY-40384,US,KY,40384,6,,,, +US-KY-40385,US,KY,40385,6,,,, +US-KY-40387,US,KY,40387,6,,,, +US-KY-40390,US,KY,40390,6,,,, +US-KY-40391,US,KY,40391,6,,,, +US-KY-40392,US,KY,40392,6,,,, +US-KY-40402,US,KY,40402,6,,,, +US-KY-40403,US,KY,40403,6,,,, +US-KY-40404,US,KY,40404,6,,,, +US-KY-40405,US,KY,40405,6,,,, +US-KY-40409,US,KY,40409,6,,,, +US-KY-40410,US,KY,40410,6,,,, +US-KY-40419,US,KY,40419,6,,,, +US-KY-40422,US,KY,40422,6,,,, +US-KY-40423,US,KY,40423,6,,,, +US-KY-40434,US,KY,40434,6,,,, +US-KY-40437,US,KY,40437,6,,,, +US-KY-40440,US,KY,40440,6,,,, +US-KY-40442,US,KY,40442,6,,,, +US-KY-40444,US,KY,40444,6,,,, +US-KY-40445,US,KY,40445,6,,,, +US-KY-40446,US,KY,40446,6,,,, +US-KY-40447,US,KY,40447,6,,,, +US-KY-40448,US,KY,40448,6,,,, +US-KY-40452,US,KY,40452,6,,,, +US-KY-40456,US,KY,40456,6,,,, +US-KY-40460,US,KY,40460,6,,,, +US-KY-40461,US,KY,40461,6,,,, +US-KY-40464,US,KY,40464,6,,,, +US-KY-40468,US,KY,40468,6,,,, +US-KY-40472,US,KY,40472,6,,,, +US-KY-40473,US,KY,40473,6,,,, +US-KY-40475,US,KY,40475,6,,,, +US-KY-40476,US,KY,40476,6,,,, +US-KY-40481,US,KY,40481,6,,,, +US-KY-40484,US,KY,40484,6,,,, +US-KY-40486,US,KY,40486,6,,,, +US-KY-40488,US,KY,40488,6,,,, +US-KY-40489,US,KY,40489,6,,,, +US-KY-40492,US,KY,40492,6,,,, +US-KY-40502,US,KY,40502,6,,,, +US-KY-40503,US,KY,40503,6,,,, +US-KY-40504,US,KY,40504,6,,,, +US-KY-40505,US,KY,40505,6,,,, +US-KY-40506,US,KY,40506,6,,,, +US-KY-40507,US,KY,40507,6,,,, +US-KY-40508,US,KY,40508,6,,,, +US-KY-40509,US,KY,40509,6,,,, +US-KY-40510,US,KY,40510,6,,,, +US-KY-40511,US,KY,40511,6,,,, +US-KY-40512,US,KY,40512,6,,,, +US-KY-40513,US,KY,40513,6,,,, +US-KY-40514,US,KY,40514,6,,,, +US-KY-40515,US,KY,40515,6,,,, +US-KY-40516,US,KY,40516,6,,,, +US-KY-40517,US,KY,40517,6,,,, +US-KY-40522,US,KY,40522,6,,,, +US-KY-40523,US,KY,40523,6,,,, +US-KY-40524,US,KY,40524,6,,,, +US-KY-40526,US,KY,40526,6,,,, +US-KY-40533,US,KY,40533,6,,,, +US-KY-40536,US,KY,40536,6,,,, +US-KY-40544,US,KY,40544,6,,,, +US-KY-40546,US,KY,40546,6,,,, +US-KY-40550,US,KY,40550,6,,,, +US-KY-40555,US,KY,40555,6,,,, +US-KY-40574,US,KY,40574,6,,,, +US-KY-40575,US,KY,40575,6,,,, +US-KY-40576,US,KY,40576,6,,,, +US-KY-40577,US,KY,40577,6,,,, +US-KY-40578,US,KY,40578,6,,,, +US-KY-40579,US,KY,40579,6,,,, +US-KY-40580,US,KY,40580,6,,,, +US-KY-40581,US,KY,40581,6,,,, +US-KY-40582,US,KY,40582,6,,,, +US-KY-40583,US,KY,40583,6,,,, +US-KY-40588,US,KY,40588,6,,,, +US-KY-40591,US,KY,40591,6,,,, +US-KY-40598,US,KY,40598,6,,,, +US-KY-40601,US,KY,40601,6,,,, +US-KY-40602,US,KY,40602,6,,,, +US-KY-40603,US,KY,40603,6,,,, +US-KY-40604,US,KY,40604,6,,,, +US-KY-40618,US,KY,40618,6,,,, +US-KY-40619,US,KY,40619,6,,,, +US-KY-40620,US,KY,40620,6,,,, +US-KY-40621,US,KY,40621,6,,,, +US-KY-40622,US,KY,40622,6,,,, +US-KY-40701,US,KY,40701,6,,,, +US-KY-40702,US,KY,40702,6,,,, +US-KY-40724,US,KY,40724,6,,,, +US-KY-40729,US,KY,40729,6,,,, +US-KY-40730,US,KY,40730,6,,,, +US-KY-40734,US,KY,40734,6,,,, +US-KY-40737,US,KY,40737,6,,,, +US-KY-40740,US,KY,40740,6,,,, +US-KY-40741,US,KY,40741,6,,,, +US-KY-40742,US,KY,40742,6,,,, +US-KY-40743,US,KY,40743,6,,,, +US-KY-40744,US,KY,40744,6,,,, +US-KY-40745,US,KY,40745,6,,,, +US-KY-40755,US,KY,40755,6,,,, +US-KY-40759,US,KY,40759,6,,,, +US-KY-40763,US,KY,40763,6,,,, +US-KY-40769,US,KY,40769,6,,,, +US-KY-40771,US,KY,40771,6,,,, +US-KY-40801,US,KY,40801,6,,,, +US-KY-40803,US,KY,40803,6,,,, +US-KY-40806,US,KY,40806,6,,,, +US-KY-40807,US,KY,40807,6,,,, +US-KY-40808,US,KY,40808,6,,,, +US-KY-40810,US,KY,40810,6,,,, +US-KY-40813,US,KY,40813,6,,,, +US-KY-40815,US,KY,40815,6,,,, +US-KY-40816,US,KY,40816,6,,,, +US-KY-40818,US,KY,40818,6,,,, +US-KY-40819,US,KY,40819,6,,,, +US-KY-40820,US,KY,40820,6,,,, +US-KY-40823,US,KY,40823,6,,,, +US-KY-40824,US,KY,40824,6,,,, +US-KY-40826,US,KY,40826,6,,,, +US-KY-40827,US,KY,40827,6,,,, +US-KY-40828,US,KY,40828,6,,,, +US-KY-40829,US,KY,40829,6,,,, +US-KY-40830,US,KY,40830,6,,,, +US-KY-40831,US,KY,40831,6,,,, +US-KY-40840,US,KY,40840,6,,,, +US-KY-40843,US,KY,40843,6,,,, +US-KY-40844,US,KY,40844,6,,,, +US-KY-40845,US,KY,40845,6,,,, +US-KY-40847,US,KY,40847,6,,,, +US-KY-40849,US,KY,40849,6,,,, +US-KY-40854,US,KY,40854,6,,,, +US-KY-40855,US,KY,40855,6,,,, +US-KY-40856,US,KY,40856,6,,,, +US-KY-40858,US,KY,40858,6,,,, +US-KY-40862,US,KY,40862,6,,,, +US-KY-40863,US,KY,40863,6,,,, +US-KY-40865,US,KY,40865,6,,,, +US-KY-40868,US,KY,40868,6,,,, +US-KY-40870,US,KY,40870,6,,,, +US-KY-40873,US,KY,40873,6,,,, +US-KY-40874,US,KY,40874,6,,,, +US-KY-40902,US,KY,40902,6,,,, +US-KY-40903,US,KY,40903,6,,,, +US-KY-40906,US,KY,40906,6,,,, +US-KY-40913,US,KY,40913,6,,,, +US-KY-40914,US,KY,40914,6,,,, +US-KY-40915,US,KY,40915,6,,,, +US-KY-40921,US,KY,40921,6,,,, +US-KY-40923,US,KY,40923,6,,,, +US-KY-40927,US,KY,40927,6,,,, +US-KY-40930,US,KY,40930,6,,,, +US-KY-40932,US,KY,40932,6,,,, +US-KY-40935,US,KY,40935,6,,,, +US-KY-40939,US,KY,40939,6,,,, +US-KY-40940,US,KY,40940,6,,,, +US-KY-40941,US,KY,40941,6,,,, +US-KY-40943,US,KY,40943,6,,,, +US-KY-40944,US,KY,40944,6,,,, +US-KY-40946,US,KY,40946,6,,,, +US-KY-40949,US,KY,40949,6,,,, +US-KY-40951,US,KY,40951,6,,,, +US-KY-40953,US,KY,40953,6,,,, +US-KY-40955,US,KY,40955,6,,,, +US-KY-40958,US,KY,40958,6,,,, +US-KY-40962,US,KY,40962,6,,,, +US-KY-40964,US,KY,40964,6,,,, +US-KY-40965,US,KY,40965,6,,,, +US-KY-40972,US,KY,40972,6,,,, +US-KY-40977,US,KY,40977,6,,,, +US-KY-40979,US,KY,40979,6,,,, +US-KY-40981,US,KY,40981,6,,,, +US-KY-40982,US,KY,40982,6,,,, +US-KY-40983,US,KY,40983,6,,,, +US-KY-40988,US,KY,40988,6,,,, +US-KY-40995,US,KY,40995,6,,,, +US-KY-40997,US,KY,40997,6,,,, +US-KY-41001,US,KY,41001,6,,,, +US-KY-41002,US,KY,41002,6,,,, +US-KY-41003,US,KY,41003,6,,,, +US-KY-41004,US,KY,41004,6,,,, +US-KY-41005,US,KY,41005,6,,,, +US-KY-41006,US,KY,41006,6,,,, +US-KY-41007,US,KY,41007,6,,,, +US-KY-41008,US,KY,41008,6,,,, +US-KY-41010,US,KY,41010,6,,,, +US-KY-41011,US,KY,41011,6,,,, +US-KY-41012,US,KY,41012,6,,,, +US-KY-41014,US,KY,41014,6,,,, +US-KY-41015,US,KY,41015,6,,,, +US-KY-41016,US,KY,41016,6,,,, +US-KY-41017,US,KY,41017,6,,,, +US-KY-41018,US,KY,41018,6,,,, +US-KY-41019,US,KY,41019,6,,,, +US-KY-41022,US,KY,41022,6,,,, +US-KY-41030,US,KY,41030,6,,,, +US-KY-41031,US,KY,41031,6,,,, +US-KY-41033,US,KY,41033,6,,,, +US-KY-41034,US,KY,41034,6,,,, +US-KY-41035,US,KY,41035,6,,,, +US-KY-41037,US,KY,41037,6,,,, +US-KY-41039,US,KY,41039,6,,,, +US-KY-41040,US,KY,41040,6,,,, +US-KY-41041,US,KY,41041,6,,,, +US-KY-41042,US,KY,41042,6,,,, +US-KY-41043,US,KY,41043,6,,,, +US-KY-41044,US,KY,41044,6,,,, +US-KY-41045,US,KY,41045,6,,,, +US-KY-41046,US,KY,41046,6,,,, +US-KY-41048,US,KY,41048,6,,,, +US-KY-41049,US,KY,41049,6,,,, +US-KY-41051,US,KY,41051,6,,,, +US-KY-41052,US,KY,41052,6,,,, +US-KY-41053,US,KY,41053,6,,,, +US-KY-41055,US,KY,41055,6,,,, +US-KY-41056,US,KY,41056,6,,,, +US-KY-41059,US,KY,41059,6,,,, +US-KY-41061,US,KY,41061,6,,,, +US-KY-41062,US,KY,41062,6,,,, +US-KY-41063,US,KY,41063,6,,,, +US-KY-41064,US,KY,41064,6,,,, +US-KY-41065,US,KY,41065,6,,,, +US-KY-41071,US,KY,41071,6,,,, +US-KY-41072,US,KY,41072,6,,,, +US-KY-41073,US,KY,41073,6,,,, +US-KY-41074,US,KY,41074,6,,,, +US-KY-41075,US,KY,41075,6,,,, +US-KY-41076,US,KY,41076,6,,,, +US-KY-41080,US,KY,41080,6,,,, +US-KY-41081,US,KY,41081,6,,,, +US-KY-41083,US,KY,41083,6,,,, +US-KY-41085,US,KY,41085,6,,,, +US-KY-41086,US,KY,41086,6,,,, +US-KY-41091,US,KY,41091,6,,,, +US-KY-41092,US,KY,41092,6,,,, +US-KY-41093,US,KY,41093,6,,,, +US-KY-41094,US,KY,41094,6,,,, +US-KY-41095,US,KY,41095,6,,,, +US-KY-41096,US,KY,41096,6,,,, +US-KY-41097,US,KY,41097,6,,,, +US-KY-41098,US,KY,41098,6,,,, +US-KY-41099,US,KY,41099,6,,,, +US-KY-41101,US,KY,41101,6,,,, +US-KY-41102,US,KY,41102,6,,,, +US-KY-41105,US,KY,41105,6,,,, +US-KY-41114,US,KY,41114,6,,,, +US-KY-41121,US,KY,41121,6,,,, +US-KY-41124,US,KY,41124,6,,,, +US-KY-41128,US,KY,41128,6,,,, +US-KY-41129,US,KY,41129,6,,,, +US-KY-41132,US,KY,41132,6,,,, +US-KY-41135,US,KY,41135,6,,,, +US-KY-41139,US,KY,41139,6,,,, +US-KY-41141,US,KY,41141,6,,,, +US-KY-41142,US,KY,41142,6,,,, +US-KY-41143,US,KY,41143,6,,,, +US-KY-41144,US,KY,41144,6,,,, +US-KY-41146,US,KY,41146,6,,,, +US-KY-41149,US,KY,41149,6,,,, +US-KY-41159,US,KY,41159,6,,,, +US-KY-41160,US,KY,41160,6,,,, +US-KY-41164,US,KY,41164,6,,,, +US-KY-41166,US,KY,41166,6,,,, +US-KY-41168,US,KY,41168,6,,,, +US-KY-41169,US,KY,41169,6,,,, +US-KY-41171,US,KY,41171,6,,,, +US-KY-41173,US,KY,41173,6,,,, +US-KY-41174,US,KY,41174,6,,,, +US-KY-41175,US,KY,41175,6,,,, +US-KY-41179,US,KY,41179,6,,,, +US-KY-41180,US,KY,41180,6,,,, +US-KY-41181,US,KY,41181,6,,,, +US-KY-41183,US,KY,41183,6,,,, +US-KY-41189,US,KY,41189,6,,,, +US-KY-41201,US,KY,41201,6,,,, +US-KY-41203,US,KY,41203,6,,,, +US-KY-41204,US,KY,41204,6,,,, +US-KY-41214,US,KY,41214,6,,,, +US-KY-41216,US,KY,41216,6,,,, +US-KY-41219,US,KY,41219,6,,,, +US-KY-41222,US,KY,41222,6,,,, +US-KY-41224,US,KY,41224,6,,,, +US-KY-41226,US,KY,41226,6,,,, +US-KY-41230,US,KY,41230,6,,,, +US-KY-41231,US,KY,41231,6,,,, +US-KY-41232,US,KY,41232,6,,,, +US-KY-41234,US,KY,41234,6,,,, +US-KY-41238,US,KY,41238,6,,,, +US-KY-41240,US,KY,41240,6,,,, +US-KY-41250,US,KY,41250,6,,,, +US-KY-41254,US,KY,41254,6,,,, +US-KY-41255,US,KY,41255,6,,,, +US-KY-41256,US,KY,41256,6,,,, +US-KY-41257,US,KY,41257,6,,,, +US-KY-41260,US,KY,41260,6,,,, +US-KY-41262,US,KY,41262,6,,,, +US-KY-41263,US,KY,41263,6,,,, +US-KY-41264,US,KY,41264,6,,,, +US-KY-41265,US,KY,41265,6,,,, +US-KY-41267,US,KY,41267,6,,,, +US-KY-41268,US,KY,41268,6,,,, +US-KY-41271,US,KY,41271,6,,,, +US-KY-41274,US,KY,41274,6,,,, +US-KY-41301,US,KY,41301,6,,,, +US-KY-41307,US,KY,41307,6,,,, +US-KY-41310,US,KY,41310,6,,,, +US-KY-41311,US,KY,41311,6,,,, +US-KY-41314,US,KY,41314,6,,,, +US-KY-41317,US,KY,41317,6,,,, +US-KY-41332,US,KY,41332,6,,,, +US-KY-41333,US,KY,41333,6,,,, +US-KY-41339,US,KY,41339,6,,,, +US-KY-41347,US,KY,41347,6,,,, +US-KY-41348,US,KY,41348,6,,,, +US-KY-41351,US,KY,41351,6,,,, +US-KY-41352,US,KY,41352,6,,,, +US-KY-41360,US,KY,41360,6,,,, +US-KY-41364,US,KY,41364,6,,,, +US-KY-41365,US,KY,41365,6,,,, +US-KY-41366,US,KY,41366,6,,,, +US-KY-41367,US,KY,41367,6,,,, +US-KY-41368,US,KY,41368,6,,,, +US-KY-41385,US,KY,41385,6,,,, +US-KY-41386,US,KY,41386,6,,,, +US-KY-41390,US,KY,41390,6,,,, +US-KY-41397,US,KY,41397,6,,,, +US-KY-41408,US,KY,41408,6,,,, +US-KY-41413,US,KY,41413,6,,,, +US-KY-41421,US,KY,41421,6,,,, +US-KY-41425,US,KY,41425,6,,,, +US-KY-41426,US,KY,41426,6,,,, +US-KY-41451,US,KY,41451,6,,,, +US-KY-41459,US,KY,41459,6,,,, +US-KY-41464,US,KY,41464,6,,,, +US-KY-41465,US,KY,41465,6,,,, +US-KY-41472,US,KY,41472,6,,,, +US-KY-41501,US,KY,41501,6,,,, +US-KY-41502,US,KY,41502,6,,,, +US-KY-41503,US,KY,41503,6,,,, +US-KY-41512,US,KY,41512,6,,,, +US-KY-41513,US,KY,41513,6,,,, +US-KY-41514,US,KY,41514,6,,,, +US-KY-41517,US,KY,41517,6,,,, +US-KY-41519,US,KY,41519,6,,,, +US-KY-41520,US,KY,41520,6,,,, +US-KY-41522,US,KY,41522,6,,,, +US-KY-41524,US,KY,41524,6,,,, +US-KY-41526,US,KY,41526,6,,,, +US-KY-41527,US,KY,41527,6,,,, +US-KY-41528,US,KY,41528,6,,,, +US-KY-41531,US,KY,41531,6,,,, +US-KY-41534,US,KY,41534,6,,,, +US-KY-41535,US,KY,41535,6,,,, +US-KY-41537,US,KY,41537,6,,,, +US-KY-41538,US,KY,41538,6,,,, +US-KY-41539,US,KY,41539,6,,,, +US-KY-41540,US,KY,41540,6,,,, +US-KY-41542,US,KY,41542,6,,,, +US-KY-41543,US,KY,41543,6,,,, +US-KY-41544,US,KY,41544,6,,,, +US-KY-41547,US,KY,41547,6,,,, +US-KY-41548,US,KY,41548,6,,,, +US-KY-41549,US,KY,41549,6,,,, +US-KY-41553,US,KY,41553,6,,,, +US-KY-41554,US,KY,41554,6,,,, +US-KY-41555,US,KY,41555,6,,,, +US-KY-41557,US,KY,41557,6,,,, +US-KY-41558,US,KY,41558,6,,,, +US-KY-41559,US,KY,41559,6,,,, +US-KY-41560,US,KY,41560,6,,,, +US-KY-41561,US,KY,41561,6,,,, +US-KY-41562,US,KY,41562,6,,,, +US-KY-41563,US,KY,41563,6,,,, +US-KY-41564,US,KY,41564,6,,,, +US-KY-41566,US,KY,41566,6,,,, +US-KY-41567,US,KY,41567,6,,,, +US-KY-41568,US,KY,41568,6,,,, +US-KY-41571,US,KY,41571,6,,,, +US-KY-41572,US,KY,41572,6,,,, +US-KY-41601,US,KY,41601,6,,,, +US-KY-41602,US,KY,41602,6,,,, +US-KY-41603,US,KY,41603,6,,,, +US-KY-41604,US,KY,41604,6,,,, +US-KY-41605,US,KY,41605,6,,,, +US-KY-41606,US,KY,41606,6,,,, +US-KY-41607,US,KY,41607,6,,,, +US-KY-41612,US,KY,41612,6,,,, +US-KY-41615,US,KY,41615,6,,,, +US-KY-41616,US,KY,41616,6,,,, +US-KY-41619,US,KY,41619,6,,,, +US-KY-41621,US,KY,41621,6,,,, +US-KY-41622,US,KY,41622,6,,,, +US-KY-41630,US,KY,41630,6,,,, +US-KY-41631,US,KY,41631,6,,,, +US-KY-41632,US,KY,41632,6,,,, +US-KY-41635,US,KY,41635,6,,,, +US-KY-41636,US,KY,41636,6,,,, +US-KY-41640,US,KY,41640,6,,,, +US-KY-41642,US,KY,41642,6,,,, +US-KY-41643,US,KY,41643,6,,,, +US-KY-41645,US,KY,41645,6,,,, +US-KY-41647,US,KY,41647,6,,,, +US-KY-41649,US,KY,41649,6,,,, +US-KY-41650,US,KY,41650,6,,,, +US-KY-41651,US,KY,41651,6,,,, +US-KY-41653,US,KY,41653,6,,,, +US-KY-41655,US,KY,41655,6,,,, +US-KY-41659,US,KY,41659,6,,,, +US-KY-41660,US,KY,41660,6,,,, +US-KY-41663,US,KY,41663,6,,,, +US-KY-41666,US,KY,41666,6,,,, +US-KY-41667,US,KY,41667,6,,,, +US-KY-41669,US,KY,41669,6,,,, +US-KY-41701,US,KY,41701,6,,,, +US-KY-41702,US,KY,41702,6,,,, +US-KY-41712,US,KY,41712,6,,,, +US-KY-41713,US,KY,41713,6,,,, +US-KY-41714,US,KY,41714,6,,,, +US-KY-41719,US,KY,41719,6,,,, +US-KY-41721,US,KY,41721,6,,,, +US-KY-41722,US,KY,41722,6,,,, +US-KY-41723,US,KY,41723,6,,,, +US-KY-41725,US,KY,41725,6,,,, +US-KY-41727,US,KY,41727,6,,,, +US-KY-41729,US,KY,41729,6,,,, +US-KY-41731,US,KY,41731,6,,,, +US-KY-41735,US,KY,41735,6,,,, +US-KY-41736,US,KY,41736,6,,,, +US-KY-41739,US,KY,41739,6,,,, +US-KY-41740,US,KY,41740,6,,,, +US-KY-41743,US,KY,41743,6,,,, +US-KY-41745,US,KY,41745,6,,,, +US-KY-41746,US,KY,41746,6,,,, +US-KY-41749,US,KY,41749,6,,,, +US-KY-41751,US,KY,41751,6,,,, +US-KY-41754,US,KY,41754,6,,,, +US-KY-41759,US,KY,41759,6,,,, +US-KY-41760,US,KY,41760,6,,,, +US-KY-41762,US,KY,41762,6,,,, +US-KY-41763,US,KY,41763,6,,,, +US-KY-41764,US,KY,41764,6,,,, +US-KY-41766,US,KY,41766,6,,,, +US-KY-41772,US,KY,41772,6,,,, +US-KY-41773,US,KY,41773,6,,,, +US-KY-41774,US,KY,41774,6,,,, +US-KY-41775,US,KY,41775,6,,,, +US-KY-41776,US,KY,41776,6,,,, +US-KY-41777,US,KY,41777,6,,,, +US-KY-41778,US,KY,41778,6,,,, +US-KY-41804,US,KY,41804,6,,,, +US-KY-41810,US,KY,41810,6,,,, +US-KY-41812,US,KY,41812,6,,,, +US-KY-41815,US,KY,41815,6,,,, +US-KY-41817,US,KY,41817,6,,,, +US-KY-41819,US,KY,41819,6,,,, +US-KY-41821,US,KY,41821,6,,,, +US-KY-41822,US,KY,41822,6,,,, +US-KY-41824,US,KY,41824,6,,,, +US-KY-41825,US,KY,41825,6,,,, +US-KY-41826,US,KY,41826,6,,,, +US-KY-41828,US,KY,41828,6,,,, +US-KY-41831,US,KY,41831,6,,,, +US-KY-41832,US,KY,41832,6,,,, +US-KY-41833,US,KY,41833,6,,,, +US-KY-41834,US,KY,41834,6,,,, +US-KY-41835,US,KY,41835,6,,,, +US-KY-41836,US,KY,41836,6,,,, +US-KY-41837,US,KY,41837,6,,,, +US-KY-41838,US,KY,41838,6,,,, +US-KY-41839,US,KY,41839,6,,,, +US-KY-41840,US,KY,41840,6,,,, +US-KY-41843,US,KY,41843,6,,,, +US-KY-41844,US,KY,41844,6,,,, +US-KY-41845,US,KY,41845,6,,,, +US-KY-41847,US,KY,41847,6,,,, +US-KY-41848,US,KY,41848,6,,,, +US-KY-41849,US,KY,41849,6,,,, +US-KY-41855,US,KY,41855,6,,,, +US-KY-41858,US,KY,41858,6,,,, +US-KY-41859,US,KY,41859,6,,,, +US-KY-41861,US,KY,41861,6,,,, +US-KY-41862,US,KY,41862,6,,,, +US-KY-42001,US,KY,42001,6,,,, +US-KY-42002,US,KY,42002,6,,,, +US-KY-42003,US,KY,42003,6,,,, +US-KY-42020,US,KY,42020,6,,,, +US-KY-42021,US,KY,42021,6,,,, +US-KY-42022,US,KY,42022,6,,,, +US-KY-42023,US,KY,42023,6,,,, +US-KY-42024,US,KY,42024,6,,,, +US-KY-42025,US,KY,42025,6,,,, +US-KY-42027,US,KY,42027,6,,,, +US-KY-42028,US,KY,42028,6,,,, +US-KY-42029,US,KY,42029,6,,,, +US-KY-42031,US,KY,42031,6,,,, +US-KY-42032,US,KY,42032,6,,,, +US-KY-42033,US,KY,42033,6,,,, +US-KY-42035,US,KY,42035,6,,,, +US-KY-42036,US,KY,42036,6,,,, +US-KY-42037,US,KY,42037,6,,,, +US-KY-42038,US,KY,42038,6,,,, +US-KY-42039,US,KY,42039,6,,,, +US-KY-42040,US,KY,42040,6,,,, +US-KY-42041,US,KY,42041,6,,,, +US-KY-42044,US,KY,42044,6,,,, +US-KY-42045,US,KY,42045,6,,,, +US-KY-42047,US,KY,42047,6,,,, +US-KY-42048,US,KY,42048,6,,,, +US-KY-42049,US,KY,42049,6,,,, +US-KY-42050,US,KY,42050,6,,,, +US-KY-42051,US,KY,42051,6,,,, +US-KY-42053,US,KY,42053,6,,,, +US-KY-42054,US,KY,42054,6,,,, +US-KY-42055,US,KY,42055,6,,,, +US-KY-42056,US,KY,42056,6,,,, +US-KY-42058,US,KY,42058,6,,,, +US-KY-42060,US,KY,42060,6,,,, +US-KY-42061,US,KY,42061,6,,,, +US-KY-42063,US,KY,42063,6,,,, +US-KY-42064,US,KY,42064,6,,,, +US-KY-42066,US,KY,42066,6,,,, +US-KY-42069,US,KY,42069,6,,,, +US-KY-42070,US,KY,42070,6,,,, +US-KY-42071,US,KY,42071,6,,,, +US-KY-42076,US,KY,42076,6,,,, +US-KY-42078,US,KY,42078,6,,,, +US-KY-42079,US,KY,42079,6,,,, +US-KY-42081,US,KY,42081,6,,,, +US-KY-42082,US,KY,42082,6,,,, +US-KY-42083,US,KY,42083,6,,,, +US-KY-42084,US,KY,42084,6,,,, +US-KY-42085,US,KY,42085,6,,,, +US-KY-42086,US,KY,42086,6,,,, +US-KY-42087,US,KY,42087,6,,,, +US-KY-42088,US,KY,42088,6,,,, +US-KY-42101,US,KY,42101,6,,,, +US-KY-42102,US,KY,42102,6,,,, +US-KY-42103,US,KY,42103,6,,,, +US-KY-42104,US,KY,42104,6,,,, +US-KY-42120,US,KY,42120,6,,,, +US-KY-42122,US,KY,42122,6,,,, +US-KY-42123,US,KY,42123,6,,,, +US-KY-42124,US,KY,42124,6,,,, +US-KY-42127,US,KY,42127,6,,,, +US-KY-42128,US,KY,42128,6,,,, +US-KY-42129,US,KY,42129,6,,,, +US-KY-42130,US,KY,42130,6,,,, +US-KY-42131,US,KY,42131,6,,,, +US-KY-42133,US,KY,42133,6,,,, +US-KY-42134,US,KY,42134,6,,,, +US-KY-42135,US,KY,42135,6,,,, +US-KY-42140,US,KY,42140,6,,,, +US-KY-42141,US,KY,42141,6,,,, +US-KY-42142,US,KY,42142,6,,,, +US-KY-42151,US,KY,42151,6,,,, +US-KY-42152,US,KY,42152,6,,,, +US-KY-42153,US,KY,42153,6,,,, +US-KY-42154,US,KY,42154,6,,,, +US-KY-42156,US,KY,42156,6,,,, +US-KY-42157,US,KY,42157,6,,,, +US-KY-42159,US,KY,42159,6,,,, +US-KY-42160,US,KY,42160,6,,,, +US-KY-42163,US,KY,42163,6,,,, +US-KY-42164,US,KY,42164,6,,,, +US-KY-42166,US,KY,42166,6,,,, +US-KY-42167,US,KY,42167,6,,,, +US-KY-42170,US,KY,42170,6,,,, +US-KY-42171,US,KY,42171,6,,,, +US-KY-42201,US,KY,42201,6,,,, +US-KY-42202,US,KY,42202,6,,,, +US-KY-42204,US,KY,42204,6,,,, +US-KY-42206,US,KY,42206,6,,,, +US-KY-42207,US,KY,42207,6,,,, +US-KY-42210,US,KY,42210,6,,,, +US-KY-42211,US,KY,42211,6,,,, +US-KY-42214,US,KY,42214,6,,,, +US-KY-42215,US,KY,42215,6,,,, +US-KY-42216,US,KY,42216,6,,,, +US-KY-42217,US,KY,42217,6,,,, +US-KY-42219,US,KY,42219,6,,,, +US-KY-42220,US,KY,42220,6,,,, +US-KY-42221,US,KY,42221,6,,,, +US-KY-42223,US,KY,42223,6,,,, +US-KY-42232,US,KY,42232,6,,,, +US-KY-42234,US,KY,42234,6,,,, +US-KY-42236,US,KY,42236,6,,,, +US-KY-42240,US,KY,42240,6,,,, +US-KY-42241,US,KY,42241,6,,,, +US-KY-42252,US,KY,42252,6,,,, +US-KY-42254,US,KY,42254,6,,,, +US-KY-42256,US,KY,42256,6,,,, +US-KY-42259,US,KY,42259,6,,,, +US-KY-42261,US,KY,42261,6,,,, +US-KY-42262,US,KY,42262,6,,,, +US-KY-42265,US,KY,42265,6,,,, +US-KY-42266,US,KY,42266,6,,,, +US-KY-42273,US,KY,42273,6,,,, +US-KY-42274,US,KY,42274,6,,,, +US-KY-42275,US,KY,42275,6,,,, +US-KY-42276,US,KY,42276,6,,,, +US-KY-42280,US,KY,42280,6,,,, +US-KY-42285,US,KY,42285,6,,,, +US-KY-42286,US,KY,42286,6,,,, +US-KY-42288,US,KY,42288,6,,,, +US-KY-42301,US,KY,42301,6,,,, +US-KY-42302,US,KY,42302,6,,,, +US-KY-42303,US,KY,42303,6,,,, +US-KY-42304,US,KY,42304,6,,,, +US-KY-42320,US,KY,42320,6,,,, +US-KY-42321,US,KY,42321,6,,,, +US-KY-42322,US,KY,42322,6,,,, +US-KY-42323,US,KY,42323,6,,,, +US-KY-42324,US,KY,42324,6,,,, +US-KY-42325,US,KY,42325,6,,,, +US-KY-42326,US,KY,42326,6,,,, +US-KY-42327,US,KY,42327,6,,,, +US-KY-42328,US,KY,42328,6,,,, +US-KY-42330,US,KY,42330,6,,,, +US-KY-42332,US,KY,42332,6,,,, +US-KY-42333,US,KY,42333,6,,,, +US-KY-42334,US,KY,42334,6,,,, +US-KY-42337,US,KY,42337,6,,,, +US-KY-42338,US,KY,42338,6,,,, +US-KY-42339,US,KY,42339,6,,,, +US-KY-42343,US,KY,42343,6,,,, +US-KY-42344,US,KY,42344,6,,,, +US-KY-42345,US,KY,42345,6,,,, +US-KY-42347,US,KY,42347,6,,,, +US-KY-42348,US,KY,42348,6,,,, +US-KY-42349,US,KY,42349,6,,,, +US-KY-42350,US,KY,42350,6,,,, +US-KY-42351,US,KY,42351,6,,,, +US-KY-42352,US,KY,42352,6,,,, +US-KY-42354,US,KY,42354,6,,,, +US-KY-42355,US,KY,42355,6,,,, +US-KY-42356,US,KY,42356,6,,,, +US-KY-42361,US,KY,42361,6,,,, +US-KY-42364,US,KY,42364,6,,,, +US-KY-42366,US,KY,42366,6,,,, +US-KY-42367,US,KY,42367,6,,,, +US-KY-42368,US,KY,42368,6,,,, +US-KY-42369,US,KY,42369,6,,,, +US-KY-42370,US,KY,42370,6,,,, +US-KY-42371,US,KY,42371,6,,,, +US-KY-42372,US,KY,42372,6,,,, +US-KY-42374,US,KY,42374,6,,,, +US-KY-42376,US,KY,42376,6,,,, +US-KY-42377,US,KY,42377,6,,,, +US-KY-42378,US,KY,42378,6,,,, +US-KY-42402,US,KY,42402,6,,,, +US-KY-42404,US,KY,42404,6,,,, +US-KY-42406,US,KY,42406,6,,,, +US-KY-42408,US,KY,42408,6,,,, +US-KY-42409,US,KY,42409,6,,,, +US-KY-42410,US,KY,42410,6,,,, +US-KY-42411,US,KY,42411,6,,,, +US-KY-42413,US,KY,42413,6,,,, +US-KY-42419,US,KY,42419,6,,,, +US-KY-42420,US,KY,42420,6,,,, +US-KY-42431,US,KY,42431,6,,,, +US-KY-42436,US,KY,42436,6,,,, +US-KY-42437,US,KY,42437,6,,,, +US-KY-42440,US,KY,42440,6,,,, +US-KY-42441,US,KY,42441,6,,,, +US-KY-42442,US,KY,42442,6,,,, +US-KY-42444,US,KY,42444,6,,,, +US-KY-42445,US,KY,42445,6,,,, +US-KY-42450,US,KY,42450,6,,,, +US-KY-42451,US,KY,42451,6,,,, +US-KY-42452,US,KY,42452,6,,,, +US-KY-42453,US,KY,42453,6,,,, +US-KY-42455,US,KY,42455,6,,,, +US-KY-42456,US,KY,42456,6,,,, +US-KY-42457,US,KY,42457,6,,,, +US-KY-42458,US,KY,42458,6,,,, +US-KY-42459,US,KY,42459,6,,,, +US-KY-42460,US,KY,42460,6,,,, +US-KY-42461,US,KY,42461,6,,,, +US-KY-42462,US,KY,42462,6,,,, +US-KY-42463,US,KY,42463,6,,,, +US-KY-42464,US,KY,42464,6,,,, +US-KY-42501,US,KY,42501,6,,,, +US-KY-42502,US,KY,42502,6,,,, +US-KY-42503,US,KY,42503,6,,,, +US-KY-42516,US,KY,42516,6,,,, +US-KY-42518,US,KY,42518,6,,,, +US-KY-42519,US,KY,42519,6,,,, +US-KY-42528,US,KY,42528,6,,,, +US-KY-42533,US,KY,42533,6,,,, +US-KY-42539,US,KY,42539,6,,,, +US-KY-42541,US,KY,42541,6,,,, +US-KY-42544,US,KY,42544,6,,,, +US-KY-42553,US,KY,42553,6,,,, +US-KY-42558,US,KY,42558,6,,,, +US-KY-42564,US,KY,42564,6,,,, +US-KY-42565,US,KY,42565,6,,,, +US-KY-42566,US,KY,42566,6,,,, +US-KY-42567,US,KY,42567,6,,,, +US-KY-42602,US,KY,42602,6,,,, +US-KY-42603,US,KY,42603,6,,,, +US-KY-42629,US,KY,42629,6,,,, +US-KY-42631,US,KY,42631,6,,,, +US-KY-42633,US,KY,42633,6,,,, +US-KY-42634,US,KY,42634,6,,,, +US-KY-42635,US,KY,42635,6,,,, +US-KY-42638,US,KY,42638,6,,,, +US-KY-42642,US,KY,42642,6,,,, +US-KY-42647,US,KY,42647,6,,,, +US-KY-42649,US,KY,42649,6,,,, +US-KY-42653,US,KY,42653,6,,,, +US-KY-42701,US,KY,42701,6,,,, +US-KY-42702,US,KY,42702,6,,,, +US-KY-42712,US,KY,42712,6,,,, +US-KY-42713,US,KY,42713,6,,,, +US-KY-42715,US,KY,42715,6,,,, +US-KY-42716,US,KY,42716,6,,,, +US-KY-42717,US,KY,42717,6,,,, +US-KY-42718,US,KY,42718,6,,,, +US-KY-42719,US,KY,42719,6,,,, +US-KY-42720,US,KY,42720,6,,,, +US-KY-42721,US,KY,42721,6,,,, +US-KY-42722,US,KY,42722,6,,,, +US-KY-42724,US,KY,42724,6,,,, +US-KY-42726,US,KY,42726,6,,,, +US-KY-42728,US,KY,42728,6,,,, +US-KY-42729,US,KY,42729,6,,,, +US-KY-42731,US,KY,42731,6,,,, +US-KY-42732,US,KY,42732,6,,,, +US-KY-42733,US,KY,42733,6,,,, +US-KY-42740,US,KY,42740,6,,,, +US-KY-42741,US,KY,42741,6,,,, +US-KY-42742,US,KY,42742,6,,,, +US-KY-42743,US,KY,42743,6,,,, +US-KY-42746,US,KY,42746,6,,,, +US-KY-42748,US,KY,42748,6,,,, +US-KY-42749,US,KY,42749,6,,,, +US-KY-42753,US,KY,42753,6,,,, +US-KY-42754,US,KY,42754,6,,,, +US-KY-42755,US,KY,42755,6,,,, +US-KY-42757,US,KY,42757,6,,,, +US-KY-42758,US,KY,42758,6,,,, +US-KY-42759,US,KY,42759,6,,,, +US-KY-42762,US,KY,42762,6,,,, +US-KY-42764,US,KY,42764,6,,,, +US-KY-42765,US,KY,42765,6,,,, +US-KY-42776,US,KY,42776,6,,,, +US-KY-42782,US,KY,42782,6,,,, +US-KY-42784,US,KY,42784,6,,,, +US-KY-42788,US,KY,42788,6,,,, +US-LA-70001,US,LA,70001,8.75,,,, +US-LA-70002,US,LA,70002,8.75,,,, +US-LA-70003,US,LA,70003,8.75,,,, +US-LA-70004,US,LA,70004,8.75,,,, +US-LA-70005,US,LA,70005,8.75,,,, +US-LA-70006,US,LA,70006,8.75,,,, +US-LA-70009,US,LA,70009,8.75,,,, +US-LA-70010,US,LA,70010,8.75,,,, +US-LA-70011,US,LA,70011,8.75,,,, +US-LA-70030,US,LA,70030,9,,,, +US-LA-70031,US,LA,70031,9,,,, +US-LA-70032,US,LA,70032,9,,,, +US-LA-70033,US,LA,70033,8.75,,,, +US-LA-70036,US,LA,70036,8.75,,,, +US-LA-70037,US,LA,70037,8,,,, +US-LA-70038,US,LA,70038,8,,,, +US-LA-70039,US,LA,70039,9,,,, +US-LA-70040,US,LA,70040,8,,,, +US-LA-70041,US,LA,70041,8,,,, +US-LA-70043,US,LA,70043,9,,,, +US-LA-70044,US,LA,70044,9,,,, +US-LA-70047,US,LA,70047,9,,,, +US-LA-70049,US,LA,70049,8.75,,,, +US-LA-70050,US,LA,70050,8,,,, +US-LA-70051,US,LA,70051,8.75,,,, +US-LA-70052,US,LA,70052,7.5,,,, +US-LA-70053,US,LA,70053,8.75,,,, +US-LA-70054,US,LA,70054,8.75,,,, +US-LA-70055,US,LA,70055,8.75,,,, +US-LA-70056,US,LA,70056,8.75,,,, +US-LA-70057,US,LA,70057,9,,,, +US-LA-70058,US,LA,70058,8.75,,,, +US-LA-70059,US,LA,70059,8.75,,,, +US-LA-70060,US,LA,70060,8.75,,,, +US-LA-70062,US,LA,70062,8.75,,,, +US-LA-70063,US,LA,70063,8.75,,,, +US-LA-70064,US,LA,70064,8.75,,,, +US-LA-70065,US,LA,70065,8.75,,,, +US-LA-70067,US,LA,70067,8.75,,,, +US-LA-70068,US,LA,70068,8.75,,,, +US-LA-70069,US,LA,70069,8.75,,,, +US-LA-70070,US,LA,70070,9,,,, +US-LA-70071,US,LA,70071,7.5,,,, +US-LA-70072,US,LA,70072,8.75,,,, +US-LA-70073,US,LA,70073,8.75,,,, +US-LA-70075,US,LA,70075,9,,,, +US-LA-70076,US,LA,70076,8.75,,,, +US-LA-70078,US,LA,70078,9,,,, +US-LA-70079,US,LA,70079,9,,,, +US-LA-70080,US,LA,70080,9,,,, +US-LA-70081,US,LA,70081,8,,,, +US-LA-70082,US,LA,70082,8,,,, +US-LA-70083,US,LA,70083,8,,,, +US-LA-70084,US,LA,70084,8.75,,,, +US-LA-70085,US,LA,70085,9,,,, +US-LA-70086,US,LA,70086,7.5,,,, +US-LA-70087,US,LA,70087,9,,,, +US-LA-70090,US,LA,70090,7.5,,,, +US-LA-70091,US,LA,70091,8,,,, +US-LA-70092,US,LA,70092,9,,,, +US-LA-70093,US,LA,70093,8,,,, +US-LA-70094,US,LA,70094,8.75,,,, +US-LA-70096,US,LA,70096,8.75,,,, +US-LA-70097,US,LA,70097,8.75,,,, +US-LA-70112,US,LA,70112,9,,,, +US-LA-70113,US,LA,70113,9,,,, +US-LA-70114,US,LA,70114,9,,,, +US-LA-70115,US,LA,70115,9,,,, +US-LA-70116,US,LA,70116,9,,,, +US-LA-70117,US,LA,70117,9,,,, +US-LA-70118,US,LA,70118,9,,,, +US-LA-70119,US,LA,70119,9,,,, +US-LA-70121,US,LA,70121,8.75,,,, +US-LA-70122,US,LA,70122,9,,,, +US-LA-70123,US,LA,70123,8.75,,,, +US-LA-70124,US,LA,70124,9,,,, +US-LA-70125,US,LA,70125,9,,,, +US-LA-70126,US,LA,70126,9,,,, +US-LA-70127,US,LA,70127,9,,,, +US-LA-70128,US,LA,70128,9,,,, +US-LA-70129,US,LA,70129,9,,,, +US-LA-70130,US,LA,70130,9,,,, +US-LA-70131,US,LA,70131,9,,,, +US-LA-70139,US,LA,70139,9,,,, +US-LA-70141,US,LA,70141,10.75,,,, +US-LA-70142,US,LA,70142,9,,,, +US-LA-70143,US,LA,70143,9,,,, +US-LA-70145,US,LA,70145,9,,,, +US-LA-70146,US,LA,70146,9,,,, +US-LA-70148,US,LA,70148,9,,,, +US-LA-70150,US,LA,70150,9,,,, +US-LA-70151,US,LA,70151,9,,,, +US-LA-70152,US,LA,70152,9,,,, +US-LA-70153,US,LA,70153,9,,,, +US-LA-70154,US,LA,70154,9,,,, +US-LA-70156,US,LA,70156,9,,,, +US-LA-70157,US,LA,70157,9,,,, +US-LA-70158,US,LA,70158,9,,,, +US-LA-70159,US,LA,70159,9,,,, +US-LA-70160,US,LA,70160,9,,,, +US-LA-70161,US,LA,70161,9,,,, +US-LA-70162,US,LA,70162,9,,,, +US-LA-70163,US,LA,70163,9,,,, +US-LA-70164,US,LA,70164,9,,,, +US-LA-70165,US,LA,70165,9,,,, +US-LA-70166,US,LA,70166,9,,,, +US-LA-70167,US,LA,70167,9,,,, +US-LA-70170,US,LA,70170,9,,,, +US-LA-70172,US,LA,70172,9,,,, +US-LA-70174,US,LA,70174,9,,,, +US-LA-70175,US,LA,70175,9,,,, +US-LA-70176,US,LA,70176,9,,,, +US-LA-70177,US,LA,70177,9,,,, +US-LA-70178,US,LA,70178,9,,,, +US-LA-70179,US,LA,70179,9,,,, +US-LA-70181,US,LA,70181,9,,,, +US-LA-70182,US,LA,70182,9,,,, +US-LA-70183,US,LA,70183,8.75,,,, +US-LA-70184,US,LA,70184,9,,,, +US-LA-70185,US,LA,70185,9,,,, +US-LA-70186,US,LA,70186,9,,,, +US-LA-70187,US,LA,70187,9,,,, +US-LA-70189,US,LA,70189,9,,,, +US-LA-70190,US,LA,70190,9,,,, +US-LA-70195,US,LA,70195,9,,,, +US-LA-70301,US,LA,70301,8,,,, +US-LA-70302,US,LA,70302,8,,,, +US-LA-70310,US,LA,70310,8,,,, +US-LA-70339,US,LA,70339,9,,,, +US-LA-70340,US,LA,70340,8,,,, +US-LA-70341,US,LA,70341,9,,,, +US-LA-70342,US,LA,70342,8,,,, +US-LA-70343,US,LA,70343,9,,,, +US-LA-70344,US,LA,70344,9,,,, +US-LA-70345,US,LA,70345,9.2,,,, +US-LA-70346,US,LA,70346,9,,,, +US-LA-70352,US,LA,70352,9,,,, +US-LA-70353,US,LA,70353,9,,,, +US-LA-70354,US,LA,70354,9.2,,,, +US-LA-70355,US,LA,70355,8.7,,,, +US-LA-70356,US,LA,70356,9,,,, +US-LA-70357,US,LA,70357,9.2,,,, +US-LA-70358,US,LA,70358,8.75,,,, +US-LA-70359,US,LA,70359,9,,,, +US-LA-70360,US,LA,70360,9,,,, +US-LA-70361,US,LA,70361,9,,,, +US-LA-70363,US,LA,70363,9,,,, +US-LA-70364,US,LA,70364,9,,,, +US-LA-70371,US,LA,70371,8.7,,,, +US-LA-70372,US,LA,70372,9,,,, +US-LA-70373,US,LA,70373,9.2,,,, +US-LA-70374,US,LA,70374,8.7,,,, +US-LA-70375,US,LA,70375,8.7,,,, +US-LA-70377,US,LA,70377,9,,,, +US-LA-70380,US,LA,70380,8.3,,,, +US-LA-70381,US,LA,70381,8.3,,,, +US-LA-70390,US,LA,70390,9,,,, +US-LA-70391,US,LA,70391,9,,,, +US-LA-70392,US,LA,70392,8,,,, +US-LA-70393,US,LA,70393,9,,,, +US-LA-70394,US,LA,70394,8.7,,,, +US-LA-70395,US,LA,70395,9,,,, +US-LA-70397,US,LA,70397,9,,,, +US-LA-70401,US,LA,70401,9,,,, +US-LA-70402,US,LA,70402,9,,,, +US-LA-70403,US,LA,70403,7,,,, +US-LA-70404,US,LA,70404,9,,,, +US-LA-70420,US,LA,70420,8.75,,,, +US-LA-70421,US,LA,70421,7,,,, +US-LA-70422,US,LA,70422,7,,,, +US-LA-70426,US,LA,70426,8.5,,,, +US-LA-70427,US,LA,70427,9.163,,,, +US-LA-70429,US,LA,70429,9.163,,,, +US-LA-70431,US,LA,70431,8.75,,,, +US-LA-70433,US,LA,70433,8.75,,,, +US-LA-70434,US,LA,70434,8.75,,,, +US-LA-70435,US,LA,70435,8.75,,,, +US-LA-70436,US,LA,70436,7.5,,,, +US-LA-70437,US,LA,70437,8.75,,,, +US-LA-70438,US,LA,70438,8.5,,,, +US-LA-70441,US,LA,70441,9,,,, +US-LA-70442,US,LA,70442,7,,,, +US-LA-70443,US,LA,70443,7,,,, +US-LA-70444,US,LA,70444,7,,,, +US-LA-70445,US,LA,70445,8.75,,,, +US-LA-70446,US,LA,70446,7,,,, +US-LA-70447,US,LA,70447,8.75,,,, +US-LA-70448,US,LA,70448,8.75,,,, +US-LA-70449,US,LA,70449,9,,,, +US-LA-70450,US,LA,70450,8.5,,,, +US-LA-70451,US,LA,70451,7,,,, +US-LA-70452,US,LA,70452,8.75,,,, +US-LA-70453,US,LA,70453,9,,,, +US-LA-70454,US,LA,70454,7,,,, +US-LA-70455,US,LA,70455,7,,,, +US-LA-70456,US,LA,70456,7.5,,,, +US-LA-70457,US,LA,70457,8.75,,,, +US-LA-70458,US,LA,70458,8.75,,,, +US-LA-70459,US,LA,70459,8.75,,,, +US-LA-70460,US,LA,70460,8.75,,,, +US-LA-70461,US,LA,70461,8.75,,,, +US-LA-70462,US,LA,70462,8,,,, +US-LA-70463,US,LA,70463,9.25,,,, +US-LA-70464,US,LA,70464,8.75,,,, +US-LA-70465,US,LA,70465,9,,,, +US-LA-70466,US,LA,70466,7,,,, +US-LA-70467,US,LA,70467,8.5,,,, +US-LA-70469,US,LA,70469,8.75,,,, +US-LA-70470,US,LA,70470,9.25,,,, +US-LA-70471,US,LA,70471,8.75,,,, +US-LA-70501,US,LA,70501,8,,,, +US-LA-70502,US,LA,70502,8,,,, +US-LA-70503,US,LA,70503,8,,,, +US-LA-70504,US,LA,70504,8,,,, +US-LA-70505,US,LA,70505,8,,,, +US-LA-70506,US,LA,70506,8,,,, +US-LA-70507,US,LA,70507,8,,,, +US-LA-70508,US,LA,70508,8,,,, +US-LA-70509,US,LA,70509,8,,,, +US-LA-70510,US,LA,70510,9.5,,,, +US-LA-70511,US,LA,70511,9.5,,,, +US-LA-70512,US,LA,70512,7.55,,,, +US-LA-70513,US,LA,70513,7.25,,,, +US-LA-70514,US,LA,70514,8,,,, +US-LA-70515,US,LA,70515,8.25,,,, +US-LA-70516,US,LA,70516,8.25,,,, +US-LA-70517,US,LA,70517,7.5,,,, +US-LA-70518,US,LA,70518,7.5,,,, +US-LA-70519,US,LA,70519,7.5,,,, +US-LA-70520,US,LA,70520,8,,,, +US-LA-70521,US,LA,70521,7.5,,,, +US-LA-70523,US,LA,70523,8,,,, +US-LA-70524,US,LA,70524,9,,,, +US-LA-70525,US,LA,70525,8.25,,,, +US-LA-70526,US,LA,70526,9.5,,,, +US-LA-70527,US,LA,70527,9.5,,,, +US-LA-70528,US,LA,70528,9.25,,,, +US-LA-70529,US,LA,70529,8,,,, +US-LA-70531,US,LA,70531,8.25,,,, +US-LA-70532,US,LA,70532,8.5,,,, +US-LA-70533,US,LA,70533,8.25,,,, +US-LA-70534,US,LA,70534,8.25,,,, +US-LA-70535,US,LA,70535,9.75,,,, +US-LA-70537,US,LA,70537,8.25,,,, +US-LA-70538,US,LA,70538,8,,,, +US-LA-70540,US,LA,70540,8,,,, +US-LA-70541,US,LA,70541,9.55,,,, +US-LA-70542,US,LA,70542,7.75,,,, +US-LA-70543,US,LA,70543,8.25,,,, +US-LA-70544,US,LA,70544,8.5,,,, +US-LA-70546,US,LA,70546,9,,,, +US-LA-70548,US,LA,70548,8.75,,,, +US-LA-70549,US,LA,70549,9,,,, +US-LA-70550,US,LA,70550,7.55,,,, +US-LA-70551,US,LA,70551,7.55,,,, +US-LA-70552,US,LA,70552,7.25,,,, +US-LA-70554,US,LA,70554,9,,,, +US-LA-70555,US,LA,70555,8.25,,,, +US-LA-70556,US,LA,70556,8.25,,,, +US-LA-70558,US,LA,70558,8,,,, +US-LA-70559,US,LA,70559,8.25,,,, +US-LA-70560,US,LA,70560,8.5,,,, +US-LA-70562,US,LA,70562,8.5,,,, +US-LA-70563,US,LA,70563,7.25,,,, +US-LA-70569,US,LA,70569,7.25,,,, +US-LA-70570,US,LA,70570,9.75,,,, +US-LA-70571,US,LA,70571,9.75,,,, +US-LA-70575,US,LA,70575,8.25,,,, +US-LA-70576,US,LA,70576,9,,,, +US-LA-70577,US,LA,70577,7.55,,,, +US-LA-70578,US,LA,70578,9,,,, +US-LA-70580,US,LA,70580,9,,,, +US-LA-70581,US,LA,70581,8.5,,,, +US-LA-70582,US,LA,70582,8.5,,,, +US-LA-70583,US,LA,70583,8,,,, +US-LA-70584,US,LA,70584,7.55,,,, +US-LA-70585,US,LA,70585,9,,,, +US-LA-70586,US,LA,70586,9,,,, +US-LA-70589,US,LA,70589,7.55,,,, +US-LA-70591,US,LA,70591,8.5,,,, +US-LA-70592,US,LA,70592,9.5,,,, +US-LA-70593,US,LA,70593,8,,,, +US-LA-70596,US,LA,70596,8,,,, +US-LA-70598,US,LA,70598,8,,,, +US-LA-70601,US,LA,70601,9,,,, +US-LA-70602,US,LA,70602,9,,,, +US-LA-70605,US,LA,70605,9,,,, +US-LA-70606,US,LA,70606,9,,,, +US-LA-70607,US,LA,70607,9,,,, +US-LA-70609,US,LA,70609,9,,,, +US-LA-70611,US,LA,70611,9.25,,,, +US-LA-70612,US,LA,70612,9.25,,,, +US-LA-70615,US,LA,70615,9.25,,,, +US-LA-70616,US,LA,70616,9,,,, +US-LA-70629,US,LA,70629,9,,,, +US-LA-70630,US,LA,70630,9.25,,,, +US-LA-70631,US,LA,70631,4,,,, +US-LA-70632,US,LA,70632,4,,,, +US-LA-70633,US,LA,70633,9.25,,,, +US-LA-70634,US,LA,70634,9,,,, +US-LA-70637,US,LA,70637,8.75,,,, +US-LA-70638,US,LA,70638,10,,,, +US-LA-70639,US,LA,70639,8,,,, +US-LA-70640,US,LA,70640,8.5,,,, +US-LA-70643,US,LA,70643,4,,,, +US-LA-70644,US,LA,70644,8.7,,,, +US-LA-70645,US,LA,70645,4,,,, +US-LA-70646,US,LA,70646,9.25,,,, +US-LA-70647,US,LA,70647,9.25,,,, +US-LA-70648,US,LA,70648,8.7,,,, +US-LA-70650,US,LA,70650,8.5,,,, +US-LA-70651,US,LA,70651,8.7,,,, +US-LA-70652,US,LA,70652,8.75,,,, +US-LA-70653,US,LA,70653,8.75,,,, +US-LA-70654,US,LA,70654,8.7,,,, +US-LA-70655,US,LA,70655,8.7,,,, +US-LA-70656,US,LA,70656,8,,,, +US-LA-70657,US,LA,70657,8.75,,,, +US-LA-70658,US,LA,70658,8.7,,,, +US-LA-70659,US,LA,70659,9.5,,,, +US-LA-70660,US,LA,70660,8.75,,,, +US-LA-70661,US,LA,70661,9.25,,,, +US-LA-70662,US,LA,70662,8.75,,,, +US-LA-70663,US,LA,70663,9.25,,,, +US-LA-70664,US,LA,70664,9.25,,,, +US-LA-70665,US,LA,70665,9.25,,,, +US-LA-70668,US,LA,70668,9.25,,,, +US-LA-70669,US,LA,70669,9.25,,,, +US-LA-70704,US,LA,70704,9.5,,,, +US-LA-70706,US,LA,70706,9.5,,,, +US-LA-70707,US,LA,70707,8.5,,,, +US-LA-70710,US,LA,70710,9,,,, +US-LA-70711,US,LA,70711,8,,,, +US-LA-70712,US,LA,70712,9,,,, +US-LA-70714,US,LA,70714,9.5,,,, +US-LA-70715,US,LA,70715,8,,,, +US-LA-70718,US,LA,70718,8.5,,,, +US-LA-70719,US,LA,70719,9,,,, +US-LA-70721,US,LA,70721,9.666,,,, +US-LA-70722,US,LA,70722,9,,,, +US-LA-70723,US,LA,70723,7.5,,,, +US-LA-70725,US,LA,70725,8.5,,,, +US-LA-70726,US,LA,70726,8.5,,,, +US-LA-70727,US,LA,70727,9.5,,,, +US-LA-70728,US,LA,70728,8.5,,,, +US-LA-70729,US,LA,70729,9,,,, +US-LA-70730,US,LA,70730,9,,,, +US-LA-70732,US,LA,70732,9,,,, +US-LA-70733,US,LA,70733,8,,,, +US-LA-70734,US,LA,70734,8.5,,,, +US-LA-70736,US,LA,70736,8,,,, +US-LA-70737,US,LA,70737,8.5,,,, +US-LA-70738,US,LA,70738,8.5,,,, +US-LA-70739,US,LA,70739,9.5,,,, +US-LA-70740,US,LA,70740,9,,,, +US-LA-70743,US,LA,70743,7.5,,,, +US-LA-70744,US,LA,70744,8,,,, +US-LA-70747,US,LA,70747,8,,,, +US-LA-70748,US,LA,70748,9,,,, +US-LA-70749,US,LA,70749,8,,,, +US-LA-70750,US,LA,70750,7.55,,,, +US-LA-70752,US,LA,70752,8,,,, +US-LA-70753,US,LA,70753,8,,,, +US-LA-70754,US,LA,70754,8,,,, +US-LA-70755,US,LA,70755,9,,,, +US-LA-70756,US,LA,70756,8,,,, +US-LA-70757,US,LA,70757,9,,,, +US-LA-70759,US,LA,70759,8,,,, +US-LA-70760,US,LA,70760,9,,,, +US-LA-70761,US,LA,70761,9,,,, +US-LA-70762,US,LA,70762,8,,,, +US-LA-70763,US,LA,70763,7.5,,,, +US-LA-70764,US,LA,70764,9,,,, +US-LA-70765,US,LA,70765,9,,,, +US-LA-70767,US,LA,70767,9,,,, +US-LA-70769,US,LA,70769,8.5,,,, +US-LA-70770,US,LA,70770,9,,,, +US-LA-70772,US,LA,70772,9,,,, +US-LA-70773,US,LA,70773,8,,,, +US-LA-70774,US,LA,70774,8.5,,,, +US-LA-70775,US,LA,70775,9,,,, +US-LA-70776,US,LA,70776,9.666,,,, +US-LA-70777,US,LA,70777,9,,,, +US-LA-70778,US,LA,70778,8.5,,,, +US-LA-70780,US,LA,70780,9.666,,,, +US-LA-70782,US,LA,70782,9,,,, +US-LA-70783,US,LA,70783,8,,,, +US-LA-70784,US,LA,70784,9,,,, +US-LA-70785,US,LA,70785,9.5,,,, +US-LA-70786,US,LA,70786,9.5,,,, +US-LA-70787,US,LA,70787,9,,,, +US-LA-70788,US,LA,70788,9,,,, +US-LA-70789,US,LA,70789,9,,,, +US-LA-70791,US,LA,70791,9,,,, +US-LA-70792,US,LA,70792,7.5,,,, +US-LA-70801,US,LA,70801,9,,,, +US-LA-70802,US,LA,70802,9,,,, +US-LA-70804,US,LA,70804,9,,,, +US-LA-70805,US,LA,70805,9,,,, +US-LA-70806,US,LA,70806,9,,,, +US-LA-70807,US,LA,70807,9,,,, +US-LA-70808,US,LA,70808,9,,,, +US-LA-70809,US,LA,70809,9,,,, +US-LA-70810,US,LA,70810,9,,,, +US-LA-70811,US,LA,70811,9,,,, +US-LA-70812,US,LA,70812,9,,,, +US-LA-70813,US,LA,70813,9,,,, +US-LA-70814,US,LA,70814,9,,,, +US-LA-70815,US,LA,70815,9,,,, +US-LA-70816,US,LA,70816,9,,,, +US-LA-70817,US,LA,70817,9,,,, +US-LA-70818,US,LA,70818,9.5,,,, +US-LA-70819,US,LA,70819,9,,,, +US-LA-70820,US,LA,70820,9,,,, +US-LA-70821,US,LA,70821,9,,,, +US-LA-70822,US,LA,70822,9,,,, +US-LA-70823,US,LA,70823,9,,,, +US-LA-70825,US,LA,70825,9,,,, +US-LA-70826,US,LA,70826,9,,,, +US-LA-70827,US,LA,70827,9,,,, +US-LA-70831,US,LA,70831,9,,,, +US-LA-70833,US,LA,70833,9,,,, +US-LA-70835,US,LA,70835,9,,,, +US-LA-70836,US,LA,70836,9,,,, +US-LA-70837,US,LA,70837,9.5,,,, +US-LA-70873,US,LA,70873,9,,,, +US-LA-70874,US,LA,70874,9,,,, +US-LA-70879,US,LA,70879,9,,,, +US-LA-70884,US,LA,70884,9,,,, +US-LA-70891,US,LA,70891,9,,,, +US-LA-70892,US,LA,70892,9,,,, +US-LA-70893,US,LA,70893,9,,,, +US-LA-70895,US,LA,70895,9,,,, +US-LA-70896,US,LA,70896,9,,,, +US-LA-70898,US,LA,70898,9,,,, +US-LA-71001,US,LA,71001,9.5,,,, +US-LA-71002,US,LA,71002,7.5,,,, +US-LA-71003,US,LA,71003,7.125,,,, +US-LA-71004,US,LA,71004,8.35,,,, +US-LA-71006,US,LA,71006,8.25,,,, +US-LA-71007,US,LA,71007,7.35,,,, +US-LA-71008,US,LA,71008,7,,,, +US-LA-71009,US,LA,71009,8.35,,,, +US-LA-71016,US,LA,71016,7,,,, +US-LA-71018,US,LA,71018,7,,,, +US-LA-71019,US,LA,71019,8.5,,,, +US-LA-71021,US,LA,71021,9.5,,,, +US-LA-71023,US,LA,71023,7,,,, +US-LA-71024,US,LA,71024,7,,,, +US-LA-71027,US,LA,71027,8,,,, +US-LA-71028,US,LA,71028,7,,,, +US-LA-71029,US,LA,71029,8.35,,,, +US-LA-71030,US,LA,71030,8,,,, +US-LA-71031,US,LA,71031,7.5,,,, +US-LA-71032,US,LA,71032,8,,,, +US-LA-71033,US,LA,71033,8.35,,,, +US-LA-71034,US,LA,71034,9.5,,,, +US-LA-71037,US,LA,71037,8.25,,,, +US-LA-71038,US,LA,71038,7.125,,,, +US-LA-71039,US,LA,71039,7,,,, +US-LA-71040,US,LA,71040,7.125,,,, +US-LA-71043,US,LA,71043,8.35,,,, +US-LA-71044,US,LA,71044,8.35,,,, +US-LA-71045,US,LA,71045,7,,,, +US-LA-71046,US,LA,71046,8,,,, +US-LA-71047,US,LA,71047,7.35,,,, +US-LA-71048,US,LA,71048,7.125,,,, +US-LA-71049,US,LA,71049,8,,,, +US-LA-71050,US,LA,71050,9,,,, +US-LA-71051,US,LA,71051,8.25,,,, +US-LA-71052,US,LA,71052,8,,,, +US-LA-71055,US,LA,71055,9.5,,,, +US-LA-71058,US,LA,71058,9.5,,,, +US-LA-71060,US,LA,71060,8.35,,,, +US-LA-71061,US,LA,71061,8.35,,,, +US-LA-71063,US,LA,71063,8,,,, +US-LA-71064,US,LA,71064,8.25,,,, +US-LA-71065,US,LA,71065,8.625,,,, +US-LA-71066,US,LA,71066,7.5,,,, +US-LA-71067,US,LA,71067,8.25,,,, +US-LA-71068,US,LA,71068,7,,,, +US-LA-71069,US,LA,71069,8.35,,,, +US-LA-71070,US,LA,71070,7.5,,,, +US-LA-71071,US,LA,71071,7,,,, +US-LA-71072,US,LA,71072,7,,,, +US-LA-71073,US,LA,71073,7,,,, +US-LA-71075,US,LA,71075,9.5,,,, +US-LA-71078,US,LA,71078,8,,,, +US-LA-71079,US,LA,71079,7.125,,,, +US-LA-71080,US,LA,71080,7,,,, +US-LA-71082,US,LA,71082,9.35,,,, +US-LA-71101,US,LA,71101,8.6,,,, +US-LA-71102,US,LA,71102,8.6,,,, +US-LA-71103,US,LA,71103,8.6,,,, +US-LA-71104,US,LA,71104,8.6,,,, +US-LA-71105,US,LA,71105,8.6,,,, +US-LA-71106,US,LA,71106,8.6,,,, +US-LA-71107,US,LA,71107,7.35,,,, +US-LA-71108,US,LA,71108,8.6,,,, +US-LA-71109,US,LA,71109,8.6,,,, +US-LA-71110,US,LA,71110,8.25,,,, +US-LA-71111,US,LA,71111,9,,,, +US-LA-71112,US,LA,71112,9,,,, +US-LA-71113,US,LA,71113,9,,,, +US-LA-71115,US,LA,71115,8.6,,,, +US-LA-71118,US,LA,71118,8.6,,,, +US-LA-71119,US,LA,71119,8.6,,,, +US-LA-71120,US,LA,71120,8.6,,,, +US-LA-71129,US,LA,71129,8.6,,,, +US-LA-71130,US,LA,71130,8.6,,,, +US-LA-71133,US,LA,71133,8.6,,,, +US-LA-71134,US,LA,71134,8.6,,,, +US-LA-71135,US,LA,71135,8.6,,,, +US-LA-71136,US,LA,71136,8.6,,,, +US-LA-71137,US,LA,71137,9.25,,,, +US-LA-71138,US,LA,71138,8.6,,,, +US-LA-71148,US,LA,71148,8.6,,,, +US-LA-71149,US,LA,71149,8.6,,,, +US-LA-71150,US,LA,71150,8.6,,,, +US-LA-71151,US,LA,71151,8.6,,,, +US-LA-71152,US,LA,71152,8.6,,,, +US-LA-71153,US,LA,71153,8.6,,,, +US-LA-71154,US,LA,71154,8.6,,,, +US-LA-71156,US,LA,71156,8.6,,,, +US-LA-71161,US,LA,71161,8.6,,,, +US-LA-71162,US,LA,71162,8.6,,,, +US-LA-71163,US,LA,71163,8.6,,,, +US-LA-71164,US,LA,71164,8.6,,,, +US-LA-71165,US,LA,71165,8.6,,,, +US-LA-71166,US,LA,71166,8.6,,,, +US-LA-71171,US,LA,71171,9,,,, +US-LA-71172,US,LA,71172,9,,,, +US-LA-71201,US,LA,71201,9.99,,,, +US-LA-71202,US,LA,71202,9.99,,,, +US-LA-71203,US,LA,71203,8.6,,,, +US-LA-71207,US,LA,71207,9.99,,,, +US-LA-71209,US,LA,71209,9.99,,,, +US-LA-71210,US,LA,71210,9.99,,,, +US-LA-71211,US,LA,71211,9.99,,,, +US-LA-71212,US,LA,71212,9.99,,,, +US-LA-71213,US,LA,71213,9.99,,,, +US-LA-71217,US,LA,71217,9.99,,,, +US-LA-71218,US,LA,71218,8,,,, +US-LA-71219,US,LA,71219,8,,,, +US-LA-71220,US,LA,71220,8,,,, +US-LA-71221,US,LA,71221,10,,,, +US-LA-71222,US,LA,71222,8,,,, +US-LA-71223,US,LA,71223,8,,,, +US-LA-71225,US,LA,71225,9.6,,,, +US-LA-71226,US,LA,71226,8,,,, +US-LA-71227,US,LA,71227,7.25,,,, +US-LA-71229,US,LA,71229,8,,,, +US-LA-71230,US,LA,71230,8,,,, +US-LA-71232,US,LA,71232,9.5,,,, +US-LA-71233,US,LA,71233,8.5,,,, +US-LA-71234,US,LA,71234,8,,,, +US-LA-71235,US,LA,71235,7.25,,,, +US-LA-71237,US,LA,71237,9,,,, +US-LA-71238,US,LA,71238,9.6,,,, +US-LA-71240,US,LA,71240,8.6,,,, +US-LA-71241,US,LA,71241,8,,,, +US-LA-71242,US,LA,71242,9,,,, +US-LA-71243,US,LA,71243,8,,,, +US-LA-71245,US,LA,71245,9,,,, +US-LA-71247,US,LA,71247,9,,,, +US-LA-71249,US,LA,71249,8,,,, +US-LA-71250,US,LA,71250,8,,,, +US-LA-71251,US,LA,71251,8,,,, +US-LA-71253,US,LA,71253,10,,,, +US-LA-71254,US,LA,71254,11,,,, +US-LA-71256,US,LA,71256,8,,,, +US-LA-71259,US,LA,71259,8,,,, +US-LA-71260,US,LA,71260,8,,,, +US-LA-71261,US,LA,71261,8,,,, +US-LA-71263,US,LA,71263,9,,,, +US-LA-71264,US,LA,71264,8,,,, +US-LA-71266,US,LA,71266,9,,,, +US-LA-71268,US,LA,71268,8,,,, +US-LA-71269,US,LA,71269,8,,,, +US-LA-71270,US,LA,71270,8.75,,,, +US-LA-71272,US,LA,71272,8.75,,,, +US-LA-71273,US,LA,71273,8.75,,,, +US-LA-71275,US,LA,71275,7.25,,,, +US-LA-71276,US,LA,71276,9,,,, +US-LA-71277,US,LA,71277,8,,,, +US-LA-71279,US,LA,71279,8,,,, +US-LA-71280,US,LA,71280,8,,,, +US-LA-71281,US,LA,71281,8.6,,,, +US-LA-71282,US,LA,71282,9.5,,,, +US-LA-71284,US,LA,71284,9.5,,,, +US-LA-71286,US,LA,71286,9,,,, +US-LA-71291,US,LA,71291,9.6,,,, +US-LA-71292,US,LA,71292,9.6,,,, +US-LA-71294,US,LA,71294,9.5,,,, +US-LA-71295,US,LA,71295,8,,,, +US-LA-71301,US,LA,71301,9,,,, +US-LA-71302,US,LA,71302,9,,,, +US-LA-71303,US,LA,71303,9,,,, +US-LA-71306,US,LA,71306,9,,,, +US-LA-71307,US,LA,71307,9,,,, +US-LA-71309,US,LA,71309,9,,,, +US-LA-71315,US,LA,71315,9,,,, +US-LA-71316,US,LA,71316,8.75,,,, +US-LA-71320,US,LA,71320,7.25,,,, +US-LA-71322,US,LA,71322,9.25,,,, +US-LA-71323,US,LA,71323,7.25,,,, +US-LA-71324,US,LA,71324,8,,,, +US-LA-71325,US,LA,71325,7,,,, +US-LA-71326,US,LA,71326,8.75,,,, +US-LA-71327,US,LA,71327,7.25,,,, +US-LA-71328,US,LA,71328,7,,,, +US-LA-71329,US,LA,71329,7.25,,,, +US-LA-71330,US,LA,71330,7,,,, +US-LA-71331,US,LA,71331,7.25,,,, +US-LA-71333,US,LA,71333,7.25,,,, +US-LA-71334,US,LA,71334,8.75,,,, +US-LA-71336,US,LA,71336,8,,,, +US-LA-71339,US,LA,71339,7.25,,,, +US-LA-71340,US,LA,71340,10,,,, +US-LA-71341,US,LA,71341,7.25,,,, +US-LA-71342,US,LA,71342,7.5,,,, +US-LA-71343,US,LA,71343,10,,,, +US-LA-71345,US,LA,71345,7.55,,,, +US-LA-71346,US,LA,71346,7,,,, +US-LA-71348,US,LA,71348,7,,,, +US-LA-71350,US,LA,71350,7.25,,,, +US-LA-71351,US,LA,71351,7.25,,,, +US-LA-71353,US,LA,71353,7.55,,,, +US-LA-71354,US,LA,71354,8.75,,,, +US-LA-71355,US,LA,71355,7.25,,,, +US-LA-71356,US,LA,71356,7.55,,,, +US-LA-71357,US,LA,71357,9.25,,,, +US-LA-71358,US,LA,71358,7.55,,,, +US-LA-71359,US,LA,71359,9,,,, +US-LA-71360,US,LA,71360,7,,,, +US-LA-71361,US,LA,71361,9,,,, +US-LA-71362,US,LA,71362,7.25,,,, +US-LA-71363,US,LA,71363,10,,,, +US-LA-71365,US,LA,71365,7.25,,,, +US-LA-71366,US,LA,71366,10.25,,,, +US-LA-71367,US,LA,71367,9,,,, +US-LA-71368,US,LA,71368,10,,,, +US-LA-71369,US,LA,71369,7.25,,,, +US-LA-71371,US,LA,71371,7.5,,,, +US-LA-71373,US,LA,71373,8.75,,,, +US-LA-71375,US,LA,71375,9.25,,,, +US-LA-71377,US,LA,71377,10,,,, +US-LA-71378,US,LA,71378,8,,,, +US-LA-71401,US,LA,71401,10,,,, +US-LA-71403,US,LA,71403,8,,,, +US-LA-71404,US,LA,71404,7,,,, +US-LA-71405,US,LA,71405,9,,,, +US-LA-71406,US,LA,71406,8.625,,,, +US-LA-71407,US,LA,71407,8,,,, +US-LA-71409,US,LA,71409,7,,,, +US-LA-71410,US,LA,71410,7,,,, +US-LA-71411,US,LA,71411,7.5,,,, +US-LA-71414,US,LA,71414,8.5,,,, +US-LA-71415,US,LA,71415,9,,,, +US-LA-71416,US,LA,71416,7.5,,,, +US-LA-71417,US,LA,71417,8,,,, +US-LA-71418,US,LA,71418,9,,,, +US-LA-71419,US,LA,71419,8.625,,,, +US-LA-71422,US,LA,71422,7,,,, +US-LA-71423,US,LA,71423,8,,,, +US-LA-71424,US,LA,71424,7,,,, +US-LA-71425,US,LA,71425,10,,,, +US-LA-71426,US,LA,71426,8.625,,,, +US-LA-71427,US,LA,71427,7,,,, +US-LA-71428,US,LA,71428,7.5,,,, +US-LA-71429,US,LA,71429,8.625,,,, +US-LA-71430,US,LA,71430,7,,,, +US-LA-71431,US,LA,71431,8,,,, +US-LA-71432,US,LA,71432,8,,,, +US-LA-71433,US,LA,71433,7,,,, +US-LA-71434,US,LA,71434,7.5,,,, +US-LA-71435,US,LA,71435,9,,,, +US-LA-71438,US,LA,71438,8,,,, +US-LA-71439,US,LA,71439,8,,,, +US-LA-71440,US,LA,71440,7,,,, +US-LA-71441,US,LA,71441,9,,,, +US-LA-71443,US,LA,71443,9.5,,,, +US-LA-71446,US,LA,71446,8,,,, +US-LA-71447,US,LA,71447,7,,,, +US-LA-71448,US,LA,71448,7,,,, +US-LA-71449,US,LA,71449,8.625,,,, +US-LA-71450,US,LA,71450,7.5,,,, +US-LA-71452,US,LA,71452,7.5,,,, +US-LA-71454,US,LA,71454,8,,,, +US-LA-71455,US,LA,71455,7,,,, +US-LA-71456,US,LA,71456,7.5,,,, +US-LA-71457,US,LA,71457,9,,,, +US-LA-71458,US,LA,71458,9,,,, +US-LA-71459,US,LA,71459,8,,,, +US-LA-71460,US,LA,71460,8.625,,,, +US-LA-71461,US,LA,71461,9.5,,,, +US-LA-71462,US,LA,71462,8.625,,,, +US-LA-71463,US,LA,71463,10,,,, +US-LA-71465,US,LA,71465,7.5,,,, +US-LA-71466,US,LA,71466,7,,,, +US-LA-71467,US,LA,71467,8,,,, +US-LA-71468,US,LA,71468,7.5,,,, +US-LA-71469,US,LA,71469,7.5,,,, +US-LA-71471,US,LA,71471,8.5,,,, +US-LA-71472,US,LA,71472,7,,,, +US-LA-71473,US,LA,71473,7,,,, +US-LA-71474,US,LA,71474,8,,,, +US-LA-71475,US,LA,71475,8,,,, +US-LA-71477,US,LA,71477,7,,,, +US-LA-71479,US,LA,71479,7.5,,,, +US-LA-71480,US,LA,71480,7.5,,,, +US-LA-71483,US,LA,71483,8.5,,,, +US-LA-71485,US,LA,71485,9,,,, +US-LA-71486,US,LA,71486,8.625,,,, +US-LA-71496,US,LA,71496,9.5,,,, +US-LA-71497,US,LA,71497,9,,,, +US-MA-01001,US,MA,01001,6.25,,,, +US-MA-01002,US,MA,01002,6.25,,,, +US-MA-01003,US,MA,01003,6.25,,,, +US-MA-01004,US,MA,01004,6.25,,,, +US-MA-01005,US,MA,01005,6.25,,,, +US-MA-01007,US,MA,01007,6.25,,,, +US-MA-01008,US,MA,01008,6.25,,,, +US-MA-01009,US,MA,01009,6.25,,,, +US-MA-01010,US,MA,01010,6.25,,,, +US-MA-01011,US,MA,01011,6.25,,,, +US-MA-01012,US,MA,01012,6.25,,,, +US-MA-01013,US,MA,01013,6.25,,,, +US-MA-01014,US,MA,01014,6.25,,,, +US-MA-01020,US,MA,01020,6.25,,,, +US-MA-01021,US,MA,01021,6.25,,,, +US-MA-01022,US,MA,01022,6.25,,,, +US-MA-01026,US,MA,01026,6.25,,,, +US-MA-01027,US,MA,01027,6.25,,,, +US-MA-01028,US,MA,01028,6.25,,,, +US-MA-01029,US,MA,01029,6.25,,,, +US-MA-01030,US,MA,01030,6.25,,,, +US-MA-01031,US,MA,01031,6.25,,,, +US-MA-01032,US,MA,01032,6.25,,,, +US-MA-01033,US,MA,01033,6.25,,,, +US-MA-01034,US,MA,01034,6.25,,,, +US-MA-01035,US,MA,01035,6.25,,,, +US-MA-01036,US,MA,01036,6.25,,,, +US-MA-01037,US,MA,01037,6.25,,,, +US-MA-01038,US,MA,01038,6.25,,,, +US-MA-01039,US,MA,01039,6.25,,,, +US-MA-01040,US,MA,01040,6.25,,,, +US-MA-01041,US,MA,01041,6.25,,,, +US-MA-01050,US,MA,01050,6.25,,,, +US-MA-01053,US,MA,01053,6.25,,,, +US-MA-01054,US,MA,01054,6.25,,,, +US-MA-01056,US,MA,01056,6.25,,,, +US-MA-01057,US,MA,01057,6.25,,,, +US-MA-01059,US,MA,01059,6.25,,,, +US-MA-01060,US,MA,01060,6.25,,,, +US-MA-01061,US,MA,01061,6.25,,,, +US-MA-01062,US,MA,01062,6.25,,,, +US-MA-01063,US,MA,01063,6.25,,,, +US-MA-01066,US,MA,01066,6.25,,,, +US-MA-01068,US,MA,01068,6.25,,,, +US-MA-01069,US,MA,01069,6.25,,,, +US-MA-01070,US,MA,01070,6.25,,,, +US-MA-01071,US,MA,01071,6.25,,,, +US-MA-01072,US,MA,01072,6.25,,,, +US-MA-01073,US,MA,01073,6.25,,,, +US-MA-01074,US,MA,01074,6.25,,,, +US-MA-01075,US,MA,01075,6.25,,,, +US-MA-01077,US,MA,01077,6.25,,,, +US-MA-01079,US,MA,01079,6.25,,,, +US-MA-01080,US,MA,01080,6.25,,,, +US-MA-01081,US,MA,01081,6.25,,,, +US-MA-01082,US,MA,01082,6.25,,,, +US-MA-01083,US,MA,01083,6.25,,,, +US-MA-01084,US,MA,01084,6.25,,,, +US-MA-01085,US,MA,01085,6.25,,,, +US-MA-01086,US,MA,01086,6.25,,,, +US-MA-01088,US,MA,01088,6.25,,,, +US-MA-01089,US,MA,01089,6.25,,,, +US-MA-01090,US,MA,01090,6.25,,,, +US-MA-01092,US,MA,01092,6.25,,,, +US-MA-01093,US,MA,01093,6.25,,,, +US-MA-01094,US,MA,01094,6.25,,,, +US-MA-01095,US,MA,01095,6.25,,,, +US-MA-01096,US,MA,01096,6.25,,,, +US-MA-01097,US,MA,01097,6.25,,,, +US-MA-01098,US,MA,01098,6.25,,,, +US-MA-01101,US,MA,01101,6.25,,,, +US-MA-01102,US,MA,01102,6.25,,,, +US-MA-01103,US,MA,01103,6.25,,,, +US-MA-01104,US,MA,01104,6.25,,,, +US-MA-01105,US,MA,01105,6.25,,,, +US-MA-01106,US,MA,01106,6.25,,,, +US-MA-01107,US,MA,01107,6.25,,,, +US-MA-01108,US,MA,01108,6.25,,,, +US-MA-01109,US,MA,01109,6.25,,,, +US-MA-01111,US,MA,01111,6.25,,,, +US-MA-01115,US,MA,01115,6.25,,,, +US-MA-01116,US,MA,01116,6.25,,,, +US-MA-01118,US,MA,01118,6.25,,,, +US-MA-01119,US,MA,01119,6.25,,,, +US-MA-01128,US,MA,01128,6.25,,,, +US-MA-01129,US,MA,01129,6.25,,,, +US-MA-01138,US,MA,01138,6.25,,,, +US-MA-01139,US,MA,01139,6.25,,,, +US-MA-01144,US,MA,01144,6.25,,,, +US-MA-01151,US,MA,01151,6.25,,,, +US-MA-01152,US,MA,01152,6.25,,,, +US-MA-01199,US,MA,01199,6.25,,,, +US-MA-01201,US,MA,01201,6.25,,,, +US-MA-01202,US,MA,01202,6.25,,,, +US-MA-01203,US,MA,01203,6.25,,,, +US-MA-01220,US,MA,01220,6.25,,,, +US-MA-01222,US,MA,01222,6.25,,,, +US-MA-01223,US,MA,01223,6.25,,,, +US-MA-01224,US,MA,01224,6.25,,,, +US-MA-01225,US,MA,01225,6.25,,,, +US-MA-01226,US,MA,01226,6.25,,,, +US-MA-01227,US,MA,01227,6.25,,,, +US-MA-01229,US,MA,01229,6.25,,,, +US-MA-01230,US,MA,01230,6.25,,,, +US-MA-01235,US,MA,01235,6.25,,,, +US-MA-01236,US,MA,01236,6.25,,,, +US-MA-01237,US,MA,01237,6.25,,,, +US-MA-01238,US,MA,01238,6.25,,,, +US-MA-01240,US,MA,01240,6.25,,,, +US-MA-01242,US,MA,01242,6.25,,,, +US-MA-01243,US,MA,01243,6.25,,,, +US-MA-01244,US,MA,01244,6.25,,,, +US-MA-01245,US,MA,01245,6.25,,,, +US-MA-01247,US,MA,01247,6.25,,,, +US-MA-01252,US,MA,01252,6.25,,,, +US-MA-01253,US,MA,01253,6.25,,,, +US-MA-01254,US,MA,01254,6.25,,,, +US-MA-01255,US,MA,01255,6.25,,,, +US-MA-01256,US,MA,01256,6.25,,,, +US-MA-01257,US,MA,01257,6.25,,,, +US-MA-01258,US,MA,01258,6.25,,,, +US-MA-01259,US,MA,01259,6.25,,,, +US-MA-01260,US,MA,01260,6.25,,,, +US-MA-01262,US,MA,01262,6.25,,,, +US-MA-01263,US,MA,01263,6.25,,,, +US-MA-01264,US,MA,01264,6.25,,,, +US-MA-01266,US,MA,01266,6.25,,,, +US-MA-01267,US,MA,01267,6.25,,,, +US-MA-01270,US,MA,01270,6.25,,,, +US-MA-01301,US,MA,01301,6.25,,,, +US-MA-01302,US,MA,01302,6.25,,,, +US-MA-01330,US,MA,01330,6.25,,,, +US-MA-01331,US,MA,01331,6.25,,,, +US-MA-01337,US,MA,01337,6.25,,,, +US-MA-01338,US,MA,01338,6.25,,,, +US-MA-01339,US,MA,01339,6.25,,,, +US-MA-01340,US,MA,01340,6.25,,,, +US-MA-01341,US,MA,01341,6.25,,,, +US-MA-01342,US,MA,01342,6.25,,,, +US-MA-01343,US,MA,01343,6.25,,,, +US-MA-01344,US,MA,01344,6.25,,,, +US-MA-01346,US,MA,01346,6.25,,,, +US-MA-01347,US,MA,01347,6.25,,,, +US-MA-01349,US,MA,01349,6.25,,,, +US-MA-01350,US,MA,01350,6.25,,,, +US-MA-01351,US,MA,01351,6.25,,,, +US-MA-01354,US,MA,01354,6.25,,,, +US-MA-01355,US,MA,01355,6.25,,,, +US-MA-01360,US,MA,01360,6.25,,,, +US-MA-01364,US,MA,01364,6.25,,,, +US-MA-01366,US,MA,01366,6.25,,,, +US-MA-01367,US,MA,01367,6.25,,,, +US-MA-01368,US,MA,01368,6.25,,,, +US-MA-01370,US,MA,01370,6.25,,,, +US-MA-01373,US,MA,01373,6.25,,,, +US-MA-01375,US,MA,01375,6.25,,,, +US-MA-01376,US,MA,01376,6.25,,,, +US-MA-01378,US,MA,01378,6.25,,,, +US-MA-01379,US,MA,01379,6.25,,,, +US-MA-01380,US,MA,01380,6.25,,,, +US-MA-01420,US,MA,01420,6.25,,,, +US-MA-01430,US,MA,01430,6.25,,,, +US-MA-01431,US,MA,01431,6.25,,,, +US-MA-01432,US,MA,01432,6.25,,,, +US-MA-01434,US,MA,01434,6.25,,,, +US-MA-01436,US,MA,01436,6.25,,,, +US-MA-01438,US,MA,01438,6.25,,,, +US-MA-01440,US,MA,01440,6.25,,,, +US-MA-01441,US,MA,01441,6.25,,,, +US-MA-01450,US,MA,01450,6.25,,,, +US-MA-01451,US,MA,01451,6.25,,,, +US-MA-01452,US,MA,01452,6.25,,,, +US-MA-01453,US,MA,01453,6.25,,,, +US-MA-01460,US,MA,01460,6.25,,,, +US-MA-01462,US,MA,01462,6.25,,,, +US-MA-01463,US,MA,01463,6.25,,,, +US-MA-01464,US,MA,01464,6.25,,,, +US-MA-01467,US,MA,01467,6.25,,,, +US-MA-01468,US,MA,01468,6.25,,,, +US-MA-01469,US,MA,01469,6.25,,,, +US-MA-01470,US,MA,01470,6.25,,,, +US-MA-01471,US,MA,01471,6.25,,,, +US-MA-01472,US,MA,01472,6.25,,,, +US-MA-01473,US,MA,01473,6.25,,,, +US-MA-01474,US,MA,01474,6.25,,,, +US-MA-01475,US,MA,01475,6.25,,,, +US-MA-01477,US,MA,01477,6.25,,,, +US-MA-01501,US,MA,01501,6.25,,,, +US-MA-01503,US,MA,01503,6.25,,,, +US-MA-01504,US,MA,01504,6.25,,,, +US-MA-01505,US,MA,01505,6.25,,,, +US-MA-01506,US,MA,01506,6.25,,,, +US-MA-01507,US,MA,01507,6.25,,,, +US-MA-01508,US,MA,01508,6.25,,,, +US-MA-01509,US,MA,01509,6.25,,,, +US-MA-01510,US,MA,01510,6.25,,,, +US-MA-01515,US,MA,01515,6.25,,,, +US-MA-01516,US,MA,01516,6.25,,,, +US-MA-01517,US,MA,01517,6.25,,,, +US-MA-01518,US,MA,01518,6.25,,,, +US-MA-01519,US,MA,01519,6.25,,,, +US-MA-01520,US,MA,01520,6.25,,,, +US-MA-01521,US,MA,01521,6.25,,,, +US-MA-01522,US,MA,01522,6.25,,,, +US-MA-01523,US,MA,01523,6.25,,,, +US-MA-01524,US,MA,01524,6.25,,,, +US-MA-01525,US,MA,01525,6.25,,,, +US-MA-01526,US,MA,01526,6.25,,,, +US-MA-01527,US,MA,01527,6.25,,,, +US-MA-01529,US,MA,01529,6.25,,,, +US-MA-01531,US,MA,01531,6.25,,,, +US-MA-01532,US,MA,01532,6.25,,,, +US-MA-01534,US,MA,01534,6.25,,,, +US-MA-01535,US,MA,01535,6.25,,,, +US-MA-01536,US,MA,01536,6.25,,,, +US-MA-01537,US,MA,01537,6.25,,,, +US-MA-01538,US,MA,01538,6.25,,,, +US-MA-01540,US,MA,01540,6.25,,,, +US-MA-01541,US,MA,01541,6.25,,,, +US-MA-01542,US,MA,01542,6.25,,,, +US-MA-01543,US,MA,01543,6.25,,,, +US-MA-01545,US,MA,01545,6.25,,,, +US-MA-01546,US,MA,01546,6.25,,,, +US-MA-01550,US,MA,01550,6.25,,,, +US-MA-01560,US,MA,01560,6.25,,,, +US-MA-01561,US,MA,01561,6.25,,,, +US-MA-01562,US,MA,01562,6.25,,,, +US-MA-01564,US,MA,01564,6.25,,,, +US-MA-01566,US,MA,01566,6.25,,,, +US-MA-01568,US,MA,01568,6.25,,,, +US-MA-01569,US,MA,01569,6.25,,,, +US-MA-01570,US,MA,01570,6.25,,,, +US-MA-01571,US,MA,01571,6.25,,,, +US-MA-01581,US,MA,01581,6.25,,,, +US-MA-01583,US,MA,01583,6.25,,,, +US-MA-01585,US,MA,01585,6.25,,,, +US-MA-01586,US,MA,01586,6.25,,,, +US-MA-01588,US,MA,01588,6.25,,,, +US-MA-01590,US,MA,01590,6.25,,,, +US-MA-01601,US,MA,01601,6.25,,,, +US-MA-01602,US,MA,01602,6.25,,,, +US-MA-01603,US,MA,01603,6.25,,,, +US-MA-01604,US,MA,01604,6.25,,,, +US-MA-01605,US,MA,01605,6.25,,,, +US-MA-01606,US,MA,01606,6.25,,,, +US-MA-01607,US,MA,01607,6.25,,,, +US-MA-01608,US,MA,01608,6.25,,,, +US-MA-01609,US,MA,01609,6.25,,,, +US-MA-01610,US,MA,01610,6.25,,,, +US-MA-01611,US,MA,01611,6.25,,,, +US-MA-01612,US,MA,01612,6.25,,,, +US-MA-01613,US,MA,01613,6.25,,,, +US-MA-01614,US,MA,01614,6.25,,,, +US-MA-01615,US,MA,01615,6.25,,,, +US-MA-01653,US,MA,01653,6.25,,,, +US-MA-01654,US,MA,01654,6.25,,,, +US-MA-01655,US,MA,01655,6.25,,,, +US-MA-01701,US,MA,01701,6.25,,,, +US-MA-01702,US,MA,01702,6.25,,,, +US-MA-01703,US,MA,01703,6.25,,,, +US-MA-01704,US,MA,01704,6.25,,,, +US-MA-01705,US,MA,01705,6.25,,,, +US-MA-01718,US,MA,01718,6.25,,,, +US-MA-01719,US,MA,01719,6.25,,,, +US-MA-01720,US,MA,01720,6.25,,,, +US-MA-01721,US,MA,01721,6.25,,,, +US-MA-01730,US,MA,01730,6.25,,,, +US-MA-01731,US,MA,01731,6.25,,,, +US-MA-01740,US,MA,01740,6.25,,,, +US-MA-01741,US,MA,01741,6.25,,,, +US-MA-01742,US,MA,01742,6.25,,,, +US-MA-01745,US,MA,01745,6.25,,,, +US-MA-01746,US,MA,01746,6.25,,,, +US-MA-01747,US,MA,01747,6.25,,,, +US-MA-01748,US,MA,01748,6.25,,,, +US-MA-01749,US,MA,01749,6.25,,,, +US-MA-01752,US,MA,01752,6.25,,,, +US-MA-01754,US,MA,01754,6.25,,,, +US-MA-01756,US,MA,01756,6.25,,,, +US-MA-01757,US,MA,01757,6.25,,,, +US-MA-01760,US,MA,01760,6.25,,,, +US-MA-01770,US,MA,01770,6.25,,,, +US-MA-01772,US,MA,01772,6.25,,,, +US-MA-01773,US,MA,01773,6.25,,,, +US-MA-01775,US,MA,01775,6.25,,,, +US-MA-01776,US,MA,01776,6.25,,,, +US-MA-01778,US,MA,01778,6.25,,,, +US-MA-01784,US,MA,01784,6.25,,,, +US-MA-01801,US,MA,01801,6.25,,,, +US-MA-01803,US,MA,01803,6.25,,,, +US-MA-01805,US,MA,01805,6.25,,,, +US-MA-01810,US,MA,01810,6.25,,,, +US-MA-01812,US,MA,01812,6.25,,,, +US-MA-01813,US,MA,01813,6.25,,,, +US-MA-01815,US,MA,01815,6.25,,,, +US-MA-01821,US,MA,01821,6.25,,,, +US-MA-01822,US,MA,01822,6.25,,,, +US-MA-01824,US,MA,01824,6.25,,,, +US-MA-01826,US,MA,01826,6.25,,,, +US-MA-01827,US,MA,01827,6.25,,,, +US-MA-01830,US,MA,01830,6.25,,,, +US-MA-01831,US,MA,01831,6.25,,,, +US-MA-01832,US,MA,01832,6.25,,,, +US-MA-01833,US,MA,01833,6.25,,,, +US-MA-01834,US,MA,01834,6.25,,,, +US-MA-01835,US,MA,01835,6.25,,,, +US-MA-01840,US,MA,01840,6.25,,,, +US-MA-01841,US,MA,01841,6.25,,,, +US-MA-01842,US,MA,01842,6.25,,,, +US-MA-01843,US,MA,01843,6.25,,,, +US-MA-01844,US,MA,01844,6.25,,,, +US-MA-01845,US,MA,01845,6.25,,,, +US-MA-01850,US,MA,01850,6.25,,,, +US-MA-01851,US,MA,01851,6.25,,,, +US-MA-01852,US,MA,01852,6.25,,,, +US-MA-01853,US,MA,01853,6.25,,,, +US-MA-01854,US,MA,01854,6.25,,,, +US-MA-01860,US,MA,01860,6.25,,,, +US-MA-01862,US,MA,01862,6.25,,,, +US-MA-01863,US,MA,01863,6.25,,,, +US-MA-01864,US,MA,01864,6.25,,,, +US-MA-01865,US,MA,01865,6.25,,,, +US-MA-01866,US,MA,01866,6.25,,,, +US-MA-01867,US,MA,01867,6.25,,,, +US-MA-01876,US,MA,01876,6.25,,,, +US-MA-01879,US,MA,01879,6.25,,,, +US-MA-01880,US,MA,01880,6.25,,,, +US-MA-01885,US,MA,01885,6.25,,,, +US-MA-01886,US,MA,01886,6.25,,,, +US-MA-01887,US,MA,01887,6.25,,,, +US-MA-01888,US,MA,01888,6.25,,,, +US-MA-01889,US,MA,01889,6.25,,,, +US-MA-01890,US,MA,01890,6.25,,,, +US-MA-01899,US,MA,01899,6.25,,,, +US-MA-01901,US,MA,01901,6.25,,,, +US-MA-01902,US,MA,01902,6.25,,,, +US-MA-01903,US,MA,01903,6.25,,,, +US-MA-01904,US,MA,01904,6.25,,,, +US-MA-01905,US,MA,01905,6.25,,,, +US-MA-01906,US,MA,01906,6.25,,,, +US-MA-01907,US,MA,01907,6.25,,,, +US-MA-01908,US,MA,01908,6.25,,,, +US-MA-01910,US,MA,01910,6.25,,,, +US-MA-01913,US,MA,01913,6.25,,,, +US-MA-01915,US,MA,01915,6.25,,,, +US-MA-01921,US,MA,01921,6.25,,,, +US-MA-01922,US,MA,01922,6.25,,,, +US-MA-01923,US,MA,01923,6.25,,,, +US-MA-01929,US,MA,01929,6.25,,,, +US-MA-01930,US,MA,01930,6.25,,,, +US-MA-01931,US,MA,01931,6.25,,,, +US-MA-01936,US,MA,01936,6.25,,,, +US-MA-01937,US,MA,01937,6.25,,,, +US-MA-01938,US,MA,01938,6.25,,,, +US-MA-01940,US,MA,01940,6.25,,,, +US-MA-01944,US,MA,01944,6.25,,,, +US-MA-01945,US,MA,01945,6.25,,,, +US-MA-01949,US,MA,01949,6.25,,,, +US-MA-01950,US,MA,01950,6.25,,,, +US-MA-01951,US,MA,01951,6.25,,,, +US-MA-01952,US,MA,01952,6.25,,,, +US-MA-01960,US,MA,01960,6.25,,,, +US-MA-01961,US,MA,01961,6.25,,,, +US-MA-01965,US,MA,01965,6.25,,,, +US-MA-01966,US,MA,01966,6.25,,,, +US-MA-01969,US,MA,01969,6.25,,,, +US-MA-01970,US,MA,01970,6.25,,,, +US-MA-01971,US,MA,01971,6.25,,,, +US-MA-01982,US,MA,01982,6.25,,,, +US-MA-01983,US,MA,01983,6.25,,,, +US-MA-01984,US,MA,01984,6.25,,,, +US-MA-01985,US,MA,01985,6.25,,,, +US-MA-02018,US,MA,02018,6.25,,,, +US-MA-02019,US,MA,02019,6.25,,,, +US-MA-02020,US,MA,02020,6.25,,,, +US-MA-02021,US,MA,02021,6.25,,,, +US-MA-02025,US,MA,02025,6.25,,,, +US-MA-02026,US,MA,02026,6.25,,,, +US-MA-02027,US,MA,02027,6.25,,,, +US-MA-02030,US,MA,02030,6.25,,,, +US-MA-02032,US,MA,02032,6.25,,,, +US-MA-02035,US,MA,02035,6.25,,,, +US-MA-02038,US,MA,02038,6.25,,,, +US-MA-02040,US,MA,02040,6.25,,,, +US-MA-02041,US,MA,02041,6.25,,,, +US-MA-02043,US,MA,02043,6.25,,,, +US-MA-02044,US,MA,02044,6.25,,,, +US-MA-02045,US,MA,02045,6.25,,,, +US-MA-02047,US,MA,02047,6.25,,,, +US-MA-02048,US,MA,02048,6.25,,,, +US-MA-02050,US,MA,02050,6.25,,,, +US-MA-02051,US,MA,02051,6.25,,,, +US-MA-02052,US,MA,02052,6.25,,,, +US-MA-02053,US,MA,02053,6.25,,,, +US-MA-02054,US,MA,02054,6.25,,,, +US-MA-02055,US,MA,02055,6.25,,,, +US-MA-02056,US,MA,02056,6.25,,,, +US-MA-02059,US,MA,02059,6.25,,,, +US-MA-02060,US,MA,02060,6.25,,,, +US-MA-02061,US,MA,02061,6.25,,,, +US-MA-02062,US,MA,02062,6.25,,,, +US-MA-02065,US,MA,02065,6.25,,,, +US-MA-02066,US,MA,02066,6.25,,,, +US-MA-02067,US,MA,02067,6.25,,,, +US-MA-02070,US,MA,02070,6.25,,,, +US-MA-02071,US,MA,02071,6.25,,,, +US-MA-02072,US,MA,02072,6.25,,,, +US-MA-02081,US,MA,02081,6.25,,,, +US-MA-02090,US,MA,02090,6.25,,,, +US-MA-02093,US,MA,02093,6.25,,,, +US-MA-02108,US,MA,02108,6.25,,,, +US-MA-02109,US,MA,02109,6.25,,,, +US-MA-02110,US,MA,02110,6.25,,,, +US-MA-02111,US,MA,02111,6.25,,,, +US-MA-02112,US,MA,02112,6.25,,,, +US-MA-02113,US,MA,02113,6.25,,,, +US-MA-02114,US,MA,02114,6.25,,,, +US-MA-02115,US,MA,02115,6.25,,,, +US-MA-02116,US,MA,02116,6.25,,,, +US-MA-02117,US,MA,02117,6.25,,,, +US-MA-02118,US,MA,02118,6.25,,,, +US-MA-02119,US,MA,02119,6.25,,,, +US-MA-02120,US,MA,02120,6.25,,,, +US-MA-02121,US,MA,02121,6.25,,,, +US-MA-02122,US,MA,02122,6.25,,,, +US-MA-02123,US,MA,02123,6.25,,,, +US-MA-02124,US,MA,02124,6.25,,,, +US-MA-02125,US,MA,02125,6.25,,,, +US-MA-02126,US,MA,02126,6.25,,,, +US-MA-02127,US,MA,02127,6.25,,,, +US-MA-02128,US,MA,02128,6.25,,,, +US-MA-02129,US,MA,02129,6.25,,,, +US-MA-02130,US,MA,02130,6.25,,,, +US-MA-02131,US,MA,02131,6.25,,,, +US-MA-02132,US,MA,02132,6.25,,,, +US-MA-02133,US,MA,02133,6.25,,,, +US-MA-02134,US,MA,02134,6.25,,,, +US-MA-02135,US,MA,02135,6.25,,,, +US-MA-02136,US,MA,02136,6.25,,,, +US-MA-02137,US,MA,02137,6.25,,,, +US-MA-02138,US,MA,02138,6.25,,,, +US-MA-02139,US,MA,02139,6.25,,,, +US-MA-02140,US,MA,02140,6.25,,,, +US-MA-02141,US,MA,02141,6.25,,,, +US-MA-02142,US,MA,02142,6.25,,,, +US-MA-02143,US,MA,02143,6.25,,,, +US-MA-02144,US,MA,02144,6.25,,,, +US-MA-02145,US,MA,02145,6.25,,,, +US-MA-02148,US,MA,02148,6.25,,,, +US-MA-02149,US,MA,02149,6.25,,,, +US-MA-02150,US,MA,02150,6.25,,,, +US-MA-02151,US,MA,02151,6.25,,,, +US-MA-02152,US,MA,02152,6.25,,,, +US-MA-02153,US,MA,02153,6.25,,,, +US-MA-02155,US,MA,02155,6.25,,,, +US-MA-02156,US,MA,02156,6.25,,,, +US-MA-02163,US,MA,02163,6.25,,,, +US-MA-02169,US,MA,02169,6.25,,,, +US-MA-02170,US,MA,02170,6.25,,,, +US-MA-02171,US,MA,02171,6.25,,,, +US-MA-02176,US,MA,02176,6.25,,,, +US-MA-02180,US,MA,02180,6.25,,,, +US-MA-02184,US,MA,02184,6.25,,,, +US-MA-02185,US,MA,02185,6.25,,,, +US-MA-02186,US,MA,02186,6.25,,,, +US-MA-02187,US,MA,02187,6.25,,,, +US-MA-02188,US,MA,02188,6.25,,,, +US-MA-02189,US,MA,02189,6.25,,,, +US-MA-02190,US,MA,02190,6.25,,,, +US-MA-02191,US,MA,02191,6.25,,,, +US-MA-02196,US,MA,02196,6.25,,,, +US-MA-02199,US,MA,02199,6.25,,,, +US-MA-02201,US,MA,02201,6.25,,,, +US-MA-02203,US,MA,02203,6.25,,,, +US-MA-02204,US,MA,02204,6.25,,,, +US-MA-02205,US,MA,02205,6.25,,,, +US-MA-02206,US,MA,02206,6.25,,,, +US-MA-02210,US,MA,02210,6.25,,,, +US-MA-02211,US,MA,02211,6.25,,,, +US-MA-02212,US,MA,02212,6.25,,,, +US-MA-02215,US,MA,02215,6.25,,,, +US-MA-02217,US,MA,02217,6.25,,,, +US-MA-02222,US,MA,02222,6.25,,,, +US-MA-02228,US,MA,02228,6.25,,,, +US-MA-02238,US,MA,02238,6.25,,,, +US-MA-02241,US,MA,02241,6.25,,,, +US-MA-02266,US,MA,02266,6.25,,,, +US-MA-02269,US,MA,02269,6.25,,,, +US-MA-02283,US,MA,02283,6.25,,,, +US-MA-02284,US,MA,02284,6.25,,,, +US-MA-02293,US,MA,02293,6.25,,,, +US-MA-02297,US,MA,02297,6.25,,,, +US-MA-02298,US,MA,02298,6.25,,,, +US-MA-02301,US,MA,02301,6.25,,,, +US-MA-02302,US,MA,02302,6.25,,,, +US-MA-02303,US,MA,02303,6.25,,,, +US-MA-02304,US,MA,02304,6.25,,,, +US-MA-02305,US,MA,02305,6.25,,,, +US-MA-02322,US,MA,02322,6.25,,,, +US-MA-02324,US,MA,02324,6.25,,,, +US-MA-02325,US,MA,02325,6.25,,,, +US-MA-02327,US,MA,02327,6.25,,,, +US-MA-02330,US,MA,02330,6.25,,,, +US-MA-02331,US,MA,02331,6.25,,,, +US-MA-02332,US,MA,02332,6.25,,,, +US-MA-02333,US,MA,02333,6.25,,,, +US-MA-02334,US,MA,02334,6.25,,,, +US-MA-02337,US,MA,02337,6.25,,,, +US-MA-02338,US,MA,02338,6.25,,,, +US-MA-02339,US,MA,02339,6.25,,,, +US-MA-02340,US,MA,02340,6.25,,,, +US-MA-02341,US,MA,02341,6.25,,,, +US-MA-02343,US,MA,02343,6.25,,,, +US-MA-02344,US,MA,02344,6.25,,,, +US-MA-02345,US,MA,02345,6.25,,,, +US-MA-02346,US,MA,02346,6.25,,,, +US-MA-02347,US,MA,02347,6.25,,,, +US-MA-02348,US,MA,02348,6.25,,,, +US-MA-02349,US,MA,02349,6.25,,,, +US-MA-02350,US,MA,02350,6.25,,,, +US-MA-02351,US,MA,02351,6.25,,,, +US-MA-02355,US,MA,02355,6.25,,,, +US-MA-02356,US,MA,02356,6.25,,,, +US-MA-02357,US,MA,02357,6.25,,,, +US-MA-02358,US,MA,02358,6.25,,,, +US-MA-02359,US,MA,02359,6.25,,,, +US-MA-02360,US,MA,02360,6.25,,,, +US-MA-02361,US,MA,02361,6.25,,,, +US-MA-02362,US,MA,02362,6.25,,,, +US-MA-02364,US,MA,02364,6.25,,,, +US-MA-02366,US,MA,02366,6.25,,,, +US-MA-02367,US,MA,02367,6.25,,,, +US-MA-02368,US,MA,02368,6.25,,,, +US-MA-02370,US,MA,02370,6.25,,,, +US-MA-02375,US,MA,02375,6.25,,,, +US-MA-02379,US,MA,02379,6.25,,,, +US-MA-02381,US,MA,02381,6.25,,,, +US-MA-02382,US,MA,02382,6.25,,,, +US-MA-02420,US,MA,02420,6.25,,,, +US-MA-02421,US,MA,02421,6.25,,,, +US-MA-02445,US,MA,02445,6.25,,,, +US-MA-02446,US,MA,02446,6.25,,,, +US-MA-02447,US,MA,02447,6.25,,,, +US-MA-02451,US,MA,02451,6.25,,,, +US-MA-02452,US,MA,02452,6.25,,,, +US-MA-02453,US,MA,02453,6.25,,,, +US-MA-02454,US,MA,02454,6.25,,,, +US-MA-02455,US,MA,02455,6.25,,,, +US-MA-02456,US,MA,02456,6.25,,,, +US-MA-02457,US,MA,02457,6.25,,,, +US-MA-02458,US,MA,02458,6.25,,,, +US-MA-02459,US,MA,02459,6.25,,,, +US-MA-02460,US,MA,02460,6.25,,,, +US-MA-02461,US,MA,02461,6.25,,,, +US-MA-02462,US,MA,02462,6.25,,,, +US-MA-02464,US,MA,02464,6.25,,,, +US-MA-02465,US,MA,02465,6.25,,,, +US-MA-02466,US,MA,02466,6.25,,,, +US-MA-02467,US,MA,02467,6.25,,,, +US-MA-02468,US,MA,02468,6.25,,,, +US-MA-02471,US,MA,02471,6.25,,,, +US-MA-02472,US,MA,02472,6.25,,,, +US-MA-02474,US,MA,02474,6.25,,,, +US-MA-02475,US,MA,02475,6.25,,,, +US-MA-02476,US,MA,02476,6.25,,,, +US-MA-02477,US,MA,02477,6.25,,,, +US-MA-02478,US,MA,02478,6.25,,,, +US-MA-02479,US,MA,02479,6.25,,,, +US-MA-02481,US,MA,02481,6.25,,,, +US-MA-02482,US,MA,02482,6.25,,,, +US-MA-02492,US,MA,02492,6.25,,,, +US-MA-02493,US,MA,02493,6.25,,,, +US-MA-02494,US,MA,02494,6.25,,,, +US-MA-02495,US,MA,02495,6.25,,,, +US-MA-02532,US,MA,02532,6.25,,,, +US-MA-02534,US,MA,02534,6.25,,,, +US-MA-02535,US,MA,02535,6.25,,,, +US-MA-02536,US,MA,02536,6.25,,,, +US-MA-02537,US,MA,02537,6.25,,,, +US-MA-02538,US,MA,02538,6.25,,,, +US-MA-02539,US,MA,02539,6.25,,,, +US-MA-02540,US,MA,02540,6.25,,,, +US-MA-02541,US,MA,02541,6.25,,,, +US-MA-02542,US,MA,02542,6.25,,,, +US-MA-02543,US,MA,02543,6.25,,,, +US-MA-02552,US,MA,02552,6.25,,,, +US-MA-02553,US,MA,02553,6.25,,,, +US-MA-02554,US,MA,02554,6.25,,,, +US-MA-02556,US,MA,02556,6.25,,,, +US-MA-02557,US,MA,02557,6.25,,,, +US-MA-02558,US,MA,02558,6.25,,,, +US-MA-02559,US,MA,02559,6.25,,,, +US-MA-02561,US,MA,02561,6.25,,,, +US-MA-02562,US,MA,02562,6.25,,,, +US-MA-02563,US,MA,02563,6.25,,,, +US-MA-02564,US,MA,02564,6.25,,,, +US-MA-02565,US,MA,02565,6.25,,,, +US-MA-02568,US,MA,02568,6.25,,,, +US-MA-02571,US,MA,02571,6.25,,,, +US-MA-02573,US,MA,02573,6.25,,,, +US-MA-02574,US,MA,02574,6.25,,,, +US-MA-02575,US,MA,02575,6.25,,,, +US-MA-02576,US,MA,02576,6.25,,,, +US-MA-02584,US,MA,02584,6.25,,,, +US-MA-02601,US,MA,02601,6.25,,,, +US-MA-02630,US,MA,02630,6.25,,,, +US-MA-02631,US,MA,02631,6.25,,,, +US-MA-02632,US,MA,02632,6.25,,,, +US-MA-02633,US,MA,02633,6.25,,,, +US-MA-02634,US,MA,02634,6.25,,,, +US-MA-02635,US,MA,02635,6.25,,,, +US-MA-02637,US,MA,02637,6.25,,,, +US-MA-02638,US,MA,02638,6.25,,,, +US-MA-02639,US,MA,02639,6.25,,,, +US-MA-02641,US,MA,02641,6.25,,,, +US-MA-02642,US,MA,02642,6.25,,,, +US-MA-02643,US,MA,02643,6.25,,,, +US-MA-02644,US,MA,02644,6.25,,,, +US-MA-02645,US,MA,02645,6.25,,,, +US-MA-02646,US,MA,02646,6.25,,,, +US-MA-02647,US,MA,02647,6.25,,,, +US-MA-02648,US,MA,02648,6.25,,,, +US-MA-02649,US,MA,02649,6.25,,,, +US-MA-02650,US,MA,02650,6.25,,,, +US-MA-02651,US,MA,02651,6.25,,,, +US-MA-02652,US,MA,02652,6.25,,,, +US-MA-02653,US,MA,02653,6.25,,,, +US-MA-02655,US,MA,02655,6.25,,,, +US-MA-02657,US,MA,02657,6.25,,,, +US-MA-02659,US,MA,02659,6.25,,,, +US-MA-02660,US,MA,02660,6.25,,,, +US-MA-02661,US,MA,02661,6.25,,,, +US-MA-02662,US,MA,02662,6.25,,,, +US-MA-02663,US,MA,02663,6.25,,,, +US-MA-02664,US,MA,02664,6.25,,,, +US-MA-02666,US,MA,02666,6.25,,,, +US-MA-02667,US,MA,02667,6.25,,,, +US-MA-02668,US,MA,02668,6.25,,,, +US-MA-02669,US,MA,02669,6.25,,,, +US-MA-02670,US,MA,02670,6.25,,,, +US-MA-02671,US,MA,02671,6.25,,,, +US-MA-02672,US,MA,02672,6.25,,,, +US-MA-02673,US,MA,02673,6.25,,,, +US-MA-02675,US,MA,02675,6.25,,,, +US-MA-02702,US,MA,02702,6.25,,,, +US-MA-02703,US,MA,02703,6.25,,,, +US-MA-02712,US,MA,02712,6.25,,,, +US-MA-02713,US,MA,02713,6.25,,,, +US-MA-02714,US,MA,02714,6.25,,,, +US-MA-02715,US,MA,02715,6.25,,,, +US-MA-02717,US,MA,02717,6.25,,,, +US-MA-02718,US,MA,02718,6.25,,,, +US-MA-02719,US,MA,02719,6.25,,,, +US-MA-02720,US,MA,02720,6.25,,,, +US-MA-02721,US,MA,02721,6.25,,,, +US-MA-02722,US,MA,02722,6.25,,,, +US-MA-02723,US,MA,02723,6.25,,,, +US-MA-02724,US,MA,02724,6.25,,,, +US-MA-02725,US,MA,02725,6.25,,,, +US-MA-02726,US,MA,02726,6.25,,,, +US-MA-02738,US,MA,02738,6.25,,,, +US-MA-02739,US,MA,02739,6.25,,,, +US-MA-02740,US,MA,02740,6.25,,,, +US-MA-02741,US,MA,02741,6.25,,,, +US-MA-02742,US,MA,02742,6.25,,,, +US-MA-02743,US,MA,02743,6.25,,,, +US-MA-02744,US,MA,02744,6.25,,,, +US-MA-02745,US,MA,02745,6.25,,,, +US-MA-02746,US,MA,02746,6.25,,,, +US-MA-02747,US,MA,02747,6.25,,,, +US-MA-02748,US,MA,02748,6.25,,,, +US-MA-02760,US,MA,02760,6.25,,,, +US-MA-02761,US,MA,02761,6.25,,,, +US-MA-02762,US,MA,02762,6.25,,,, +US-MA-02763,US,MA,02763,6.25,,,, +US-MA-02764,US,MA,02764,6.25,,,, +US-MA-02766,US,MA,02766,6.25,,,, +US-MA-02767,US,MA,02767,6.25,,,, +US-MA-02768,US,MA,02768,6.25,,,, +US-MA-02769,US,MA,02769,6.25,,,, +US-MA-02770,US,MA,02770,6.25,,,, +US-MA-02771,US,MA,02771,6.25,,,, +US-MA-02777,US,MA,02777,6.25,,,, +US-MA-02779,US,MA,02779,6.25,,,, +US-MA-02780,US,MA,02780,6.25,,,, +US-MA-02783,US,MA,02783,6.25,,,, +US-MA-02790,US,MA,02790,6.25,,,, +US-MA-02791,US,MA,02791,6.25,,,, +US-MA-05501,US,MA,05501,6.25,,,, +US-MA-05544,US,MA,05544,6.25,,,, +US-MD-20601,US,MD,20601,6,,,, +US-MD-20602,US,MD,20602,6,,,, +US-MD-20603,US,MD,20603,6,,,, +US-MD-20604,US,MD,20604,6,,,, +US-MD-20606,US,MD,20606,6,,,, +US-MD-20607,US,MD,20607,6,,,, +US-MD-20608,US,MD,20608,6,,,, +US-MD-20609,US,MD,20609,6,,,, +US-MD-20610,US,MD,20610,6,,,, +US-MD-20611,US,MD,20611,6,,,, +US-MD-20612,US,MD,20612,6,,,, +US-MD-20613,US,MD,20613,6,,,, +US-MD-20615,US,MD,20615,6,,,, +US-MD-20616,US,MD,20616,6,,,, +US-MD-20617,US,MD,20617,6,,,, +US-MD-20618,US,MD,20618,6,,,, +US-MD-20619,US,MD,20619,6,,,, +US-MD-20620,US,MD,20620,6,,,, +US-MD-20621,US,MD,20621,6,,,, +US-MD-20622,US,MD,20622,6,,,, +US-MD-20623,US,MD,20623,6,,,, +US-MD-20624,US,MD,20624,6,,,, +US-MD-20625,US,MD,20625,6,,,, +US-MD-20626,US,MD,20626,6,,,, +US-MD-20627,US,MD,20627,6,,,, +US-MD-20628,US,MD,20628,6,,,, +US-MD-20629,US,MD,20629,6,,,, +US-MD-20630,US,MD,20630,6,,,, +US-MD-20632,US,MD,20632,6,,,, +US-MD-20634,US,MD,20634,6,,,, +US-MD-20635,US,MD,20635,6,,,, +US-MD-20636,US,MD,20636,6,,,, +US-MD-20637,US,MD,20637,6,,,, +US-MD-20639,US,MD,20639,6,,,, +US-MD-20640,US,MD,20640,6,,,, +US-MD-20643,US,MD,20643,6,,,, +US-MD-20645,US,MD,20645,6,,,, +US-MD-20646,US,MD,20646,6,,,, +US-MD-20650,US,MD,20650,6,,,, +US-MD-20653,US,MD,20653,6,,,, +US-MD-20656,US,MD,20656,6,,,, +US-MD-20657,US,MD,20657,6,,,, +US-MD-20658,US,MD,20658,6,,,, +US-MD-20659,US,MD,20659,6,,,, +US-MD-20660,US,MD,20660,6,,,, +US-MD-20661,US,MD,20661,6,,,, +US-MD-20662,US,MD,20662,6,,,, +US-MD-20664,US,MD,20664,6,,,, +US-MD-20667,US,MD,20667,6,,,, +US-MD-20670,US,MD,20670,6,,,, +US-MD-20674,US,MD,20674,6,,,, +US-MD-20675,US,MD,20675,6,,,, +US-MD-20676,US,MD,20676,6,,,, +US-MD-20677,US,MD,20677,6,,,, +US-MD-20678,US,MD,20678,6,,,, +US-MD-20680,US,MD,20680,6,,,, +US-MD-20682,US,MD,20682,6,,,, +US-MD-20684,US,MD,20684,6,,,, +US-MD-20685,US,MD,20685,6,,,, +US-MD-20686,US,MD,20686,6,,,, +US-MD-20687,US,MD,20687,6,,,, +US-MD-20688,US,MD,20688,6,,,, +US-MD-20689,US,MD,20689,6,,,, +US-MD-20690,US,MD,20690,6,,,, +US-MD-20692,US,MD,20692,6,,,, +US-MD-20693,US,MD,20693,6,,,, +US-MD-20695,US,MD,20695,6,,,, +US-MD-20697,US,MD,20697,6,,,, +US-MD-20701,US,MD,20701,6,,,, +US-MD-20703,US,MD,20703,6,,,, +US-MD-20704,US,MD,20704,6,,,, +US-MD-20705,US,MD,20705,6,,,, +US-MD-20706,US,MD,20706,6,,,, +US-MD-20707,US,MD,20707,6,,,, +US-MD-20708,US,MD,20708,6,,,, +US-MD-20709,US,MD,20709,6,,,, +US-MD-20710,US,MD,20710,6,,,, +US-MD-20711,US,MD,20711,6,,,, +US-MD-20712,US,MD,20712,6,,,, +US-MD-20714,US,MD,20714,6,,,, +US-MD-20715,US,MD,20715,6,,,, +US-MD-20716,US,MD,20716,6,,,, +US-MD-20717,US,MD,20717,6,,,, +US-MD-20718,US,MD,20718,6,,,, +US-MD-20719,US,MD,20719,6,,,, +US-MD-20720,US,MD,20720,6,,,, +US-MD-20721,US,MD,20721,6,,,, +US-MD-20722,US,MD,20722,6,,,, +US-MD-20723,US,MD,20723,6,,,, +US-MD-20724,US,MD,20724,6,,,, +US-MD-20725,US,MD,20725,6,,,, +US-MD-20726,US,MD,20726,6,,,, +US-MD-20731,US,MD,20731,6,,,, +US-MD-20732,US,MD,20732,6,,,, +US-MD-20733,US,MD,20733,6,,,, +US-MD-20735,US,MD,20735,6,,,, +US-MD-20736,US,MD,20736,6,,,, +US-MD-20737,US,MD,20737,6,,,, +US-MD-20738,US,MD,20738,6,,,, +US-MD-20740,US,MD,20740,6,,,, +US-MD-20741,US,MD,20741,6,,,, +US-MD-20742,US,MD,20742,6,,,, +US-MD-20743,US,MD,20743,6,,,, +US-MD-20744,US,MD,20744,6,,,, +US-MD-20745,US,MD,20745,6,,,, +US-MD-20746,US,MD,20746,6,,,, +US-MD-20747,US,MD,20747,6,,,, +US-MD-20748,US,MD,20748,6,,,, +US-MD-20749,US,MD,20749,6,,,, +US-MD-20750,US,MD,20750,6,,,, +US-MD-20751,US,MD,20751,6,,,, +US-MD-20752,US,MD,20752,6,,,, +US-MD-20753,US,MD,20753,6,,,, +US-MD-20754,US,MD,20754,6,,,, +US-MD-20755,US,MD,20755,6,,,, +US-MD-20757,US,MD,20757,6,,,, +US-MD-20758,US,MD,20758,6,,,, +US-MD-20759,US,MD,20759,6,,,, +US-MD-20762,US,MD,20762,6,,,, +US-MD-20763,US,MD,20763,6,,,, +US-MD-20764,US,MD,20764,6,,,, +US-MD-20765,US,MD,20765,6,,,, +US-MD-20768,US,MD,20768,6,,,, +US-MD-20769,US,MD,20769,6,,,, +US-MD-20770,US,MD,20770,6,,,, +US-MD-20771,US,MD,20771,6,,,, +US-MD-20772,US,MD,20772,6,,,, +US-MD-20773,US,MD,20773,6,,,, +US-MD-20774,US,MD,20774,6,,,, +US-MD-20775,US,MD,20775,6,,,, +US-MD-20776,US,MD,20776,6,,,, +US-MD-20777,US,MD,20777,6,,,, +US-MD-20778,US,MD,20778,6,,,, +US-MD-20779,US,MD,20779,6,,,, +US-MD-20781,US,MD,20781,6,,,, +US-MD-20782,US,MD,20782,6,,,, +US-MD-20783,US,MD,20783,6,,,, +US-MD-20784,US,MD,20784,6,,,, +US-MD-20785,US,MD,20785,6,,,, +US-MD-20787,US,MD,20787,6,,,, +US-MD-20788,US,MD,20788,6,,,, +US-MD-20790,US,MD,20790,6,,,, +US-MD-20791,US,MD,20791,6,,,, +US-MD-20792,US,MD,20792,6,,,, +US-MD-20794,US,MD,20794,6,,,, +US-MD-20797,US,MD,20797,6,,,, +US-MD-20799,US,MD,20799,6,,,, +US-MD-20810,US,MD,20810,6,,,, +US-MD-20811,US,MD,20811,6,,,, +US-MD-20812,US,MD,20812,6,,,, +US-MD-20813,US,MD,20813,6,,,, +US-MD-20814,US,MD,20814,6,,,, +US-MD-20815,US,MD,20815,6,,,, +US-MD-20816,US,MD,20816,6,,,, +US-MD-20817,US,MD,20817,6,,,, +US-MD-20818,US,MD,20818,6,,,, +US-MD-20824,US,MD,20824,6,,,, +US-MD-20825,US,MD,20825,6,,,, +US-MD-20827,US,MD,20827,6,,,, +US-MD-20830,US,MD,20830,6,,,, +US-MD-20832,US,MD,20832,6,,,, +US-MD-20833,US,MD,20833,6,,,, +US-MD-20837,US,MD,20837,6,,,, +US-MD-20838,US,MD,20838,6,,,, +US-MD-20839,US,MD,20839,6,,,, +US-MD-20841,US,MD,20841,6,,,, +US-MD-20842,US,MD,20842,6,,,, +US-MD-20847,US,MD,20847,6,,,, +US-MD-20848,US,MD,20848,6,,,, +US-MD-20849,US,MD,20849,6,,,, +US-MD-20850,US,MD,20850,6,,,, +US-MD-20851,US,MD,20851,6,,,, +US-MD-20852,US,MD,20852,6,,,, +US-MD-20853,US,MD,20853,6,,,, +US-MD-20854,US,MD,20854,6,,,, +US-MD-20855,US,MD,20855,6,,,, +US-MD-20857,US,MD,20857,6,,,, +US-MD-20859,US,MD,20859,6,,,, +US-MD-20860,US,MD,20860,6,,,, +US-MD-20861,US,MD,20861,6,,,, +US-MD-20862,US,MD,20862,6,,,, +US-MD-20866,US,MD,20866,6,,,, +US-MD-20868,US,MD,20868,6,,,, +US-MD-20871,US,MD,20871,6,,,, +US-MD-20872,US,MD,20872,6,,,, +US-MD-20874,US,MD,20874,6,,,, +US-MD-20875,US,MD,20875,6,,,, +US-MD-20876,US,MD,20876,6,,,, +US-MD-20877,US,MD,20877,6,,,, +US-MD-20878,US,MD,20878,6,,,, +US-MD-20879,US,MD,20879,6,,,, +US-MD-20880,US,MD,20880,6,,,, +US-MD-20882,US,MD,20882,6,,,, +US-MD-20883,US,MD,20883,6,,,, +US-MD-20884,US,MD,20884,6,,,, +US-MD-20885,US,MD,20885,6,,,, +US-MD-20886,US,MD,20886,6,,,, +US-MD-20889,US,MD,20889,6,,,, +US-MD-20891,US,MD,20891,6,,,, +US-MD-20892,US,MD,20892,6,,,, +US-MD-20894,US,MD,20894,6,,,, +US-MD-20895,US,MD,20895,6,,,, +US-MD-20896,US,MD,20896,6,,,, +US-MD-20897,US,MD,20897,6,,,, +US-MD-20898,US,MD,20898,6,,,, +US-MD-20899,US,MD,20899,6,,,, +US-MD-20901,US,MD,20901,6,,,, +US-MD-20902,US,MD,20902,6,,,, +US-MD-20903,US,MD,20903,6,,,, +US-MD-20904,US,MD,20904,6,,,, +US-MD-20905,US,MD,20905,6,,,, +US-MD-20906,US,MD,20906,6,,,, +US-MD-20907,US,MD,20907,6,,,, +US-MD-20908,US,MD,20908,6,,,, +US-MD-20910,US,MD,20910,6,,,, +US-MD-20911,US,MD,20911,6,,,, +US-MD-20912,US,MD,20912,6,,,, +US-MD-20913,US,MD,20913,6,,,, +US-MD-20914,US,MD,20914,6,,,, +US-MD-20915,US,MD,20915,6,,,, +US-MD-20916,US,MD,20916,6,,,, +US-MD-20918,US,MD,20918,6,,,, +US-MD-20993,US,MD,20993,6,,,, +US-MD-20997,US,MD,20997,6,,,, +US-MD-21001,US,MD,21001,6,,,, +US-MD-21005,US,MD,21005,6,,,, +US-MD-21009,US,MD,21009,6,,,, +US-MD-21010,US,MD,21010,6,,,, +US-MD-21012,US,MD,21012,6,,,, +US-MD-21013,US,MD,21013,6,,,, +US-MD-21014,US,MD,21014,6,,,, +US-MD-21015,US,MD,21015,6,,,, +US-MD-21017,US,MD,21017,6,,,, +US-MD-21018,US,MD,21018,6,,,, +US-MD-21020,US,MD,21020,6,,,, +US-MD-21022,US,MD,21022,6,,,, +US-MD-21023,US,MD,21023,6,,,, +US-MD-21027,US,MD,21027,6,,,, +US-MD-21028,US,MD,21028,6,,,, +US-MD-21029,US,MD,21029,6,,,, +US-MD-21030,US,MD,21030,6,,,, +US-MD-21031,US,MD,21031,6,,,, +US-MD-21032,US,MD,21032,6,,,, +US-MD-21034,US,MD,21034,6,,,, +US-MD-21035,US,MD,21035,6,,,, +US-MD-21036,US,MD,21036,6,,,, +US-MD-21037,US,MD,21037,6,,,, +US-MD-21040,US,MD,21040,6,,,, +US-MD-21041,US,MD,21041,6,,,, +US-MD-21042,US,MD,21042,6,,,, +US-MD-21043,US,MD,21043,6,,,, +US-MD-21044,US,MD,21044,6,,,, +US-MD-21045,US,MD,21045,6,,,, +US-MD-21046,US,MD,21046,6,,,, +US-MD-21047,US,MD,21047,6,,,, +US-MD-21048,US,MD,21048,6,,,, +US-MD-21050,US,MD,21050,6,,,, +US-MD-21051,US,MD,21051,6,,,, +US-MD-21052,US,MD,21052,6,,,, +US-MD-21053,US,MD,21053,6,,,, +US-MD-21054,US,MD,21054,6,,,, +US-MD-21056,US,MD,21056,6,,,, +US-MD-21057,US,MD,21057,6,,,, +US-MD-21060,US,MD,21060,6,,,, +US-MD-21061,US,MD,21061,6,,,, +US-MD-21062,US,MD,21062,6,,,, +US-MD-21065,US,MD,21065,6,,,, +US-MD-21071,US,MD,21071,6,,,, +US-MD-21074,US,MD,21074,6,,,, +US-MD-21075,US,MD,21075,6,,,, +US-MD-21076,US,MD,21076,6,,,, +US-MD-21077,US,MD,21077,6,,,, +US-MD-21078,US,MD,21078,6,,,, +US-MD-21082,US,MD,21082,6,,,, +US-MD-21084,US,MD,21084,6,,,, +US-MD-21085,US,MD,21085,6,,,, +US-MD-21087,US,MD,21087,6,,,, +US-MD-21088,US,MD,21088,6,,,, +US-MD-21090,US,MD,21090,6,,,, +US-MD-21092,US,MD,21092,6,,,, +US-MD-21093,US,MD,21093,6,,,, +US-MD-21094,US,MD,21094,6,,,, +US-MD-21102,US,MD,21102,6,,,, +US-MD-21104,US,MD,21104,6,,,, +US-MD-21105,US,MD,21105,6,,,, +US-MD-21106,US,MD,21106,6,,,, +US-MD-21108,US,MD,21108,6,,,, +US-MD-21111,US,MD,21111,6,,,, +US-MD-21113,US,MD,21113,6,,,, +US-MD-21114,US,MD,21114,6,,,, +US-MD-21117,US,MD,21117,6,,,, +US-MD-21120,US,MD,21120,6,,,, +US-MD-21122,US,MD,21122,6,,,, +US-MD-21123,US,MD,21123,6,,,, +US-MD-21128,US,MD,21128,6,,,, +US-MD-21130,US,MD,21130,6,,,, +US-MD-21131,US,MD,21131,6,,,, +US-MD-21132,US,MD,21132,6,,,, +US-MD-21133,US,MD,21133,6,,,, +US-MD-21136,US,MD,21136,6,,,, +US-MD-21139,US,MD,21139,6,,,, +US-MD-21140,US,MD,21140,6,,,, +US-MD-21144,US,MD,21144,6,,,, +US-MD-21146,US,MD,21146,6,,,, +US-MD-21150,US,MD,21150,6,,,, +US-MD-21152,US,MD,21152,6,,,, +US-MD-21153,US,MD,21153,6,,,, +US-MD-21154,US,MD,21154,6,,,, +US-MD-21155,US,MD,21155,6,,,, +US-MD-21156,US,MD,21156,6,,,, +US-MD-21157,US,MD,21157,6,,,, +US-MD-21158,US,MD,21158,6,,,, +US-MD-21160,US,MD,21160,6,,,, +US-MD-21161,US,MD,21161,6,,,, +US-MD-21162,US,MD,21162,6,,,, +US-MD-21163,US,MD,21163,6,,,, +US-MD-21201,US,MD,21201,6,,,, +US-MD-21202,US,MD,21202,6,,,, +US-MD-21203,US,MD,21203,6,,,, +US-MD-21204,US,MD,21204,6,,,, +US-MD-21205,US,MD,21205,6,,,, +US-MD-21206,US,MD,21206,6,,,, +US-MD-21207,US,MD,21207,6,,,, +US-MD-21208,US,MD,21208,6,,,, +US-MD-21209,US,MD,21209,6,,,, +US-MD-21210,US,MD,21210,6,,,, +US-MD-21211,US,MD,21211,6,,,, +US-MD-21212,US,MD,21212,6,,,, +US-MD-21213,US,MD,21213,6,,,, +US-MD-21214,US,MD,21214,6,,,, +US-MD-21215,US,MD,21215,6,,,, +US-MD-21216,US,MD,21216,6,,,, +US-MD-21217,US,MD,21217,6,,,, +US-MD-21218,US,MD,21218,6,,,, +US-MD-21219,US,MD,21219,6,,,, +US-MD-21220,US,MD,21220,6,,,, +US-MD-21221,US,MD,21221,6,,,, +US-MD-21222,US,MD,21222,6,,,, +US-MD-21223,US,MD,21223,6,,,, +US-MD-21224,US,MD,21224,6,,,, +US-MD-21225,US,MD,21225,6,,,, +US-MD-21226,US,MD,21226,6,,,, +US-MD-21227,US,MD,21227,6,,,, +US-MD-21228,US,MD,21228,6,,,, +US-MD-21229,US,MD,21229,6,,,, +US-MD-21230,US,MD,21230,6,,,, +US-MD-21231,US,MD,21231,6,,,, +US-MD-21233,US,MD,21233,6,,,, +US-MD-21234,US,MD,21234,6,,,, +US-MD-21235,US,MD,21235,6,,,, +US-MD-21236,US,MD,21236,6,,,, +US-MD-21237,US,MD,21237,6,,,, +US-MD-21239,US,MD,21239,6,,,, +US-MD-21240,US,MD,21240,6,,,, +US-MD-21241,US,MD,21241,6,,,, +US-MD-21244,US,MD,21244,6,,,, +US-MD-21250,US,MD,21250,6,,,, +US-MD-21251,US,MD,21251,6,,,, +US-MD-21252,US,MD,21252,6,,,, +US-MD-21263,US,MD,21263,6,,,, +US-MD-21264,US,MD,21264,6,,,, +US-MD-21270,US,MD,21270,6,,,, +US-MD-21273,US,MD,21273,6,,,, +US-MD-21275,US,MD,21275,6,,,, +US-MD-21278,US,MD,21278,6,,,, +US-MD-21279,US,MD,21279,6,,,, +US-MD-21280,US,MD,21280,6,,,, +US-MD-21281,US,MD,21281,6,,,, +US-MD-21282,US,MD,21282,6,,,, +US-MD-21284,US,MD,21284,6,,,, +US-MD-21285,US,MD,21285,6,,,, +US-MD-21286,US,MD,21286,6,,,, +US-MD-21287,US,MD,21287,6,,,, +US-MD-21288,US,MD,21288,6,,,, +US-MD-21289,US,MD,21289,6,,,, +US-MD-21290,US,MD,21290,6,,,, +US-MD-21297,US,MD,21297,6,,,, +US-MD-21298,US,MD,21298,6,,,, +US-MD-21401,US,MD,21401,6,,,, +US-MD-21402,US,MD,21402,6,,,, +US-MD-21403,US,MD,21403,6,,,, +US-MD-21404,US,MD,21404,6,,,, +US-MD-21405,US,MD,21405,6,,,, +US-MD-21409,US,MD,21409,6,,,, +US-MD-21411,US,MD,21411,6,,,, +US-MD-21412,US,MD,21412,6,,,, +US-MD-21501,US,MD,21501,6,,,, +US-MD-21502,US,MD,21502,6,,,, +US-MD-21503,US,MD,21503,6,,,, +US-MD-21504,US,MD,21504,6,,,, +US-MD-21505,US,MD,21505,6,,,, +US-MD-21520,US,MD,21520,6,,,, +US-MD-21521,US,MD,21521,6,,,, +US-MD-21522,US,MD,21522,6,,,, +US-MD-21523,US,MD,21523,6,,,, +US-MD-21524,US,MD,21524,6,,,, +US-MD-21528,US,MD,21528,6,,,, +US-MD-21529,US,MD,21529,6,,,, +US-MD-21530,US,MD,21530,6,,,, +US-MD-21531,US,MD,21531,6,,,, +US-MD-21532,US,MD,21532,6,,,, +US-MD-21536,US,MD,21536,6,,,, +US-MD-21538,US,MD,21538,6,,,, +US-MD-21539,US,MD,21539,6,,,, +US-MD-21540,US,MD,21540,6,,,, +US-MD-21541,US,MD,21541,6,,,, +US-MD-21542,US,MD,21542,6,,,, +US-MD-21543,US,MD,21543,6,,,, +US-MD-21545,US,MD,21545,6,,,, +US-MD-21550,US,MD,21550,6,,,, +US-MD-21555,US,MD,21555,6,,,, +US-MD-21556,US,MD,21556,6,,,, +US-MD-21557,US,MD,21557,6,,,, +US-MD-21560,US,MD,21560,6,,,, +US-MD-21561,US,MD,21561,6,,,, +US-MD-21562,US,MD,21562,6,,,, +US-MD-21601,US,MD,21601,6,,,, +US-MD-21607,US,MD,21607,6,,,, +US-MD-21609,US,MD,21609,6,,,, +US-MD-21610,US,MD,21610,6,,,, +US-MD-21612,US,MD,21612,6,,,, +US-MD-21613,US,MD,21613,6,,,, +US-MD-21617,US,MD,21617,6,,,, +US-MD-21619,US,MD,21619,6,,,, +US-MD-21620,US,MD,21620,6,,,, +US-MD-21622,US,MD,21622,6,,,, +US-MD-21623,US,MD,21623,6,,,, +US-MD-21624,US,MD,21624,6,,,, +US-MD-21625,US,MD,21625,6,,,, +US-MD-21626,US,MD,21626,6,,,, +US-MD-21627,US,MD,21627,6,,,, +US-MD-21628,US,MD,21628,6,,,, +US-MD-21629,US,MD,21629,6,,,, +US-MD-21631,US,MD,21631,6,,,, +US-MD-21632,US,MD,21632,6,,,, +US-MD-21634,US,MD,21634,6,,,, +US-MD-21635,US,MD,21635,6,,,, +US-MD-21636,US,MD,21636,6,,,, +US-MD-21638,US,MD,21638,6,,,, +US-MD-21639,US,MD,21639,6,,,, +US-MD-21640,US,MD,21640,6,,,, +US-MD-21641,US,MD,21641,6,,,, +US-MD-21643,US,MD,21643,6,,,, +US-MD-21644,US,MD,21644,6,,,, +US-MD-21645,US,MD,21645,6,,,, +US-MD-21647,US,MD,21647,6,,,, +US-MD-21648,US,MD,21648,6,,,, +US-MD-21649,US,MD,21649,6,,,, +US-MD-21650,US,MD,21650,6,,,, +US-MD-21651,US,MD,21651,6,,,, +US-MD-21652,US,MD,21652,6,,,, +US-MD-21653,US,MD,21653,6,,,, +US-MD-21654,US,MD,21654,6,,,, +US-MD-21655,US,MD,21655,6,,,, +US-MD-21656,US,MD,21656,6,,,, +US-MD-21657,US,MD,21657,6,,,, +US-MD-21658,US,MD,21658,6,,,, +US-MD-21659,US,MD,21659,6,,,, +US-MD-21660,US,MD,21660,6,,,, +US-MD-21661,US,MD,21661,6,,,, +US-MD-21662,US,MD,21662,6,,,, +US-MD-21663,US,MD,21663,6,,,, +US-MD-21664,US,MD,21664,6,,,, +US-MD-21665,US,MD,21665,6,,,, +US-MD-21666,US,MD,21666,6,,,, +US-MD-21667,US,MD,21667,6,,,, +US-MD-21668,US,MD,21668,6,,,, +US-MD-21669,US,MD,21669,6,,,, +US-MD-21670,US,MD,21670,6,,,, +US-MD-21671,US,MD,21671,6,,,, +US-MD-21672,US,MD,21672,6,,,, +US-MD-21673,US,MD,21673,6,,,, +US-MD-21675,US,MD,21675,6,,,, +US-MD-21676,US,MD,21676,6,,,, +US-MD-21677,US,MD,21677,6,,,, +US-MD-21678,US,MD,21678,6,,,, +US-MD-21679,US,MD,21679,6,,,, +US-MD-21690,US,MD,21690,6,,,, +US-MD-21701,US,MD,21701,6,,,, +US-MD-21702,US,MD,21702,6,,,, +US-MD-21703,US,MD,21703,6,,,, +US-MD-21704,US,MD,21704,6,,,, +US-MD-21705,US,MD,21705,6,,,, +US-MD-21709,US,MD,21709,6,,,, +US-MD-21710,US,MD,21710,6,,,, +US-MD-21711,US,MD,21711,6,,,, +US-MD-21713,US,MD,21713,6,,,, +US-MD-21714,US,MD,21714,6,,,, +US-MD-21715,US,MD,21715,6,,,, +US-MD-21716,US,MD,21716,6,,,, +US-MD-21717,US,MD,21717,6,,,, +US-MD-21718,US,MD,21718,6,,,, +US-MD-21719,US,MD,21719,6,,,, +US-MD-21720,US,MD,21720,6,,,, +US-MD-21721,US,MD,21721,6,,,, +US-MD-21722,US,MD,21722,6,,,, +US-MD-21723,US,MD,21723,6,,,, +US-MD-21727,US,MD,21727,6,,,, +US-MD-21733,US,MD,21733,6,,,, +US-MD-21734,US,MD,21734,6,,,, +US-MD-21737,US,MD,21737,6,,,, +US-MD-21738,US,MD,21738,6,,,, +US-MD-21740,US,MD,21740,6,,,, +US-MD-21741,US,MD,21741,6,,,, +US-MD-21742,US,MD,21742,6,,,, +US-MD-21746,US,MD,21746,6,,,, +US-MD-21747,US,MD,21747,6,,,, +US-MD-21749,US,MD,21749,6,,,, +US-MD-21750,US,MD,21750,6,,,, +US-MD-21754,US,MD,21754,6,,,, +US-MD-21755,US,MD,21755,6,,,, +US-MD-21756,US,MD,21756,6,,,, +US-MD-21757,US,MD,21757,6,,,, +US-MD-21758,US,MD,21758,6,,,, +US-MD-21759,US,MD,21759,6,,,, +US-MD-21762,US,MD,21762,6,,,, +US-MD-21765,US,MD,21765,6,,,, +US-MD-21766,US,MD,21766,6,,,, +US-MD-21767,US,MD,21767,6,,,, +US-MD-21769,US,MD,21769,6,,,, +US-MD-21770,US,MD,21770,6,,,, +US-MD-21771,US,MD,21771,6,,,, +US-MD-21773,US,MD,21773,6,,,, +US-MD-21774,US,MD,21774,6,,,, +US-MD-21775,US,MD,21775,6,,,, +US-MD-21776,US,MD,21776,6,,,, +US-MD-21777,US,MD,21777,6,,,, +US-MD-21778,US,MD,21778,6,,,, +US-MD-21779,US,MD,21779,6,,,, +US-MD-21780,US,MD,21780,6,,,, +US-MD-21781,US,MD,21781,6,,,, +US-MD-21782,US,MD,21782,6,,,, +US-MD-21783,US,MD,21783,6,,,, +US-MD-21784,US,MD,21784,6,,,, +US-MD-21787,US,MD,21787,6,,,, +US-MD-21788,US,MD,21788,6,,,, +US-MD-21790,US,MD,21790,6,,,, +US-MD-21791,US,MD,21791,6,,,, +US-MD-21792,US,MD,21792,6,,,, +US-MD-21793,US,MD,21793,6,,,, +US-MD-21794,US,MD,21794,6,,,, +US-MD-21795,US,MD,21795,6,,,, +US-MD-21797,US,MD,21797,6,,,, +US-MD-21798,US,MD,21798,6,,,, +US-MD-21801,US,MD,21801,6,,,, +US-MD-21802,US,MD,21802,6,,,, +US-MD-21803,US,MD,21803,6,,,, +US-MD-21804,US,MD,21804,6,,,, +US-MD-21810,US,MD,21810,6,,,, +US-MD-21811,US,MD,21811,6,,,, +US-MD-21813,US,MD,21813,6,,,, +US-MD-21814,US,MD,21814,6,,,, +US-MD-21817,US,MD,21817,6,,,, +US-MD-21821,US,MD,21821,6,,,, +US-MD-21822,US,MD,21822,6,,,, +US-MD-21824,US,MD,21824,6,,,, +US-MD-21826,US,MD,21826,6,,,, +US-MD-21829,US,MD,21829,6,,,, +US-MD-21830,US,MD,21830,6,,,, +US-MD-21835,US,MD,21835,6,,,, +US-MD-21836,US,MD,21836,6,,,, +US-MD-21837,US,MD,21837,6,,,, +US-MD-21838,US,MD,21838,6,,,, +US-MD-21840,US,MD,21840,6,,,, +US-MD-21841,US,MD,21841,6,,,, +US-MD-21842,US,MD,21842,6,,,, +US-MD-21843,US,MD,21843,6,,,, +US-MD-21849,US,MD,21849,6,,,, +US-MD-21850,US,MD,21850,6,,,, +US-MD-21851,US,MD,21851,6,,,, +US-MD-21852,US,MD,21852,6,,,, +US-MD-21853,US,MD,21853,6,,,, +US-MD-21856,US,MD,21856,6,,,, +US-MD-21857,US,MD,21857,6,,,, +US-MD-21861,US,MD,21861,6,,,, +US-MD-21862,US,MD,21862,6,,,, +US-MD-21863,US,MD,21863,6,,,, +US-MD-21864,US,MD,21864,6,,,, +US-MD-21865,US,MD,21865,6,,,, +US-MD-21866,US,MD,21866,6,,,, +US-MD-21867,US,MD,21867,6,,,, +US-MD-21869,US,MD,21869,6,,,, +US-MD-21871,US,MD,21871,6,,,, +US-MD-21872,US,MD,21872,6,,,, +US-MD-21874,US,MD,21874,6,,,, +US-MD-21875,US,MD,21875,6,,,, +US-MD-21890,US,MD,21890,6,,,, +US-MD-21901,US,MD,21901,6,,,, +US-MD-21902,US,MD,21902,6,,,, +US-MD-21903,US,MD,21903,6,,,, +US-MD-21904,US,MD,21904,6,,,, +US-MD-21911,US,MD,21911,6,,,, +US-MD-21912,US,MD,21912,6,,,, +US-MD-21913,US,MD,21913,6,,,, +US-MD-21914,US,MD,21914,6,,,, +US-MD-21915,US,MD,21915,6,,,, +US-MD-21916,US,MD,21916,6,,,, +US-MD-21917,US,MD,21917,6,,,, +US-MD-21918,US,MD,21918,6,,,, +US-MD-21919,US,MD,21919,6,,,, +US-MD-21920,US,MD,21920,6,,,, +US-MD-21921,US,MD,21921,6,,,, +US-MD-21922,US,MD,21922,6,,,, +US-MD-21930,US,MD,21930,6,,,, +US-ME-03901,US,ME,03901,5.5,,,, +US-ME-03902,US,ME,03902,5.5,,,, +US-ME-03903,US,ME,03903,5.5,,,, +US-ME-03904,US,ME,03904,5.5,,,, +US-ME-03905,US,ME,03905,5.5,,,, +US-ME-03906,US,ME,03906,5.5,,,, +US-ME-03907,US,ME,03907,5.5,,,, +US-ME-03908,US,ME,03908,5.5,,,, +US-ME-03909,US,ME,03909,5.5,,,, +US-ME-03910,US,ME,03910,5.5,,,, +US-ME-03911,US,ME,03911,5.5,,,, +US-ME-04001,US,ME,04001,5.5,,,, +US-ME-04002,US,ME,04002,5.5,,,, +US-ME-04003,US,ME,04003,5.5,,,, +US-ME-04004,US,ME,04004,5.5,,,, +US-ME-04005,US,ME,04005,5.5,,,, +US-ME-04006,US,ME,04006,5.5,,,, +US-ME-04007,US,ME,04007,5.5,,,, +US-ME-04008,US,ME,04008,5.5,,,, +US-ME-04009,US,ME,04009,5.5,,,, +US-ME-04010,US,ME,04010,5.5,,,, +US-ME-04011,US,ME,04011,5.5,,,, +US-ME-04013,US,ME,04013,5.5,,,, +US-ME-04014,US,ME,04014,5.5,,,, +US-ME-04015,US,ME,04015,5.5,,,, +US-ME-04016,US,ME,04016,5.5,,,, +US-ME-04017,US,ME,04017,5.5,,,, +US-ME-04019,US,ME,04019,5.5,,,, +US-ME-04020,US,ME,04020,5.5,,,, +US-ME-04021,US,ME,04021,5.5,,,, +US-ME-04022,US,ME,04022,5.5,,,, +US-ME-04024,US,ME,04024,5.5,,,, +US-ME-04027,US,ME,04027,5.5,,,, +US-ME-04028,US,ME,04028,5.5,,,, +US-ME-04029,US,ME,04029,5.5,,,, +US-ME-04030,US,ME,04030,5.5,,,, +US-ME-04032,US,ME,04032,5.5,,,, +US-ME-04033,US,ME,04033,5.5,,,, +US-ME-04034,US,ME,04034,5.5,,,, +US-ME-04037,US,ME,04037,5.5,,,, +US-ME-04038,US,ME,04038,5.5,,,, +US-ME-04039,US,ME,04039,5.5,,,, +US-ME-04040,US,ME,04040,5.5,,,, +US-ME-04041,US,ME,04041,5.5,,,, +US-ME-04042,US,ME,04042,5.5,,,, +US-ME-04043,US,ME,04043,5.5,,,, +US-ME-04046,US,ME,04046,5.5,,,, +US-ME-04047,US,ME,04047,5.5,,,, +US-ME-04048,US,ME,04048,5.5,,,, +US-ME-04049,US,ME,04049,5.5,,,, +US-ME-04050,US,ME,04050,5.5,,,, +US-ME-04051,US,ME,04051,5.5,,,, +US-ME-04054,US,ME,04054,5.5,,,, +US-ME-04055,US,ME,04055,5.5,,,, +US-ME-04056,US,ME,04056,5.5,,,, +US-ME-04057,US,ME,04057,5.5,,,, +US-ME-04061,US,ME,04061,5.5,,,, +US-ME-04062,US,ME,04062,5.5,,,, +US-ME-04063,US,ME,04063,5.5,,,, +US-ME-04064,US,ME,04064,5.5,,,, +US-ME-04066,US,ME,04066,5.5,,,, +US-ME-04068,US,ME,04068,5.5,,,, +US-ME-04069,US,ME,04069,5.5,,,, +US-ME-04070,US,ME,04070,5.5,,,, +US-ME-04071,US,ME,04071,5.5,,,, +US-ME-04072,US,ME,04072,5.5,,,, +US-ME-04073,US,ME,04073,5.5,,,, +US-ME-04074,US,ME,04074,5.5,,,, +US-ME-04076,US,ME,04076,5.5,,,, +US-ME-04077,US,ME,04077,5.5,,,, +US-ME-04078,US,ME,04078,5.5,,,, +US-ME-04079,US,ME,04079,5.5,,,, +US-ME-04082,US,ME,04082,5.5,,,, +US-ME-04083,US,ME,04083,5.5,,,, +US-ME-04084,US,ME,04084,5.5,,,, +US-ME-04085,US,ME,04085,5.5,,,, +US-ME-04086,US,ME,04086,5.5,,,, +US-ME-04087,US,ME,04087,5.5,,,, +US-ME-04088,US,ME,04088,5.5,,,, +US-ME-04090,US,ME,04090,5.5,,,, +US-ME-04091,US,ME,04091,5.5,,,, +US-ME-04092,US,ME,04092,5.5,,,, +US-ME-04093,US,ME,04093,5.5,,,, +US-ME-04094,US,ME,04094,5.5,,,, +US-ME-04095,US,ME,04095,5.5,,,, +US-ME-04096,US,ME,04096,5.5,,,, +US-ME-04097,US,ME,04097,5.5,,,, +US-ME-04098,US,ME,04098,5.5,,,, +US-ME-04101,US,ME,04101,5.5,,,, +US-ME-04102,US,ME,04102,5.5,,,, +US-ME-04103,US,ME,04103,5.5,,,, +US-ME-04104,US,ME,04104,5.5,,,, +US-ME-04105,US,ME,04105,5.5,,,, +US-ME-04106,US,ME,04106,5.5,,,, +US-ME-04107,US,ME,04107,5.5,,,, +US-ME-04108,US,ME,04108,5.5,,,, +US-ME-04109,US,ME,04109,5.5,,,, +US-ME-04110,US,ME,04110,5.5,,,, +US-ME-04112,US,ME,04112,5.5,,,, +US-ME-04116,US,ME,04116,5.5,,,, +US-ME-04122,US,ME,04122,5.5,,,, +US-ME-04123,US,ME,04123,5.5,,,, +US-ME-04124,US,ME,04124,5.5,,,, +US-ME-04210,US,ME,04210,5.5,,,, +US-ME-04211,US,ME,04211,5.5,,,, +US-ME-04212,US,ME,04212,5.5,,,, +US-ME-04216,US,ME,04216,5.5,,,, +US-ME-04217,US,ME,04217,5.5,,,, +US-ME-04219,US,ME,04219,5.5,,,, +US-ME-04220,US,ME,04220,5.5,,,, +US-ME-04221,US,ME,04221,5.5,,,, +US-ME-04222,US,ME,04222,5.5,,,, +US-ME-04223,US,ME,04223,5.5,,,, +US-ME-04224,US,ME,04224,5.5,,,, +US-ME-04225,US,ME,04225,5.5,,,, +US-ME-04226,US,ME,04226,5.5,,,, +US-ME-04227,US,ME,04227,5.5,,,, +US-ME-04228,US,ME,04228,5.5,,,, +US-ME-04230,US,ME,04230,5.5,,,, +US-ME-04231,US,ME,04231,5.5,,,, +US-ME-04234,US,ME,04234,5.5,,,, +US-ME-04236,US,ME,04236,5.5,,,, +US-ME-04237,US,ME,04237,5.5,,,, +US-ME-04238,US,ME,04238,5.5,,,, +US-ME-04239,US,ME,04239,5.5,,,, +US-ME-04240,US,ME,04240,5.5,,,, +US-ME-04241,US,ME,04241,5.5,,,, +US-ME-04243,US,ME,04243,5.5,,,, +US-ME-04250,US,ME,04250,5.5,,,, +US-ME-04252,US,ME,04252,5.5,,,, +US-ME-04253,US,ME,04253,5.5,,,, +US-ME-04254,US,ME,04254,5.5,,,, +US-ME-04255,US,ME,04255,5.5,,,, +US-ME-04256,US,ME,04256,5.5,,,, +US-ME-04257,US,ME,04257,5.5,,,, +US-ME-04258,US,ME,04258,5.5,,,, +US-ME-04259,US,ME,04259,5.5,,,, +US-ME-04260,US,ME,04260,5.5,,,, +US-ME-04261,US,ME,04261,5.5,,,, +US-ME-04262,US,ME,04262,5.5,,,, +US-ME-04263,US,ME,04263,5.5,,,, +US-ME-04265,US,ME,04265,5.5,,,, +US-ME-04266,US,ME,04266,5.5,,,, +US-ME-04267,US,ME,04267,5.5,,,, +US-ME-04268,US,ME,04268,5.5,,,, +US-ME-04270,US,ME,04270,5.5,,,, +US-ME-04271,US,ME,04271,5.5,,,, +US-ME-04274,US,ME,04274,5.5,,,, +US-ME-04275,US,ME,04275,5.5,,,, +US-ME-04276,US,ME,04276,5.5,,,, +US-ME-04280,US,ME,04280,5.5,,,, +US-ME-04281,US,ME,04281,5.5,,,, +US-ME-04282,US,ME,04282,5.5,,,, +US-ME-04284,US,ME,04284,5.5,,,, +US-ME-04285,US,ME,04285,5.5,,,, +US-ME-04286,US,ME,04286,5.5,,,, +US-ME-04287,US,ME,04287,5.5,,,, +US-ME-04288,US,ME,04288,5.5,,,, +US-ME-04289,US,ME,04289,5.5,,,, +US-ME-04290,US,ME,04290,5.5,,,, +US-ME-04291,US,ME,04291,5.5,,,, +US-ME-04292,US,ME,04292,5.5,,,, +US-ME-04294,US,ME,04294,5.5,,,, +US-ME-04330,US,ME,04330,5.5,,,, +US-ME-04332,US,ME,04332,5.5,,,, +US-ME-04333,US,ME,04333,5.5,,,, +US-ME-04336,US,ME,04336,5.5,,,, +US-ME-04338,US,ME,04338,5.5,,,, +US-ME-04341,US,ME,04341,5.5,,,, +US-ME-04342,US,ME,04342,5.5,,,, +US-ME-04343,US,ME,04343,5.5,,,, +US-ME-04344,US,ME,04344,5.5,,,, +US-ME-04345,US,ME,04345,5.5,,,, +US-ME-04346,US,ME,04346,5.5,,,, +US-ME-04347,US,ME,04347,5.5,,,, +US-ME-04348,US,ME,04348,5.5,,,, +US-ME-04349,US,ME,04349,5.5,,,, +US-ME-04350,US,ME,04350,5.5,,,, +US-ME-04351,US,ME,04351,5.5,,,, +US-ME-04352,US,ME,04352,5.5,,,, +US-ME-04353,US,ME,04353,5.5,,,, +US-ME-04354,US,ME,04354,5.5,,,, +US-ME-04355,US,ME,04355,5.5,,,, +US-ME-04357,US,ME,04357,5.5,,,, +US-ME-04358,US,ME,04358,5.5,,,, +US-ME-04359,US,ME,04359,5.5,,,, +US-ME-04360,US,ME,04360,5.5,,,, +US-ME-04363,US,ME,04363,5.5,,,, +US-ME-04364,US,ME,04364,5.5,,,, +US-ME-04401,US,ME,04401,5.5,,,, +US-ME-04402,US,ME,04402,5.5,,,, +US-ME-04406,US,ME,04406,5.5,,,, +US-ME-04408,US,ME,04408,5.5,,,, +US-ME-04410,US,ME,04410,5.5,,,, +US-ME-04411,US,ME,04411,5.5,,,, +US-ME-04412,US,ME,04412,5.5,,,, +US-ME-04413,US,ME,04413,5.5,,,, +US-ME-04414,US,ME,04414,5.5,,,, +US-ME-04415,US,ME,04415,5.5,,,, +US-ME-04416,US,ME,04416,5.5,,,, +US-ME-04417,US,ME,04417,5.5,,,, +US-ME-04418,US,ME,04418,5.5,,,, +US-ME-04419,US,ME,04419,5.5,,,, +US-ME-04420,US,ME,04420,5.5,,,, +US-ME-04421,US,ME,04421,5.5,,,, +US-ME-04422,US,ME,04422,5.5,,,, +US-ME-04424,US,ME,04424,5.5,,,, +US-ME-04426,US,ME,04426,5.5,,,, +US-ME-04427,US,ME,04427,5.5,,,, +US-ME-04428,US,ME,04428,5.5,,,, +US-ME-04429,US,ME,04429,5.5,,,, +US-ME-04430,US,ME,04430,5.5,,,, +US-ME-04431,US,ME,04431,5.5,,,, +US-ME-04434,US,ME,04434,5.5,,,, +US-ME-04435,US,ME,04435,5.5,,,, +US-ME-04438,US,ME,04438,5.5,,,, +US-ME-04441,US,ME,04441,5.5,,,, +US-ME-04442,US,ME,04442,5.5,,,, +US-ME-04443,US,ME,04443,5.5,,,, +US-ME-04444,US,ME,04444,5.5,,,, +US-ME-04448,US,ME,04448,5.5,,,, +US-ME-04449,US,ME,04449,5.5,,,, +US-ME-04450,US,ME,04450,5.5,,,, +US-ME-04451,US,ME,04451,5.5,,,, +US-ME-04453,US,ME,04453,5.5,,,, +US-ME-04454,US,ME,04454,5.5,,,, +US-ME-04455,US,ME,04455,5.5,,,, +US-ME-04456,US,ME,04456,5.5,,,, +US-ME-04457,US,ME,04457,5.5,,,, +US-ME-04459,US,ME,04459,5.5,,,, +US-ME-04460,US,ME,04460,5.5,,,, +US-ME-04461,US,ME,04461,5.5,,,, +US-ME-04462,US,ME,04462,5.5,,,, +US-ME-04463,US,ME,04463,5.5,,,, +US-ME-04464,US,ME,04464,5.5,,,, +US-ME-04468,US,ME,04468,5.5,,,, +US-ME-04469,US,ME,04469,5.5,,,, +US-ME-04471,US,ME,04471,5.5,,,, +US-ME-04472,US,ME,04472,5.5,,,, +US-ME-04473,US,ME,04473,5.5,,,, +US-ME-04474,US,ME,04474,5.5,,,, +US-ME-04475,US,ME,04475,5.5,,,, +US-ME-04476,US,ME,04476,5.5,,,, +US-ME-04478,US,ME,04478,5.5,,,, +US-ME-04479,US,ME,04479,5.5,,,, +US-ME-04481,US,ME,04481,5.5,,,, +US-ME-04485,US,ME,04485,5.5,,,, +US-ME-04487,US,ME,04487,5.5,,,, +US-ME-04488,US,ME,04488,5.5,,,, +US-ME-04489,US,ME,04489,5.5,,,, +US-ME-04490,US,ME,04490,5.5,,,, +US-ME-04491,US,ME,04491,5.5,,,, +US-ME-04492,US,ME,04492,5.5,,,, +US-ME-04493,US,ME,04493,5.5,,,, +US-ME-04495,US,ME,04495,5.5,,,, +US-ME-04496,US,ME,04496,5.5,,,, +US-ME-04497,US,ME,04497,5.5,,,, +US-ME-04530,US,ME,04530,5.5,,,, +US-ME-04535,US,ME,04535,5.5,,,, +US-ME-04537,US,ME,04537,5.5,,,, +US-ME-04538,US,ME,04538,5.5,,,, +US-ME-04539,US,ME,04539,5.5,,,, +US-ME-04541,US,ME,04541,5.5,,,, +US-ME-04543,US,ME,04543,5.5,,,, +US-ME-04544,US,ME,04544,5.5,,,, +US-ME-04547,US,ME,04547,5.5,,,, +US-ME-04548,US,ME,04548,5.5,,,, +US-ME-04549,US,ME,04549,5.5,,,, +US-ME-04551,US,ME,04551,5.5,,,, +US-ME-04553,US,ME,04553,5.5,,,, +US-ME-04554,US,ME,04554,5.5,,,, +US-ME-04555,US,ME,04555,5.5,,,, +US-ME-04556,US,ME,04556,5.5,,,, +US-ME-04558,US,ME,04558,5.5,,,, +US-ME-04562,US,ME,04562,5.5,,,, +US-ME-04563,US,ME,04563,5.5,,,, +US-ME-04564,US,ME,04564,5.5,,,, +US-ME-04565,US,ME,04565,5.5,,,, +US-ME-04568,US,ME,04568,5.5,,,, +US-ME-04570,US,ME,04570,5.5,,,, +US-ME-04571,US,ME,04571,5.5,,,, +US-ME-04572,US,ME,04572,5.5,,,, +US-ME-04573,US,ME,04573,5.5,,,, +US-ME-04574,US,ME,04574,5.5,,,, +US-ME-04575,US,ME,04575,5.5,,,, +US-ME-04576,US,ME,04576,5.5,,,, +US-ME-04578,US,ME,04578,5.5,,,, +US-ME-04579,US,ME,04579,5.5,,,, +US-ME-04605,US,ME,04605,5.5,,,, +US-ME-04606,US,ME,04606,5.5,,,, +US-ME-04607,US,ME,04607,5.5,,,, +US-ME-04609,US,ME,04609,5.5,,,, +US-ME-04611,US,ME,04611,5.5,,,, +US-ME-04612,US,ME,04612,5.5,,,, +US-ME-04613,US,ME,04613,5.5,,,, +US-ME-04614,US,ME,04614,5.5,,,, +US-ME-04616,US,ME,04616,5.5,,,, +US-ME-04617,US,ME,04617,5.5,,,, +US-ME-04619,US,ME,04619,5.5,,,, +US-ME-04622,US,ME,04622,5.5,,,, +US-ME-04623,US,ME,04623,5.5,,,, +US-ME-04624,US,ME,04624,5.5,,,, +US-ME-04625,US,ME,04625,5.5,,,, +US-ME-04626,US,ME,04626,5.5,,,, +US-ME-04627,US,ME,04627,5.5,,,, +US-ME-04628,US,ME,04628,5.5,,,, +US-ME-04629,US,ME,04629,5.5,,,, +US-ME-04630,US,ME,04630,5.5,,,, +US-ME-04631,US,ME,04631,5.5,,,, +US-ME-04634,US,ME,04634,5.5,,,, +US-ME-04635,US,ME,04635,5.5,,,, +US-ME-04637,US,ME,04637,5.5,,,, +US-ME-04640,US,ME,04640,5.5,,,, +US-ME-04642,US,ME,04642,5.5,,,, +US-ME-04643,US,ME,04643,5.5,,,, +US-ME-04644,US,ME,04644,5.5,,,, +US-ME-04645,US,ME,04645,5.5,,,, +US-ME-04646,US,ME,04646,5.5,,,, +US-ME-04648,US,ME,04648,5.5,,,, +US-ME-04649,US,ME,04649,5.5,,,, +US-ME-04650,US,ME,04650,5.5,,,, +US-ME-04652,US,ME,04652,5.5,,,, +US-ME-04653,US,ME,04653,5.5,,,, +US-ME-04654,US,ME,04654,5.5,,,, +US-ME-04655,US,ME,04655,5.5,,,, +US-ME-04657,US,ME,04657,5.5,,,, +US-ME-04658,US,ME,04658,5.5,,,, +US-ME-04660,US,ME,04660,5.5,,,, +US-ME-04662,US,ME,04662,5.5,,,, +US-ME-04664,US,ME,04664,5.5,,,, +US-ME-04666,US,ME,04666,5.5,,,, +US-ME-04667,US,ME,04667,5.5,,,, +US-ME-04668,US,ME,04668,5.5,,,, +US-ME-04669,US,ME,04669,5.5,,,, +US-ME-04671,US,ME,04671,5.5,,,, +US-ME-04672,US,ME,04672,5.5,,,, +US-ME-04673,US,ME,04673,5.5,,,, +US-ME-04674,US,ME,04674,5.5,,,, +US-ME-04675,US,ME,04675,5.5,,,, +US-ME-04676,US,ME,04676,5.5,,,, +US-ME-04677,US,ME,04677,5.5,,,, +US-ME-04679,US,ME,04679,5.5,,,, +US-ME-04680,US,ME,04680,5.5,,,, +US-ME-04681,US,ME,04681,5.5,,,, +US-ME-04683,US,ME,04683,5.5,,,, +US-ME-04684,US,ME,04684,5.5,,,, +US-ME-04685,US,ME,04685,5.5,,,, +US-ME-04686,US,ME,04686,5.5,,,, +US-ME-04691,US,ME,04691,5.5,,,, +US-ME-04693,US,ME,04693,5.5,,,, +US-ME-04694,US,ME,04694,5.5,,,, +US-ME-04730,US,ME,04730,5.5,,,, +US-ME-04732,US,ME,04732,5.5,,,, +US-ME-04733,US,ME,04733,5.5,,,, +US-ME-04734,US,ME,04734,5.5,,,, +US-ME-04735,US,ME,04735,5.5,,,, +US-ME-04736,US,ME,04736,5.5,,,, +US-ME-04737,US,ME,04737,5.5,,,, +US-ME-04738,US,ME,04738,5.5,,,, +US-ME-04739,US,ME,04739,5.5,,,, +US-ME-04740,US,ME,04740,5.5,,,, +US-ME-04741,US,ME,04741,5.5,,,, +US-ME-04742,US,ME,04742,5.5,,,, +US-ME-04743,US,ME,04743,5.5,,,, +US-ME-04744,US,ME,04744,5.5,,,, +US-ME-04745,US,ME,04745,5.5,,,, +US-ME-04746,US,ME,04746,5.5,,,, +US-ME-04747,US,ME,04747,5.5,,,, +US-ME-04750,US,ME,04750,5.5,,,, +US-ME-04751,US,ME,04751,5.5,,,, +US-ME-04756,US,ME,04756,5.5,,,, +US-ME-04757,US,ME,04757,5.5,,,, +US-ME-04758,US,ME,04758,5.5,,,, +US-ME-04760,US,ME,04760,5.5,,,, +US-ME-04761,US,ME,04761,5.5,,,, +US-ME-04762,US,ME,04762,5.5,,,, +US-ME-04763,US,ME,04763,5.5,,,, +US-ME-04764,US,ME,04764,5.5,,,, +US-ME-04765,US,ME,04765,5.5,,,, +US-ME-04766,US,ME,04766,5.5,,,, +US-ME-04768,US,ME,04768,5.5,,,, +US-ME-04769,US,ME,04769,5.5,,,, +US-ME-04772,US,ME,04772,5.5,,,, +US-ME-04773,US,ME,04773,5.5,,,, +US-ME-04774,US,ME,04774,5.5,,,, +US-ME-04775,US,ME,04775,5.5,,,, +US-ME-04776,US,ME,04776,5.5,,,, +US-ME-04777,US,ME,04777,5.5,,,, +US-ME-04779,US,ME,04779,5.5,,,, +US-ME-04780,US,ME,04780,5.5,,,, +US-ME-04781,US,ME,04781,5.5,,,, +US-ME-04783,US,ME,04783,5.5,,,, +US-ME-04785,US,ME,04785,5.5,,,, +US-ME-04786,US,ME,04786,5.5,,,, +US-ME-04787,US,ME,04787,5.5,,,, +US-ME-04841,US,ME,04841,5.5,,,, +US-ME-04843,US,ME,04843,5.5,,,, +US-ME-04846,US,ME,04846,5.5,,,, +US-ME-04847,US,ME,04847,5.5,,,, +US-ME-04848,US,ME,04848,5.5,,,, +US-ME-04849,US,ME,04849,5.5,,,, +US-ME-04850,US,ME,04850,5.5,,,, +US-ME-04851,US,ME,04851,5.5,,,, +US-ME-04852,US,ME,04852,5.5,,,, +US-ME-04853,US,ME,04853,5.5,,,, +US-ME-04854,US,ME,04854,5.5,,,, +US-ME-04855,US,ME,04855,5.5,,,, +US-ME-04856,US,ME,04856,5.5,,,, +US-ME-04858,US,ME,04858,5.5,,,, +US-ME-04859,US,ME,04859,5.5,,,, +US-ME-04860,US,ME,04860,5.5,,,, +US-ME-04861,US,ME,04861,5.5,,,, +US-ME-04862,US,ME,04862,5.5,,,, +US-ME-04863,US,ME,04863,5.5,,,, +US-ME-04864,US,ME,04864,5.5,,,, +US-ME-04865,US,ME,04865,5.5,,,, +US-ME-04901,US,ME,04901,5.5,,,, +US-ME-04903,US,ME,04903,5.5,,,, +US-ME-04910,US,ME,04910,5.5,,,, +US-ME-04911,US,ME,04911,5.5,,,, +US-ME-04912,US,ME,04912,5.5,,,, +US-ME-04915,US,ME,04915,5.5,,,, +US-ME-04917,US,ME,04917,5.5,,,, +US-ME-04918,US,ME,04918,5.5,,,, +US-ME-04920,US,ME,04920,5.5,,,, +US-ME-04921,US,ME,04921,5.5,,,, +US-ME-04922,US,ME,04922,5.5,,,, +US-ME-04923,US,ME,04923,5.5,,,, +US-ME-04924,US,ME,04924,5.5,,,, +US-ME-04925,US,ME,04925,5.5,,,, +US-ME-04926,US,ME,04926,5.5,,,, +US-ME-04927,US,ME,04927,5.5,,,, +US-ME-04928,US,ME,04928,5.5,,,, +US-ME-04929,US,ME,04929,5.5,,,, +US-ME-04930,US,ME,04930,5.5,,,, +US-ME-04932,US,ME,04932,5.5,,,, +US-ME-04933,US,ME,04933,5.5,,,, +US-ME-04935,US,ME,04935,5.5,,,, +US-ME-04936,US,ME,04936,5.5,,,, +US-ME-04937,US,ME,04937,5.5,,,, +US-ME-04938,US,ME,04938,5.5,,,, +US-ME-04939,US,ME,04939,5.5,,,, +US-ME-04940,US,ME,04940,5.5,,,, +US-ME-04941,US,ME,04941,5.5,,,, +US-ME-04942,US,ME,04942,5.5,,,, +US-ME-04943,US,ME,04943,5.5,,,, +US-ME-04944,US,ME,04944,5.5,,,, +US-ME-04945,US,ME,04945,5.5,,,, +US-ME-04947,US,ME,04947,5.5,,,, +US-ME-04949,US,ME,04949,5.5,,,, +US-ME-04950,US,ME,04950,5.5,,,, +US-ME-04951,US,ME,04951,5.5,,,, +US-ME-04952,US,ME,04952,5.5,,,, +US-ME-04953,US,ME,04953,5.5,,,, +US-ME-04954,US,ME,04954,5.5,,,, +US-ME-04955,US,ME,04955,5.5,,,, +US-ME-04956,US,ME,04956,5.5,,,, +US-ME-04957,US,ME,04957,5.5,,,, +US-ME-04958,US,ME,04958,5.5,,,, +US-ME-04961,US,ME,04961,5.5,,,, +US-ME-04962,US,ME,04962,5.5,,,, +US-ME-04963,US,ME,04963,5.5,,,, +US-ME-04964,US,ME,04964,5.5,,,, +US-ME-04965,US,ME,04965,5.5,,,, +US-ME-04966,US,ME,04966,5.5,,,, +US-ME-04967,US,ME,04967,5.5,,,, +US-ME-04969,US,ME,04969,5.5,,,, +US-ME-04970,US,ME,04970,5.5,,,, +US-ME-04971,US,ME,04971,5.5,,,, +US-ME-04972,US,ME,04972,5.5,,,, +US-ME-04973,US,ME,04973,5.5,,,, +US-ME-04974,US,ME,04974,5.5,,,, +US-ME-04975,US,ME,04975,5.5,,,, +US-ME-04976,US,ME,04976,5.5,,,, +US-ME-04978,US,ME,04978,5.5,,,, +US-ME-04979,US,ME,04979,5.5,,,, +US-ME-04981,US,ME,04981,5.5,,,, +US-ME-04982,US,ME,04982,5.5,,,, +US-ME-04983,US,ME,04983,5.5,,,, +US-ME-04984,US,ME,04984,5.5,,,, +US-ME-04985,US,ME,04985,5.5,,,, +US-ME-04986,US,ME,04986,5.5,,,, +US-ME-04987,US,ME,04987,5.5,,,, +US-ME-04988,US,ME,04988,5.5,,,, +US-ME-04989,US,ME,04989,5.5,,,, +US-ME-04992,US,ME,04992,5.5,,,, +US-MI-48001,US,MI,48001,6,,,, +US-MI-48002,US,MI,48002,6,,,, +US-MI-48003,US,MI,48003,6,,,, +US-MI-48004,US,MI,48004,6,,,, +US-MI-48005,US,MI,48005,6,,,, +US-MI-48006,US,MI,48006,6,,,, +US-MI-48007,US,MI,48007,6,,,, +US-MI-48009,US,MI,48009,6,,,, +US-MI-48012,US,MI,48012,6,,,, +US-MI-48014,US,MI,48014,6,,,, +US-MI-48015,US,MI,48015,6,,,, +US-MI-48017,US,MI,48017,6,,,, +US-MI-48021,US,MI,48021,6,,,, +US-MI-48022,US,MI,48022,6,,,, +US-MI-48023,US,MI,48023,6,,,, +US-MI-48025,US,MI,48025,6,,,, +US-MI-48026,US,MI,48026,6,,,, +US-MI-48027,US,MI,48027,6,,,, +US-MI-48028,US,MI,48028,6,,,, +US-MI-48030,US,MI,48030,6,,,, +US-MI-48032,US,MI,48032,6,,,, +US-MI-48033,US,MI,48033,6,,,, +US-MI-48034,US,MI,48034,6,,,, +US-MI-48035,US,MI,48035,6,,,, +US-MI-48036,US,MI,48036,6,,,, +US-MI-48037,US,MI,48037,6,,,, +US-MI-48038,US,MI,48038,6,,,, +US-MI-48039,US,MI,48039,6,,,, +US-MI-48040,US,MI,48040,6,,,, +US-MI-48041,US,MI,48041,6,,,, +US-MI-48042,US,MI,48042,6,,,, +US-MI-48043,US,MI,48043,6,,,, +US-MI-48044,US,MI,48044,6,,,, +US-MI-48045,US,MI,48045,6,,,, +US-MI-48046,US,MI,48046,6,,,, +US-MI-48047,US,MI,48047,6,,,, +US-MI-48048,US,MI,48048,6,,,, +US-MI-48049,US,MI,48049,6,,,, +US-MI-48050,US,MI,48050,6,,,, +US-MI-48051,US,MI,48051,6,,,, +US-MI-48054,US,MI,48054,6,,,, +US-MI-48059,US,MI,48059,6,,,, +US-MI-48060,US,MI,48060,6,,,, +US-MI-48061,US,MI,48061,6,,,, +US-MI-48062,US,MI,48062,6,,,, +US-MI-48063,US,MI,48063,6,,,, +US-MI-48064,US,MI,48064,6,,,, +US-MI-48065,US,MI,48065,6,,,, +US-MI-48066,US,MI,48066,6,,,, +US-MI-48067,US,MI,48067,6,,,, +US-MI-48068,US,MI,48068,6,,,, +US-MI-48069,US,MI,48069,6,,,, +US-MI-48070,US,MI,48070,6,,,, +US-MI-48071,US,MI,48071,6,,,, +US-MI-48072,US,MI,48072,6,,,, +US-MI-48073,US,MI,48073,6,,,, +US-MI-48074,US,MI,48074,6,,,, +US-MI-48075,US,MI,48075,6,,,, +US-MI-48076,US,MI,48076,6,,,, +US-MI-48079,US,MI,48079,6,,,, +US-MI-48080,US,MI,48080,6,,,, +US-MI-48081,US,MI,48081,6,,,, +US-MI-48082,US,MI,48082,6,,,, +US-MI-48083,US,MI,48083,6,,,, +US-MI-48084,US,MI,48084,6,,,, +US-MI-48085,US,MI,48085,6,,,, +US-MI-48086,US,MI,48086,6,,,, +US-MI-48088,US,MI,48088,6,,,, +US-MI-48089,US,MI,48089,6,,,, +US-MI-48090,US,MI,48090,6,,,, +US-MI-48091,US,MI,48091,6,,,, +US-MI-48092,US,MI,48092,6,,,, +US-MI-48093,US,MI,48093,6,,,, +US-MI-48094,US,MI,48094,6,,,, +US-MI-48095,US,MI,48095,6,,,, +US-MI-48096,US,MI,48096,6,,,, +US-MI-48097,US,MI,48097,6,,,, +US-MI-48098,US,MI,48098,6,,,, +US-MI-48099,US,MI,48099,6,,,, +US-MI-48101,US,MI,48101,6,,,, +US-MI-48103,US,MI,48103,6,,,, +US-MI-48104,US,MI,48104,6,,,, +US-MI-48105,US,MI,48105,6,,,, +US-MI-48106,US,MI,48106,6,,,, +US-MI-48107,US,MI,48107,6,,,, +US-MI-48108,US,MI,48108,6,,,, +US-MI-48109,US,MI,48109,6,,,, +US-MI-48110,US,MI,48110,6,,,, +US-MI-48111,US,MI,48111,6,,,, +US-MI-48112,US,MI,48112,6,,,, +US-MI-48113,US,MI,48113,6,,,, +US-MI-48114,US,MI,48114,6,,,, +US-MI-48115,US,MI,48115,6,,,, +US-MI-48116,US,MI,48116,6,,,, +US-MI-48117,US,MI,48117,6,,,, +US-MI-48118,US,MI,48118,6,,,, +US-MI-48120,US,MI,48120,6,,,, +US-MI-48121,US,MI,48121,6,,,, +US-MI-48122,US,MI,48122,6,,,, +US-MI-48123,US,MI,48123,6,,,, +US-MI-48124,US,MI,48124,6,,,, +US-MI-48125,US,MI,48125,6,,,, +US-MI-48126,US,MI,48126,6,,,, +US-MI-48127,US,MI,48127,6,,,, +US-MI-48128,US,MI,48128,6,,,, +US-MI-48130,US,MI,48130,6,,,, +US-MI-48131,US,MI,48131,6,,,, +US-MI-48133,US,MI,48133,6,,,, +US-MI-48134,US,MI,48134,6,,,, +US-MI-48135,US,MI,48135,6,,,, +US-MI-48136,US,MI,48136,6,,,, +US-MI-48137,US,MI,48137,6,,,, +US-MI-48138,US,MI,48138,6,,,, +US-MI-48139,US,MI,48139,6,,,, +US-MI-48140,US,MI,48140,6,,,, +US-MI-48141,US,MI,48141,6,,,, +US-MI-48143,US,MI,48143,6,,,, +US-MI-48144,US,MI,48144,6,,,, +US-MI-48145,US,MI,48145,6,,,, +US-MI-48146,US,MI,48146,6,,,, +US-MI-48150,US,MI,48150,6,,,, +US-MI-48151,US,MI,48151,6,,,, +US-MI-48152,US,MI,48152,6,,,, +US-MI-48153,US,MI,48153,6,,,, +US-MI-48154,US,MI,48154,6,,,, +US-MI-48157,US,MI,48157,6,,,, +US-MI-48158,US,MI,48158,6,,,, +US-MI-48159,US,MI,48159,6,,,, +US-MI-48160,US,MI,48160,6,,,, +US-MI-48161,US,MI,48161,6,,,, +US-MI-48162,US,MI,48162,6,,,, +US-MI-48164,US,MI,48164,6,,,, +US-MI-48165,US,MI,48165,6,,,, +US-MI-48166,US,MI,48166,6,,,, +US-MI-48167,US,MI,48167,6,,,, +US-MI-48168,US,MI,48168,6,,,, +US-MI-48169,US,MI,48169,6,,,, +US-MI-48170,US,MI,48170,6,,,, +US-MI-48173,US,MI,48173,6,,,, +US-MI-48174,US,MI,48174,6,,,, +US-MI-48175,US,MI,48175,6,,,, +US-MI-48176,US,MI,48176,6,,,, +US-MI-48177,US,MI,48177,6,,,, +US-MI-48178,US,MI,48178,6,,,, +US-MI-48179,US,MI,48179,6,,,, +US-MI-48180,US,MI,48180,6,,,, +US-MI-48182,US,MI,48182,6,,,, +US-MI-48183,US,MI,48183,6,,,, +US-MI-48184,US,MI,48184,6,,,, +US-MI-48185,US,MI,48185,6,,,, +US-MI-48186,US,MI,48186,6,,,, +US-MI-48187,US,MI,48187,6,,,, +US-MI-48188,US,MI,48188,6,,,, +US-MI-48189,US,MI,48189,6,,,, +US-MI-48190,US,MI,48190,6,,,, +US-MI-48191,US,MI,48191,6,,,, +US-MI-48192,US,MI,48192,6,,,, +US-MI-48193,US,MI,48193,6,,,, +US-MI-48195,US,MI,48195,6,,,, +US-MI-48197,US,MI,48197,6,,,, +US-MI-48198,US,MI,48198,6,,,, +US-MI-48201,US,MI,48201,6,,,, +US-MI-48202,US,MI,48202,6,,,, +US-MI-48203,US,MI,48203,6,,,, +US-MI-48204,US,MI,48204,6,,,, +US-MI-48205,US,MI,48205,6,,,, +US-MI-48206,US,MI,48206,6,,,, +US-MI-48207,US,MI,48207,6,,,, +US-MI-48208,US,MI,48208,6,,,, +US-MI-48209,US,MI,48209,6,,,, +US-MI-48210,US,MI,48210,6,,,, +US-MI-48211,US,MI,48211,6,,,, +US-MI-48212,US,MI,48212,6,,,, +US-MI-48213,US,MI,48213,6,,,, +US-MI-48214,US,MI,48214,6,,,, +US-MI-48215,US,MI,48215,6,,,, +US-MI-48216,US,MI,48216,6,,,, +US-MI-48217,US,MI,48217,6,,,, +US-MI-48218,US,MI,48218,6,,,, +US-MI-48219,US,MI,48219,6,,,, +US-MI-48220,US,MI,48220,6,,,, +US-MI-48221,US,MI,48221,6,,,, +US-MI-48222,US,MI,48222,6,,,, +US-MI-48223,US,MI,48223,6,,,, +US-MI-48224,US,MI,48224,6,,,, +US-MI-48225,US,MI,48225,6,,,, +US-MI-48226,US,MI,48226,6,,,, +US-MI-48227,US,MI,48227,6,,,, +US-MI-48228,US,MI,48228,6,,,, +US-MI-48229,US,MI,48229,6,,,, +US-MI-48230,US,MI,48230,6,,,, +US-MI-48231,US,MI,48231,6,,,, +US-MI-48232,US,MI,48232,6,,,, +US-MI-48233,US,MI,48233,6,,,, +US-MI-48234,US,MI,48234,6,,,, +US-MI-48235,US,MI,48235,6,,,, +US-MI-48236,US,MI,48236,6,,,, +US-MI-48237,US,MI,48237,6,,,, +US-MI-48238,US,MI,48238,6,,,, +US-MI-48239,US,MI,48239,6,,,, +US-MI-48240,US,MI,48240,6,,,, +US-MI-48242,US,MI,48242,6,,,, +US-MI-48243,US,MI,48243,6,,,, +US-MI-48244,US,MI,48244,6,,,, +US-MI-48255,US,MI,48255,6,,,, +US-MI-48260,US,MI,48260,6,,,, +US-MI-48264,US,MI,48264,6,,,, +US-MI-48265,US,MI,48265,6,,,, +US-MI-48266,US,MI,48266,6,,,, +US-MI-48267,US,MI,48267,6,,,, +US-MI-48268,US,MI,48268,6,,,, +US-MI-48269,US,MI,48269,6,,,, +US-MI-48272,US,MI,48272,6,,,, +US-MI-48275,US,MI,48275,6,,,, +US-MI-48277,US,MI,48277,6,,,, +US-MI-48278,US,MI,48278,6,,,, +US-MI-48279,US,MI,48279,6,,,, +US-MI-48288,US,MI,48288,6,,,, +US-MI-48301,US,MI,48301,6,,,, +US-MI-48302,US,MI,48302,6,,,, +US-MI-48303,US,MI,48303,6,,,, +US-MI-48304,US,MI,48304,6,,,, +US-MI-48306,US,MI,48306,6,,,, +US-MI-48307,US,MI,48307,6,,,, +US-MI-48308,US,MI,48308,6,,,, +US-MI-48309,US,MI,48309,6,,,, +US-MI-48310,US,MI,48310,6,,,, +US-MI-48311,US,MI,48311,6,,,, +US-MI-48312,US,MI,48312,6,,,, +US-MI-48313,US,MI,48313,6,,,, +US-MI-48314,US,MI,48314,6,,,, +US-MI-48315,US,MI,48315,6,,,, +US-MI-48316,US,MI,48316,6,,,, +US-MI-48317,US,MI,48317,6,,,, +US-MI-48318,US,MI,48318,6,,,, +US-MI-48320,US,MI,48320,6,,,, +US-MI-48321,US,MI,48321,6,,,, +US-MI-48322,US,MI,48322,6,,,, +US-MI-48323,US,MI,48323,6,,,, +US-MI-48324,US,MI,48324,6,,,, +US-MI-48325,US,MI,48325,6,,,, +US-MI-48326,US,MI,48326,6,,,, +US-MI-48327,US,MI,48327,6,,,, +US-MI-48328,US,MI,48328,6,,,, +US-MI-48329,US,MI,48329,6,,,, +US-MI-48330,US,MI,48330,6,,,, +US-MI-48331,US,MI,48331,6,,,, +US-MI-48332,US,MI,48332,6,,,, +US-MI-48333,US,MI,48333,6,,,, +US-MI-48334,US,MI,48334,6,,,, +US-MI-48335,US,MI,48335,6,,,, +US-MI-48336,US,MI,48336,6,,,, +US-MI-48340,US,MI,48340,6,,,, +US-MI-48341,US,MI,48341,6,,,, +US-MI-48342,US,MI,48342,6,,,, +US-MI-48343,US,MI,48343,6,,,, +US-MI-48346,US,MI,48346,6,,,, +US-MI-48347,US,MI,48347,6,,,, +US-MI-48348,US,MI,48348,6,,,, +US-MI-48350,US,MI,48350,6,,,, +US-MI-48353,US,MI,48353,6,,,, +US-MI-48356,US,MI,48356,6,,,, +US-MI-48357,US,MI,48357,6,,,, +US-MI-48359,US,MI,48359,6,,,, +US-MI-48360,US,MI,48360,6,,,, +US-MI-48361,US,MI,48361,6,,,, +US-MI-48362,US,MI,48362,6,,,, +US-MI-48363,US,MI,48363,6,,,, +US-MI-48366,US,MI,48366,6,,,, +US-MI-48367,US,MI,48367,6,,,, +US-MI-48370,US,MI,48370,6,,,, +US-MI-48371,US,MI,48371,6,,,, +US-MI-48374,US,MI,48374,6,,,, +US-MI-48375,US,MI,48375,6,,,, +US-MI-48376,US,MI,48376,6,,,, +US-MI-48377,US,MI,48377,6,,,, +US-MI-48380,US,MI,48380,6,,,, +US-MI-48381,US,MI,48381,6,,,, +US-MI-48382,US,MI,48382,6,,,, +US-MI-48383,US,MI,48383,6,,,, +US-MI-48386,US,MI,48386,6,,,, +US-MI-48387,US,MI,48387,6,,,, +US-MI-48390,US,MI,48390,6,,,, +US-MI-48391,US,MI,48391,6,,,, +US-MI-48393,US,MI,48393,6,,,, +US-MI-48397,US,MI,48397,6,,,, +US-MI-48401,US,MI,48401,6,,,, +US-MI-48410,US,MI,48410,6,,,, +US-MI-48411,US,MI,48411,6,,,, +US-MI-48412,US,MI,48412,6,,,, +US-MI-48413,US,MI,48413,6,,,, +US-MI-48414,US,MI,48414,6,,,, +US-MI-48415,US,MI,48415,6,,,, +US-MI-48416,US,MI,48416,6,,,, +US-MI-48417,US,MI,48417,6,,,, +US-MI-48418,US,MI,48418,6,,,, +US-MI-48419,US,MI,48419,6,,,, +US-MI-48420,US,MI,48420,6,,,, +US-MI-48421,US,MI,48421,6,,,, +US-MI-48422,US,MI,48422,6,,,, +US-MI-48423,US,MI,48423,6,,,, +US-MI-48426,US,MI,48426,6,,,, +US-MI-48427,US,MI,48427,6,,,, +US-MI-48428,US,MI,48428,6,,,, +US-MI-48429,US,MI,48429,6,,,, +US-MI-48430,US,MI,48430,6,,,, +US-MI-48432,US,MI,48432,6,,,, +US-MI-48433,US,MI,48433,6,,,, +US-MI-48434,US,MI,48434,6,,,, +US-MI-48435,US,MI,48435,6,,,, +US-MI-48436,US,MI,48436,6,,,, +US-MI-48437,US,MI,48437,6,,,, +US-MI-48438,US,MI,48438,6,,,, +US-MI-48439,US,MI,48439,6,,,, +US-MI-48440,US,MI,48440,6,,,, +US-MI-48441,US,MI,48441,6,,,, +US-MI-48442,US,MI,48442,6,,,, +US-MI-48444,US,MI,48444,6,,,, +US-MI-48445,US,MI,48445,6,,,, +US-MI-48446,US,MI,48446,6,,,, +US-MI-48449,US,MI,48449,6,,,, +US-MI-48450,US,MI,48450,6,,,, +US-MI-48451,US,MI,48451,6,,,, +US-MI-48453,US,MI,48453,6,,,, +US-MI-48454,US,MI,48454,6,,,, +US-MI-48455,US,MI,48455,6,,,, +US-MI-48456,US,MI,48456,6,,,, +US-MI-48457,US,MI,48457,6,,,, +US-MI-48458,US,MI,48458,6,,,, +US-MI-48460,US,MI,48460,6,,,, +US-MI-48461,US,MI,48461,6,,,, +US-MI-48462,US,MI,48462,6,,,, +US-MI-48463,US,MI,48463,6,,,, +US-MI-48464,US,MI,48464,6,,,, +US-MI-48465,US,MI,48465,6,,,, +US-MI-48466,US,MI,48466,6,,,, +US-MI-48467,US,MI,48467,6,,,, +US-MI-48468,US,MI,48468,6,,,, +US-MI-48469,US,MI,48469,6,,,, +US-MI-48470,US,MI,48470,6,,,, +US-MI-48471,US,MI,48471,6,,,, +US-MI-48472,US,MI,48472,6,,,, +US-MI-48473,US,MI,48473,6,,,, +US-MI-48475,US,MI,48475,6,,,, +US-MI-48476,US,MI,48476,6,,,, +US-MI-48480,US,MI,48480,6,,,, +US-MI-48501,US,MI,48501,6,,,, +US-MI-48502,US,MI,48502,6,,,, +US-MI-48503,US,MI,48503,6,,,, +US-MI-48504,US,MI,48504,6,,,, +US-MI-48505,US,MI,48505,6,,,, +US-MI-48506,US,MI,48506,6,,,, +US-MI-48507,US,MI,48507,6,,,, +US-MI-48509,US,MI,48509,6,,,, +US-MI-48519,US,MI,48519,6,,,, +US-MI-48529,US,MI,48529,6,,,, +US-MI-48531,US,MI,48531,6,,,, +US-MI-48532,US,MI,48532,6,,,, +US-MI-48550,US,MI,48550,6,,,, +US-MI-48551,US,MI,48551,6,,,, +US-MI-48552,US,MI,48552,6,,,, +US-MI-48553,US,MI,48553,6,,,, +US-MI-48554,US,MI,48554,6,,,, +US-MI-48555,US,MI,48555,6,,,, +US-MI-48556,US,MI,48556,6,,,, +US-MI-48557,US,MI,48557,6,,,, +US-MI-48601,US,MI,48601,6,,,, +US-MI-48602,US,MI,48602,6,,,, +US-MI-48603,US,MI,48603,6,,,, +US-MI-48604,US,MI,48604,6,,,, +US-MI-48605,US,MI,48605,6,,,, +US-MI-48606,US,MI,48606,6,,,, +US-MI-48607,US,MI,48607,6,,,, +US-MI-48608,US,MI,48608,6,,,, +US-MI-48609,US,MI,48609,6,,,, +US-MI-48610,US,MI,48610,6,,,, +US-MI-48611,US,MI,48611,6,,,, +US-MI-48612,US,MI,48612,6,,,, +US-MI-48613,US,MI,48613,6,,,, +US-MI-48614,US,MI,48614,6,,,, +US-MI-48615,US,MI,48615,6,,,, +US-MI-48616,US,MI,48616,6,,,, +US-MI-48617,US,MI,48617,6,,,, +US-MI-48618,US,MI,48618,6,,,, +US-MI-48619,US,MI,48619,6,,,, +US-MI-48620,US,MI,48620,6,,,, +US-MI-48621,US,MI,48621,6,,,, +US-MI-48622,US,MI,48622,6,,,, +US-MI-48623,US,MI,48623,6,,,, +US-MI-48624,US,MI,48624,6,,,, +US-MI-48625,US,MI,48625,6,,,, +US-MI-48626,US,MI,48626,6,,,, +US-MI-48627,US,MI,48627,6,,,, +US-MI-48628,US,MI,48628,6,,,, +US-MI-48629,US,MI,48629,6,,,, +US-MI-48630,US,MI,48630,6,,,, +US-MI-48631,US,MI,48631,6,,,, +US-MI-48632,US,MI,48632,6,,,, +US-MI-48633,US,MI,48633,6,,,, +US-MI-48634,US,MI,48634,6,,,, +US-MI-48635,US,MI,48635,6,,,, +US-MI-48636,US,MI,48636,6,,,, +US-MI-48637,US,MI,48637,6,,,, +US-MI-48638,US,MI,48638,6,,,, +US-MI-48640,US,MI,48640,6,,,, +US-MI-48641,US,MI,48641,6,,,, +US-MI-48642,US,MI,48642,6,,,, +US-MI-48647,US,MI,48647,6,,,, +US-MI-48649,US,MI,48649,6,,,, +US-MI-48650,US,MI,48650,6,,,, +US-MI-48651,US,MI,48651,6,,,, +US-MI-48652,US,MI,48652,6,,,, +US-MI-48653,US,MI,48653,6,,,, +US-MI-48654,US,MI,48654,6,,,, +US-MI-48655,US,MI,48655,6,,,, +US-MI-48656,US,MI,48656,6,,,, +US-MI-48657,US,MI,48657,6,,,, +US-MI-48658,US,MI,48658,6,,,, +US-MI-48659,US,MI,48659,6,,,, +US-MI-48661,US,MI,48661,6,,,, +US-MI-48662,US,MI,48662,6,,,, +US-MI-48663,US,MI,48663,6,,,, +US-MI-48667,US,MI,48667,6,,,, +US-MI-48670,US,MI,48670,6,,,, +US-MI-48674,US,MI,48674,6,,,, +US-MI-48686,US,MI,48686,6,,,, +US-MI-48701,US,MI,48701,6,,,, +US-MI-48703,US,MI,48703,6,,,, +US-MI-48705,US,MI,48705,6,,,, +US-MI-48706,US,MI,48706,6,,,, +US-MI-48707,US,MI,48707,6,,,, +US-MI-48708,US,MI,48708,6,,,, +US-MI-48710,US,MI,48710,6,,,, +US-MI-48720,US,MI,48720,6,,,, +US-MI-48721,US,MI,48721,6,,,, +US-MI-48722,US,MI,48722,6,,,, +US-MI-48723,US,MI,48723,6,,,, +US-MI-48724,US,MI,48724,6,,,, +US-MI-48725,US,MI,48725,6,,,, +US-MI-48726,US,MI,48726,6,,,, +US-MI-48727,US,MI,48727,6,,,, +US-MI-48728,US,MI,48728,6,,,, +US-MI-48729,US,MI,48729,6,,,, +US-MI-48730,US,MI,48730,6,,,, +US-MI-48731,US,MI,48731,6,,,, +US-MI-48732,US,MI,48732,6,,,, +US-MI-48733,US,MI,48733,6,,,, +US-MI-48734,US,MI,48734,6,,,, +US-MI-48735,US,MI,48735,6,,,, +US-MI-48737,US,MI,48737,6,,,, +US-MI-48738,US,MI,48738,6,,,, +US-MI-48739,US,MI,48739,6,,,, +US-MI-48740,US,MI,48740,6,,,, +US-MI-48741,US,MI,48741,6,,,, +US-MI-48742,US,MI,48742,6,,,, +US-MI-48743,US,MI,48743,6,,,, +US-MI-48744,US,MI,48744,6,,,, +US-MI-48745,US,MI,48745,6,,,, +US-MI-48746,US,MI,48746,6,,,, +US-MI-48747,US,MI,48747,6,,,, +US-MI-48748,US,MI,48748,6,,,, +US-MI-48749,US,MI,48749,6,,,, +US-MI-48750,US,MI,48750,6,,,, +US-MI-48754,US,MI,48754,6,,,, +US-MI-48755,US,MI,48755,6,,,, +US-MI-48756,US,MI,48756,6,,,, +US-MI-48757,US,MI,48757,6,,,, +US-MI-48758,US,MI,48758,6,,,, +US-MI-48759,US,MI,48759,6,,,, +US-MI-48760,US,MI,48760,6,,,, +US-MI-48761,US,MI,48761,6,,,, +US-MI-48762,US,MI,48762,6,,,, +US-MI-48763,US,MI,48763,6,,,, +US-MI-48764,US,MI,48764,6,,,, +US-MI-48765,US,MI,48765,6,,,, +US-MI-48766,US,MI,48766,6,,,, +US-MI-48767,US,MI,48767,6,,,, +US-MI-48768,US,MI,48768,6,,,, +US-MI-48770,US,MI,48770,6,,,, +US-MI-48787,US,MI,48787,6,,,, +US-MI-48801,US,MI,48801,6,,,, +US-MI-48804,US,MI,48804,6,,,, +US-MI-48805,US,MI,48805,6,,,, +US-MI-48806,US,MI,48806,6,,,, +US-MI-48807,US,MI,48807,6,,,, +US-MI-48808,US,MI,48808,6,,,, +US-MI-48809,US,MI,48809,6,,,, +US-MI-48811,US,MI,48811,6,,,, +US-MI-48812,US,MI,48812,6,,,, +US-MI-48813,US,MI,48813,6,,,, +US-MI-48815,US,MI,48815,6,,,, +US-MI-48816,US,MI,48816,6,,,, +US-MI-48817,US,MI,48817,6,,,, +US-MI-48818,US,MI,48818,6,,,, +US-MI-48819,US,MI,48819,6,,,, +US-MI-48820,US,MI,48820,6,,,, +US-MI-48821,US,MI,48821,6,,,, +US-MI-48822,US,MI,48822,6,,,, +US-MI-48823,US,MI,48823,6,,,, +US-MI-48824,US,MI,48824,6,,,, +US-MI-48825,US,MI,48825,6,,,, +US-MI-48826,US,MI,48826,6,,,, +US-MI-48827,US,MI,48827,6,,,, +US-MI-48829,US,MI,48829,6,,,, +US-MI-48830,US,MI,48830,6,,,, +US-MI-48831,US,MI,48831,6,,,, +US-MI-48832,US,MI,48832,6,,,, +US-MI-48833,US,MI,48833,6,,,, +US-MI-48834,US,MI,48834,6,,,, +US-MI-48835,US,MI,48835,6,,,, +US-MI-48836,US,MI,48836,6,,,, +US-MI-48837,US,MI,48837,6,,,, +US-MI-48838,US,MI,48838,6,,,, +US-MI-48840,US,MI,48840,6,,,, +US-MI-48841,US,MI,48841,6,,,, +US-MI-48842,US,MI,48842,6,,,, +US-MI-48843,US,MI,48843,6,,,, +US-MI-48844,US,MI,48844,6,,,, +US-MI-48845,US,MI,48845,6,,,, +US-MI-48846,US,MI,48846,6,,,, +US-MI-48847,US,MI,48847,6,,,, +US-MI-48848,US,MI,48848,6,,,, +US-MI-48849,US,MI,48849,6,,,, +US-MI-48850,US,MI,48850,6,,,, +US-MI-48851,US,MI,48851,6,,,, +US-MI-48852,US,MI,48852,6,,,, +US-MI-48853,US,MI,48853,6,,,, +US-MI-48854,US,MI,48854,6,,,, +US-MI-48855,US,MI,48855,6,,,, +US-MI-48856,US,MI,48856,6,,,, +US-MI-48857,US,MI,48857,6,,,, +US-MI-48858,US,MI,48858,6,,,, +US-MI-48859,US,MI,48859,6,,,, +US-MI-48860,US,MI,48860,6,,,, +US-MI-48861,US,MI,48861,6,,,, +US-MI-48862,US,MI,48862,6,,,, +US-MI-48864,US,MI,48864,6,,,, +US-MI-48865,US,MI,48865,6,,,, +US-MI-48866,US,MI,48866,6,,,, +US-MI-48867,US,MI,48867,6,,,, +US-MI-48870,US,MI,48870,6,,,, +US-MI-48871,US,MI,48871,6,,,, +US-MI-48872,US,MI,48872,6,,,, +US-MI-48873,US,MI,48873,6,,,, +US-MI-48874,US,MI,48874,6,,,, +US-MI-48875,US,MI,48875,6,,,, +US-MI-48876,US,MI,48876,6,,,, +US-MI-48877,US,MI,48877,6,,,, +US-MI-48878,US,MI,48878,6,,,, +US-MI-48879,US,MI,48879,6,,,, +US-MI-48880,US,MI,48880,6,,,, +US-MI-48881,US,MI,48881,6,,,, +US-MI-48882,US,MI,48882,6,,,, +US-MI-48883,US,MI,48883,6,,,, +US-MI-48884,US,MI,48884,6,,,, +US-MI-48885,US,MI,48885,6,,,, +US-MI-48886,US,MI,48886,6,,,, +US-MI-48887,US,MI,48887,6,,,, +US-MI-48888,US,MI,48888,6,,,, +US-MI-48889,US,MI,48889,6,,,, +US-MI-48890,US,MI,48890,6,,,, +US-MI-48891,US,MI,48891,6,,,, +US-MI-48892,US,MI,48892,6,,,, +US-MI-48893,US,MI,48893,6,,,, +US-MI-48894,US,MI,48894,6,,,, +US-MI-48895,US,MI,48895,6,,,, +US-MI-48896,US,MI,48896,6,,,, +US-MI-48897,US,MI,48897,6,,,, +US-MI-48901,US,MI,48901,6,,,, +US-MI-48906,US,MI,48906,6,,,, +US-MI-48908,US,MI,48908,6,,,, +US-MI-48909,US,MI,48909,6,,,, +US-MI-48910,US,MI,48910,6,,,, +US-MI-48911,US,MI,48911,6,,,, +US-MI-48912,US,MI,48912,6,,,, +US-MI-48913,US,MI,48913,6,,,, +US-MI-48915,US,MI,48915,6,,,, +US-MI-48916,US,MI,48916,6,,,, +US-MI-48917,US,MI,48917,6,,,, +US-MI-48918,US,MI,48918,6,,,, +US-MI-48919,US,MI,48919,6,,,, +US-MI-48922,US,MI,48922,6,,,, +US-MI-48924,US,MI,48924,6,,,, +US-MI-48929,US,MI,48929,6,,,, +US-MI-48930,US,MI,48930,6,,,, +US-MI-48933,US,MI,48933,6,,,, +US-MI-48937,US,MI,48937,6,,,, +US-MI-48951,US,MI,48951,6,,,, +US-MI-48956,US,MI,48956,6,,,, +US-MI-48980,US,MI,48980,6,,,, +US-MI-49001,US,MI,49001,6,,,, +US-MI-49002,US,MI,49002,6,,,, +US-MI-49003,US,MI,49003,6,,,, +US-MI-49004,US,MI,49004,6,,,, +US-MI-49005,US,MI,49005,6,,,, +US-MI-49006,US,MI,49006,6,,,, +US-MI-49007,US,MI,49007,6,,,, +US-MI-49008,US,MI,49008,6,,,, +US-MI-49009,US,MI,49009,6,,,, +US-MI-49010,US,MI,49010,6,,,, +US-MI-49011,US,MI,49011,6,,,, +US-MI-49012,US,MI,49012,6,,,, +US-MI-49013,US,MI,49013,6,,,, +US-MI-49014,US,MI,49014,6,,,, +US-MI-49015,US,MI,49015,6,,,, +US-MI-49016,US,MI,49016,6,,,, +US-MI-49017,US,MI,49017,6,,,, +US-MI-49018,US,MI,49018,6,,,, +US-MI-49019,US,MI,49019,6,,,, +US-MI-49020,US,MI,49020,6,,,, +US-MI-49021,US,MI,49021,6,,,, +US-MI-49022,US,MI,49022,6,,,, +US-MI-49023,US,MI,49023,6,,,, +US-MI-49024,US,MI,49024,6,,,, +US-MI-49026,US,MI,49026,6,,,, +US-MI-49027,US,MI,49027,6,,,, +US-MI-49028,US,MI,49028,6,,,, +US-MI-49029,US,MI,49029,6,,,, +US-MI-49030,US,MI,49030,6,,,, +US-MI-49031,US,MI,49031,6,,,, +US-MI-49032,US,MI,49032,6,,,, +US-MI-49033,US,MI,49033,6,,,, +US-MI-49034,US,MI,49034,6,,,, +US-MI-49035,US,MI,49035,6,,,, +US-MI-49036,US,MI,49036,6,,,, +US-MI-49037,US,MI,49037,6,,,, +US-MI-49038,US,MI,49038,6,,,, +US-MI-49039,US,MI,49039,6,,,, +US-MI-49040,US,MI,49040,6,,,, +US-MI-49041,US,MI,49041,6,,,, +US-MI-49042,US,MI,49042,6,,,, +US-MI-49043,US,MI,49043,6,,,, +US-MI-49045,US,MI,49045,6,,,, +US-MI-49046,US,MI,49046,6,,,, +US-MI-49047,US,MI,49047,6,,,, +US-MI-49048,US,MI,49048,6,,,, +US-MI-49050,US,MI,49050,6,,,, +US-MI-49051,US,MI,49051,6,,,, +US-MI-49052,US,MI,49052,6,,,, +US-MI-49053,US,MI,49053,6,,,, +US-MI-49055,US,MI,49055,6,,,, +US-MI-49056,US,MI,49056,6,,,, +US-MI-49057,US,MI,49057,6,,,, +US-MI-49058,US,MI,49058,6,,,, +US-MI-49060,US,MI,49060,6,,,, +US-MI-49061,US,MI,49061,6,,,, +US-MI-49062,US,MI,49062,6,,,, +US-MI-49063,US,MI,49063,6,,,, +US-MI-49064,US,MI,49064,6,,,, +US-MI-49065,US,MI,49065,6,,,, +US-MI-49066,US,MI,49066,6,,,, +US-MI-49067,US,MI,49067,6,,,, +US-MI-49068,US,MI,49068,6,,,, +US-MI-49070,US,MI,49070,6,,,, +US-MI-49071,US,MI,49071,6,,,, +US-MI-49072,US,MI,49072,6,,,, +US-MI-49073,US,MI,49073,6,,,, +US-MI-49074,US,MI,49074,6,,,, +US-MI-49075,US,MI,49075,6,,,, +US-MI-49076,US,MI,49076,6,,,, +US-MI-49077,US,MI,49077,6,,,, +US-MI-49078,US,MI,49078,6,,,, +US-MI-49079,US,MI,49079,6,,,, +US-MI-49080,US,MI,49080,6,,,, +US-MI-49081,US,MI,49081,6,,,, +US-MI-49082,US,MI,49082,6,,,, +US-MI-49083,US,MI,49083,6,,,, +US-MI-49084,US,MI,49084,6,,,, +US-MI-49085,US,MI,49085,6,,,, +US-MI-49087,US,MI,49087,6,,,, +US-MI-49088,US,MI,49088,6,,,, +US-MI-49089,US,MI,49089,6,,,, +US-MI-49090,US,MI,49090,6,,,, +US-MI-49091,US,MI,49091,6,,,, +US-MI-49092,US,MI,49092,6,,,, +US-MI-49093,US,MI,49093,6,,,, +US-MI-49094,US,MI,49094,6,,,, +US-MI-49095,US,MI,49095,6,,,, +US-MI-49096,US,MI,49096,6,,,, +US-MI-49097,US,MI,49097,6,,,, +US-MI-49098,US,MI,49098,6,,,, +US-MI-49099,US,MI,49099,6,,,, +US-MI-49101,US,MI,49101,6,,,, +US-MI-49102,US,MI,49102,6,,,, +US-MI-49103,US,MI,49103,6,,,, +US-MI-49104,US,MI,49104,6,,,, +US-MI-49106,US,MI,49106,6,,,, +US-MI-49107,US,MI,49107,6,,,, +US-MI-49111,US,MI,49111,6,,,, +US-MI-49112,US,MI,49112,6,,,, +US-MI-49113,US,MI,49113,6,,,, +US-MI-49115,US,MI,49115,6,,,, +US-MI-49116,US,MI,49116,6,,,, +US-MI-49117,US,MI,49117,6,,,, +US-MI-49119,US,MI,49119,6,,,, +US-MI-49120,US,MI,49120,6,,,, +US-MI-49125,US,MI,49125,6,,,, +US-MI-49126,US,MI,49126,6,,,, +US-MI-49127,US,MI,49127,6,,,, +US-MI-49128,US,MI,49128,6,,,, +US-MI-49129,US,MI,49129,6,,,, +US-MI-49130,US,MI,49130,6,,,, +US-MI-49201,US,MI,49201,6,,,, +US-MI-49202,US,MI,49202,6,,,, +US-MI-49203,US,MI,49203,6,,,, +US-MI-49204,US,MI,49204,6,,,, +US-MI-49220,US,MI,49220,6,,,, +US-MI-49221,US,MI,49221,6,,,, +US-MI-49224,US,MI,49224,6,,,, +US-MI-49227,US,MI,49227,6,,,, +US-MI-49228,US,MI,49228,6,,,, +US-MI-49229,US,MI,49229,6,,,, +US-MI-49230,US,MI,49230,6,,,, +US-MI-49232,US,MI,49232,6,,,, +US-MI-49233,US,MI,49233,6,,,, +US-MI-49234,US,MI,49234,6,,,, +US-MI-49235,US,MI,49235,6,,,, +US-MI-49236,US,MI,49236,6,,,, +US-MI-49237,US,MI,49237,6,,,, +US-MI-49238,US,MI,49238,6,,,, +US-MI-49239,US,MI,49239,6,,,, +US-MI-49240,US,MI,49240,6,,,, +US-MI-49241,US,MI,49241,6,,,, +US-MI-49242,US,MI,49242,6,,,, +US-MI-49245,US,MI,49245,6,,,, +US-MI-49246,US,MI,49246,6,,,, +US-MI-49247,US,MI,49247,6,,,, +US-MI-49248,US,MI,49248,6,,,, +US-MI-49249,US,MI,49249,6,,,, +US-MI-49250,US,MI,49250,6,,,, +US-MI-49251,US,MI,49251,6,,,, +US-MI-49252,US,MI,49252,6,,,, +US-MI-49253,US,MI,49253,6,,,, +US-MI-49254,US,MI,49254,6,,,, +US-MI-49255,US,MI,49255,6,,,, +US-MI-49256,US,MI,49256,6,,,, +US-MI-49257,US,MI,49257,6,,,, +US-MI-49258,US,MI,49258,6,,,, +US-MI-49259,US,MI,49259,6,,,, +US-MI-49261,US,MI,49261,6,,,, +US-MI-49262,US,MI,49262,6,,,, +US-MI-49263,US,MI,49263,6,,,, +US-MI-49264,US,MI,49264,6,,,, +US-MI-49265,US,MI,49265,6,,,, +US-MI-49266,US,MI,49266,6,,,, +US-MI-49267,US,MI,49267,6,,,, +US-MI-49268,US,MI,49268,6,,,, +US-MI-49269,US,MI,49269,6,,,, +US-MI-49270,US,MI,49270,6,,,, +US-MI-49271,US,MI,49271,6,,,, +US-MI-49272,US,MI,49272,6,,,, +US-MI-49274,US,MI,49274,6,,,, +US-MI-49276,US,MI,49276,6,,,, +US-MI-49277,US,MI,49277,6,,,, +US-MI-49279,US,MI,49279,6,,,, +US-MI-49281,US,MI,49281,6,,,, +US-MI-49282,US,MI,49282,6,,,, +US-MI-49283,US,MI,49283,6,,,, +US-MI-49284,US,MI,49284,6,,,, +US-MI-49285,US,MI,49285,6,,,, +US-MI-49286,US,MI,49286,6,,,, +US-MI-49287,US,MI,49287,6,,,, +US-MI-49288,US,MI,49288,6,,,, +US-MI-49289,US,MI,49289,6,,,, +US-MI-49301,US,MI,49301,6,,,, +US-MI-49302,US,MI,49302,6,,,, +US-MI-49303,US,MI,49303,6,,,, +US-MI-49304,US,MI,49304,6,,,, +US-MI-49305,US,MI,49305,6,,,, +US-MI-49306,US,MI,49306,6,,,, +US-MI-49307,US,MI,49307,6,,,, +US-MI-49309,US,MI,49309,6,,,, +US-MI-49310,US,MI,49310,6,,,, +US-MI-49311,US,MI,49311,6,,,, +US-MI-49312,US,MI,49312,6,,,, +US-MI-49314,US,MI,49314,6,,,, +US-MI-49315,US,MI,49315,6,,,, +US-MI-49316,US,MI,49316,6,,,, +US-MI-49317,US,MI,49317,6,,,, +US-MI-49318,US,MI,49318,6,,,, +US-MI-49319,US,MI,49319,6,,,, +US-MI-49320,US,MI,49320,6,,,, +US-MI-49321,US,MI,49321,6,,,, +US-MI-49322,US,MI,49322,6,,,, +US-MI-49323,US,MI,49323,6,,,, +US-MI-49325,US,MI,49325,6,,,, +US-MI-49326,US,MI,49326,6,,,, +US-MI-49327,US,MI,49327,6,,,, +US-MI-49328,US,MI,49328,6,,,, +US-MI-49329,US,MI,49329,6,,,, +US-MI-49330,US,MI,49330,6,,,, +US-MI-49331,US,MI,49331,6,,,, +US-MI-49332,US,MI,49332,6,,,, +US-MI-49333,US,MI,49333,6,,,, +US-MI-49335,US,MI,49335,6,,,, +US-MI-49336,US,MI,49336,6,,,, +US-MI-49337,US,MI,49337,6,,,, +US-MI-49338,US,MI,49338,6,,,, +US-MI-49339,US,MI,49339,6,,,, +US-MI-49340,US,MI,49340,6,,,, +US-MI-49341,US,MI,49341,6,,,, +US-MI-49342,US,MI,49342,6,,,, +US-MI-49343,US,MI,49343,6,,,, +US-MI-49344,US,MI,49344,6,,,, +US-MI-49345,US,MI,49345,6,,,, +US-MI-49346,US,MI,49346,6,,,, +US-MI-49347,US,MI,49347,6,,,, +US-MI-49348,US,MI,49348,6,,,, +US-MI-49349,US,MI,49349,6,,,, +US-MI-49351,US,MI,49351,6,,,, +US-MI-49355,US,MI,49355,6,,,, +US-MI-49356,US,MI,49356,6,,,, +US-MI-49357,US,MI,49357,6,,,, +US-MI-49401,US,MI,49401,6,,,, +US-MI-49402,US,MI,49402,6,,,, +US-MI-49403,US,MI,49403,6,,,, +US-MI-49404,US,MI,49404,6,,,, +US-MI-49405,US,MI,49405,6,,,, +US-MI-49406,US,MI,49406,6,,,, +US-MI-49408,US,MI,49408,6,,,, +US-MI-49409,US,MI,49409,6,,,, +US-MI-49410,US,MI,49410,6,,,, +US-MI-49411,US,MI,49411,6,,,, +US-MI-49412,US,MI,49412,6,,,, +US-MI-49413,US,MI,49413,6,,,, +US-MI-49415,US,MI,49415,6,,,, +US-MI-49416,US,MI,49416,6,,,, +US-MI-49417,US,MI,49417,6,,,, +US-MI-49418,US,MI,49418,6,,,, +US-MI-49419,US,MI,49419,6,,,, +US-MI-49420,US,MI,49420,6,,,, +US-MI-49421,US,MI,49421,6,,,, +US-MI-49422,US,MI,49422,6,,,, +US-MI-49423,US,MI,49423,6,,,, +US-MI-49424,US,MI,49424,6,,,, +US-MI-49425,US,MI,49425,6,,,, +US-MI-49426,US,MI,49426,6,,,, +US-MI-49427,US,MI,49427,6,,,, +US-MI-49428,US,MI,49428,6,,,, +US-MI-49429,US,MI,49429,6,,,, +US-MI-49430,US,MI,49430,6,,,, +US-MI-49431,US,MI,49431,6,,,, +US-MI-49434,US,MI,49434,6,,,, +US-MI-49435,US,MI,49435,6,,,, +US-MI-49436,US,MI,49436,6,,,, +US-MI-49437,US,MI,49437,6,,,, +US-MI-49440,US,MI,49440,6,,,, +US-MI-49441,US,MI,49441,6,,,, +US-MI-49442,US,MI,49442,6,,,, +US-MI-49443,US,MI,49443,6,,,, +US-MI-49444,US,MI,49444,6,,,, +US-MI-49445,US,MI,49445,6,,,, +US-MI-49446,US,MI,49446,6,,,, +US-MI-49448,US,MI,49448,6,,,, +US-MI-49449,US,MI,49449,6,,,, +US-MI-49450,US,MI,49450,6,,,, +US-MI-49451,US,MI,49451,6,,,, +US-MI-49452,US,MI,49452,6,,,, +US-MI-49453,US,MI,49453,6,,,, +US-MI-49454,US,MI,49454,6,,,, +US-MI-49455,US,MI,49455,6,,,, +US-MI-49456,US,MI,49456,6,,,, +US-MI-49457,US,MI,49457,6,,,, +US-MI-49458,US,MI,49458,6,,,, +US-MI-49459,US,MI,49459,6,,,, +US-MI-49460,US,MI,49460,6,,,, +US-MI-49461,US,MI,49461,6,,,, +US-MI-49463,US,MI,49463,6,,,, +US-MI-49464,US,MI,49464,6,,,, +US-MI-49468,US,MI,49468,6,,,, +US-MI-49501,US,MI,49501,6,,,, +US-MI-49502,US,MI,49502,6,,,, +US-MI-49503,US,MI,49503,6,,,, +US-MI-49504,US,MI,49504,6,,,, +US-MI-49505,US,MI,49505,6,,,, +US-MI-49506,US,MI,49506,6,,,, +US-MI-49507,US,MI,49507,6,,,, +US-MI-49508,US,MI,49508,6,,,, +US-MI-49509,US,MI,49509,6,,,, +US-MI-49510,US,MI,49510,6,,,, +US-MI-49512,US,MI,49512,6,,,, +US-MI-49514,US,MI,49514,6,,,, +US-MI-49515,US,MI,49515,6,,,, +US-MI-49516,US,MI,49516,6,,,, +US-MI-49518,US,MI,49518,6,,,, +US-MI-49519,US,MI,49519,6,,,, +US-MI-49523,US,MI,49523,6,,,, +US-MI-49525,US,MI,49525,6,,,, +US-MI-49528,US,MI,49528,6,,,, +US-MI-49530,US,MI,49530,6,,,, +US-MI-49534,US,MI,49534,6,,,, +US-MI-49544,US,MI,49544,6,,,, +US-MI-49546,US,MI,49546,6,,,, +US-MI-49548,US,MI,49548,6,,,, +US-MI-49555,US,MI,49555,6,,,, +US-MI-49560,US,MI,49560,6,,,, +US-MI-49588,US,MI,49588,6,,,, +US-MI-49599,US,MI,49599,6,,,, +US-MI-49601,US,MI,49601,6,,,, +US-MI-49610,US,MI,49610,6,,,, +US-MI-49611,US,MI,49611,6,,,, +US-MI-49612,US,MI,49612,6,,,, +US-MI-49613,US,MI,49613,6,,,, +US-MI-49614,US,MI,49614,6,,,, +US-MI-49615,US,MI,49615,6,,,, +US-MI-49616,US,MI,49616,6,,,, +US-MI-49617,US,MI,49617,6,,,, +US-MI-49618,US,MI,49618,6,,,, +US-MI-49619,US,MI,49619,6,,,, +US-MI-49620,US,MI,49620,6,,,, +US-MI-49621,US,MI,49621,6,,,, +US-MI-49622,US,MI,49622,6,,,, +US-MI-49623,US,MI,49623,6,,,, +US-MI-49625,US,MI,49625,6,,,, +US-MI-49626,US,MI,49626,6,,,, +US-MI-49627,US,MI,49627,6,,,, +US-MI-49628,US,MI,49628,6,,,, +US-MI-49629,US,MI,49629,6,,,, +US-MI-49630,US,MI,49630,6,,,, +US-MI-49631,US,MI,49631,6,,,, +US-MI-49632,US,MI,49632,6,,,, +US-MI-49633,US,MI,49633,6,,,, +US-MI-49634,US,MI,49634,6,,,, +US-MI-49635,US,MI,49635,6,,,, +US-MI-49636,US,MI,49636,6,,,, +US-MI-49637,US,MI,49637,6,,,, +US-MI-49638,US,MI,49638,6,,,, +US-MI-49639,US,MI,49639,6,,,, +US-MI-49640,US,MI,49640,6,,,, +US-MI-49642,US,MI,49642,6,,,, +US-MI-49643,US,MI,49643,6,,,, +US-MI-49644,US,MI,49644,6,,,, +US-MI-49645,US,MI,49645,6,,,, +US-MI-49646,US,MI,49646,6,,,, +US-MI-49648,US,MI,49648,6,,,, +US-MI-49649,US,MI,49649,6,,,, +US-MI-49650,US,MI,49650,6,,,, +US-MI-49651,US,MI,49651,6,,,, +US-MI-49653,US,MI,49653,6,,,, +US-MI-49654,US,MI,49654,6,,,, +US-MI-49655,US,MI,49655,6,,,, +US-MI-49656,US,MI,49656,6,,,, +US-MI-49657,US,MI,49657,6,,,, +US-MI-49659,US,MI,49659,6,,,, +US-MI-49660,US,MI,49660,6,,,, +US-MI-49663,US,MI,49663,6,,,, +US-MI-49664,US,MI,49664,6,,,, +US-MI-49665,US,MI,49665,6,,,, +US-MI-49666,US,MI,49666,6,,,, +US-MI-49667,US,MI,49667,6,,,, +US-MI-49668,US,MI,49668,6,,,, +US-MI-49670,US,MI,49670,6,,,, +US-MI-49673,US,MI,49673,6,,,, +US-MI-49674,US,MI,49674,6,,,, +US-MI-49675,US,MI,49675,6,,,, +US-MI-49676,US,MI,49676,6,,,, +US-MI-49677,US,MI,49677,6,,,, +US-MI-49679,US,MI,49679,6,,,, +US-MI-49680,US,MI,49680,6,,,, +US-MI-49682,US,MI,49682,6,,,, +US-MI-49683,US,MI,49683,6,,,, +US-MI-49684,US,MI,49684,6,,,, +US-MI-49685,US,MI,49685,6,,,, +US-MI-49686,US,MI,49686,6,,,, +US-MI-49688,US,MI,49688,6,,,, +US-MI-49689,US,MI,49689,6,,,, +US-MI-49690,US,MI,49690,6,,,, +US-MI-49696,US,MI,49696,6,,,, +US-MI-49701,US,MI,49701,6,,,, +US-MI-49705,US,MI,49705,6,,,, +US-MI-49706,US,MI,49706,6,,,, +US-MI-49707,US,MI,49707,6,,,, +US-MI-49709,US,MI,49709,6,,,, +US-MI-49710,US,MI,49710,6,,,, +US-MI-49711,US,MI,49711,6,,,, +US-MI-49712,US,MI,49712,6,,,, +US-MI-49713,US,MI,49713,6,,,, +US-MI-49715,US,MI,49715,6,,,, +US-MI-49716,US,MI,49716,6,,,, +US-MI-49717,US,MI,49717,6,,,, +US-MI-49718,US,MI,49718,6,,,, +US-MI-49719,US,MI,49719,6,,,, +US-MI-49720,US,MI,49720,6,,,, +US-MI-49721,US,MI,49721,6,,,, +US-MI-49722,US,MI,49722,6,,,, +US-MI-49723,US,MI,49723,6,,,, +US-MI-49724,US,MI,49724,6,,,, +US-MI-49725,US,MI,49725,6,,,, +US-MI-49726,US,MI,49726,6,,,, +US-MI-49727,US,MI,49727,6,,,, +US-MI-49728,US,MI,49728,6,,,, +US-MI-49729,US,MI,49729,6,,,, +US-MI-49730,US,MI,49730,6,,,, +US-MI-49733,US,MI,49733,6,,,, +US-MI-49734,US,MI,49734,6,,,, +US-MI-49735,US,MI,49735,6,,,, +US-MI-49736,US,MI,49736,6,,,, +US-MI-49737,US,MI,49737,6,,,, +US-MI-49738,US,MI,49738,6,,,, +US-MI-49739,US,MI,49739,6,,,, +US-MI-49740,US,MI,49740,6,,,, +US-MI-49743,US,MI,49743,6,,,, +US-MI-49744,US,MI,49744,6,,,, +US-MI-49745,US,MI,49745,6,,,, +US-MI-49746,US,MI,49746,6,,,, +US-MI-49747,US,MI,49747,6,,,, +US-MI-49748,US,MI,49748,6,,,, +US-MI-49749,US,MI,49749,6,,,, +US-MI-49751,US,MI,49751,6,,,, +US-MI-49752,US,MI,49752,6,,,, +US-MI-49753,US,MI,49753,6,,,, +US-MI-49755,US,MI,49755,6,,,, +US-MI-49756,US,MI,49756,6,,,, +US-MI-49757,US,MI,49757,6,,,, +US-MI-49759,US,MI,49759,6,,,, +US-MI-49760,US,MI,49760,6,,,, +US-MI-49761,US,MI,49761,6,,,, +US-MI-49762,US,MI,49762,6,,,, +US-MI-49764,US,MI,49764,6,,,, +US-MI-49765,US,MI,49765,6,,,, +US-MI-49766,US,MI,49766,6,,,, +US-MI-49768,US,MI,49768,6,,,, +US-MI-49769,US,MI,49769,6,,,, +US-MI-49770,US,MI,49770,6,,,, +US-MI-49774,US,MI,49774,6,,,, +US-MI-49775,US,MI,49775,6,,,, +US-MI-49776,US,MI,49776,6,,,, +US-MI-49777,US,MI,49777,6,,,, +US-MI-49779,US,MI,49779,6,,,, +US-MI-49780,US,MI,49780,6,,,, +US-MI-49781,US,MI,49781,6,,,, +US-MI-49782,US,MI,49782,6,,,, +US-MI-49783,US,MI,49783,6,,,, +US-MI-49784,US,MI,49784,6,,,, +US-MI-49785,US,MI,49785,6,,,, +US-MI-49786,US,MI,49786,6,,,, +US-MI-49788,US,MI,49788,6,,,, +US-MI-49791,US,MI,49791,6,,,, +US-MI-49792,US,MI,49792,6,,,, +US-MI-49793,US,MI,49793,6,,,, +US-MI-49795,US,MI,49795,6,,,, +US-MI-49796,US,MI,49796,6,,,, +US-MI-49797,US,MI,49797,6,,,, +US-MI-49799,US,MI,49799,6,,,, +US-MI-49801,US,MI,49801,6,,,, +US-MI-49802,US,MI,49802,6,,,, +US-MI-49805,US,MI,49805,6,,,, +US-MI-49806,US,MI,49806,6,,,, +US-MI-49807,US,MI,49807,6,,,, +US-MI-49808,US,MI,49808,6,,,, +US-MI-49812,US,MI,49812,6,,,, +US-MI-49814,US,MI,49814,6,,,, +US-MI-49815,US,MI,49815,6,,,, +US-MI-49816,US,MI,49816,6,,,, +US-MI-49817,US,MI,49817,6,,,, +US-MI-49818,US,MI,49818,6,,,, +US-MI-49819,US,MI,49819,6,,,, +US-MI-49820,US,MI,49820,6,,,, +US-MI-49821,US,MI,49821,6,,,, +US-MI-49822,US,MI,49822,6,,,, +US-MI-49825,US,MI,49825,6,,,, +US-MI-49826,US,MI,49826,6,,,, +US-MI-49827,US,MI,49827,6,,,, +US-MI-49829,US,MI,49829,6,,,, +US-MI-49831,US,MI,49831,6,,,, +US-MI-49833,US,MI,49833,6,,,, +US-MI-49834,US,MI,49834,6,,,, +US-MI-49835,US,MI,49835,6,,,, +US-MI-49836,US,MI,49836,6,,,, +US-MI-49837,US,MI,49837,6,,,, +US-MI-49838,US,MI,49838,6,,,, +US-MI-49839,US,MI,49839,6,,,, +US-MI-49840,US,MI,49840,6,,,, +US-MI-49841,US,MI,49841,6,,,, +US-MI-49845,US,MI,49845,6,,,, +US-MI-49847,US,MI,49847,6,,,, +US-MI-49848,US,MI,49848,6,,,, +US-MI-49849,US,MI,49849,6,,,, +US-MI-49852,US,MI,49852,6,,,, +US-MI-49853,US,MI,49853,6,,,, +US-MI-49854,US,MI,49854,6,,,, +US-MI-49855,US,MI,49855,6,,,, +US-MI-49858,US,MI,49858,6,,,, +US-MI-49861,US,MI,49861,6,,,, +US-MI-49862,US,MI,49862,6,,,, +US-MI-49863,US,MI,49863,6,,,, +US-MI-49864,US,MI,49864,6,,,, +US-MI-49865,US,MI,49865,6,,,, +US-MI-49866,US,MI,49866,6,,,, +US-MI-49868,US,MI,49868,6,,,, +US-MI-49870,US,MI,49870,6,,,, +US-MI-49871,US,MI,49871,6,,,, +US-MI-49872,US,MI,49872,6,,,, +US-MI-49873,US,MI,49873,6,,,, +US-MI-49874,US,MI,49874,6,,,, +US-MI-49876,US,MI,49876,6,,,, +US-MI-49877,US,MI,49877,6,,,, +US-MI-49878,US,MI,49878,6,,,, +US-MI-49879,US,MI,49879,6,,,, +US-MI-49880,US,MI,49880,6,,,, +US-MI-49881,US,MI,49881,6,,,, +US-MI-49883,US,MI,49883,6,,,, +US-MI-49884,US,MI,49884,6,,,, +US-MI-49885,US,MI,49885,6,,,, +US-MI-49886,US,MI,49886,6,,,, +US-MI-49887,US,MI,49887,6,,,, +US-MI-49891,US,MI,49891,6,,,, +US-MI-49892,US,MI,49892,6,,,, +US-MI-49893,US,MI,49893,6,,,, +US-MI-49894,US,MI,49894,6,,,, +US-MI-49895,US,MI,49895,6,,,, +US-MI-49896,US,MI,49896,6,,,, +US-MI-49901,US,MI,49901,6,,,, +US-MI-49902,US,MI,49902,6,,,, +US-MI-49903,US,MI,49903,6,,,, +US-MI-49905,US,MI,49905,6,,,, +US-MI-49908,US,MI,49908,6,,,, +US-MI-49910,US,MI,49910,6,,,, +US-MI-49911,US,MI,49911,6,,,, +US-MI-49912,US,MI,49912,6,,,, +US-MI-49913,US,MI,49913,6,,,, +US-MI-49915,US,MI,49915,6,,,, +US-MI-49916,US,MI,49916,6,,,, +US-MI-49917,US,MI,49917,6,,,, +US-MI-49918,US,MI,49918,6,,,, +US-MI-49919,US,MI,49919,6,,,, +US-MI-49920,US,MI,49920,6,,,, +US-MI-49921,US,MI,49921,6,,,, +US-MI-49922,US,MI,49922,6,,,, +US-MI-49925,US,MI,49925,6,,,, +US-MI-49927,US,MI,49927,6,,,, +US-MI-49929,US,MI,49929,6,,,, +US-MI-49930,US,MI,49930,6,,,, +US-MI-49931,US,MI,49931,6,,,, +US-MI-49934,US,MI,49934,6,,,, +US-MI-49935,US,MI,49935,6,,,, +US-MI-49938,US,MI,49938,6,,,, +US-MI-49942,US,MI,49942,6,,,, +US-MI-49945,US,MI,49945,6,,,, +US-MI-49946,US,MI,49946,6,,,, +US-MI-49947,US,MI,49947,6,,,, +US-MI-49948,US,MI,49948,6,,,, +US-MI-49950,US,MI,49950,6,,,, +US-MI-49952,US,MI,49952,6,,,, +US-MI-49953,US,MI,49953,6,,,, +US-MI-49955,US,MI,49955,6,,,, +US-MI-49958,US,MI,49958,6,,,, +US-MI-49959,US,MI,49959,6,,,, +US-MI-49960,US,MI,49960,6,,,, +US-MI-49961,US,MI,49961,6,,,, +US-MI-49962,US,MI,49962,6,,,, +US-MI-49963,US,MI,49963,6,,,, +US-MI-49964,US,MI,49964,6,,,, +US-MI-49965,US,MI,49965,6,,,, +US-MI-49967,US,MI,49967,6,,,, +US-MI-49968,US,MI,49968,6,,,, +US-MI-49969,US,MI,49969,6,,,, +US-MI-49970,US,MI,49970,6,,,, +US-MI-49971,US,MI,49971,6,,,, +US-MN-55001,US,MN,55001,7.125,,,, +US-MN-55002,US,MN,55002,6.875,,,, +US-MN-55003,US,MN,55003,7.125,,,, +US-MN-55005,US,MN,55005,7.125,,,, +US-MN-55006,US,MN,55006,6.875,,,, +US-MN-55007,US,MN,55007,6.875,,,, +US-MN-55008,US,MN,55008,6.875,,,, +US-MN-55009,US,MN,55009,6.875,,,, +US-MN-55010,US,MN,55010,6.875,,,, +US-MN-55011,US,MN,55011,7.125,,,, +US-MN-55012,US,MN,55012,6.875,,,, +US-MN-55013,US,MN,55013,6.875,,,, +US-MN-55014,US,MN,55014,7.125,,,, +US-MN-55016,US,MN,55016,7.125,,,, +US-MN-55017,US,MN,55017,6.875,,,, +US-MN-55018,US,MN,55018,6.875,,,, +US-MN-55019,US,MN,55019,6.875,,,, +US-MN-55020,US,MN,55020,6.875,,,, +US-MN-55021,US,MN,55021,6.875,,,, +US-MN-55024,US,MN,55024,7.125,,,, +US-MN-55025,US,MN,55025,7.125,,,, +US-MN-55026,US,MN,55026,6.875,,,, +US-MN-55027,US,MN,55027,6.875,,,, +US-MN-55029,US,MN,55029,6.875,,,, +US-MN-55030,US,MN,55030,6.875,,,, +US-MN-55031,US,MN,55031,7.125,,,, +US-MN-55032,US,MN,55032,6.875,,,, +US-MN-55033,US,MN,55033,7.125,,,, +US-MN-55036,US,MN,55036,6.875,,,, +US-MN-55037,US,MN,55037,6.875,,,, +US-MN-55038,US,MN,55038,7.125,,,, +US-MN-55040,US,MN,55040,6.875,,,, +US-MN-55041,US,MN,55041,6.875,,,, +US-MN-55042,US,MN,55042,7.125,,,, +US-MN-55043,US,MN,55043,7.125,,,, +US-MN-55044,US,MN,55044,7.125,,,, +US-MN-55045,US,MN,55045,6.875,,,, +US-MN-55046,US,MN,55046,6.875,,,, +US-MN-55047,US,MN,55047,7.125,,,, +US-MN-55049,US,MN,55049,6.875,,,, +US-MN-55051,US,MN,55051,6.875,,,, +US-MN-55052,US,MN,55052,6.875,,,, +US-MN-55053,US,MN,55053,6.875,,,, +US-MN-55054,US,MN,55054,6.875,,,, +US-MN-55055,US,MN,55055,7.125,,,, +US-MN-55056,US,MN,55056,6.875,,,, +US-MN-55057,US,MN,55057,6.875,,,, +US-MN-55060,US,MN,55060,6.875,,,, +US-MN-55063,US,MN,55063,6.875,,,, +US-MN-55065,US,MN,55065,7.125,,,, +US-MN-55066,US,MN,55066,6.875,,,, +US-MN-55067,US,MN,55067,6.875,,,, +US-MN-55068,US,MN,55068,7.125,,,, +US-MN-55069,US,MN,55069,6.875,,,, +US-MN-55070,US,MN,55070,7.125,,,, +US-MN-55071,US,MN,55071,7.125,,,, +US-MN-55072,US,MN,55072,6.875,,,, +US-MN-55073,US,MN,55073,7.125,,,, +US-MN-55074,US,MN,55074,6.875,,,, +US-MN-55075,US,MN,55075,7.125,,,, +US-MN-55076,US,MN,55076,7.125,,,, +US-MN-55077,US,MN,55077,7.125,,,, +US-MN-55078,US,MN,55078,6.875,,,, +US-MN-55079,US,MN,55079,6.875,,,, +US-MN-55080,US,MN,55080,6.875,,,, +US-MN-55082,US,MN,55082,7.125,,,, +US-MN-55083,US,MN,55083,7.125,,,, +US-MN-55084,US,MN,55084,6.875,,,, +US-MN-55085,US,MN,55085,7.125,,,, +US-MN-55087,US,MN,55087,6.875,,,, +US-MN-55088,US,MN,55088,6.875,,,, +US-MN-55089,US,MN,55089,6.875,,,, +US-MN-55090,US,MN,55090,7.125,,,, +US-MN-55092,US,MN,55092,6.875,,,, +US-MN-55101,US,MN,55101,7.625,,,, +US-MN-55102,US,MN,55102,7.625,,,, +US-MN-55103,US,MN,55103,7.625,,,, +US-MN-55104,US,MN,55104,7.625,,,, +US-MN-55105,US,MN,55105,7.625,,,, +US-MN-55106,US,MN,55106,7.625,,,, +US-MN-55107,US,MN,55107,7.625,,,, +US-MN-55108,US,MN,55108,7.625,,,, +US-MN-55109,US,MN,55109,7.125,,,, +US-MN-55110,US,MN,55110,7.125,,,, +US-MN-55111,US,MN,55111,7.275,,,, +US-MN-55112,US,MN,55112,7.125,,,, +US-MN-55113,US,MN,55113,7.125,,,, +US-MN-55114,US,MN,55114,7.625,,,, +US-MN-55115,US,MN,55115,7.125,,,, +US-MN-55116,US,MN,55116,7.625,,,, +US-MN-55117,US,MN,55117,7.625,,,, +US-MN-55118,US,MN,55118,7.125,,,, +US-MN-55119,US,MN,55119,7.625,,,, +US-MN-55120,US,MN,55120,7.125,,,, +US-MN-55121,US,MN,55121,7.125,,,, +US-MN-55122,US,MN,55122,7.125,,,, +US-MN-55123,US,MN,55123,7.125,,,, +US-MN-55124,US,MN,55124,7.125,,,, +US-MN-55125,US,MN,55125,7.125,,,, +US-MN-55126,US,MN,55126,7.125,,,, +US-MN-55127,US,MN,55127,7.125,,,, +US-MN-55128,US,MN,55128,7.125,,,, +US-MN-55129,US,MN,55129,7.125,,,, +US-MN-55130,US,MN,55130,7.625,,,, +US-MN-55133,US,MN,55133,7.125,,,, +US-MN-55144,US,MN,55144,7.125,,,, +US-MN-55145,US,MN,55145,7.625,,,, +US-MN-55146,US,MN,55146,7.625,,,, +US-MN-55150,US,MN,55150,7.125,,,, +US-MN-55155,US,MN,55155,7.625,,,, +US-MN-55164,US,MN,55164,7.125,,,, +US-MN-55165,US,MN,55165,7.625,,,, +US-MN-55166,US,MN,55166,7.125,,,, +US-MN-55168,US,MN,55168,7.625,,,, +US-MN-55170,US,MN,55170,7.125,,,, +US-MN-55171,US,MN,55171,7.125,,,, +US-MN-55172,US,MN,55172,7.125,,,, +US-MN-55175,US,MN,55175,7.625,,,, +US-MN-55187,US,MN,55187,7.125,,,, +US-MN-55188,US,MN,55188,6.875,,,, +US-MN-55301,US,MN,55301,6.875,,,, +US-MN-55302,US,MN,55302,6.875,,,, +US-MN-55303,US,MN,55303,7.125,,,, +US-MN-55304,US,MN,55304,7.125,,,, +US-MN-55305,US,MN,55305,7.275,,,, +US-MN-55306,US,MN,55306,7.125,,,, +US-MN-55307,US,MN,55307,6.875,,,, +US-MN-55308,US,MN,55308,6.875,,,, +US-MN-55309,US,MN,55309,6.875,,,, +US-MN-55310,US,MN,55310,6.875,,,, +US-MN-55311,US,MN,55311,7.275,,,, +US-MN-55312,US,MN,55312,6.875,,,, +US-MN-55313,US,MN,55313,6.875,,,, +US-MN-55314,US,MN,55314,6.875,,,, +US-MN-55315,US,MN,55315,6.875,,,, +US-MN-55316,US,MN,55316,7.275,,,, +US-MN-55317,US,MN,55317,6.875,,,, +US-MN-55318,US,MN,55318,6.875,,,, +US-MN-55319,US,MN,55319,6.875,,,, +US-MN-55320,US,MN,55320,6.875,,,, +US-MN-55321,US,MN,55321,6.875,,,, +US-MN-55322,US,MN,55322,6.875,,,, +US-MN-55323,US,MN,55323,6.875,,,, +US-MN-55324,US,MN,55324,6.875,,,, +US-MN-55325,US,MN,55325,6.875,,,, +US-MN-55327,US,MN,55327,7.275,,,, +US-MN-55328,US,MN,55328,6.875,,,, +US-MN-55329,US,MN,55329,6.875,,,, +US-MN-55330,US,MN,55330,6.875,,,, +US-MN-55331,US,MN,55331,7.275,,,, +US-MN-55332,US,MN,55332,6.875,,,, +US-MN-55333,US,MN,55333,6.875,,,, +US-MN-55334,US,MN,55334,6.875,,,, +US-MN-55335,US,MN,55335,6.875,,,, +US-MN-55336,US,MN,55336,6.875,,,, +US-MN-55337,US,MN,55337,7.125,,,, +US-MN-55338,US,MN,55338,6.875,,,, +US-MN-55339,US,MN,55339,6.875,,,, +US-MN-55340,US,MN,55340,7.275,,,, +US-MN-55341,US,MN,55341,6.875,,,, +US-MN-55342,US,MN,55342,6.875,,,, +US-MN-55343,US,MN,55343,7.275,,,, +US-MN-55344,US,MN,55344,7.275,,,, +US-MN-55345,US,MN,55345,7.275,,,, +US-MN-55346,US,MN,55346,7.275,,,, +US-MN-55347,US,MN,55347,7.275,,,, +US-MN-55348,US,MN,55348,7.275,,,, +US-MN-55349,US,MN,55349,6.875,,,, +US-MN-55350,US,MN,55350,7.375,,,, +US-MN-55352,US,MN,55352,6.875,,,, +US-MN-55353,US,MN,55353,6.875,,,, +US-MN-55354,US,MN,55354,6.875,,,, +US-MN-55355,US,MN,55355,6.875,,,, +US-MN-55356,US,MN,55356,7.275,,,, +US-MN-55357,US,MN,55357,7.275,,,, +US-MN-55358,US,MN,55358,6.875,,,, +US-MN-55359,US,MN,55359,7.275,,,, +US-MN-55360,US,MN,55360,6.875,,,, +US-MN-55361,US,MN,55361,7.275,,,, +US-MN-55362,US,MN,55362,6.875,,,, +US-MN-55363,US,MN,55363,6.875,,,, +US-MN-55364,US,MN,55364,7.275,,,, +US-MN-55365,US,MN,55365,6.875,,,, +US-MN-55366,US,MN,55366,6.875,,,, +US-MN-55367,US,MN,55367,6.875,,,, +US-MN-55368,US,MN,55368,6.875,,,, +US-MN-55369,US,MN,55369,7.275,,,, +US-MN-55370,US,MN,55370,6.875,,,, +US-MN-55371,US,MN,55371,6.875,,,, +US-MN-55372,US,MN,55372,6.875,,,, +US-MN-55373,US,MN,55373,6.875,,,, +US-MN-55374,US,MN,55374,7.275,,,, +US-MN-55375,US,MN,55375,7.275,,,, +US-MN-55376,US,MN,55376,6.875,,,, +US-MN-55377,US,MN,55377,6.875,,,, +US-MN-55378,US,MN,55378,6.875,,,, +US-MN-55379,US,MN,55379,6.875,,,, +US-MN-55380,US,MN,55380,6.875,,,, +US-MN-55381,US,MN,55381,6.875,,,, +US-MN-55382,US,MN,55382,6.875,,,, +US-MN-55383,US,MN,55383,6.875,,,, +US-MN-55384,US,MN,55384,7.275,,,, +US-MN-55385,US,MN,55385,6.875,,,, +US-MN-55386,US,MN,55386,6.875,,,, +US-MN-55387,US,MN,55387,6.875,,,, +US-MN-55388,US,MN,55388,6.875,,,, +US-MN-55389,US,MN,55389,6.875,,,, +US-MN-55390,US,MN,55390,6.875,,,, +US-MN-55391,US,MN,55391,7.275,,,, +US-MN-55392,US,MN,55392,7.275,,,, +US-MN-55393,US,MN,55393,7.275,,,, +US-MN-55394,US,MN,55394,6.875,,,, +US-MN-55395,US,MN,55395,6.875,,,, +US-MN-55396,US,MN,55396,6.875,,,, +US-MN-55397,US,MN,55397,6.875,,,, +US-MN-55398,US,MN,55398,6.875,,,, +US-MN-55399,US,MN,55399,6.875,,,, +US-MN-55401,US,MN,55401,7.775,,,, +US-MN-55402,US,MN,55402,7.775,,,, +US-MN-55403,US,MN,55403,7.775,,,, +US-MN-55404,US,MN,55404,7.775,,,, +US-MN-55405,US,MN,55405,7.775,,,, +US-MN-55406,US,MN,55406,7.775,,,, +US-MN-55407,US,MN,55407,7.775,,,, +US-MN-55408,US,MN,55408,7.775,,,, +US-MN-55409,US,MN,55409,7.775,,,, +US-MN-55410,US,MN,55410,7.775,,,, +US-MN-55411,US,MN,55411,7.775,,,, +US-MN-55412,US,MN,55412,7.775,,,, +US-MN-55413,US,MN,55413,7.775,,,, +US-MN-55414,US,MN,55414,7.775,,,, +US-MN-55415,US,MN,55415,7.775,,,, +US-MN-55416,US,MN,55416,7.275,,,, +US-MN-55417,US,MN,55417,7.775,,,, +US-MN-55418,US,MN,55418,7.775,,,, +US-MN-55419,US,MN,55419,7.775,,,, +US-MN-55420,US,MN,55420,7.275,,,, +US-MN-55421,US,MN,55421,7.125,,,, +US-MN-55422,US,MN,55422,7.275,,,, +US-MN-55423,US,MN,55423,7.275,,,, +US-MN-55424,US,MN,55424,7.275,,,, +US-MN-55425,US,MN,55425,7.275,,,, +US-MN-55426,US,MN,55426,7.275,,,, +US-MN-55427,US,MN,55427,7.275,,,, +US-MN-55428,US,MN,55428,7.275,,,, +US-MN-55429,US,MN,55429,7.275,,,, +US-MN-55430,US,MN,55430,7.275,,,, +US-MN-55431,US,MN,55431,7.275,,,, +US-MN-55432,US,MN,55432,7.125,,,, +US-MN-55433,US,MN,55433,7.125,,,, +US-MN-55434,US,MN,55434,7.125,,,, +US-MN-55435,US,MN,55435,7.275,,,, +US-MN-55436,US,MN,55436,7.275,,,, +US-MN-55437,US,MN,55437,7.275,,,, +US-MN-55438,US,MN,55438,7.275,,,, +US-MN-55439,US,MN,55439,7.275,,,, +US-MN-55440,US,MN,55440,7.775,,,, +US-MN-55441,US,MN,55441,7.275,,,, +US-MN-55442,US,MN,55442,7.275,,,, +US-MN-55443,US,MN,55443,7.275,,,, +US-MN-55444,US,MN,55444,7.275,,,, +US-MN-55445,US,MN,55445,7.275,,,, +US-MN-55446,US,MN,55446,7.275,,,, +US-MN-55447,US,MN,55447,7.275,,,, +US-MN-55448,US,MN,55448,7.125,,,, +US-MN-55449,US,MN,55449,7.125,,,, +US-MN-55450,US,MN,55450,7.275,,,, +US-MN-55454,US,MN,55454,7.775,,,, +US-MN-55455,US,MN,55455,7.775,,,, +US-MN-55458,US,MN,55458,7.775,,,, +US-MN-55459,US,MN,55459,7.775,,,, +US-MN-55460,US,MN,55460,7.775,,,, +US-MN-55467,US,MN,55467,7.775,,,, +US-MN-55470,US,MN,55470,7.775,,,, +US-MN-55472,US,MN,55472,7.775,,,, +US-MN-55473,US,MN,55473,7.775,,,, +US-MN-55474,US,MN,55474,7.775,,,, +US-MN-55478,US,MN,55478,7.775,,,, +US-MN-55479,US,MN,55479,7.775,,,, +US-MN-55480,US,MN,55480,7.775,,,, +US-MN-55483,US,MN,55483,7.775,,,, +US-MN-55484,US,MN,55484,7.775,,,, +US-MN-55485,US,MN,55485,7.775,,,, +US-MN-55486,US,MN,55486,7.775,,,, +US-MN-55487,US,MN,55487,7.775,,,, +US-MN-55488,US,MN,55488,7.775,,,, +US-MN-55550,US,MN,55550,6.875,,,, +US-MN-55551,US,MN,55551,6.875,,,, +US-MN-55552,US,MN,55552,6.875,,,, +US-MN-55553,US,MN,55553,6.875,,,, +US-MN-55554,US,MN,55554,6.875,,,, +US-MN-55556,US,MN,55556,6.875,,,, +US-MN-55557,US,MN,55557,6.875,,,, +US-MN-55558,US,MN,55558,6.875,,,, +US-MN-55559,US,MN,55559,6.875,,,, +US-MN-55560,US,MN,55560,6.875,,,, +US-MN-55562,US,MN,55562,6.875,,,, +US-MN-55564,US,MN,55564,6.875,,,, +US-MN-55565,US,MN,55565,6.875,,,, +US-MN-55566,US,MN,55566,6.875,,,, +US-MN-55567,US,MN,55567,6.875,,,, +US-MN-55568,US,MN,55568,6.875,,,, +US-MN-55569,US,MN,55569,7.275,,,, +US-MN-55570,US,MN,55570,7.275,,,, +US-MN-55571,US,MN,55571,7.275,,,, +US-MN-55572,US,MN,55572,6.875,,,, +US-MN-55573,US,MN,55573,6.875,,,, +US-MN-55574,US,MN,55574,7.275,,,, +US-MN-55575,US,MN,55575,6.875,,,, +US-MN-55576,US,MN,55576,7.275,,,, +US-MN-55577,US,MN,55577,7.275,,,, +US-MN-55578,US,MN,55578,7.275,,,, +US-MN-55579,US,MN,55579,7.275,,,, +US-MN-55580,US,MN,55580,6.875,,,, +US-MN-55581,US,MN,55581,6.875,,,, +US-MN-55582,US,MN,55582,6.875,,,, +US-MN-55583,US,MN,55583,6.875,,,, +US-MN-55584,US,MN,55584,6.875,,,, +US-MN-55585,US,MN,55585,6.875,,,, +US-MN-55586,US,MN,55586,6.875,,,, +US-MN-55587,US,MN,55587,6.875,,,, +US-MN-55588,US,MN,55588,6.875,,,, +US-MN-55589,US,MN,55589,6.875,,,, +US-MN-55590,US,MN,55590,6.875,,,, +US-MN-55591,US,MN,55591,6.875,,,, +US-MN-55592,US,MN,55592,7.275,,,, +US-MN-55593,US,MN,55593,7.275,,,, +US-MN-55594,US,MN,55594,6.875,,,, +US-MN-55595,US,MN,55595,7.275,,,, +US-MN-55596,US,MN,55596,7.275,,,, +US-MN-55597,US,MN,55597,7.275,,,, +US-MN-55598,US,MN,55598,7.275,,,, +US-MN-55599,US,MN,55599,7.275,,,, +US-MN-55601,US,MN,55601,6.875,,,, +US-MN-55602,US,MN,55602,6.875,,,, +US-MN-55603,US,MN,55603,6.875,,,, +US-MN-55604,US,MN,55604,7.875,,,, +US-MN-55605,US,MN,55605,7.875,,,, +US-MN-55606,US,MN,55606,7.875,,,, +US-MN-55607,US,MN,55607,6.875,,,, +US-MN-55609,US,MN,55609,6.875,,,, +US-MN-55612,US,MN,55612,7.875,,,, +US-MN-55613,US,MN,55613,7.875,,,, +US-MN-55614,US,MN,55614,6.875,,,, +US-MN-55615,US,MN,55615,7.875,,,, +US-MN-55616,US,MN,55616,7.375,,,, +US-MN-55701,US,MN,55701,7.875,,,, +US-MN-55702,US,MN,55702,6.875,,,, +US-MN-55703,US,MN,55703,6.875,,,, +US-MN-55704,US,MN,55704,6.875,,,, +US-MN-55705,US,MN,55705,6.875,,,, +US-MN-55706,US,MN,55706,6.875,,,, +US-MN-55707,US,MN,55707,6.875,,,, +US-MN-55708,US,MN,55708,6.875,,,, +US-MN-55709,US,MN,55709,6.875,,,, +US-MN-55710,US,MN,55710,6.875,,,, +US-MN-55711,US,MN,55711,6.875,,,, +US-MN-55712,US,MN,55712,6.875,,,, +US-MN-55713,US,MN,55713,6.875,,,, +US-MN-55716,US,MN,55716,6.875,,,, +US-MN-55717,US,MN,55717,6.875,,,, +US-MN-55718,US,MN,55718,6.875,,,, +US-MN-55719,US,MN,55719,6.875,,,, +US-MN-55720,US,MN,55720,7.375,,,, +US-MN-55721,US,MN,55721,6.875,,,, +US-MN-55722,US,MN,55722,6.875,,,, +US-MN-55723,US,MN,55723,6.875,,,, +US-MN-55724,US,MN,55724,6.875,,,, +US-MN-55725,US,MN,55725,6.875,,,, +US-MN-55726,US,MN,55726,6.875,,,, +US-MN-55730,US,MN,55730,6.875,,,, +US-MN-55731,US,MN,55731,6.875,,,, +US-MN-55732,US,MN,55732,6.875,,,, +US-MN-55733,US,MN,55733,6.875,,,, +US-MN-55734,US,MN,55734,6.875,,,, +US-MN-55735,US,MN,55735,6.875,,,, +US-MN-55736,US,MN,55736,6.875,,,, +US-MN-55738,US,MN,55738,6.875,,,, +US-MN-55741,US,MN,55741,6.875,,,, +US-MN-55742,US,MN,55742,6.875,,,, +US-MN-55744,US,MN,55744,6.875,,,, +US-MN-55745,US,MN,55745,6.875,,,, +US-MN-55746,US,MN,55746,6.875,,,, +US-MN-55747,US,MN,55747,6.875,,,, +US-MN-55748,US,MN,55748,6.875,,,, +US-MN-55749,US,MN,55749,6.875,,,, +US-MN-55750,US,MN,55750,6.875,,,, +US-MN-55751,US,MN,55751,6.875,,,, +US-MN-55752,US,MN,55752,6.875,,,, +US-MN-55753,US,MN,55753,6.875,,,, +US-MN-55756,US,MN,55756,6.875,,,, +US-MN-55757,US,MN,55757,6.875,,,, +US-MN-55758,US,MN,55758,6.875,,,, +US-MN-55760,US,MN,55760,6.875,,,, +US-MN-55763,US,MN,55763,6.875,,,, +US-MN-55764,US,MN,55764,6.875,,,, +US-MN-55765,US,MN,55765,6.875,,,, +US-MN-55766,US,MN,55766,6.875,,,, +US-MN-55767,US,MN,55767,6.875,,,, +US-MN-55768,US,MN,55768,6.875,,,, +US-MN-55769,US,MN,55769,6.875,,,, +US-MN-55771,US,MN,55771,6.875,,,, +US-MN-55772,US,MN,55772,6.875,,,, +US-MN-55775,US,MN,55775,6.875,,,, +US-MN-55777,US,MN,55777,6.875,,,, +US-MN-55779,US,MN,55779,6.875,,,, +US-MN-55780,US,MN,55780,6.875,,,, +US-MN-55781,US,MN,55781,6.875,,,, +US-MN-55782,US,MN,55782,6.875,,,, +US-MN-55783,US,MN,55783,6.875,,,, +US-MN-55784,US,MN,55784,6.875,,,, +US-MN-55785,US,MN,55785,6.875,,,, +US-MN-55786,US,MN,55786,6.875,,,, +US-MN-55787,US,MN,55787,6.875,,,, +US-MN-55790,US,MN,55790,6.875,,,, +US-MN-55791,US,MN,55791,6.875,,,, +US-MN-55792,US,MN,55792,6.875,,,, +US-MN-55793,US,MN,55793,6.875,,,, +US-MN-55795,US,MN,55795,6.875,,,, +US-MN-55796,US,MN,55796,6.875,,,, +US-MN-55797,US,MN,55797,6.875,,,, +US-MN-55798,US,MN,55798,6.875,,,, +US-MN-55801,US,MN,55801,7.875,,,, +US-MN-55802,US,MN,55802,7.875,,,, +US-MN-55803,US,MN,55803,7.875,,,, +US-MN-55804,US,MN,55804,7.875,,,, +US-MN-55805,US,MN,55805,7.875,,,, +US-MN-55806,US,MN,55806,7.875,,,, +US-MN-55807,US,MN,55807,7.875,,,, +US-MN-55808,US,MN,55808,7.875,,,, +US-MN-55810,US,MN,55810,7.375,,,, +US-MN-55811,US,MN,55811,7.875,,,, +US-MN-55812,US,MN,55812,7.875,,,, +US-MN-55814,US,MN,55814,7.875,,,, +US-MN-55815,US,MN,55815,7.875,,,, +US-MN-55816,US,MN,55816,7.875,,,, +US-MN-55901,US,MN,55901,7.375,,,, +US-MN-55902,US,MN,55902,7.375,,,, +US-MN-55903,US,MN,55903,7.375,,,, +US-MN-55904,US,MN,55904,7.375,,,, +US-MN-55905,US,MN,55905,6.875,,,, +US-MN-55906,US,MN,55906,7.375,,,, +US-MN-55909,US,MN,55909,6.875,,,, +US-MN-55910,US,MN,55910,6.875,,,, +US-MN-55912,US,MN,55912,7.375,,,, +US-MN-55917,US,MN,55917,6.875,,,, +US-MN-55918,US,MN,55918,6.875,,,, +US-MN-55919,US,MN,55919,6.875,,,, +US-MN-55920,US,MN,55920,6.875,,,, +US-MN-55921,US,MN,55921,6.875,,,, +US-MN-55922,US,MN,55922,6.875,,,, +US-MN-55923,US,MN,55923,6.875,,,, +US-MN-55924,US,MN,55924,6.875,,,, +US-MN-55925,US,MN,55925,6.875,,,, +US-MN-55926,US,MN,55926,6.875,,,, +US-MN-55927,US,MN,55927,6.875,,,, +US-MN-55929,US,MN,55929,6.875,,,, +US-MN-55931,US,MN,55931,6.875,,,, +US-MN-55932,US,MN,55932,6.875,,,, +US-MN-55933,US,MN,55933,6.875,,,, +US-MN-55934,US,MN,55934,6.875,,,, +US-MN-55935,US,MN,55935,6.875,,,, +US-MN-55936,US,MN,55936,6.875,,,, +US-MN-55939,US,MN,55939,6.875,,,, +US-MN-55940,US,MN,55940,6.875,,,, +US-MN-55941,US,MN,55941,6.875,,,, +US-MN-55942,US,MN,55942,6.875,,,, +US-MN-55943,US,MN,55943,6.875,,,, +US-MN-55944,US,MN,55944,6.875,,,, +US-MN-55945,US,MN,55945,6.875,,,, +US-MN-55946,US,MN,55946,6.875,,,, +US-MN-55947,US,MN,55947,6.875,,,, +US-MN-55949,US,MN,55949,6.875,,,, +US-MN-55950,US,MN,55950,6.875,,,, +US-MN-55951,US,MN,55951,6.875,,,, +US-MN-55952,US,MN,55952,6.875,,,, +US-MN-55953,US,MN,55953,6.875,,,, +US-MN-55954,US,MN,55954,6.875,,,, +US-MN-55955,US,MN,55955,6.875,,,, +US-MN-55956,US,MN,55956,6.875,,,, +US-MN-55957,US,MN,55957,6.875,,,, +US-MN-55959,US,MN,55959,6.875,,,, +US-MN-55960,US,MN,55960,6.875,,,, +US-MN-55961,US,MN,55961,6.875,,,, +US-MN-55962,US,MN,55962,6.875,,,, +US-MN-55963,US,MN,55963,6.875,,,, +US-MN-55964,US,MN,55964,6.875,,,, +US-MN-55965,US,MN,55965,6.875,,,, +US-MN-55967,US,MN,55967,6.875,,,, +US-MN-55968,US,MN,55968,6.875,,,, +US-MN-55969,US,MN,55969,6.875,,,, +US-MN-55970,US,MN,55970,6.875,,,, +US-MN-55971,US,MN,55971,6.875,,,, +US-MN-55972,US,MN,55972,6.875,,,, +US-MN-55973,US,MN,55973,6.875,,,, +US-MN-55974,US,MN,55974,6.875,,,, +US-MN-55975,US,MN,55975,6.875,,,, +US-MN-55976,US,MN,55976,6.875,,,, +US-MN-55977,US,MN,55977,6.875,,,, +US-MN-55979,US,MN,55979,6.875,,,, +US-MN-55981,US,MN,55981,6.875,,,, +US-MN-55982,US,MN,55982,6.875,,,, +US-MN-55983,US,MN,55983,6.875,,,, +US-MN-55985,US,MN,55985,6.875,,,, +US-MN-55987,US,MN,55987,6.875,,,, +US-MN-55988,US,MN,55988,6.875,,,, +US-MN-55990,US,MN,55990,6.875,,,, +US-MN-55991,US,MN,55991,6.875,,,, +US-MN-55992,US,MN,55992,6.875,,,, +US-MN-56001,US,MN,56001,7.375,,,, +US-MN-56002,US,MN,56002,7.375,,,, +US-MN-56003,US,MN,56003,7.375,,,, +US-MN-56006,US,MN,56006,7.375,,,, +US-MN-56007,US,MN,56007,7.375,,,, +US-MN-56009,US,MN,56009,6.875,,,, +US-MN-56010,US,MN,56010,6.875,,,, +US-MN-56011,US,MN,56011,6.875,,,, +US-MN-56013,US,MN,56013,6.875,,,, +US-MN-56014,US,MN,56014,6.875,,,, +US-MN-56016,US,MN,56016,6.875,,,, +US-MN-56017,US,MN,56017,6.875,,,, +US-MN-56019,US,MN,56019,6.875,,,, +US-MN-56020,US,MN,56020,6.875,,,, +US-MN-56021,US,MN,56021,6.875,,,, +US-MN-56022,US,MN,56022,6.875,,,, +US-MN-56023,US,MN,56023,6.875,,,, +US-MN-56024,US,MN,56024,6.875,,,, +US-MN-56025,US,MN,56025,6.875,,,, +US-MN-56026,US,MN,56026,6.875,,,, +US-MN-56027,US,MN,56027,6.875,,,, +US-MN-56028,US,MN,56028,6.875,,,, +US-MN-56029,US,MN,56029,6.875,,,, +US-MN-56030,US,MN,56030,6.875,,,, +US-MN-56031,US,MN,56031,6.875,,,, +US-MN-56032,US,MN,56032,6.875,,,, +US-MN-56033,US,MN,56033,6.875,,,, +US-MN-56034,US,MN,56034,6.875,,,, +US-MN-56035,US,MN,56035,6.875,,,, +US-MN-56036,US,MN,56036,6.875,,,, +US-MN-56037,US,MN,56037,6.875,,,, +US-MN-56039,US,MN,56039,6.875,,,, +US-MN-56041,US,MN,56041,6.875,,,, +US-MN-56042,US,MN,56042,6.875,,,, +US-MN-56043,US,MN,56043,6.875,,,, +US-MN-56044,US,MN,56044,6.875,,,, +US-MN-56045,US,MN,56045,6.875,,,, +US-MN-56046,US,MN,56046,6.875,,,, +US-MN-56047,US,MN,56047,6.875,,,, +US-MN-56048,US,MN,56048,6.875,,,, +US-MN-56050,US,MN,56050,6.875,,,, +US-MN-56051,US,MN,56051,6.875,,,, +US-MN-56052,US,MN,56052,6.875,,,, +US-MN-56054,US,MN,56054,6.875,,,, +US-MN-56055,US,MN,56055,6.875,,,, +US-MN-56056,US,MN,56056,6.875,,,, +US-MN-56057,US,MN,56057,6.875,,,, +US-MN-56058,US,MN,56058,6.875,,,, +US-MN-56060,US,MN,56060,6.875,,,, +US-MN-56062,US,MN,56062,6.875,,,, +US-MN-56063,US,MN,56063,6.875,,,, +US-MN-56065,US,MN,56065,6.875,,,, +US-MN-56068,US,MN,56068,6.875,,,, +US-MN-56069,US,MN,56069,6.875,,,, +US-MN-56071,US,MN,56071,6.875,,,, +US-MN-56072,US,MN,56072,6.875,,,, +US-MN-56073,US,MN,56073,7.375,,,, +US-MN-56074,US,MN,56074,6.875,,,, +US-MN-56075,US,MN,56075,6.875,,,, +US-MN-56078,US,MN,56078,6.875,,,, +US-MN-56080,US,MN,56080,6.875,,,, +US-MN-56081,US,MN,56081,6.875,,,, +US-MN-56082,US,MN,56082,6.875,,,, +US-MN-56083,US,MN,56083,6.875,,,, +US-MN-56084,US,MN,56084,7.375,,,, +US-MN-56085,US,MN,56085,6.875,,,, +US-MN-56087,US,MN,56087,6.875,,,, +US-MN-56088,US,MN,56088,6.875,,,, +US-MN-56089,US,MN,56089,6.875,,,, +US-MN-56090,US,MN,56090,6.875,,,, +US-MN-56091,US,MN,56091,6.875,,,, +US-MN-56093,US,MN,56093,6.875,,,, +US-MN-56096,US,MN,56096,6.875,,,, +US-MN-56097,US,MN,56097,6.875,,,, +US-MN-56098,US,MN,56098,6.875,,,, +US-MN-56101,US,MN,56101,6.875,,,, +US-MN-56110,US,MN,56110,6.875,,,, +US-MN-56111,US,MN,56111,6.875,,,, +US-MN-56113,US,MN,56113,6.875,,,, +US-MN-56114,US,MN,56114,6.875,,,, +US-MN-56115,US,MN,56115,6.875,,,, +US-MN-56116,US,MN,56116,6.875,,,, +US-MN-56117,US,MN,56117,6.875,,,, +US-MN-56118,US,MN,56118,6.875,,,, +US-MN-56119,US,MN,56119,6.875,,,, +US-MN-56120,US,MN,56120,6.875,,,, +US-MN-56121,US,MN,56121,6.875,,,, +US-MN-56122,US,MN,56122,6.875,,,, +US-MN-56123,US,MN,56123,6.875,,,, +US-MN-56125,US,MN,56125,6.875,,,, +US-MN-56127,US,MN,56127,6.875,,,, +US-MN-56128,US,MN,56128,6.875,,,, +US-MN-56129,US,MN,56129,6.875,,,, +US-MN-56131,US,MN,56131,6.875,,,, +US-MN-56132,US,MN,56132,6.875,,,, +US-MN-56134,US,MN,56134,6.875,,,, +US-MN-56136,US,MN,56136,6.875,,,, +US-MN-56137,US,MN,56137,6.875,,,, +US-MN-56138,US,MN,56138,6.875,,,, +US-MN-56139,US,MN,56139,6.875,,,, +US-MN-56140,US,MN,56140,6.875,,,, +US-MN-56141,US,MN,56141,6.875,,,, +US-MN-56142,US,MN,56142,6.875,,,, +US-MN-56143,US,MN,56143,6.875,,,, +US-MN-56144,US,MN,56144,6.875,,,, +US-MN-56145,US,MN,56145,6.875,,,, +US-MN-56146,US,MN,56146,6.875,,,, +US-MN-56147,US,MN,56147,6.875,,,, +US-MN-56149,US,MN,56149,6.875,,,, +US-MN-56150,US,MN,56150,6.875,,,, +US-MN-56151,US,MN,56151,6.875,,,, +US-MN-56152,US,MN,56152,6.875,,,, +US-MN-56153,US,MN,56153,6.875,,,, +US-MN-56155,US,MN,56155,6.875,,,, +US-MN-56156,US,MN,56156,6.875,,,, +US-MN-56157,US,MN,56157,6.875,,,, +US-MN-56158,US,MN,56158,6.875,,,, +US-MN-56159,US,MN,56159,6.875,,,, +US-MN-56160,US,MN,56160,6.875,,,, +US-MN-56161,US,MN,56161,6.875,,,, +US-MN-56162,US,MN,56162,6.875,,,, +US-MN-56164,US,MN,56164,6.875,,,, +US-MN-56165,US,MN,56165,6.875,,,, +US-MN-56166,US,MN,56166,6.875,,,, +US-MN-56167,US,MN,56167,6.875,,,, +US-MN-56168,US,MN,56168,6.875,,,, +US-MN-56169,US,MN,56169,6.875,,,, +US-MN-56170,US,MN,56170,6.875,,,, +US-MN-56171,US,MN,56171,6.875,,,, +US-MN-56172,US,MN,56172,6.875,,,, +US-MN-56173,US,MN,56173,6.875,,,, +US-MN-56174,US,MN,56174,6.875,,,, +US-MN-56175,US,MN,56175,6.875,,,, +US-MN-56176,US,MN,56176,6.875,,,, +US-MN-56177,US,MN,56177,6.875,,,, +US-MN-56178,US,MN,56178,6.875,,,, +US-MN-56180,US,MN,56180,6.875,,,, +US-MN-56181,US,MN,56181,6.875,,,, +US-MN-56183,US,MN,56183,6.875,,,, +US-MN-56185,US,MN,56185,6.875,,,, +US-MN-56186,US,MN,56186,6.875,,,, +US-MN-56187,US,MN,56187,7.375,,,, +US-MN-56201,US,MN,56201,6.875,,,, +US-MN-56207,US,MN,56207,6.875,,,, +US-MN-56208,US,MN,56208,6.875,,,, +US-MN-56209,US,MN,56209,6.875,,,, +US-MN-56210,US,MN,56210,6.875,,,, +US-MN-56211,US,MN,56211,6.875,,,, +US-MN-56212,US,MN,56212,6.875,,,, +US-MN-56214,US,MN,56214,6.875,,,, +US-MN-56215,US,MN,56215,6.875,,,, +US-MN-56216,US,MN,56216,6.875,,,, +US-MN-56218,US,MN,56218,6.875,,,, +US-MN-56219,US,MN,56219,6.875,,,, +US-MN-56220,US,MN,56220,6.875,,,, +US-MN-56221,US,MN,56221,6.875,,,, +US-MN-56222,US,MN,56222,6.875,,,, +US-MN-56223,US,MN,56223,6.875,,,, +US-MN-56224,US,MN,56224,6.875,,,, +US-MN-56225,US,MN,56225,6.875,,,, +US-MN-56226,US,MN,56226,6.875,,,, +US-MN-56227,US,MN,56227,6.875,,,, +US-MN-56228,US,MN,56228,6.875,,,, +US-MN-56229,US,MN,56229,6.875,,,, +US-MN-56230,US,MN,56230,6.875,,,, +US-MN-56231,US,MN,56231,6.875,,,, +US-MN-56232,US,MN,56232,6.875,,,, +US-MN-56235,US,MN,56235,6.875,,,, +US-MN-56236,US,MN,56236,6.875,,,, +US-MN-56237,US,MN,56237,6.875,,,, +US-MN-56239,US,MN,56239,6.875,,,, +US-MN-56240,US,MN,56240,6.875,,,, +US-MN-56241,US,MN,56241,6.875,,,, +US-MN-56243,US,MN,56243,6.875,,,, +US-MN-56244,US,MN,56244,6.875,,,, +US-MN-56245,US,MN,56245,6.875,,,, +US-MN-56248,US,MN,56248,6.875,,,, +US-MN-56249,US,MN,56249,6.875,,,, +US-MN-56251,US,MN,56251,6.875,,,, +US-MN-56252,US,MN,56252,6.875,,,, +US-MN-56253,US,MN,56253,6.875,,,, +US-MN-56255,US,MN,56255,6.875,,,, +US-MN-56256,US,MN,56256,6.875,,,, +US-MN-56257,US,MN,56257,6.875,,,, +US-MN-56258,US,MN,56258,7.375,,,, +US-MN-56260,US,MN,56260,6.875,,,, +US-MN-56262,US,MN,56262,6.875,,,, +US-MN-56263,US,MN,56263,6.875,,,, +US-MN-56264,US,MN,56264,6.875,,,, +US-MN-56265,US,MN,56265,6.875,,,, +US-MN-56266,US,MN,56266,6.875,,,, +US-MN-56267,US,MN,56267,6.875,,,, +US-MN-56270,US,MN,56270,6.875,,,, +US-MN-56271,US,MN,56271,6.875,,,, +US-MN-56273,US,MN,56273,6.875,,,, +US-MN-56274,US,MN,56274,6.875,,,, +US-MN-56276,US,MN,56276,6.875,,,, +US-MN-56277,US,MN,56277,6.875,,,, +US-MN-56278,US,MN,56278,6.875,,,, +US-MN-56279,US,MN,56279,6.875,,,, +US-MN-56280,US,MN,56280,6.875,,,, +US-MN-56281,US,MN,56281,6.875,,,, +US-MN-56282,US,MN,56282,6.875,,,, +US-MN-56283,US,MN,56283,6.875,,,, +US-MN-56284,US,MN,56284,6.875,,,, +US-MN-56285,US,MN,56285,6.875,,,, +US-MN-56287,US,MN,56287,6.875,,,, +US-MN-56288,US,MN,56288,6.875,,,, +US-MN-56289,US,MN,56289,6.875,,,, +US-MN-56291,US,MN,56291,6.875,,,, +US-MN-56292,US,MN,56292,6.875,,,, +US-MN-56293,US,MN,56293,6.875,,,, +US-MN-56294,US,MN,56294,6.875,,,, +US-MN-56295,US,MN,56295,6.875,,,, +US-MN-56296,US,MN,56296,6.875,,,, +US-MN-56297,US,MN,56297,6.875,,,, +US-MN-56301,US,MN,56301,7.375,,,, +US-MN-56302,US,MN,56302,7.375,,,, +US-MN-56303,US,MN,56303,7.375,,,, +US-MN-56304,US,MN,56304,7.375,,,, +US-MN-56307,US,MN,56307,6.875,,,, +US-MN-56308,US,MN,56308,6.875,,,, +US-MN-56309,US,MN,56309,6.875,,,, +US-MN-56310,US,MN,56310,6.875,,,, +US-MN-56311,US,MN,56311,6.875,,,, +US-MN-56312,US,MN,56312,6.875,,,, +US-MN-56313,US,MN,56313,6.875,,,, +US-MN-56314,US,MN,56314,6.875,,,, +US-MN-56315,US,MN,56315,6.875,,,, +US-MN-56316,US,MN,56316,6.875,,,, +US-MN-56317,US,MN,56317,6.875,,,, +US-MN-56318,US,MN,56318,6.875,,,, +US-MN-56319,US,MN,56319,6.875,,,, +US-MN-56320,US,MN,56320,6.875,,,, +US-MN-56321,US,MN,56321,6.875,,,, +US-MN-56323,US,MN,56323,6.875,,,, +US-MN-56324,US,MN,56324,6.875,,,, +US-MN-56325,US,MN,56325,6.875,,,, +US-MN-56326,US,MN,56326,6.875,,,, +US-MN-56327,US,MN,56327,6.875,,,, +US-MN-56328,US,MN,56328,6.875,,,, +US-MN-56329,US,MN,56329,6.875,,,, +US-MN-56330,US,MN,56330,6.875,,,, +US-MN-56331,US,MN,56331,6.875,,,, +US-MN-56332,US,MN,56332,6.875,,,, +US-MN-56333,US,MN,56333,6.875,,,, +US-MN-56334,US,MN,56334,6.875,,,, +US-MN-56335,US,MN,56335,6.875,,,, +US-MN-56336,US,MN,56336,6.875,,,, +US-MN-56338,US,MN,56338,6.875,,,, +US-MN-56339,US,MN,56339,6.875,,,, +US-MN-56340,US,MN,56340,6.875,,,, +US-MN-56341,US,MN,56341,6.875,,,, +US-MN-56342,US,MN,56342,6.875,,,, +US-MN-56343,US,MN,56343,6.875,,,, +US-MN-56344,US,MN,56344,6.875,,,, +US-MN-56345,US,MN,56345,6.875,,,, +US-MN-56347,US,MN,56347,6.875,,,, +US-MN-56349,US,MN,56349,6.875,,,, +US-MN-56350,US,MN,56350,6.875,,,, +US-MN-56352,US,MN,56352,6.875,,,, +US-MN-56353,US,MN,56353,6.875,,,, +US-MN-56354,US,MN,56354,6.875,,,, +US-MN-56355,US,MN,56355,6.875,,,, +US-MN-56356,US,MN,56356,6.875,,,, +US-MN-56357,US,MN,56357,6.875,,,, +US-MN-56358,US,MN,56358,6.875,,,, +US-MN-56359,US,MN,56359,6.875,,,, +US-MN-56360,US,MN,56360,6.875,,,, +US-MN-56361,US,MN,56361,6.875,,,, +US-MN-56362,US,MN,56362,6.875,,,, +US-MN-56363,US,MN,56363,6.875,,,, +US-MN-56364,US,MN,56364,6.875,,,, +US-MN-56367,US,MN,56367,6.875,,,, +US-MN-56368,US,MN,56368,6.875,,,, +US-MN-56369,US,MN,56369,6.875,,,, +US-MN-56371,US,MN,56371,6.875,,,, +US-MN-56372,US,MN,56372,7.375,,,, +US-MN-56373,US,MN,56373,6.875,,,, +US-MN-56374,US,MN,56374,6.875,,,, +US-MN-56375,US,MN,56375,6.875,,,, +US-MN-56376,US,MN,56376,6.875,,,, +US-MN-56377,US,MN,56377,7.375,,,, +US-MN-56378,US,MN,56378,6.875,,,, +US-MN-56379,US,MN,56379,7.375,,,, +US-MN-56381,US,MN,56381,6.875,,,, +US-MN-56382,US,MN,56382,6.875,,,, +US-MN-56384,US,MN,56384,6.875,,,, +US-MN-56385,US,MN,56385,6.875,,,, +US-MN-56386,US,MN,56386,6.875,,,, +US-MN-56387,US,MN,56387,7.375,,,, +US-MN-56388,US,MN,56388,7.375,,,, +US-MN-56389,US,MN,56389,6.875,,,, +US-MN-56393,US,MN,56393,7.375,,,, +US-MN-56395,US,MN,56395,7.375,,,, +US-MN-56396,US,MN,56396,7.375,,,, +US-MN-56397,US,MN,56397,7.375,,,, +US-MN-56398,US,MN,56398,7.375,,,, +US-MN-56399,US,MN,56399,7.375,,,, +US-MN-56401,US,MN,56401,6.875,,,, +US-MN-56425,US,MN,56425,7.375,,,, +US-MN-56430,US,MN,56430,6.875,,,, +US-MN-56431,US,MN,56431,6.875,,,, +US-MN-56433,US,MN,56433,6.875,,,, +US-MN-56434,US,MN,56434,6.875,,,, +US-MN-56435,US,MN,56435,6.875,,,, +US-MN-56436,US,MN,56436,6.875,,,, +US-MN-56437,US,MN,56437,6.875,,,, +US-MN-56438,US,MN,56438,6.875,,,, +US-MN-56440,US,MN,56440,6.875,,,, +US-MN-56441,US,MN,56441,6.875,,,, +US-MN-56442,US,MN,56442,6.875,,,, +US-MN-56443,US,MN,56443,6.875,,,, +US-MN-56444,US,MN,56444,6.875,,,, +US-MN-56446,US,MN,56446,6.875,,,, +US-MN-56447,US,MN,56447,6.875,,,, +US-MN-56448,US,MN,56448,6.875,,,, +US-MN-56449,US,MN,56449,6.875,,,, +US-MN-56450,US,MN,56450,6.875,,,, +US-MN-56452,US,MN,56452,6.875,,,, +US-MN-56453,US,MN,56453,6.875,,,, +US-MN-56455,US,MN,56455,6.875,,,, +US-MN-56456,US,MN,56456,6.875,,,, +US-MN-56458,US,MN,56458,6.875,,,, +US-MN-56459,US,MN,56459,6.875,,,, +US-MN-56461,US,MN,56461,6.875,,,, +US-MN-56464,US,MN,56464,6.875,,,, +US-MN-56465,US,MN,56465,6.875,,,, +US-MN-56466,US,MN,56466,6.875,,,, +US-MN-56467,US,MN,56467,6.875,,,, +US-MN-56468,US,MN,56468,6.875,,,, +US-MN-56469,US,MN,56469,6.875,,,, +US-MN-56470,US,MN,56470,6.875,,,, +US-MN-56472,US,MN,56472,6.875,,,, +US-MN-56473,US,MN,56473,6.875,,,, +US-MN-56474,US,MN,56474,6.875,,,, +US-MN-56475,US,MN,56475,6.875,,,, +US-MN-56477,US,MN,56477,6.875,,,, +US-MN-56478,US,MN,56478,6.875,,,, +US-MN-56479,US,MN,56479,6.875,,,, +US-MN-56481,US,MN,56481,6.875,,,, +US-MN-56482,US,MN,56482,6.875,,,, +US-MN-56484,US,MN,56484,6.875,,,, +US-MN-56501,US,MN,56501,6.875,,,, +US-MN-56502,US,MN,56502,6.875,,,, +US-MN-56510,US,MN,56510,6.875,,,, +US-MN-56511,US,MN,56511,6.875,,,, +US-MN-56514,US,MN,56514,6.875,,,, +US-MN-56515,US,MN,56515,6.875,,,, +US-MN-56516,US,MN,56516,6.875,,,, +US-MN-56517,US,MN,56517,6.875,,,, +US-MN-56518,US,MN,56518,6.875,,,, +US-MN-56519,US,MN,56519,6.875,,,, +US-MN-56520,US,MN,56520,6.875,,,, +US-MN-56521,US,MN,56521,6.875,,,, +US-MN-56522,US,MN,56522,6.875,,,, +US-MN-56523,US,MN,56523,6.875,,,, +US-MN-56524,US,MN,56524,6.875,,,, +US-MN-56525,US,MN,56525,6.875,,,, +US-MN-56527,US,MN,56527,6.875,,,, +US-MN-56528,US,MN,56528,6.875,,,, +US-MN-56529,US,MN,56529,6.875,,,, +US-MN-56531,US,MN,56531,6.875,,,, +US-MN-56533,US,MN,56533,6.875,,,, +US-MN-56534,US,MN,56534,6.875,,,, +US-MN-56535,US,MN,56535,6.875,,,, +US-MN-56536,US,MN,56536,6.875,,,, +US-MN-56537,US,MN,56537,7.375,,,, +US-MN-56538,US,MN,56538,7.375,,,, +US-MN-56540,US,MN,56540,6.875,,,, +US-MN-56541,US,MN,56541,6.875,,,, +US-MN-56542,US,MN,56542,6.875,,,, +US-MN-56543,US,MN,56543,6.875,,,, +US-MN-56544,US,MN,56544,6.875,,,, +US-MN-56545,US,MN,56545,6.875,,,, +US-MN-56546,US,MN,56546,6.875,,,, +US-MN-56547,US,MN,56547,6.875,,,, +US-MN-56548,US,MN,56548,6.875,,,, +US-MN-56549,US,MN,56549,6.875,,,, +US-MN-56550,US,MN,56550,6.875,,,, +US-MN-56551,US,MN,56551,6.875,,,, +US-MN-56552,US,MN,56552,6.875,,,, +US-MN-56553,US,MN,56553,6.875,,,, +US-MN-56554,US,MN,56554,6.875,,,, +US-MN-56556,US,MN,56556,6.875,,,, +US-MN-56557,US,MN,56557,6.875,,,, +US-MN-56560,US,MN,56560,6.875,,,, +US-MN-56561,US,MN,56561,6.875,,,, +US-MN-56562,US,MN,56562,6.875,,,, +US-MN-56563,US,MN,56563,6.875,,,, +US-MN-56565,US,MN,56565,6.875,,,, +US-MN-56566,US,MN,56566,6.875,,,, +US-MN-56567,US,MN,56567,6.875,,,, +US-MN-56568,US,MN,56568,6.875,,,, +US-MN-56569,US,MN,56569,6.875,,,, +US-MN-56570,US,MN,56570,6.875,,,, +US-MN-56571,US,MN,56571,6.875,,,, +US-MN-56572,US,MN,56572,6.875,,,, +US-MN-56573,US,MN,56573,6.875,,,, +US-MN-56574,US,MN,56574,6.875,,,, +US-MN-56575,US,MN,56575,6.875,,,, +US-MN-56576,US,MN,56576,6.875,,,, +US-MN-56577,US,MN,56577,6.875,,,, +US-MN-56578,US,MN,56578,6.875,,,, +US-MN-56579,US,MN,56579,6.875,,,, +US-MN-56580,US,MN,56580,6.875,,,, +US-MN-56581,US,MN,56581,6.875,,,, +US-MN-56583,US,MN,56583,6.875,,,, +US-MN-56584,US,MN,56584,6.875,,,, +US-MN-56585,US,MN,56585,6.875,,,, +US-MN-56586,US,MN,56586,6.875,,,, +US-MN-56587,US,MN,56587,6.875,,,, +US-MN-56588,US,MN,56588,6.875,,,, +US-MN-56589,US,MN,56589,6.875,,,, +US-MN-56590,US,MN,56590,6.875,,,, +US-MN-56591,US,MN,56591,6.875,,,, +US-MN-56592,US,MN,56592,6.875,,,, +US-MN-56593,US,MN,56593,6.875,,,, +US-MN-56594,US,MN,56594,6.875,,,, +US-MN-56601,US,MN,56601,6.875,,,, +US-MN-56619,US,MN,56619,7.375,,,, +US-MN-56621,US,MN,56621,6.875,,,, +US-MN-56623,US,MN,56623,6.875,,,, +US-MN-56626,US,MN,56626,6.875,,,, +US-MN-56627,US,MN,56627,6.875,,,, +US-MN-56628,US,MN,56628,6.875,,,, +US-MN-56629,US,MN,56629,6.875,,,, +US-MN-56630,US,MN,56630,6.875,,,, +US-MN-56631,US,MN,56631,7.375,,,, +US-MN-56633,US,MN,56633,6.875,,,, +US-MN-56634,US,MN,56634,6.875,,,, +US-MN-56636,US,MN,56636,6.875,,,, +US-MN-56637,US,MN,56637,6.875,,,, +US-MN-56639,US,MN,56639,6.875,,,, +US-MN-56641,US,MN,56641,6.875,,,, +US-MN-56644,US,MN,56644,6.875,,,, +US-MN-56646,US,MN,56646,6.875,,,, +US-MN-56647,US,MN,56647,6.875,,,, +US-MN-56649,US,MN,56649,6.875,,,, +US-MN-56650,US,MN,56650,6.875,,,, +US-MN-56651,US,MN,56651,6.875,,,, +US-MN-56652,US,MN,56652,6.875,,,, +US-MN-56653,US,MN,56653,6.875,,,, +US-MN-56654,US,MN,56654,6.875,,,, +US-MN-56655,US,MN,56655,6.875,,,, +US-MN-56657,US,MN,56657,6.875,,,, +US-MN-56658,US,MN,56658,6.875,,,, +US-MN-56659,US,MN,56659,6.875,,,, +US-MN-56660,US,MN,56660,6.875,,,, +US-MN-56661,US,MN,56661,6.875,,,, +US-MN-56662,US,MN,56662,6.875,,,, +US-MN-56663,US,MN,56663,6.875,,,, +US-MN-56666,US,MN,56666,6.875,,,, +US-MN-56667,US,MN,56667,6.875,,,, +US-MN-56668,US,MN,56668,6.875,,,, +US-MN-56669,US,MN,56669,6.875,,,, +US-MN-56670,US,MN,56670,6.875,,,, +US-MN-56671,US,MN,56671,6.875,,,, +US-MN-56672,US,MN,56672,6.875,,,, +US-MN-56673,US,MN,56673,6.875,,,, +US-MN-56676,US,MN,56676,6.875,,,, +US-MN-56678,US,MN,56678,6.875,,,, +US-MN-56679,US,MN,56679,6.875,,,, +US-MN-56680,US,MN,56680,6.875,,,, +US-MN-56681,US,MN,56681,6.875,,,, +US-MN-56682,US,MN,56682,6.875,,,, +US-MN-56683,US,MN,56683,6.875,,,, +US-MN-56684,US,MN,56684,6.875,,,, +US-MN-56685,US,MN,56685,6.875,,,, +US-MN-56686,US,MN,56686,6.875,,,, +US-MN-56687,US,MN,56687,6.875,,,, +US-MN-56688,US,MN,56688,6.875,,,, +US-MN-56701,US,MN,56701,6.875,,,, +US-MN-56710,US,MN,56710,6.875,,,, +US-MN-56711,US,MN,56711,6.875,,,, +US-MN-56713,US,MN,56713,6.875,,,, +US-MN-56714,US,MN,56714,6.875,,,, +US-MN-56715,US,MN,56715,6.875,,,, +US-MN-56716,US,MN,56716,6.875,,,, +US-MN-56720,US,MN,56720,6.875,,,, +US-MN-56721,US,MN,56721,6.875,,,, +US-MN-56722,US,MN,56722,6.875,,,, +US-MN-56723,US,MN,56723,6.875,,,, +US-MN-56724,US,MN,56724,6.875,,,, +US-MN-56725,US,MN,56725,6.875,,,, +US-MN-56726,US,MN,56726,6.875,,,, +US-MN-56727,US,MN,56727,6.875,,,, +US-MN-56728,US,MN,56728,6.875,,,, +US-MN-56729,US,MN,56729,6.875,,,, +US-MN-56731,US,MN,56731,6.875,,,, +US-MN-56732,US,MN,56732,6.875,,,, +US-MN-56733,US,MN,56733,6.875,,,, +US-MN-56734,US,MN,56734,6.875,,,, +US-MN-56735,US,MN,56735,6.875,,,, +US-MN-56736,US,MN,56736,6.875,,,, +US-MN-56737,US,MN,56737,6.875,,,, +US-MN-56738,US,MN,56738,6.875,,,, +US-MN-56740,US,MN,56740,6.875,,,, +US-MN-56741,US,MN,56741,6.875,,,, +US-MN-56742,US,MN,56742,6.875,,,, +US-MN-56744,US,MN,56744,6.875,,,, +US-MN-56748,US,MN,56748,6.875,,,, +US-MN-56750,US,MN,56750,6.875,,,, +US-MN-56751,US,MN,56751,6.875,,,, +US-MN-56754,US,MN,56754,6.875,,,, +US-MN-56755,US,MN,56755,6.875,,,, +US-MN-56756,US,MN,56756,6.875,,,, +US-MN-56757,US,MN,56757,6.875,,,, +US-MN-56758,US,MN,56758,6.875,,,, +US-MN-56759,US,MN,56759,6.875,,,, +US-MN-56760,US,MN,56760,6.875,,,, +US-MN-56761,US,MN,56761,6.875,,,, +US-MN-56762,US,MN,56762,6.875,,,, +US-MN-56763,US,MN,56763,6.875,,,, +US-MO-63005,US,MO,63005,8.113,,,, +US-MO-63006,US,MO,63006,8.113,,,, +US-MO-63010,US,MO,63010,8.35,,,, +US-MO-63011,US,MO,63011,8.113,,,, +US-MO-63012,US,MO,63012,7.1,,,, +US-MO-63013,US,MO,63013,6.475,,,, +US-MO-63014,US,MO,63014,6.475,,,, +US-MO-63015,US,MO,63015,6.475,,,, +US-MO-63016,US,MO,63016,6.85,,,, +US-MO-63017,US,MO,63017,8.113,,,, +US-MO-63019,US,MO,63019,8.6,,,, +US-MO-63020,US,MO,63020,6.35,,,, +US-MO-63021,US,MO,63021,7.113,,,, +US-MO-63022,US,MO,63022,8.113,,,, +US-MO-63023,US,MO,63023,6.85,,,, +US-MO-63024,US,MO,63024,8.113,,,, +US-MO-63025,US,MO,63025,8.113,,,, +US-MO-63026,US,MO,63026,7.113,,,, +US-MO-63028,US,MO,63028,6.85,,,, +US-MO-63030,US,MO,63030,6.35,,,, +US-MO-63031,US,MO,63031,8.113,,,, +US-MO-63032,US,MO,63032,8.113,,,, +US-MO-63033,US,MO,63033,8.113,,,, +US-MO-63034,US,MO,63034,7.113,,,, +US-MO-63036,US,MO,63036,5.975,,,, +US-MO-63037,US,MO,63037,6.475,,,, +US-MO-63038,US,MO,63038,7.613,,,, +US-MO-63039,US,MO,63039,6.475,,,, +US-MO-63040,US,MO,63040,7.613,,,, +US-MO-63041,US,MO,63041,6.975,,,, +US-MO-63042,US,MO,63042,8.613,,,, +US-MO-63043,US,MO,63043,7.613,,,, +US-MO-63044,US,MO,63044,8.113,,,, +US-MO-63045,US,MO,63045,7.113,,,, +US-MO-63047,US,MO,63047,6.85,,,, +US-MO-63048,US,MO,63048,9.35,,,, +US-MO-63049,US,MO,63049,6.85,,,, +US-MO-63050,US,MO,63050,6.35,,,, +US-MO-63051,US,MO,63051,7.35,,,, +US-MO-63052,US,MO,63052,7.1,,,, +US-MO-63053,US,MO,63053,8.6,,,, +US-MO-63055,US,MO,63055,6.475,,,, +US-MO-63056,US,MO,63056,6.475,,,, +US-MO-63057,US,MO,63057,7.1,,,, +US-MO-63060,US,MO,63060,6.975,,,, +US-MO-63061,US,MO,63061,6.975,,,, +US-MO-63065,US,MO,63065,6.85,,,, +US-MO-63066,US,MO,63066,6.85,,,, +US-MO-63068,US,MO,63068,6.475,,,, +US-MO-63069,US,MO,63069,7.975,,,, +US-MO-63070,US,MO,63070,8.85,,,, +US-MO-63071,US,MO,63071,7.225,,,, +US-MO-63072,US,MO,63072,6.475,,,, +US-MO-63073,US,MO,63073,6.475,,,, +US-MO-63074,US,MO,63074,8.863,,,, +US-MO-63077,US,MO,63077,6.975,,,, +US-MO-63079,US,MO,63079,6.475,,,, +US-MO-63080,US,MO,63080,8.475,,,, +US-MO-63084,US,MO,63084,8.475,,,, +US-MO-63087,US,MO,63087,5.975,,,, +US-MO-63088,US,MO,63088,8.113,,,, +US-MO-63089,US,MO,63089,6.475,,,, +US-MO-63090,US,MO,63090,8.35,,,, +US-MO-63091,US,MO,63091,7.6,,,, +US-MO-63099,US,MO,63099,7.113,,,, +US-MO-63101,US,MO,63101,8.679,,,, +US-MO-63102,US,MO,63102,8.679,,,, +US-MO-63103,US,MO,63103,8.679,,,, +US-MO-63104,US,MO,63104,8.679,,,, +US-MO-63105,US,MO,63105,8.363,,,, +US-MO-63106,US,MO,63106,8.679,,,, +US-MO-63107,US,MO,63107,8.679,,,, +US-MO-63108,US,MO,63108,8.679,,,, +US-MO-63109,US,MO,63109,8.679,,,, +US-MO-63110,US,MO,63110,8.679,,,, +US-MO-63111,US,MO,63111,8.679,,,, +US-MO-63112,US,MO,63112,8.679,,,, +US-MO-63113,US,MO,63113,8.679,,,, +US-MO-63114,US,MO,63114,7.863,,,, +US-MO-63115,US,MO,63115,8.679,,,, +US-MO-63116,US,MO,63116,8.679,,,, +US-MO-63117,US,MO,63117,8.613,,,, +US-MO-63118,US,MO,63118,8.679,,,, +US-MO-63119,US,MO,63119,8.613,,,, +US-MO-63120,US,MO,63120,8.679,,,, +US-MO-63121,US,MO,63121,8.613,,,, +US-MO-63122,US,MO,63122,8.363,,,, +US-MO-63123,US,MO,63123,7.113,,,, +US-MO-63124,US,MO,63124,8.363,,,, +US-MO-63125,US,MO,63125,7.113,,,, +US-MO-63126,US,MO,63126,8.613,,,, +US-MO-63127,US,MO,63127,8.363,,,, +US-MO-63128,US,MO,63128,7.113,,,, +US-MO-63129,US,MO,63129,7.113,,,, +US-MO-63130,US,MO,63130,8.613,,,, +US-MO-63131,US,MO,63131,8.613,,,, +US-MO-63132,US,MO,63132,8.613,,,, +US-MO-63133,US,MO,63133,7.863,,,, +US-MO-63134,US,MO,63134,9.113,,,, +US-MO-63135,US,MO,63135,8.613,,,, +US-MO-63136,US,MO,63136,7.113,,,, +US-MO-63137,US,MO,63137,7.613,,,, +US-MO-63138,US,MO,63138,7.113,,,, +US-MO-63139,US,MO,63139,8.679,,,, +US-MO-63140,US,MO,63140,8.363,,,, +US-MO-63141,US,MO,63141,7.863,,,, +US-MO-63143,US,MO,63143,8.613,,,, +US-MO-63144,US,MO,63144,8.613,,,, +US-MO-63145,US,MO,63145,9.113,,,, +US-MO-63146,US,MO,63146,7.113,,,, +US-MO-63147,US,MO,63147,8.679,,,, +US-MO-63150,US,MO,63150,8.679,,,, +US-MO-63151,US,MO,63151,7.113,,,, +US-MO-63155,US,MO,63155,8.679,,,, +US-MO-63156,US,MO,63156,8.679,,,, +US-MO-63157,US,MO,63157,8.679,,,, +US-MO-63158,US,MO,63158,8.679,,,, +US-MO-63160,US,MO,63160,8.679,,,, +US-MO-63163,US,MO,63163,8.679,,,, +US-MO-63166,US,MO,63166,8.679,,,, +US-MO-63167,US,MO,63167,7.863,,,, +US-MO-63169,US,MO,63169,8.679,,,, +US-MO-63171,US,MO,63171,8.679,,,, +US-MO-63177,US,MO,63177,8.679,,,, +US-MO-63178,US,MO,63178,8.679,,,, +US-MO-63179,US,MO,63179,8.679,,,, +US-MO-63180,US,MO,63180,8.679,,,, +US-MO-63182,US,MO,63182,8.679,,,, +US-MO-63188,US,MO,63188,8.679,,,, +US-MO-63195,US,MO,63195,8.679,,,, +US-MO-63197,US,MO,63197,8.679,,,, +US-MO-63199,US,MO,63199,8.679,,,, +US-MO-63301,US,MO,63301,7.45,,,, +US-MO-63302,US,MO,63302,7.45,,,, +US-MO-63303,US,MO,63303,7.45,,,, +US-MO-63304,US,MO,63304,5.95,,,, +US-MO-63330,US,MO,63330,6.225,,,, +US-MO-63332,US,MO,63332,5.95,,,, +US-MO-63333,US,MO,63333,5.975,,,, +US-MO-63334,US,MO,63334,6.225,,,, +US-MO-63336,US,MO,63336,6.225,,,, +US-MO-63338,US,MO,63338,8.95,,,, +US-MO-63339,US,MO,63339,6.225,,,, +US-MO-63341,US,MO,63341,5.95,,,, +US-MO-63342,US,MO,63342,6.225,,,, +US-MO-63343,US,MO,63343,6.475,,,, +US-MO-63344,US,MO,63344,6.225,,,, +US-MO-63345,US,MO,63345,7.6,,,, +US-MO-63346,US,MO,63346,6.95,,,, +US-MO-63347,US,MO,63347,6.475,,,, +US-MO-63348,US,MO,63348,5.95,,,, +US-MO-63349,US,MO,63349,6.475,,,, +US-MO-63350,US,MO,63350,5.975,,,, +US-MO-63351,US,MO,63351,6.225,,,, +US-MO-63352,US,MO,63352,6.6,,,, +US-MO-63353,US,MO,63353,7.725,,,, +US-MO-63357,US,MO,63357,6.225,,,, +US-MO-63359,US,MO,63359,6.225,,,, +US-MO-63361,US,MO,63361,7.475,,,, +US-MO-63362,US,MO,63362,6.475,,,, +US-MO-63363,US,MO,63363,5.975,,,, +US-MO-63365,US,MO,63365,7.95,,,, +US-MO-63366,US,MO,63366,7.95,,,, +US-MO-63367,US,MO,63367,7.45,,,, +US-MO-63368,US,MO,63368,7.95,,,, +US-MO-63369,US,MO,63369,6.475,,,, +US-MO-63370,US,MO,63370,7.475,,,, +US-MO-63373,US,MO,63373,5.95,,,, +US-MO-63376,US,MO,63376,7.95,,,, +US-MO-63377,US,MO,63377,6.475,,,, +US-MO-63378,US,MO,63378,7.725,,,, +US-MO-63379,US,MO,63379,6.475,,,, +US-MO-63381,US,MO,63381,6.225,,,, +US-MO-63382,US,MO,63382,8.1,,,, +US-MO-63383,US,MO,63383,6.225,,,, +US-MO-63384,US,MO,63384,7.725,,,, +US-MO-63385,US,MO,63385,8.45,,,, +US-MO-63386,US,MO,63386,6.95,,,, +US-MO-63387,US,MO,63387,6.475,,,, +US-MO-63388,US,MO,63388,5.725,,,, +US-MO-63389,US,MO,63389,6.475,,,, +US-MO-63390,US,MO,63390,6.225,,,, +US-MO-63401,US,MO,63401,8.6,,,, +US-MO-63430,US,MO,63430,7.225,,,, +US-MO-63431,US,MO,63431,6.35,,,, +US-MO-63432,US,MO,63432,5.475,,,, +US-MO-63433,US,MO,63433,6.225,,,, +US-MO-63434,US,MO,63434,6.725,,,, +US-MO-63435,US,MO,63435,8.975,,,, +US-MO-63436,US,MO,63436,6.225,,,, +US-MO-63437,US,MO,63437,6.725,,,, +US-MO-63438,US,MO,63438,7.35,,,, +US-MO-63439,US,MO,63439,6.725,,,, +US-MO-63440,US,MO,63440,7.35,,,, +US-MO-63441,US,MO,63441,6.225,,,, +US-MO-63443,US,MO,63443,7.725,,,, +US-MO-63445,US,MO,63445,7.225,,,, +US-MO-63446,US,MO,63446,6.225,,,, +US-MO-63447,US,MO,63447,7.35,,,, +US-MO-63448,US,MO,63448,8.35,,,, +US-MO-63450,US,MO,63450,6.725,,,, +US-MO-63451,US,MO,63451,6.725,,,, +US-MO-63452,US,MO,63452,7.35,,,, +US-MO-63453,US,MO,63453,6.225,,,, +US-MO-63454,US,MO,63454,6.35,,,, +US-MO-63456,US,MO,63456,8.225,,,, +US-MO-63457,US,MO,63457,7.35,,,, +US-MO-63458,US,MO,63458,6.225,,,, +US-MO-63459,US,MO,63459,6.225,,,, +US-MO-63460,US,MO,63460,6.225,,,, +US-MO-63461,US,MO,63461,8.1,,,, +US-MO-63462,US,MO,63462,6.225,,,, +US-MO-63463,US,MO,63463,6.35,,,, +US-MO-63464,US,MO,63464,6.225,,,, +US-MO-63465,US,MO,63465,6.225,,,, +US-MO-63466,US,MO,63466,6.225,,,, +US-MO-63467,US,MO,63467,6.225,,,, +US-MO-63468,US,MO,63468,8.475,,,, +US-MO-63469,US,MO,63469,6.725,,,, +US-MO-63471,US,MO,63471,6.35,,,, +US-MO-63472,US,MO,63472,7.225,,,, +US-MO-63473,US,MO,63473,7.35,,,, +US-MO-63474,US,MO,63474,7.225,,,, +US-MO-63501,US,MO,63501,7.85,,,, +US-MO-63530,US,MO,63530,6.35,,,, +US-MO-63531,US,MO,63531,6.225,,,, +US-MO-63532,US,MO,63532,6.35,,,, +US-MO-63533,US,MO,63533,5.6,,,, +US-MO-63534,US,MO,63534,6.35,,,, +US-MO-63535,US,MO,63535,6.225,,,, +US-MO-63536,US,MO,63536,6.225,,,, +US-MO-63537,US,MO,63537,7.225,,,, +US-MO-63538,US,MO,63538,6.35,,,, +US-MO-63539,US,MO,63539,6.35,,,, +US-MO-63540,US,MO,63540,5.6,,,, +US-MO-63541,US,MO,63541,6.225,,,, +US-MO-63543,US,MO,63543,5.475,,,, +US-MO-63544,US,MO,63544,5.6,,,, +US-MO-63545,US,MO,63545,6.975,,,, +US-MO-63546,US,MO,63546,5.6,,,, +US-MO-63547,US,MO,63547,6.225,,,, +US-MO-63548,US,MO,63548,7.225,,,, +US-MO-63549,US,MO,63549,7.85,,,, +US-MO-63551,US,MO,63551,6.225,,,, +US-MO-63552,US,MO,63552,7.85,,,, +US-MO-63555,US,MO,63555,6.475,,,, +US-MO-63556,US,MO,63556,6.975,,,, +US-MO-63557,US,MO,63557,6.225,,,, +US-MO-63558,US,MO,63558,6.35,,,, +US-MO-63559,US,MO,63559,5.6,,,, +US-MO-63560,US,MO,63560,6.975,,,, +US-MO-63561,US,MO,63561,8.725,,,, +US-MO-63563,US,MO,63563,6.475,,,, +US-MO-63565,US,MO,63565,6.225,,,, +US-MO-63566,US,MO,63566,6.975,,,, +US-MO-63567,US,MO,63567,6.225,,,, +US-MO-63601,US,MO,63601,8.475,,,, +US-MO-63620,US,MO,63620,8.225,,,, +US-MO-63621,US,MO,63621,7.475,,,, +US-MO-63622,US,MO,63622,7.225,,,, +US-MO-63623,US,MO,63623,6.225,,,, +US-MO-63624,US,MO,63624,7.475,,,, +US-MO-63625,US,MO,63625,5.225,,,, +US-MO-63626,US,MO,63626,7.225,,,, +US-MO-63627,US,MO,63627,6.725,,,, +US-MO-63628,US,MO,63628,5.975,,,, +US-MO-63629,US,MO,63629,5.225,,,, +US-MO-63630,US,MO,63630,7.225,,,, +US-MO-63631,US,MO,63631,7.225,,,, +US-MO-63632,US,MO,63632,5.725,,,, +US-MO-63633,US,MO,63633,5.225,,,, +US-MO-63636,US,MO,63636,6.225,,,, +US-MO-63637,US,MO,63637,5.975,,,, +US-MO-63638,US,MO,63638,8.225,,,, +US-MO-63640,US,MO,63640,7.975,,,, +US-MO-63645,US,MO,63645,6.225,,,, +US-MO-63648,US,MO,63648,7.225,,,, +US-MO-63650,US,MO,63650,8.225,,,, +US-MO-63651,US,MO,63651,5.975,,,, +US-MO-63653,US,MO,63653,6.975,,,, +US-MO-63654,US,MO,63654,5.225,,,, +US-MO-63655,US,MO,63655,6.225,,,, +US-MO-63656,US,MO,63656,6.225,,,, +US-MO-63660,US,MO,63660,7.225,,,, +US-MO-63662,US,MO,63662,5.85,,,, +US-MO-63663,US,MO,63663,8.225,,,, +US-MO-63664,US,MO,63664,7.225,,,, +US-MO-63665,US,MO,63665,5.225,,,, +US-MO-63666,US,MO,63666,5.225,,,, +US-MO-63670,US,MO,63670,6.725,,,, +US-MO-63673,US,MO,63673,6.725,,,, +US-MO-63674,US,MO,63674,7.225,,,, +US-MO-63675,US,MO,63675,6.225,,,, +US-MO-63701,US,MO,63701,7.975,,,, +US-MO-63702,US,MO,63702,7.975,,,, +US-MO-63703,US,MO,63703,7.975,,,, +US-MO-63730,US,MO,63730,5.225,,,, +US-MO-63732,US,MO,63732,5.225,,,, +US-MO-63735,US,MO,63735,5.225,,,, +US-MO-63736,US,MO,63736,5.225,,,, +US-MO-63737,US,MO,63737,6.1,,,, +US-MO-63738,US,MO,63738,5.225,,,, +US-MO-63739,US,MO,63739,5.225,,,, +US-MO-63740,US,MO,63740,6.975,,,, +US-MO-63742,US,MO,63742,5.225,,,, +US-MO-63743,US,MO,63743,5.225,,,, +US-MO-63744,US,MO,63744,6.725,,,, +US-MO-63745,US,MO,63745,6.225,,,, +US-MO-63746,US,MO,63746,6.1,,,, +US-MO-63747,US,MO,63747,5.225,,,, +US-MO-63748,US,MO,63748,6.1,,,, +US-MO-63750,US,MO,63750,5.85,,,, +US-MO-63751,US,MO,63751,5.85,,,, +US-MO-63752,US,MO,63752,5.725,,,, +US-MO-63755,US,MO,63755,7.225,,,, +US-MO-63758,US,MO,63758,6.225,,,, +US-MO-63760,US,MO,63760,5.85,,,, +US-MO-63763,US,MO,63763,5.725,,,, +US-MO-63764,US,MO,63764,7.85,,,, +US-MO-63766,US,MO,63766,5.225,,,, +US-MO-63767,US,MO,63767,6.225,,,, +US-MO-63769,US,MO,63769,5.225,,,, +US-MO-63770,US,MO,63770,6.1,,,, +US-MO-63771,US,MO,63771,5.225,,,, +US-MO-63774,US,MO,63774,5.225,,,, +US-MO-63775,US,MO,63775,6.1,,,, +US-MO-63776,US,MO,63776,7.975,,,, +US-MO-63779,US,MO,63779,5.225,,,, +US-MO-63780,US,MO,63780,6.975,,,, +US-MO-63781,US,MO,63781,5.85,,,, +US-MO-63782,US,MO,63782,5.85,,,, +US-MO-63783,US,MO,63783,6.1,,,, +US-MO-63784,US,MO,63784,5.225,,,, +US-MO-63785,US,MO,63785,5.225,,,, +US-MO-63787,US,MO,63787,5.85,,,, +US-MO-63801,US,MO,63801,7.725,,,, +US-MO-63820,US,MO,63820,5.975,,,, +US-MO-63821,US,MO,63821,5.225,,,, +US-MO-63822,US,MO,63822,6.725,,,, +US-MO-63823,US,MO,63823,6.975,,,, +US-MO-63824,US,MO,63824,5.225,,,, +US-MO-63825,US,MO,63825,5.225,,,, +US-MO-63826,US,MO,63826,5.475,,,, +US-MO-63827,US,MO,63827,5.475,,,, +US-MO-63828,US,MO,63828,5.475,,,, +US-MO-63829,US,MO,63829,6.225,,,, +US-MO-63830,US,MO,63830,6.975,,,, +US-MO-63833,US,MO,63833,5.225,,,, +US-MO-63834,US,MO,63834,7.475,,,, +US-MO-63837,US,MO,63837,5.225,,,, +US-MO-63839,US,MO,63839,5.475,,,, +US-MO-63840,US,MO,63840,5.475,,,, +US-MO-63841,US,MO,63841,7.1,,,, +US-MO-63845,US,MO,63845,8.475,,,, +US-MO-63846,US,MO,63846,5.225,,,, +US-MO-63847,US,MO,63847,5.225,,,, +US-MO-63848,US,MO,63848,6.475,,,, +US-MO-63849,US,MO,63849,5.225,,,, +US-MO-63850,US,MO,63850,5.225,,,, +US-MO-63851,US,MO,63851,7.725,,,, +US-MO-63852,US,MO,63852,5.225,,,, +US-MO-63853,US,MO,63853,5.475,,,, +US-MO-63855,US,MO,63855,5.225,,,, +US-MO-63857,US,MO,63857,7.975,,,, +US-MO-63860,US,MO,63860,5.475,,,, +US-MO-63862,US,MO,63862,5.475,,,, +US-MO-63863,US,MO,63863,6.975,,,, +US-MO-63866,US,MO,63866,7.975,,,, +US-MO-63867,US,MO,63867,5.475,,,, +US-MO-63868,US,MO,63868,6.475,,,, +US-MO-63869,US,MO,63869,7.975,,,, +US-MO-63870,US,MO,63870,5.475,,,, +US-MO-63873,US,MO,63873,6.975,,,, +US-MO-63874,US,MO,63874,6.475,,,, +US-MO-63876,US,MO,63876,5.225,,,, +US-MO-63877,US,MO,63877,5.475,,,, +US-MO-63878,US,MO,63878,5.475,,,, +US-MO-63879,US,MO,63879,6.725,,,, +US-MO-63880,US,MO,63880,5.225,,,, +US-MO-63881,US,MO,63881,8.475,,,, +US-MO-63882,US,MO,63882,6.975,,,, +US-MO-63901,US,MO,63901,5.225,,,, +US-MO-63902,US,MO,63902,7.725,,,, +US-MO-63931,US,MO,63931,7.225,,,, +US-MO-63932,US,MO,63932,5.225,,,, +US-MO-63933,US,MO,63933,5.225,,,, +US-MO-63935,US,MO,63935,7.225,,,, +US-MO-63936,US,MO,63936,5.225,,,, +US-MO-63937,US,MO,63937,6.725,,,, +US-MO-63938,US,MO,63938,6.725,,,, +US-MO-63939,US,MO,63939,5.725,,,, +US-MO-63940,US,MO,63940,5.225,,,, +US-MO-63941,US,MO,63941,5.225,,,, +US-MO-63943,US,MO,63943,6.225,,,, +US-MO-63944,US,MO,63944,7.725,,,, +US-MO-63945,US,MO,63945,5.225,,,, +US-MO-63950,US,MO,63950,5.725,,,, +US-MO-63951,US,MO,63951,5.725,,,, +US-MO-63952,US,MO,63952,6.725,,,, +US-MO-63953,US,MO,63953,7.725,,,, +US-MO-63954,US,MO,63954,5.225,,,, +US-MO-63955,US,MO,63955,5.725,,,, +US-MO-63956,US,MO,63956,5.725,,,, +US-MO-63957,US,MO,63957,8.225,,,, +US-MO-63960,US,MO,63960,5.225,,,, +US-MO-63961,US,MO,63961,5.225,,,, +US-MO-63962,US,MO,63962,7.725,,,, +US-MO-63964,US,MO,63964,5.725,,,, +US-MO-63965,US,MO,63965,6.725,,,, +US-MO-63966,US,MO,63966,5.225,,,, +US-MO-63967,US,MO,63967,7.225,,,, +US-MO-64001,US,MO,64001,5.85,,,, +US-MO-64002,US,MO,64002,7.725,,,, +US-MO-64011,US,MO,64011,6.35,,,, +US-MO-64012,US,MO,64012,8.725,,,, +US-MO-64013,US,MO,64013,7.975,,,, +US-MO-64014,US,MO,64014,7.975,,,, +US-MO-64015,US,MO,64015,7.975,,,, +US-MO-64016,US,MO,64016,5.475,,,, +US-MO-64017,US,MO,64017,6.225,,,, +US-MO-64018,US,MO,64018,5.6,,,, +US-MO-64019,US,MO,64019,6.475,,,, +US-MO-64020,US,MO,64020,8.1,,,, +US-MO-64021,US,MO,64021,5.85,,,, +US-MO-64022,US,MO,64022,5.85,,,, +US-MO-64024,US,MO,64024,7.725,,,, +US-MO-64028,US,MO,64028,5.6,,,, +US-MO-64029,US,MO,64029,8.475,,,, +US-MO-64030,US,MO,64030,7.975,,,, +US-MO-64034,US,MO,64034,7.475,,,, +US-MO-64035,US,MO,64035,6.225,,,, +US-MO-64036,US,MO,64036,8.225,,,, +US-MO-64037,US,MO,64037,8.1,,,, +US-MO-64040,US,MO,64040,7.975,,,, +US-MO-64048,US,MO,64048,5.225,,,, +US-MO-64050,US,MO,64050,7.725,,,, +US-MO-64051,US,MO,64051,7.725,,,, +US-MO-64052,US,MO,64052,7.725,,,, +US-MO-64053,US,MO,64053,7.725,,,, +US-MO-64054,US,MO,64054,7.475,,,, +US-MO-64055,US,MO,64055,7.725,,,, +US-MO-64056,US,MO,64056,7.725,,,, +US-MO-64057,US,MO,64057,7.725,,,, +US-MO-64058,US,MO,64058,5.475,,,, +US-MO-64060,US,MO,64060,7.225,,,, +US-MO-64061,US,MO,64061,6.475,,,, +US-MO-64062,US,MO,64062,5.725,,,, +US-MO-64063,US,MO,64063,7.725,,,, +US-MO-64064,US,MO,64064,7.725,,,, +US-MO-64065,US,MO,64065,7.725,,,, +US-MO-64066,US,MO,64066,6.475,,,, +US-MO-64067,US,MO,64067,8.35,,,, +US-MO-64068,US,MO,64068,7.725,,,, +US-MO-64069,US,MO,64069,7.725,,,, +US-MO-64070,US,MO,64070,5.475,,,, +US-MO-64071,US,MO,64071,5.85,,,, +US-MO-64072,US,MO,64072,5.225,,,, +US-MO-64073,US,MO,64073,7.725,,,, +US-MO-64074,US,MO,64074,5.85,,,, +US-MO-64075,US,MO,64075,7.975,,,, +US-MO-64076,US,MO,64076,5.85,,,, +US-MO-64077,US,MO,64077,6.725,,,, +US-MO-64078,US,MO,64078,5.975,,,, +US-MO-64079,US,MO,64079,5.6,,,, +US-MO-64080,US,MO,64080,5.975,,,, +US-MO-64081,US,MO,64081,7.725,,,, +US-MO-64082,US,MO,64082,7.725,,,, +US-MO-64083,US,MO,64083,8.975,,,, +US-MO-64084,US,MO,64084,6.225,,,, +US-MO-64085,US,MO,64085,8.225,,,, +US-MO-64086,US,MO,64086,7.725,,,, +US-MO-64088,US,MO,64088,5.475,,,, +US-MO-64089,US,MO,64089,7.225,,,, +US-MO-64090,US,MO,64090,6.975,,,, +US-MO-64092,US,MO,64092,5.6,,,, +US-MO-64093,US,MO,64093,8.35,,,, +US-MO-64096,US,MO,64096,8.35,,,, +US-MO-64097,US,MO,64097,5.85,,,, +US-MO-64098,US,MO,64098,5.6,,,, +US-MO-64101,US,MO,64101,8.35,,,, +US-MO-64102,US,MO,64102,8.35,,,, +US-MO-64105,US,MO,64105,9.35,,,, +US-MO-64106,US,MO,64106,9.35,,,, +US-MO-64108,US,MO,64108,8.35,,,, +US-MO-64109,US,MO,64109,8.35,,,, +US-MO-64110,US,MO,64110,8.35,,,, +US-MO-64111,US,MO,64111,8.35,,,, +US-MO-64112,US,MO,64112,8.35,,,, +US-MO-64113,US,MO,64113,8.35,,,, +US-MO-64114,US,MO,64114,8.35,,,, +US-MO-64116,US,MO,64116,8.1,,,, +US-MO-64117,US,MO,64117,8.1,,,, +US-MO-64118,US,MO,64118,8.1,,,, +US-MO-64119,US,MO,64119,8.1,,,, +US-MO-64120,US,MO,64120,8.35,,,, +US-MO-64121,US,MO,64121,9.35,,,, +US-MO-64123,US,MO,64123,8.35,,,, +US-MO-64124,US,MO,64124,8.35,,,, +US-MO-64125,US,MO,64125,8.35,,,, +US-MO-64126,US,MO,64126,8.35,,,, +US-MO-64127,US,MO,64127,8.35,,,, +US-MO-64128,US,MO,64128,8.35,,,, +US-MO-64129,US,MO,64129,8.35,,,, +US-MO-64130,US,MO,64130,8.35,,,, +US-MO-64131,US,MO,64131,8.35,,,, +US-MO-64132,US,MO,64132,8.35,,,, +US-MO-64133,US,MO,64133,8.225,,,, +US-MO-64134,US,MO,64134,8.35,,,, +US-MO-64136,US,MO,64136,8.35,,,, +US-MO-64137,US,MO,64137,8.35,,,, +US-MO-64138,US,MO,64138,8.35,,,, +US-MO-64139,US,MO,64139,8.35,,,, +US-MO-64141,US,MO,64141,9.35,,,, +US-MO-64144,US,MO,64144,8.1,,,, +US-MO-64145,US,MO,64145,8.35,,,, +US-MO-64146,US,MO,64146,8.35,,,, +US-MO-64147,US,MO,64147,8.35,,,, +US-MO-64148,US,MO,64148,9.35,,,, +US-MO-64149,US,MO,64149,8.35,,,, +US-MO-64150,US,MO,64150,6.6,,,, +US-MO-64151,US,MO,64151,8.475,,,, +US-MO-64152,US,MO,64152,5.6,,,, +US-MO-64153,US,MO,64153,8.475,,,, +US-MO-64154,US,MO,64154,8.475,,,, +US-MO-64155,US,MO,64155,8.1,,,, +US-MO-64156,US,MO,64156,8.1,,,, +US-MO-64157,US,MO,64157,8.1,,,, +US-MO-64158,US,MO,64158,8.1,,,, +US-MO-64161,US,MO,64161,8.1,,,, +US-MO-64163,US,MO,64163,6.6,,,, +US-MO-64164,US,MO,64164,8.475,,,, +US-MO-64165,US,MO,64165,8.1,,,, +US-MO-64166,US,MO,64166,5.725,,,, +US-MO-64167,US,MO,64167,5.725,,,, +US-MO-64168,US,MO,64168,7.725,,,, +US-MO-64170,US,MO,64170,8.35,,,, +US-MO-64171,US,MO,64171,9.35,,,, +US-MO-64179,US,MO,64179,9.35,,,, +US-MO-64180,US,MO,64180,9.35,,,, +US-MO-64184,US,MO,64184,9.35,,,, +US-MO-64187,US,MO,64187,9.35,,,, +US-MO-64188,US,MO,64188,7.725,,,, +US-MO-64190,US,MO,64190,8.475,,,, +US-MO-64191,US,MO,64191,8.35,,,, +US-MO-64195,US,MO,64195,9.475,,,, +US-MO-64196,US,MO,64196,9.35,,,, +US-MO-64197,US,MO,64197,8.35,,,, +US-MO-64198,US,MO,64198,8.35,,,, +US-MO-64199,US,MO,64199,9.35,,,, +US-MO-64401,US,MO,64401,5.325,,,, +US-MO-64402,US,MO,64402,7.225,,,, +US-MO-64420,US,MO,64420,7.1,,,, +US-MO-64421,US,MO,64421,6.425,,,, +US-MO-64422,US,MO,64422,5.725,,,, +US-MO-64423,US,MO,64423,5.725,,,, +US-MO-64424,US,MO,64424,7.35,,,, +US-MO-64426,US,MO,64426,5.475,,,, +US-MO-64427,US,MO,64427,6.425,,,, +US-MO-64428,US,MO,64428,5.725,,,, +US-MO-64429,US,MO,64429,7.475,,,, +US-MO-64430,US,MO,64430,5.725,,,, +US-MO-64431,US,MO,64431,5.725,,,, +US-MO-64432,US,MO,64432,5.725,,,, +US-MO-64433,US,MO,64433,5.725,,,, +US-MO-64434,US,MO,64434,5.725,,,, +US-MO-64436,US,MO,64436,6.425,,,, +US-MO-64437,US,MO,64437,7.725,,,, +US-MO-64438,US,MO,64438,5.225,,,, +US-MO-64439,US,MO,64439,5.6,,,, +US-MO-64440,US,MO,64440,5.325,,,, +US-MO-64441,US,MO,64441,6.1,,,, +US-MO-64442,US,MO,64442,5.475,,,, +US-MO-64443,US,MO,64443,5.325,,,, +US-MO-64444,US,MO,64444,5.6,,,, +US-MO-64445,US,MO,64445,5.725,,,, +US-MO-64446,US,MO,64446,7.475,,,, +US-MO-64448,US,MO,64448,5.325,,,, +US-MO-64449,US,MO,64449,6.425,,,, +US-MO-64451,US,MO,64451,6.725,,,, +US-MO-64453,US,MO,64453,5.225,,,, +US-MO-64454,US,MO,64454,6.475,,,, +US-MO-64455,US,MO,64455,5.725,,,, +US-MO-64456,US,MO,64456,8.1,,,, +US-MO-64457,US,MO,64457,5.725,,,, +US-MO-64458,US,MO,64458,5.475,,,, +US-MO-64459,US,MO,64459,6.425,,,, +US-MO-64461,US,MO,64461,5.725,,,, +US-MO-64463,US,MO,64463,6.725,,,, +US-MO-64465,US,MO,64465,5.225,,,, +US-MO-64466,US,MO,64466,6.725,,,, +US-MO-64467,US,MO,64467,5.475,,,, +US-MO-64468,US,MO,64468,7.975,,,, +US-MO-64469,US,MO,64469,5.725,,,, +US-MO-64470,US,MO,64470,8.225,,,, +US-MO-64471,US,MO,64471,5.475,,,, +US-MO-64473,US,MO,64473,6.725,,,, +US-MO-64474,US,MO,64474,5.725,,,, +US-MO-64475,US,MO,64475,5.725,,,, +US-MO-64476,US,MO,64476,5.725,,,, +US-MO-64477,US,MO,64477,7.225,,,, +US-MO-64479,US,MO,64479,5.725,,,, +US-MO-64480,US,MO,64480,5.925,,,, +US-MO-64481,US,MO,64481,5.975,,,, +US-MO-64482,US,MO,64482,8.225,,,, +US-MO-64483,US,MO,64483,6.425,,,, +US-MO-64484,US,MO,64484,5.325,,,, +US-MO-64485,US,MO,64485,8.425,,,, +US-MO-64486,US,MO,64486,6.1,,,, +US-MO-64487,US,MO,64487,5.725,,,, +US-MO-64489,US,MO,64489,6.225,,,, +US-MO-64490,US,MO,64490,5.225,,,, +US-MO-64491,US,MO,64491,8.475,,,, +US-MO-64492,US,MO,64492,5.225,,,, +US-MO-64493,US,MO,64493,5.225,,,, +US-MO-64494,US,MO,64494,5.725,,,, +US-MO-64496,US,MO,64496,6.475,,,, +US-MO-64497,US,MO,64497,5.725,,,, +US-MO-64498,US,MO,64498,6.475,,,, +US-MO-64499,US,MO,64499,6.1,,,, +US-MO-64501,US,MO,64501,7.7,,,, +US-MO-64502,US,MO,64502,7.7,,,, +US-MO-64503,US,MO,64503,7.7,,,, +US-MO-64504,US,MO,64504,7.7,,,, +US-MO-64505,US,MO,64505,7.7,,,, +US-MO-64506,US,MO,64506,7.7,,,, +US-MO-64507,US,MO,64507,7.7,,,, +US-MO-64508,US,MO,64508,7.7,,,, +US-MO-64601,US,MO,64601,7.225,,,, +US-MO-64620,US,MO,64620,6.225,,,, +US-MO-64622,US,MO,64622,5.475,,,, +US-MO-64623,US,MO,64623,5.475,,,, +US-MO-64624,US,MO,64624,7.725,,,, +US-MO-64625,US,MO,64625,7.725,,,, +US-MO-64628,US,MO,64628,7.975,,,, +US-MO-64630,US,MO,64630,6.225,,,, +US-MO-64631,US,MO,64631,6.225,,,, +US-MO-64632,US,MO,64632,5.975,,,, +US-MO-64633,US,MO,64633,7.225,,,, +US-MO-64635,US,MO,64635,4.975,,,, +US-MO-64636,US,MO,64636,6.725,,,, +US-MO-64637,US,MO,64637,6.725,,,, +US-MO-64638,US,MO,64638,4.975,,,, +US-MO-64639,US,MO,64639,5.475,,,, +US-MO-64640,US,MO,64640,7.6,,,, +US-MO-64641,US,MO,64641,5.725,,,, +US-MO-64642,US,MO,64642,5.975,,,, +US-MO-64643,US,MO,64643,7.475,,,, +US-MO-64644,US,MO,64644,8.725,,,, +US-MO-64645,US,MO,64645,6.975,,,, +US-MO-64646,US,MO,64646,6.975,,,, +US-MO-64647,US,MO,64647,6.225,,,, +US-MO-64648,US,MO,64648,6.225,,,, +US-MO-64649,US,MO,64649,6.725,,,, +US-MO-64650,US,MO,64650,6.725,,,, +US-MO-64651,US,MO,64651,6.225,,,, +US-MO-64652,US,MO,64652,5.725,,,, +US-MO-64653,US,MO,64653,6.225,,,, +US-MO-64654,US,MO,64654,6.225,,,, +US-MO-64655,US,MO,64655,6.225,,,, +US-MO-64656,US,MO,64656,4.975,,,, +US-MO-64657,US,MO,64657,5.225,,,, +US-MO-64658,US,MO,64658,7.725,,,, +US-MO-64659,US,MO,64659,6.225,,,, +US-MO-64660,US,MO,64660,5.975,,,, +US-MO-64661,US,MO,64661,6.475,,,, +US-MO-64664,US,MO,64664,4.975,,,, +US-MO-64667,US,MO,64667,6.975,,,, +US-MO-64668,US,MO,64668,5.475,,,, +US-MO-64670,US,MO,64670,6.725,,,, +US-MO-64671,US,MO,64671,6.725,,,, +US-MO-64672,US,MO,64672,6.225,,,, +US-MO-64673,US,MO,64673,7.475,,,, +US-MO-64674,US,MO,64674,6.225,,,, +US-MO-64676,US,MO,64676,5.975,,,, +US-MO-64679,US,MO,64679,5.725,,,, +US-MO-64680,US,MO,64680,9.35,,,, +US-MO-64681,US,MO,64681,5.975,,,, +US-MO-64682,US,MO,64682,5.475,,,, +US-MO-64683,US,MO,64683,7.725,,,, +US-MO-64686,US,MO,64686,4.975,,,, +US-MO-64688,US,MO,64688,4.975,,,, +US-MO-64689,US,MO,64689,6.225,,,, +US-MO-64701,US,MO,64701,7.85,,,, +US-MO-64720,US,MO,64720,7.975,,,, +US-MO-64722,US,MO,64722,5.225,,,, +US-MO-64723,US,MO,64723,6.225,,,, +US-MO-64724,US,MO,64724,7.1,,,, +US-MO-64725,US,MO,64725,5.975,,,, +US-MO-64726,US,MO,64726,5.225,,,, +US-MO-64728,US,MO,64728,5.225,,,, +US-MO-64730,US,MO,64730,7.85,,,, +US-MO-64733,US,MO,64733,6.475,,,, +US-MO-64734,US,MO,64734,5.975,,,, +US-MO-64735,US,MO,64735,7.475,,,, +US-MO-64738,US,MO,64738,4.725,,,, +US-MO-64739,US,MO,64739,5.975,,,, +US-MO-64740,US,MO,64740,5.225,,,, +US-MO-64741,US,MO,64741,5.225,,,, +US-MO-64742,US,MO,64742,7.975,,,, +US-MO-64743,US,MO,64743,7.475,,,, +US-MO-64744,US,MO,64744,7.725,,,, +US-MO-64745,US,MO,64745,5.225,,,, +US-MO-64746,US,MO,64746,5.975,,,, +US-MO-64747,US,MO,64747,5.975,,,, +US-MO-64748,US,MO,64748,7.6,,,, +US-MO-64750,US,MO,64750,5.225,,,, +US-MO-64752,US,MO,64752,5.225,,,, +US-MO-64755,US,MO,64755,5.2,,,, +US-MO-64756,US,MO,64756,5.725,,,, +US-MO-64759,US,MO,64759,7.725,,,, +US-MO-64761,US,MO,64761,7.975,,,, +US-MO-64762,US,MO,64762,5.725,,,, +US-MO-64763,US,MO,64763,6.975,,,, +US-MO-64765,US,MO,64765,5.225,,,, +US-MO-64766,US,MO,64766,7.725,,,, +US-MO-64767,US,MO,64767,5.225,,,, +US-MO-64769,US,MO,64769,5.725,,,, +US-MO-64770,US,MO,64770,6.725,,,, +US-MO-64771,US,MO,64771,5.225,,,, +US-MO-64772,US,MO,64772,7.725,,,, +US-MO-64776,US,MO,64776,4.725,,,, +US-MO-64778,US,MO,64778,5.225,,,, +US-MO-64779,US,MO,64779,7.225,,,, +US-MO-64780,US,MO,64780,6.225,,,, +US-MO-64781,US,MO,64781,4.725,,,, +US-MO-64783,US,MO,64783,5.225,,,, +US-MO-64784,US,MO,64784,5.225,,,, +US-MO-64788,US,MO,64788,7.225,,,, +US-MO-64790,US,MO,64790,5.225,,,, +US-MO-64801,US,MO,64801,7.825,,,, +US-MO-64802,US,MO,64802,7.825,,,, +US-MO-64803,US,MO,64803,7.825,,,, +US-MO-64804,US,MO,64804,7.825,,,, +US-MO-64830,US,MO,64830,6.2,,,, +US-MO-64831,US,MO,64831,6.225,,,, +US-MO-64832,US,MO,64832,5.2,,,, +US-MO-64833,US,MO,64833,5.2,,,, +US-MO-64834,US,MO,64834,7.7,,,, +US-MO-64835,US,MO,64835,7.2,,,, +US-MO-64836,US,MO,64836,5.2,,,, +US-MO-64840,US,MO,64840,5.35,,,, +US-MO-64841,US,MO,64841,6.95,,,, +US-MO-64842,US,MO,64842,5.35,,,, +US-MO-64843,US,MO,64843,6.225,,,, +US-MO-64844,US,MO,64844,5.35,,,, +US-MO-64847,US,MO,64847,8.225,,,, +US-MO-64848,US,MO,64848,5.725,,,, +US-MO-64849,US,MO,64849,5.2,,,, +US-MO-64850,US,MO,64850,5.35,,,, +US-MO-64853,US,MO,64853,5.35,,,, +US-MO-64854,US,MO,64854,6.225,,,, +US-MO-64855,US,MO,64855,5.2,,,, +US-MO-64856,US,MO,64856,6.225,,,, +US-MO-64857,US,MO,64857,6.2,,,, +US-MO-64858,US,MO,64858,5.35,,,, +US-MO-64859,US,MO,64859,5.2,,,, +US-MO-64861,US,MO,64861,6.225,,,, +US-MO-64862,US,MO,64862,5.2,,,, +US-MO-64863,US,MO,64863,6.225,,,, +US-MO-64864,US,MO,64864,6.35,,,, +US-MO-64865,US,MO,64865,5.35,,,, +US-MO-64866,US,MO,64866,5.35,,,, +US-MO-64867,US,MO,64867,6.225,,,, +US-MO-64868,US,MO,64868,6.225,,,, +US-MO-64870,US,MO,64870,7.7,,,, +US-MO-64873,US,MO,64873,5.725,,,, +US-MO-64874,US,MO,64874,7.1,,,, +US-MO-64999,US,MO,64999,8.35,,,, +US-MO-65001,US,MO,65001,7.475,,,, +US-MO-65010,US,MO,65010,7.475,,,, +US-MO-65011,US,MO,65011,5.725,,,, +US-MO-65013,US,MO,65013,5.891,,,, +US-MO-65014,US,MO,65014,8.1,,,, +US-MO-65016,US,MO,65016,6.475,,,, +US-MO-65017,US,MO,65017,5.725,,,, +US-MO-65018,US,MO,65018,7.975,,,, +US-MO-65020,US,MO,65020,5.475,,,, +US-MO-65023,US,MO,65023,5.725,,,, +US-MO-65024,US,MO,65024,6.475,,,, +US-MO-65025,US,MO,65025,7.475,,,, +US-MO-65026,US,MO,65026,8.125,,,, +US-MO-65032,US,MO,65032,5.725,,,, +US-MO-65034,US,MO,65034,5.725,,,, +US-MO-65035,US,MO,65035,6.475,,,, +US-MO-65036,US,MO,65036,7.1,,,, +US-MO-65037,US,MO,65037,5.725,,,, +US-MO-65038,US,MO,65038,7.225,,,, +US-MO-65039,US,MO,65039,5.975,,,, +US-MO-65040,US,MO,65040,5.725,,,, +US-MO-65041,US,MO,65041,8.1,,,, +US-MO-65042,US,MO,65042,6.475,,,, +US-MO-65043,US,MO,65043,5.725,,,, +US-MO-65046,US,MO,65046,6.475,,,, +US-MO-65047,US,MO,65047,5.725,,,, +US-MO-65048,US,MO,65048,6.475,,,, +US-MO-65049,US,MO,65049,5.475,,,, +US-MO-65050,US,MO,65050,6.475,,,, +US-MO-65051,US,MO,65051,6.475,,,, +US-MO-65052,US,MO,65052,5.475,,,, +US-MO-65053,US,MO,65053,5.725,,,, +US-MO-65054,US,MO,65054,6.475,,,, +US-MO-65055,US,MO,65055,6.475,,,, +US-MO-65058,US,MO,65058,6.975,,,, +US-MO-65059,US,MO,65059,5.725,,,, +US-MO-65061,US,MO,65061,6.475,,,, +US-MO-65062,US,MO,65062,5.975,,,, +US-MO-65063,US,MO,65063,5.725,,,, +US-MO-65064,US,MO,65064,5.725,,,, +US-MO-65065,US,MO,65065,7.475,,,, +US-MO-65066,US,MO,65066,8.35,,,, +US-MO-65067,US,MO,65067,5.725,,,, +US-MO-65068,US,MO,65068,6.225,,,, +US-MO-65069,US,MO,65069,6.475,,,, +US-MO-65072,US,MO,65072,5.725,,,, +US-MO-65074,US,MO,65074,5.725,,,, +US-MO-65075,US,MO,65075,5.725,,,, +US-MO-65076,US,MO,65076,5.725,,,, +US-MO-65077,US,MO,65077,5.725,,,, +US-MO-65078,US,MO,65078,5.725,,,, +US-MO-65079,US,MO,65079,5.975,,,, +US-MO-65080,US,MO,65080,5.725,,,, +US-MO-65081,US,MO,65081,7.725,,,, +US-MO-65082,US,MO,65082,5.725,,,, +US-MO-65083,US,MO,65083,5.725,,,, +US-MO-65084,US,MO,65084,5.725,,,, +US-MO-65085,US,MO,65085,6.475,,,, +US-MO-65101,US,MO,65101,7.725,,,, +US-MO-65102,US,MO,65102,7.725,,,, +US-MO-65103,US,MO,65103,7.725,,,, +US-MO-65104,US,MO,65104,7.725,,,, +US-MO-65105,US,MO,65105,7.725,,,, +US-MO-65106,US,MO,65106,7.725,,,, +US-MO-65107,US,MO,65107,7.725,,,, +US-MO-65108,US,MO,65108,7.725,,,, +US-MO-65109,US,MO,65109,7.725,,,, +US-MO-65110,US,MO,65110,7.725,,,, +US-MO-65111,US,MO,65111,7.725,,,, +US-MO-65201,US,MO,65201,7.975,,,, +US-MO-65202,US,MO,65202,7.975,,,, +US-MO-65203,US,MO,65203,7.975,,,, +US-MO-65205,US,MO,65205,8.475,,,, +US-MO-65211,US,MO,65211,7.975,,,, +US-MO-65212,US,MO,65212,7.975,,,, +US-MO-65215,US,MO,65215,7.975,,,, +US-MO-65216,US,MO,65216,7.975,,,, +US-MO-65217,US,MO,65217,7.975,,,, +US-MO-65218,US,MO,65218,7.975,,,, +US-MO-65230,US,MO,65230,6.85,,,, +US-MO-65231,US,MO,65231,5.725,,,, +US-MO-65232,US,MO,65232,6.6,,,, +US-MO-65233,US,MO,65233,8.225,,,, +US-MO-65236,US,MO,65236,7.475,,,, +US-MO-65237,US,MO,65237,6.225,,,, +US-MO-65239,US,MO,65239,5.725,,,, +US-MO-65240,US,MO,65240,7.975,,,, +US-MO-65243,US,MO,65243,5.725,,,, +US-MO-65244,US,MO,65244,5.725,,,, +US-MO-65246,US,MO,65246,5.975,,,, +US-MO-65247,US,MO,65247,6.35,,,, +US-MO-65248,US,MO,65248,6.85,,,, +US-MO-65250,US,MO,65250,6.85,,,, +US-MO-65251,US,MO,65251,5.725,,,, +US-MO-65254,US,MO,65254,6.85,,,, +US-MO-65255,US,MO,65255,5.975,,,, +US-MO-65256,US,MO,65256,5.975,,,, +US-MO-65257,US,MO,65257,5.725,,,, +US-MO-65258,US,MO,65258,5.725,,,, +US-MO-65259,US,MO,65259,5.725,,,, +US-MO-65260,US,MO,65260,5.725,,,, +US-MO-65261,US,MO,65261,6.975,,,, +US-MO-65262,US,MO,65262,5.725,,,, +US-MO-65263,US,MO,65263,5.725,,,, +US-MO-65264,US,MO,65264,8.1,,,, +US-MO-65265,US,MO,65265,8.6,,,, +US-MO-65270,US,MO,65270,8.225,,,, +US-MO-65274,US,MO,65274,6.85,,,, +US-MO-65275,US,MO,65275,5.725,,,, +US-MO-65276,US,MO,65276,6.225,,,, +US-MO-65278,US,MO,65278,5.725,,,, +US-MO-65279,US,MO,65279,5.975,,,, +US-MO-65280,US,MO,65280,6.6,,,, +US-MO-65281,US,MO,65281,7.35,,,, +US-MO-65282,US,MO,65282,5.725,,,, +US-MO-65283,US,MO,65283,6.225,,,, +US-MO-65284,US,MO,65284,5.975,,,, +US-MO-65285,US,MO,65285,6.1,,,, +US-MO-65286,US,MO,65286,5.975,,,, +US-MO-65287,US,MO,65287,6.225,,,, +US-MO-65299,US,MO,65299,5.975,,,, +US-MO-65301,US,MO,65301,8.1,,,, +US-MO-65302,US,MO,65302,8.1,,,, +US-MO-65305,US,MO,65305,6.475,,,, +US-MO-65320,US,MO,65320,8.35,,,, +US-MO-65321,US,MO,65321,6.35,,,, +US-MO-65322,US,MO,65322,6.225,,,, +US-MO-65323,US,MO,65323,7.225,,,, +US-MO-65324,US,MO,65324,5.475,,,, +US-MO-65325,US,MO,65325,7.6,,,, +US-MO-65326,US,MO,65326,6.1,,,, +US-MO-65327,US,MO,65327,6.85,,,, +US-MO-65329,US,MO,65329,5.725,,,, +US-MO-65330,US,MO,65330,6.975,,,, +US-MO-65332,US,MO,65332,7.725,,,, +US-MO-65333,US,MO,65333,5.225,,,, +US-MO-65334,US,MO,65334,5.725,,,, +US-MO-65335,US,MO,65335,6.1,,,, +US-MO-65336,US,MO,65336,8.475,,,, +US-MO-65337,US,MO,65337,7.725,,,, +US-MO-65338,US,MO,65338,6.1,,,, +US-MO-65339,US,MO,65339,6.85,,,, +US-MO-65340,US,MO,65340,7.35,,,, +US-MO-65344,US,MO,65344,5.85,,,, +US-MO-65345,US,MO,65345,6.1,,,, +US-MO-65347,US,MO,65347,5.85,,,, +US-MO-65348,US,MO,65348,7.225,,,, +US-MO-65349,US,MO,65349,7.85,,,, +US-MO-65350,US,MO,65350,5.725,,,, +US-MO-65351,US,MO,65351,8.35,,,, +US-MO-65354,US,MO,65354,5.725,,,, +US-MO-65355,US,MO,65355,6.1,,,, +US-MO-65360,US,MO,65360,6.725,,,, +US-MO-65401,US,MO,65401,7.85,,,, +US-MO-65402,US,MO,65402,7.85,,,, +US-MO-65409,US,MO,65409,7.85,,,, +US-MO-65436,US,MO,65436,5.35,,,, +US-MO-65438,US,MO,65438,7.225,,,, +US-MO-65439,US,MO,65439,5.725,,,, +US-MO-65440,US,MO,65440,5.225,,,, +US-MO-65441,US,MO,65441,6.975,,,, +US-MO-65443,US,MO,65443,6.391,,,, +US-MO-65444,US,MO,65444,5.725,,,, +US-MO-65446,US,MO,65446,5.975,,,, +US-MO-65449,US,MO,65449,5.975,,,, +US-MO-65452,US,MO,65452,5.475,,,, +US-MO-65453,US,MO,65453,6.475,,,, +US-MO-65456,US,MO,65456,5.975,,,, +US-MO-65457,US,MO,65457,5.475,,,, +US-MO-65459,US,MO,65459,4.975,,,, +US-MO-65461,US,MO,65461,5.35,,,, +US-MO-65462,US,MO,65462,5.35,,,, +US-MO-65463,US,MO,65463,5.225,,,, +US-MO-65464,US,MO,65464,5.725,,,, +US-MO-65466,US,MO,65466,7.225,,,, +US-MO-65468,US,MO,65468,5.725,,,, +US-MO-65470,US,MO,65470,5.225,,,, +US-MO-65473,US,MO,65473,4.975,,,, +US-MO-65479,US,MO,65479,5.725,,,, +US-MO-65483,US,MO,65483,7.35,,,, +US-MO-65484,US,MO,65484,5.725,,,, +US-MO-65486,US,MO,65486,5.725,,,, +US-MO-65501,US,MO,65501,5.225,,,, +US-MO-65529,US,MO,65529,5.35,,,, +US-MO-65532,US,MO,65532,5.225,,,, +US-MO-65534,US,MO,65534,5.475,,,, +US-MO-65535,US,MO,65535,6.475,,,, +US-MO-65536,US,MO,65536,5.225,,,, +US-MO-65541,US,MO,65541,5.225,,,, +US-MO-65542,US,MO,65542,5.725,,,, +US-MO-65543,US,MO,65543,5.225,,,, +US-MO-65548,US,MO,65548,7.162,,,, +US-MO-65550,US,MO,65550,5.35,,,, +US-MO-65552,US,MO,65552,5.725,,,, +US-MO-65555,US,MO,65555,5.725,,,, +US-MO-65556,US,MO,65556,5.475,,,, +US-MO-65557,US,MO,65557,5.725,,,, +US-MO-65559,US,MO,65559,5.85,,,, +US-MO-65560,US,MO,65560,5.225,,,, +US-MO-65564,US,MO,65564,5.725,,,, +US-MO-65565,US,MO,65565,8.475,,,, +US-MO-65566,US,MO,65566,7.225,,,, +US-MO-65567,US,MO,65567,5.475,,,, +US-MO-65570,US,MO,65570,5.725,,,, +US-MO-65571,US,MO,65571,7.225,,,, +US-MO-65580,US,MO,65580,5.891,,,, +US-MO-65582,US,MO,65582,6.391,,,, +US-MO-65583,US,MO,65583,5.475,,,, +US-MO-65584,US,MO,65584,5.475,,,, +US-MO-65586,US,MO,65586,5.975,,,, +US-MO-65588,US,MO,65588,7.225,,,, +US-MO-65589,US,MO,65589,5.725,,,, +US-MO-65590,US,MO,65590,6.225,,,, +US-MO-65591,US,MO,65591,5.475,,,, +US-MO-65601,US,MO,65601,5.6,,,, +US-MO-65603,US,MO,65603,6.475,,,, +US-MO-65604,US,MO,65604,5.475,,,, +US-MO-65605,US,MO,65605,7.725,,,, +US-MO-65606,US,MO,65606,8.225,,,, +US-MO-65607,US,MO,65607,7.975,,,, +US-MO-65608,US,MO,65608,7.225,,,, +US-MO-65609,US,MO,65609,5.162,,,, +US-MO-65610,US,MO,65610,5.975,,,, +US-MO-65611,US,MO,65611,6.475,,,, +US-MO-65612,US,MO,65612,5.475,,,, +US-MO-65613,US,MO,65613,8.1,,,, +US-MO-65614,US,MO,65614,6.1,,,, +US-MO-65615,US,MO,65615,9.6,,,, +US-MO-65616,US,MO,65616,8.6,,,, +US-MO-65617,US,MO,65617,5.6,,,, +US-MO-65618,US,MO,65618,8.225,,,, +US-MO-65619,US,MO,65619,6.975,,,, +US-MO-65620,US,MO,65620,5.975,,,, +US-MO-65622,US,MO,65622,8.225,,,, +US-MO-65623,US,MO,65623,6.725,,,, +US-MO-65624,US,MO,65624,6.475,,,, +US-MO-65625,US,MO,65625,5.725,,,, +US-MO-65626,US,MO,65626,5.162,,,, +US-MO-65627,US,MO,65627,6.1,,,, +US-MO-65629,US,MO,65629,5.975,,,, +US-MO-65630,US,MO,65630,5.975,,,, +US-MO-65631,US,MO,65631,5.975,,,, +US-MO-65632,US,MO,65632,5.225,,,, +US-MO-65633,US,MO,65633,5.975,,,, +US-MO-65634,US,MO,65634,5.725,,,, +US-MO-65635,US,MO,65635,6.475,,,, +US-MO-65636,US,MO,65636,7.558,,,, +US-MO-65637,US,MO,65637,6.725,,,, +US-MO-65638,US,MO,65638,7.225,,,, +US-MO-65640,US,MO,65640,5.6,,,, +US-MO-65641,US,MO,65641,5.725,,,, +US-MO-65644,US,MO,65644,6.058,,,, +US-MO-65645,US,MO,65645,5.6,,,, +US-MO-65646,US,MO,65646,5.725,,,, +US-MO-65647,US,MO,65647,5.725,,,, +US-MO-65648,US,MO,65648,5.475,,,, +US-MO-65649,US,MO,65649,5.6,,,, +US-MO-65650,US,MO,65650,5.6,,,, +US-MO-65652,US,MO,65652,6.058,,,, +US-MO-65653,US,MO,65653,6.1,,,, +US-MO-65654,US,MO,65654,5.725,,,, +US-MO-65655,US,MO,65655,8.225,,,, +US-MO-65656,US,MO,65656,5.975,,,, +US-MO-65657,US,MO,65657,5.975,,,, +US-MO-65658,US,MO,65658,5.725,,,, +US-MO-65660,US,MO,65660,5.225,,,, +US-MO-65661,US,MO,65661,7.6,,,, +US-MO-65662,US,MO,65662,5.225,,,, +US-MO-65663,US,MO,65663,5.6,,,, +US-MO-65664,US,MO,65664,5.725,,,, +US-MO-65666,US,MO,65666,6.725,,,, +US-MO-65667,US,MO,65667,5.225,,,, +US-MO-65668,US,MO,65668,7.225,,,, +US-MO-65669,US,MO,65669,5.975,,,, +US-MO-65672,US,MO,65672,6.1,,,, +US-MO-65673,US,MO,65673,8.1,,,, +US-MO-65674,US,MO,65674,7.225,,,, +US-MO-65675,US,MO,65675,6.975,,,, +US-MO-65676,US,MO,65676,6.725,,,, +US-MO-65679,US,MO,65679,6.1,,,, +US-MO-65680,US,MO,65680,6.1,,,, +US-MO-65681,US,MO,65681,6.475,,,, +US-MO-65682,US,MO,65682,7.6,,,, +US-MO-65685,US,MO,65685,5.6,,,, +US-MO-65686,US,MO,65686,6.475,,,, +US-MO-65688,US,MO,65688,5.162,,,, +US-MO-65689,US,MO,65689,5.725,,,, +US-MO-65690,US,MO,65690,8.225,,,, +US-MO-65692,US,MO,65692,9.225,,,, +US-MO-65702,US,MO,65702,5.225,,,, +US-MO-65704,US,MO,65704,5.225,,,, +US-MO-65705,US,MO,65705,5.725,,,, +US-MO-65706,US,MO,65706,6.058,,,, +US-MO-65707,US,MO,65707,5.725,,,, +US-MO-65708,US,MO,65708,7.475,,,, +US-MO-65710,US,MO,65710,5.6,,,, +US-MO-65711,US,MO,65711,7.225,,,, +US-MO-65712,US,MO,65712,5.725,,,, +US-MO-65713,US,MO,65713,6.058,,,, +US-MO-65714,US,MO,65714,7.475,,,, +US-MO-65715,US,MO,65715,7.225,,,, +US-MO-65717,US,MO,65717,5.225,,,, +US-MO-65720,US,MO,65720,5.975,,,, +US-MO-65721,US,MO,65721,7.975,,,, +US-MO-65722,US,MO,65722,5.225,,,, +US-MO-65723,US,MO,65723,5.725,,,, +US-MO-65724,US,MO,65724,5.725,,,, +US-MO-65725,US,MO,65725,5.475,,,, +US-MO-65726,US,MO,65726,6.1,,,, +US-MO-65727,US,MO,65727,5.6,,,, +US-MO-65728,US,MO,65728,5.975,,,, +US-MO-65729,US,MO,65729,6.725,,,, +US-MO-65730,US,MO,65730,6.225,,,, +US-MO-65731,US,MO,65731,6.1,,,, +US-MO-65732,US,MO,65732,6.725,,,, +US-MO-65733,US,MO,65733,6.1,,,, +US-MO-65734,US,MO,65734,5.725,,,, +US-MO-65735,US,MO,65735,5.725,,,, +US-MO-65737,US,MO,65737,6.475,,,, +US-MO-65738,US,MO,65738,7.85,,,, +US-MO-65739,US,MO,65739,6.1,,,, +US-MO-65740,US,MO,65740,7.6,,,, +US-MO-65741,US,MO,65741,6.725,,,, +US-MO-65742,US,MO,65742,5.475,,,, +US-MO-65744,US,MO,65744,6.1,,,, +US-MO-65745,US,MO,65745,5.725,,,, +US-MO-65746,US,MO,65746,6.058,,,, +US-MO-65747,US,MO,65747,5.975,,,, +US-MO-65752,US,MO,65752,5.725,,,, +US-MO-65753,US,MO,65753,5.975,,,, +US-MO-65754,US,MO,65754,5.975,,,, +US-MO-65755,US,MO,65755,5.725,,,, +US-MO-65756,US,MO,65756,5.725,,,, +US-MO-65757,US,MO,65757,5.475,,,, +US-MO-65759,US,MO,65759,6.1,,,, +US-MO-65760,US,MO,65760,6.725,,,, +US-MO-65761,US,MO,65761,6.1,,,, +US-MO-65762,US,MO,65762,6.725,,,, +US-MO-65764,US,MO,65764,6.225,,,, +US-MO-65765,US,MO,65765,5.475,,,, +US-MO-65766,US,MO,65766,7.725,,,, +US-MO-65767,US,MO,65767,7.725,,,, +US-MO-65768,US,MO,65768,7.225,,,, +US-MO-65769,US,MO,65769,5.725,,,, +US-MO-65770,US,MO,65770,5.475,,,, +US-MO-65771,US,MO,65771,6.1,,,, +US-MO-65772,US,MO,65772,5.725,,,, +US-MO-65773,US,MO,65773,6.725,,,, +US-MO-65774,US,MO,65774,7.225,,,, +US-MO-65775,US,MO,65775,5.162,,,, +US-MO-65777,US,MO,65777,5.162,,,, +US-MO-65778,US,MO,65778,6.225,,,, +US-MO-65779,US,MO,65779,7.725,,,, +US-MO-65781,US,MO,65781,5.475,,,, +US-MO-65783,US,MO,65783,6.225,,,, +US-MO-65784,US,MO,65784,6.725,,,, +US-MO-65785,US,MO,65785,5.725,,,, +US-MO-65786,US,MO,65786,5.475,,,, +US-MO-65787,US,MO,65787,5.475,,,, +US-MO-65788,US,MO,65788,5.162,,,, +US-MO-65789,US,MO,65789,5.162,,,, +US-MO-65790,US,MO,65790,5.162,,,, +US-MO-65791,US,MO,65791,8.225,,,, +US-MO-65793,US,MO,65793,6.912,,,, +US-MO-65801,US,MO,65801,7.6,,,, +US-MO-65802,US,MO,65802,7.6,,,, +US-MO-65803,US,MO,65803,7.6,,,, +US-MO-65804,US,MO,65804,7.6,,,, +US-MO-65805,US,MO,65805,7.6,,,, +US-MO-65806,US,MO,65806,7.6,,,, +US-MO-65807,US,MO,65807,7.6,,,, +US-MO-65808,US,MO,65808,7.6,,,, +US-MO-65809,US,MO,65809,5.475,,,, +US-MO-65810,US,MO,65810,5.475,,,, +US-MO-65814,US,MO,65814,7.6,,,, +US-MO-65817,US,MO,65817,7.6,,,, +US-MO-65890,US,MO,65890,7.6,,,, +US-MO-65897,US,MO,65897,7.6,,,, +US-MO-65898,US,MO,65898,7.6,,,, +US-MO-65899,US,MO,65899,7.6,,,, +US-MS-38601,US,MS,38601,7,,,, +US-MS-38602,US,MS,38602,7,,,, +US-MS-38603,US,MS,38603,7,,,, +US-MS-38606,US,MS,38606,7,,,, +US-MS-38609,US,MS,38609,7,,,, +US-MS-38610,US,MS,38610,7,,,, +US-MS-38611,US,MS,38611,7,,,, +US-MS-38614,US,MS,38614,7,,,, +US-MS-38617,US,MS,38617,7,,,, +US-MS-38618,US,MS,38618,7,,,, +US-MS-38619,US,MS,38619,7,,,, +US-MS-38620,US,MS,38620,7,,,, +US-MS-38621,US,MS,38621,7,,,, +US-MS-38622,US,MS,38622,7,,,, +US-MS-38623,US,MS,38623,7,,,, +US-MS-38625,US,MS,38625,7,,,, +US-MS-38626,US,MS,38626,7,,,, +US-MS-38627,US,MS,38627,7,,,, +US-MS-38628,US,MS,38628,7,,,, +US-MS-38629,US,MS,38629,7,,,, +US-MS-38631,US,MS,38631,7,,,, +US-MS-38632,US,MS,38632,7,,,, +US-MS-38633,US,MS,38633,7,,,, +US-MS-38634,US,MS,38634,7,,,, +US-MS-38635,US,MS,38635,7,,,, +US-MS-38637,US,MS,38637,7,,,, +US-MS-38638,US,MS,38638,7,,,, +US-MS-38639,US,MS,38639,7,,,, +US-MS-38641,US,MS,38641,7,,,, +US-MS-38642,US,MS,38642,7,,,, +US-MS-38643,US,MS,38643,7,,,, +US-MS-38644,US,MS,38644,7,,,, +US-MS-38645,US,MS,38645,7,,,, +US-MS-38646,US,MS,38646,7,,,, +US-MS-38647,US,MS,38647,7,,,, +US-MS-38649,US,MS,38649,7,,,, +US-MS-38650,US,MS,38650,7,,,, +US-MS-38651,US,MS,38651,7,,,, +US-MS-38652,US,MS,38652,7,,,, +US-MS-38654,US,MS,38654,7,,,, +US-MS-38655,US,MS,38655,7,,,, +US-MS-38658,US,MS,38658,7,,,, +US-MS-38659,US,MS,38659,7,,,, +US-MS-38661,US,MS,38661,7,,,, +US-MS-38663,US,MS,38663,7,,,, +US-MS-38664,US,MS,38664,7,,,, +US-MS-38665,US,MS,38665,7,,,, +US-MS-38666,US,MS,38666,7,,,, +US-MS-38668,US,MS,38668,7,,,, +US-MS-38669,US,MS,38669,7,,,, +US-MS-38670,US,MS,38670,7,,,, +US-MS-38671,US,MS,38671,7,,,, +US-MS-38672,US,MS,38672,7,,,, +US-MS-38673,US,MS,38673,7,,,, +US-MS-38674,US,MS,38674,7,,,, +US-MS-38675,US,MS,38675,7,,,, +US-MS-38676,US,MS,38676,7,,,, +US-MS-38677,US,MS,38677,7,,,, +US-MS-38679,US,MS,38679,7,,,, +US-MS-38680,US,MS,38680,7,,,, +US-MS-38683,US,MS,38683,7,,,, +US-MS-38685,US,MS,38685,7,,,, +US-MS-38686,US,MS,38686,7,,,, +US-MS-38701,US,MS,38701,7,,,, +US-MS-38702,US,MS,38702,7,,,, +US-MS-38703,US,MS,38703,7,,,, +US-MS-38704,US,MS,38704,7,,,, +US-MS-38720,US,MS,38720,7,,,, +US-MS-38721,US,MS,38721,7,,,, +US-MS-38722,US,MS,38722,7,,,, +US-MS-38723,US,MS,38723,7,,,, +US-MS-38725,US,MS,38725,7,,,, +US-MS-38726,US,MS,38726,7,,,, +US-MS-38730,US,MS,38730,7,,,, +US-MS-38731,US,MS,38731,7,,,, +US-MS-38732,US,MS,38732,7,,,, +US-MS-38733,US,MS,38733,7,,,, +US-MS-38736,US,MS,38736,7,,,, +US-MS-38737,US,MS,38737,7,,,, +US-MS-38738,US,MS,38738,7,,,, +US-MS-38739,US,MS,38739,7,,,, +US-MS-38740,US,MS,38740,7,,,, +US-MS-38744,US,MS,38744,7,,,, +US-MS-38745,US,MS,38745,7,,,, +US-MS-38746,US,MS,38746,7,,,, +US-MS-38748,US,MS,38748,7,,,, +US-MS-38749,US,MS,38749,7,,,, +US-MS-38751,US,MS,38751,7,,,, +US-MS-38753,US,MS,38753,7,,,, +US-MS-38754,US,MS,38754,7,,,, +US-MS-38756,US,MS,38756,7,,,, +US-MS-38759,US,MS,38759,7,,,, +US-MS-38760,US,MS,38760,7,,,, +US-MS-38761,US,MS,38761,7,,,, +US-MS-38762,US,MS,38762,7,,,, +US-MS-38764,US,MS,38764,7,,,, +US-MS-38765,US,MS,38765,7,,,, +US-MS-38767,US,MS,38767,7,,,, +US-MS-38768,US,MS,38768,7,,,, +US-MS-38769,US,MS,38769,7,,,, +US-MS-38771,US,MS,38771,7,,,, +US-MS-38772,US,MS,38772,7,,,, +US-MS-38773,US,MS,38773,7,,,, +US-MS-38774,US,MS,38774,7,,,, +US-MS-38776,US,MS,38776,7,,,, +US-MS-38778,US,MS,38778,7,,,, +US-MS-38780,US,MS,38780,7,,,, +US-MS-38781,US,MS,38781,7,,,, +US-MS-38782,US,MS,38782,7,,,, +US-MS-38801,US,MS,38801,7.25,,,, +US-MS-38802,US,MS,38802,7.25,,,, +US-MS-38803,US,MS,38803,7.25,,,, +US-MS-38804,US,MS,38804,7.25,,,, +US-MS-38820,US,MS,38820,7,,,, +US-MS-38821,US,MS,38821,7,,,, +US-MS-38824,US,MS,38824,7,,,, +US-MS-38825,US,MS,38825,7,,,, +US-MS-38826,US,MS,38826,7.25,,,, +US-MS-38827,US,MS,38827,7,,,, +US-MS-38828,US,MS,38828,7,,,, +US-MS-38829,US,MS,38829,7,,,, +US-MS-38833,US,MS,38833,7,,,, +US-MS-38834,US,MS,38834,7,,,, +US-MS-38835,US,MS,38835,7,,,, +US-MS-38838,US,MS,38838,7,,,, +US-MS-38839,US,MS,38839,7,,,, +US-MS-38841,US,MS,38841,7,,,, +US-MS-38843,US,MS,38843,7,,,, +US-MS-38844,US,MS,38844,7,,,, +US-MS-38846,US,MS,38846,7,,,, +US-MS-38847,US,MS,38847,7,,,, +US-MS-38848,US,MS,38848,7,,,, +US-MS-38849,US,MS,38849,7,,,, +US-MS-38850,US,MS,38850,7,,,, +US-MS-38851,US,MS,38851,7,,,, +US-MS-38852,US,MS,38852,7,,,, +US-MS-38855,US,MS,38855,7,,,, +US-MS-38856,US,MS,38856,7,,,, +US-MS-38857,US,MS,38857,7,,,, +US-MS-38858,US,MS,38858,7,,,, +US-MS-38859,US,MS,38859,7,,,, +US-MS-38860,US,MS,38860,7,,,, +US-MS-38862,US,MS,38862,7,,,, +US-MS-38863,US,MS,38863,7,,,, +US-MS-38864,US,MS,38864,7,,,, +US-MS-38865,US,MS,38865,7,,,, +US-MS-38866,US,MS,38866,7,,,, +US-MS-38868,US,MS,38868,7,,,, +US-MS-38869,US,MS,38869,7,,,, +US-MS-38870,US,MS,38870,7,,,, +US-MS-38871,US,MS,38871,7,,,, +US-MS-38873,US,MS,38873,7,,,, +US-MS-38874,US,MS,38874,7,,,, +US-MS-38875,US,MS,38875,7,,,, +US-MS-38876,US,MS,38876,7,,,, +US-MS-38877,US,MS,38877,7,,,, +US-MS-38878,US,MS,38878,7,,,, +US-MS-38879,US,MS,38879,7,,,, +US-MS-38880,US,MS,38880,7,,,, +US-MS-38901,US,MS,38901,7,,,, +US-MS-38902,US,MS,38902,7,,,, +US-MS-38913,US,MS,38913,7,,,, +US-MS-38914,US,MS,38914,7,,,, +US-MS-38915,US,MS,38915,7,,,, +US-MS-38916,US,MS,38916,7,,,, +US-MS-38917,US,MS,38917,7,,,, +US-MS-38920,US,MS,38920,7,,,, +US-MS-38921,US,MS,38921,7,,,, +US-MS-38922,US,MS,38922,7,,,, +US-MS-38923,US,MS,38923,7,,,, +US-MS-38924,US,MS,38924,7,,,, +US-MS-38925,US,MS,38925,7,,,, +US-MS-38926,US,MS,38926,7,,,, +US-MS-38927,US,MS,38927,7,,,, +US-MS-38928,US,MS,38928,7,,,, +US-MS-38929,US,MS,38929,7,,,, +US-MS-38930,US,MS,38930,7,,,, +US-MS-38935,US,MS,38935,7,,,, +US-MS-38940,US,MS,38940,7,,,, +US-MS-38941,US,MS,38941,7,,,, +US-MS-38943,US,MS,38943,7,,,, +US-MS-38944,US,MS,38944,7,,,, +US-MS-38945,US,MS,38945,7,,,, +US-MS-38946,US,MS,38946,7,,,, +US-MS-38947,US,MS,38947,7,,,, +US-MS-38948,US,MS,38948,7,,,, +US-MS-38949,US,MS,38949,7,,,, +US-MS-38950,US,MS,38950,7,,,, +US-MS-38951,US,MS,38951,7,,,, +US-MS-38952,US,MS,38952,7,,,, +US-MS-38953,US,MS,38953,7,,,, +US-MS-38954,US,MS,38954,7,,,, +US-MS-38955,US,MS,38955,7,,,, +US-MS-38957,US,MS,38957,7,,,, +US-MS-38958,US,MS,38958,7,,,, +US-MS-38959,US,MS,38959,7,,,, +US-MS-38960,US,MS,38960,7,,,, +US-MS-38961,US,MS,38961,7,,,, +US-MS-38962,US,MS,38962,7,,,, +US-MS-38963,US,MS,38963,7,,,, +US-MS-38964,US,MS,38964,7,,,, +US-MS-38965,US,MS,38965,7,,,, +US-MS-38966,US,MS,38966,7,,,, +US-MS-38967,US,MS,38967,7,,,, +US-MS-39038,US,MS,39038,7,,,, +US-MS-39039,US,MS,39039,7,,,, +US-MS-39040,US,MS,39040,7,,,, +US-MS-39041,US,MS,39041,7,,,, +US-MS-39042,US,MS,39042,7,,,, +US-MS-39043,US,MS,39043,7,,,, +US-MS-39044,US,MS,39044,7,,,, +US-MS-39045,US,MS,39045,7,,,, +US-MS-39046,US,MS,39046,7,,,, +US-MS-39047,US,MS,39047,7,,,, +US-MS-39051,US,MS,39051,7,,,, +US-MS-39054,US,MS,39054,7,,,, +US-MS-39056,US,MS,39056,7,,,, +US-MS-39057,US,MS,39057,7,,,, +US-MS-39058,US,MS,39058,7,,,, +US-MS-39059,US,MS,39059,7,,,, +US-MS-39060,US,MS,39060,7,,,, +US-MS-39061,US,MS,39061,7,,,, +US-MS-39062,US,MS,39062,7,,,, +US-MS-39063,US,MS,39063,7,,,, +US-MS-39066,US,MS,39066,7,,,, +US-MS-39067,US,MS,39067,7,,,, +US-MS-39069,US,MS,39069,7,,,, +US-MS-39071,US,MS,39071,7,,,, +US-MS-39072,US,MS,39072,7,,,, +US-MS-39073,US,MS,39073,7,,,, +US-MS-39074,US,MS,39074,7,,,, +US-MS-39077,US,MS,39077,7,,,, +US-MS-39078,US,MS,39078,7,,,, +US-MS-39079,US,MS,39079,7,,,, +US-MS-39080,US,MS,39080,7,,,, +US-MS-39081,US,MS,39081,7,,,, +US-MS-39082,US,MS,39082,7,,,, +US-MS-39083,US,MS,39083,7,,,, +US-MS-39086,US,MS,39086,7,,,, +US-MS-39087,US,MS,39087,7,,,, +US-MS-39088,US,MS,39088,7,,,, +US-MS-39090,US,MS,39090,7,,,, +US-MS-39092,US,MS,39092,7,,,, +US-MS-39094,US,MS,39094,7,,,, +US-MS-39095,US,MS,39095,7,,,, +US-MS-39096,US,MS,39096,7,,,, +US-MS-39097,US,MS,39097,7,,,, +US-MS-39098,US,MS,39098,7,,,, +US-MS-39107,US,MS,39107,7,,,, +US-MS-39108,US,MS,39108,7,,,, +US-MS-39109,US,MS,39109,7,,,, +US-MS-39110,US,MS,39110,7,,,, +US-MS-39111,US,MS,39111,7,,,, +US-MS-39113,US,MS,39113,7,,,, +US-MS-39114,US,MS,39114,7,,,, +US-MS-39115,US,MS,39115,7,,,, +US-MS-39116,US,MS,39116,7,,,, +US-MS-39117,US,MS,39117,7,,,, +US-MS-39119,US,MS,39119,7,,,, +US-MS-39120,US,MS,39120,7,,,, +US-MS-39121,US,MS,39121,7,,,, +US-MS-39122,US,MS,39122,7,,,, +US-MS-39130,US,MS,39130,7,,,, +US-MS-39140,US,MS,39140,7,,,, +US-MS-39144,US,MS,39144,7,,,, +US-MS-39145,US,MS,39145,7,,,, +US-MS-39146,US,MS,39146,7,,,, +US-MS-39148,US,MS,39148,7,,,, +US-MS-39149,US,MS,39149,7,,,, +US-MS-39150,US,MS,39150,7,,,, +US-MS-39151,US,MS,39151,7,,,, +US-MS-39152,US,MS,39152,7,,,, +US-MS-39153,US,MS,39153,7,,,, +US-MS-39154,US,MS,39154,7,,,, +US-MS-39156,US,MS,39156,7,,,, +US-MS-39157,US,MS,39157,7,,,, +US-MS-39158,US,MS,39158,7,,,, +US-MS-39159,US,MS,39159,7,,,, +US-MS-39160,US,MS,39160,7,,,, +US-MS-39161,US,MS,39161,7,,,, +US-MS-39162,US,MS,39162,7,,,, +US-MS-39163,US,MS,39163,7,,,, +US-MS-39165,US,MS,39165,7,,,, +US-MS-39166,US,MS,39166,7,,,, +US-MS-39167,US,MS,39167,7,,,, +US-MS-39168,US,MS,39168,7,,,, +US-MS-39169,US,MS,39169,7,,,, +US-MS-39170,US,MS,39170,7,,,, +US-MS-39171,US,MS,39171,7,,,, +US-MS-39173,US,MS,39173,7,,,, +US-MS-39174,US,MS,39174,7,,,, +US-MS-39175,US,MS,39175,7,,,, +US-MS-39176,US,MS,39176,7,,,, +US-MS-39177,US,MS,39177,7,,,, +US-MS-39179,US,MS,39179,7,,,, +US-MS-39180,US,MS,39180,7,,,, +US-MS-39181,US,MS,39181,7,,,, +US-MS-39182,US,MS,39182,7,,,, +US-MS-39183,US,MS,39183,7,,,, +US-MS-39189,US,MS,39189,7,,,, +US-MS-39190,US,MS,39190,7,,,, +US-MS-39191,US,MS,39191,7,,,, +US-MS-39192,US,MS,39192,7,,,, +US-MS-39193,US,MS,39193,7,,,, +US-MS-39194,US,MS,39194,7,,,, +US-MS-39201,US,MS,39201,7,,,, +US-MS-39202,US,MS,39202,7,,,, +US-MS-39203,US,MS,39203,7,,,, +US-MS-39204,US,MS,39204,7,,,, +US-MS-39205,US,MS,39205,7,,,, +US-MS-39206,US,MS,39206,7,,,, +US-MS-39207,US,MS,39207,7,,,, +US-MS-39208,US,MS,39208,7,,,, +US-MS-39209,US,MS,39209,7,,,, +US-MS-39210,US,MS,39210,7,,,, +US-MS-39211,US,MS,39211,7,,,, +US-MS-39212,US,MS,39212,7,,,, +US-MS-39213,US,MS,39213,7,,,, +US-MS-39215,US,MS,39215,7,,,, +US-MS-39216,US,MS,39216,7,,,, +US-MS-39217,US,MS,39217,7,,,, +US-MS-39218,US,MS,39218,7,,,, +US-MS-39225,US,MS,39225,7,,,, +US-MS-39232,US,MS,39232,7,,,, +US-MS-39236,US,MS,39236,7,,,, +US-MS-39250,US,MS,39250,7,,,, +US-MS-39269,US,MS,39269,7,,,, +US-MS-39272,US,MS,39272,7,,,, +US-MS-39282,US,MS,39282,7,,,, +US-MS-39283,US,MS,39283,7,,,, +US-MS-39284,US,MS,39284,7,,,, +US-MS-39286,US,MS,39286,7,,,, +US-MS-39288,US,MS,39288,7,,,, +US-MS-39289,US,MS,39289,7,,,, +US-MS-39296,US,MS,39296,7,,,, +US-MS-39298,US,MS,39298,7,,,, +US-MS-39301,US,MS,39301,7,,,, +US-MS-39302,US,MS,39302,7,,,, +US-MS-39303,US,MS,39303,7,,,, +US-MS-39304,US,MS,39304,7,,,, +US-MS-39305,US,MS,39305,7,,,, +US-MS-39307,US,MS,39307,7,,,, +US-MS-39309,US,MS,39309,7,,,, +US-MS-39320,US,MS,39320,7,,,, +US-MS-39322,US,MS,39322,7,,,, +US-MS-39323,US,MS,39323,7,,,, +US-MS-39324,US,MS,39324,7,,,, +US-MS-39325,US,MS,39325,7,,,, +US-MS-39326,US,MS,39326,7,,,, +US-MS-39327,US,MS,39327,7,,,, +US-MS-39328,US,MS,39328,7,,,, +US-MS-39330,US,MS,39330,7,,,, +US-MS-39332,US,MS,39332,7,,,, +US-MS-39335,US,MS,39335,7,,,, +US-MS-39336,US,MS,39336,7,,,, +US-MS-39337,US,MS,39337,7,,,, +US-MS-39338,US,MS,39338,7,,,, +US-MS-39339,US,MS,39339,7,,,, +US-MS-39341,US,MS,39341,7,,,, +US-MS-39342,US,MS,39342,7,,,, +US-MS-39345,US,MS,39345,7,,,, +US-MS-39346,US,MS,39346,7,,,, +US-MS-39347,US,MS,39347,7,,,, +US-MS-39348,US,MS,39348,7,,,, +US-MS-39350,US,MS,39350,7,,,, +US-MS-39352,US,MS,39352,7,,,, +US-MS-39354,US,MS,39354,7,,,, +US-MS-39355,US,MS,39355,7,,,, +US-MS-39356,US,MS,39356,7,,,, +US-MS-39358,US,MS,39358,7,,,, +US-MS-39359,US,MS,39359,7,,,, +US-MS-39360,US,MS,39360,7,,,, +US-MS-39361,US,MS,39361,7,,,, +US-MS-39362,US,MS,39362,7,,,, +US-MS-39363,US,MS,39363,7,,,, +US-MS-39364,US,MS,39364,7,,,, +US-MS-39365,US,MS,39365,7,,,, +US-MS-39366,US,MS,39366,7,,,, +US-MS-39367,US,MS,39367,7,,,, +US-MS-39401,US,MS,39401,7,,,, +US-MS-39402,US,MS,39402,7,,,, +US-MS-39403,US,MS,39403,7,,,, +US-MS-39404,US,MS,39404,7,,,, +US-MS-39406,US,MS,39406,7,,,, +US-MS-39407,US,MS,39407,7,,,, +US-MS-39421,US,MS,39421,7,,,, +US-MS-39422,US,MS,39422,7,,,, +US-MS-39423,US,MS,39423,7,,,, +US-MS-39425,US,MS,39425,7,,,, +US-MS-39426,US,MS,39426,7,,,, +US-MS-39427,US,MS,39427,7,,,, +US-MS-39428,US,MS,39428,7,,,, +US-MS-39429,US,MS,39429,7,,,, +US-MS-39436,US,MS,39436,7,,,, +US-MS-39437,US,MS,39437,7,,,, +US-MS-39439,US,MS,39439,7,,,, +US-MS-39440,US,MS,39440,7,,,, +US-MS-39441,US,MS,39441,7,,,, +US-MS-39442,US,MS,39442,7,,,, +US-MS-39443,US,MS,39443,7,,,, +US-MS-39451,US,MS,39451,7,,,, +US-MS-39452,US,MS,39452,7,,,, +US-MS-39455,US,MS,39455,7,,,, +US-MS-39456,US,MS,39456,7,,,, +US-MS-39457,US,MS,39457,7,,,, +US-MS-39459,US,MS,39459,7,,,, +US-MS-39460,US,MS,39460,7,,,, +US-MS-39461,US,MS,39461,7,,,, +US-MS-39462,US,MS,39462,7,,,, +US-MS-39463,US,MS,39463,7,,,, +US-MS-39464,US,MS,39464,7,,,, +US-MS-39465,US,MS,39465,7,,,, +US-MS-39466,US,MS,39466,7,,,, +US-MS-39470,US,MS,39470,7,,,, +US-MS-39474,US,MS,39474,7,,,, +US-MS-39475,US,MS,39475,7,,,, +US-MS-39476,US,MS,39476,7,,,, +US-MS-39477,US,MS,39477,7,,,, +US-MS-39478,US,MS,39478,7,,,, +US-MS-39479,US,MS,39479,7,,,, +US-MS-39480,US,MS,39480,7,,,, +US-MS-39481,US,MS,39481,7,,,, +US-MS-39482,US,MS,39482,7,,,, +US-MS-39483,US,MS,39483,7,,,, +US-MS-39501,US,MS,39501,7,,,, +US-MS-39502,US,MS,39502,7,,,, +US-MS-39503,US,MS,39503,7,,,, +US-MS-39505,US,MS,39505,7,,,, +US-MS-39506,US,MS,39506,7,,,, +US-MS-39507,US,MS,39507,7,,,, +US-MS-39520,US,MS,39520,7,,,, +US-MS-39521,US,MS,39521,7,,,, +US-MS-39522,US,MS,39522,7,,,, +US-MS-39525,US,MS,39525,7,,,, +US-MS-39529,US,MS,39529,7,,,, +US-MS-39530,US,MS,39530,7,,,, +US-MS-39531,US,MS,39531,7,,,, +US-MS-39532,US,MS,39532,7,,,, +US-MS-39533,US,MS,39533,7,,,, +US-MS-39534,US,MS,39534,7,,,, +US-MS-39535,US,MS,39535,7,,,, +US-MS-39540,US,MS,39540,7,,,, +US-MS-39552,US,MS,39552,7,,,, +US-MS-39553,US,MS,39553,7,,,, +US-MS-39555,US,MS,39555,7,,,, +US-MS-39556,US,MS,39556,7,,,, +US-MS-39558,US,MS,39558,7,,,, +US-MS-39560,US,MS,39560,7,,,, +US-MS-39561,US,MS,39561,7,,,, +US-MS-39562,US,MS,39562,7,,,, +US-MS-39563,US,MS,39563,7,,,, +US-MS-39564,US,MS,39564,7,,,, +US-MS-39565,US,MS,39565,7,,,, +US-MS-39566,US,MS,39566,7,,,, +US-MS-39567,US,MS,39567,7,,,, +US-MS-39568,US,MS,39568,7,,,, +US-MS-39569,US,MS,39569,7,,,, +US-MS-39571,US,MS,39571,7,,,, +US-MS-39572,US,MS,39572,7,,,, +US-MS-39573,US,MS,39573,7,,,, +US-MS-39574,US,MS,39574,7,,,, +US-MS-39576,US,MS,39576,7,,,, +US-MS-39577,US,MS,39577,7,,,, +US-MS-39581,US,MS,39581,7,,,, +US-MS-39595,US,MS,39595,7,,,, +US-MS-39601,US,MS,39601,7,,,, +US-MS-39602,US,MS,39602,7,,,, +US-MS-39603,US,MS,39603,7,,,, +US-MS-39629,US,MS,39629,7,,,, +US-MS-39630,US,MS,39630,7,,,, +US-MS-39631,US,MS,39631,7,,,, +US-MS-39632,US,MS,39632,7,,,, +US-MS-39633,US,MS,39633,7,,,, +US-MS-39635,US,MS,39635,7,,,, +US-MS-39638,US,MS,39638,7,,,, +US-MS-39641,US,MS,39641,7,,,, +US-MS-39643,US,MS,39643,7,,,, +US-MS-39645,US,MS,39645,7,,,, +US-MS-39647,US,MS,39647,7,,,, +US-MS-39648,US,MS,39648,7,,,, +US-MS-39649,US,MS,39649,7,,,, +US-MS-39652,US,MS,39652,7,,,, +US-MS-39653,US,MS,39653,7,,,, +US-MS-39654,US,MS,39654,7,,,, +US-MS-39656,US,MS,39656,7,,,, +US-MS-39657,US,MS,39657,7,,,, +US-MS-39661,US,MS,39661,7,,,, +US-MS-39662,US,MS,39662,7,,,, +US-MS-39663,US,MS,39663,7,,,, +US-MS-39664,US,MS,39664,7,,,, +US-MS-39665,US,MS,39665,7,,,, +US-MS-39666,US,MS,39666,7,,,, +US-MS-39667,US,MS,39667,7,,,, +US-MS-39668,US,MS,39668,7,,,, +US-MS-39669,US,MS,39669,7,,,, +US-MS-39701,US,MS,39701,7,,,, +US-MS-39702,US,MS,39702,7,,,, +US-MS-39703,US,MS,39703,7,,,, +US-MS-39704,US,MS,39704,7,,,, +US-MS-39705,US,MS,39705,7,,,, +US-MS-39710,US,MS,39710,7,,,, +US-MS-39730,US,MS,39730,7,,,, +US-MS-39735,US,MS,39735,7,,,, +US-MS-39736,US,MS,39736,7,,,, +US-MS-39737,US,MS,39737,7,,,, +US-MS-39739,US,MS,39739,7,,,, +US-MS-39740,US,MS,39740,7,,,, +US-MS-39741,US,MS,39741,7,,,, +US-MS-39743,US,MS,39743,7,,,, +US-MS-39744,US,MS,39744,7,,,, +US-MS-39745,US,MS,39745,7,,,, +US-MS-39746,US,MS,39746,7,,,, +US-MS-39747,US,MS,39747,7,,,, +US-MS-39750,US,MS,39750,7,,,, +US-MS-39751,US,MS,39751,7,,,, +US-MS-39752,US,MS,39752,7,,,, +US-MS-39753,US,MS,39753,7,,,, +US-MS-39754,US,MS,39754,7,,,, +US-MS-39755,US,MS,39755,7,,,, +US-MS-39756,US,MS,39756,7,,,, +US-MS-39759,US,MS,39759,7,,,, +US-MS-39760,US,MS,39760,7,,,, +US-MS-39762,US,MS,39762,7,,,, +US-MS-39766,US,MS,39766,7,,,, +US-MS-39767,US,MS,39767,7,,,, +US-MS-39769,US,MS,39769,7,,,, +US-MS-39771,US,MS,39771,7,,,, +US-MS-39772,US,MS,39772,7,,,, +US-MS-39773,US,MS,39773,7,,,, +US-MS-39776,US,MS,39776,7,,,, +US-NC-27006,US,NC,27006,6.75,,,, +US-NC-27007,US,NC,27007,7,,,, +US-NC-27009,US,NC,27009,6.75,,,, +US-NC-27010,US,NC,27010,6.75,,,, +US-NC-27011,US,NC,27011,6.75,,,, +US-NC-27012,US,NC,27012,6.75,,,, +US-NC-27013,US,NC,27013,7,,,, +US-NC-27014,US,NC,27014,6.75,,,, +US-NC-27016,US,NC,27016,6.75,,,, +US-NC-27017,US,NC,27017,7,,,, +US-NC-27018,US,NC,27018,6.75,,,, +US-NC-27019,US,NC,27019,6.75,,,, +US-NC-27020,US,NC,27020,6.75,,,, +US-NC-27021,US,NC,27021,6.75,,,, +US-NC-27022,US,NC,27022,6.75,,,, +US-NC-27023,US,NC,27023,6.75,,,, +US-NC-27024,US,NC,27024,7,,,, +US-NC-27025,US,NC,27025,6.75,,,, +US-NC-27027,US,NC,27027,6.75,,,, +US-NC-27028,US,NC,27028,6.75,,,, +US-NC-27030,US,NC,27030,7,,,, +US-NC-27031,US,NC,27031,7,,,, +US-NC-27040,US,NC,27040,6.75,,,, +US-NC-27041,US,NC,27041,7,,,, +US-NC-27042,US,NC,27042,6.75,,,, +US-NC-27043,US,NC,27043,6.75,,,, +US-NC-27045,US,NC,27045,6.75,,,, +US-NC-27046,US,NC,27046,6.75,,,, +US-NC-27047,US,NC,27047,7,,,, +US-NC-27048,US,NC,27048,6.75,,,, +US-NC-27049,US,NC,27049,7,,,, +US-NC-27050,US,NC,27050,6.75,,,, +US-NC-27051,US,NC,27051,6.75,,,, +US-NC-27052,US,NC,27052,6.75,,,, +US-NC-27053,US,NC,27053,6.75,,,, +US-NC-27054,US,NC,27054,7,,,, +US-NC-27055,US,NC,27055,6.75,,,, +US-NC-27094,US,NC,27094,6.75,,,, +US-NC-27098,US,NC,27098,6.75,,,, +US-NC-27099,US,NC,27099,6.75,,,, +US-NC-27101,US,NC,27101,6.75,,,, +US-NC-27102,US,NC,27102,6.75,,,, +US-NC-27103,US,NC,27103,6.75,,,, +US-NC-27104,US,NC,27104,6.75,,,, +US-NC-27105,US,NC,27105,6.75,,,, +US-NC-27106,US,NC,27106,6.75,,,, +US-NC-27107,US,NC,27107,6.75,,,, +US-NC-27108,US,NC,27108,6.75,,,, +US-NC-27109,US,NC,27109,6.75,,,, +US-NC-27110,US,NC,27110,6.75,,,, +US-NC-27111,US,NC,27111,6.75,,,, +US-NC-27113,US,NC,27113,6.75,,,, +US-NC-27114,US,NC,27114,6.75,,,, +US-NC-27115,US,NC,27115,6.75,,,, +US-NC-27116,US,NC,27116,6.75,,,, +US-NC-27117,US,NC,27117,6.75,,,, +US-NC-27120,US,NC,27120,6.75,,,, +US-NC-27127,US,NC,27127,6.75,,,, +US-NC-27130,US,NC,27130,6.75,,,, +US-NC-27150,US,NC,27150,6.75,,,, +US-NC-27152,US,NC,27152,6.75,,,, +US-NC-27155,US,NC,27155,6.75,,,, +US-NC-27157,US,NC,27157,6.75,,,, +US-NC-27198,US,NC,27198,6.75,,,, +US-NC-27199,US,NC,27199,6.75,,,, +US-NC-27201,US,NC,27201,6.75,,,, +US-NC-27202,US,NC,27202,6.75,,,, +US-NC-27203,US,NC,27203,7,,,, +US-NC-27204,US,NC,27204,7,,,, +US-NC-27205,US,NC,27205,7,,,, +US-NC-27207,US,NC,27207,6.75,,,, +US-NC-27208,US,NC,27208,6.75,,,, +US-NC-27209,US,NC,27209,7,,,, +US-NC-27212,US,NC,27212,6.75,,,, +US-NC-27213,US,NC,27213,6.75,,,, +US-NC-27214,US,NC,27214,6.75,,,, +US-NC-27215,US,NC,27215,6.75,,,, +US-NC-27216,US,NC,27216,6.75,,,, +US-NC-27217,US,NC,27217,6.75,,,, +US-NC-27228,US,NC,27228,6.75,,,, +US-NC-27229,US,NC,27229,7,,,, +US-NC-27230,US,NC,27230,7,,,, +US-NC-27231,US,NC,27231,7.5,,,, +US-NC-27233,US,NC,27233,7,,,, +US-NC-27235,US,NC,27235,6.75,,,, +US-NC-27237,US,NC,27237,7,,,, +US-NC-27239,US,NC,27239,6.75,,,, +US-NC-27242,US,NC,27242,6.75,,,, +US-NC-27243,US,NC,27243,7.5,,,, +US-NC-27244,US,NC,27244,6.75,,,, +US-NC-27247,US,NC,27247,7,,,, +US-NC-27248,US,NC,27248,7,,,, +US-NC-27249,US,NC,27249,6.75,,,, +US-NC-27252,US,NC,27252,6.75,,,, +US-NC-27253,US,NC,27253,6.75,,,, +US-NC-27256,US,NC,27256,6.75,,,, +US-NC-27258,US,NC,27258,6.75,,,, +US-NC-27259,US,NC,27259,6.75,,,, +US-NC-27260,US,NC,27260,6.75,,,, +US-NC-27261,US,NC,27261,6.75,,,, +US-NC-27262,US,NC,27262,6.75,,,, +US-NC-27263,US,NC,27263,7,,,, +US-NC-27264,US,NC,27264,7,,,, +US-NC-27265,US,NC,27265,6.75,,,, +US-NC-27278,US,NC,27278,7.5,,,, +US-NC-27281,US,NC,27281,6.75,,,, +US-NC-27282,US,NC,27282,6.75,,,, +US-NC-27283,US,NC,27283,6.75,,,, +US-NC-27284,US,NC,27284,6.75,,,, +US-NC-27285,US,NC,27285,6.75,,,, +US-NC-27288,US,NC,27288,6.75,,,, +US-NC-27289,US,NC,27289,6.75,,,, +US-NC-27291,US,NC,27291,6.75,,,, +US-NC-27292,US,NC,27292,6.75,,,, +US-NC-27293,US,NC,27293,6.75,,,, +US-NC-27294,US,NC,27294,6.75,,,, +US-NC-27295,US,NC,27295,6.75,,,, +US-NC-27298,US,NC,27298,7,,,, +US-NC-27299,US,NC,27299,6.75,,,, +US-NC-27301,US,NC,27301,6.75,,,, +US-NC-27302,US,NC,27302,6.75,,,, +US-NC-27305,US,NC,27305,6.75,,,, +US-NC-27306,US,NC,27306,7,,,, +US-NC-27310,US,NC,27310,6.75,,,, +US-NC-27311,US,NC,27311,6.75,,,, +US-NC-27312,US,NC,27312,6.75,,,, +US-NC-27313,US,NC,27313,6.75,,,, +US-NC-27314,US,NC,27314,6.75,,,, +US-NC-27315,US,NC,27315,6.75,,,, +US-NC-27316,US,NC,27316,7,,,, +US-NC-27317,US,NC,27317,7,,,, +US-NC-27320,US,NC,27320,6.75,,,, +US-NC-27323,US,NC,27323,6.75,,,, +US-NC-27325,US,NC,27325,6.75,,,, +US-NC-27326,US,NC,27326,6.75,,,, +US-NC-27330,US,NC,27330,7,,,, +US-NC-27331,US,NC,27331,7,,,, +US-NC-27332,US,NC,27332,7,,,, +US-NC-27340,US,NC,27340,6.75,,,, +US-NC-27341,US,NC,27341,7,,,, +US-NC-27342,US,NC,27342,6.75,,,, +US-NC-27343,US,NC,27343,6.75,,,, +US-NC-27344,US,NC,27344,6.75,,,, +US-NC-27349,US,NC,27349,6.75,,,, +US-NC-27350,US,NC,27350,7,,,, +US-NC-27351,US,NC,27351,6.75,,,, +US-NC-27355,US,NC,27355,7,,,, +US-NC-27356,US,NC,27356,7,,,, +US-NC-27357,US,NC,27357,6.75,,,, +US-NC-27358,US,NC,27358,6.75,,,, +US-NC-27359,US,NC,27359,6.75,,,, +US-NC-27360,US,NC,27360,6.75,,,, +US-NC-27361,US,NC,27361,6.75,,,, +US-NC-27370,US,NC,27370,7,,,, +US-NC-27371,US,NC,27371,7,,,, +US-NC-27373,US,NC,27373,6.75,,,, +US-NC-27374,US,NC,27374,6.75,,,, +US-NC-27375,US,NC,27375,6.75,,,, +US-NC-27376,US,NC,27376,6.75,,,, +US-NC-27377,US,NC,27377,6.75,,,, +US-NC-27379,US,NC,27379,6.75,,,, +US-NC-27401,US,NC,27401,6.75,,,, +US-NC-27402,US,NC,27402,6.75,,,, +US-NC-27403,US,NC,27403,6.75,,,, +US-NC-27404,US,NC,27404,6.75,,,, +US-NC-27405,US,NC,27405,6.75,,,, +US-NC-27406,US,NC,27406,6.75,,,, +US-NC-27407,US,NC,27407,6.75,,,, +US-NC-27408,US,NC,27408,6.75,,,, +US-NC-27409,US,NC,27409,6.75,,,, +US-NC-27410,US,NC,27410,6.75,,,, +US-NC-27411,US,NC,27411,6.75,,,, +US-NC-27412,US,NC,27412,6.75,,,, +US-NC-27413,US,NC,27413,6.75,,,, +US-NC-27415,US,NC,27415,6.75,,,, +US-NC-27416,US,NC,27416,6.75,,,, +US-NC-27417,US,NC,27417,6.75,,,, +US-NC-27419,US,NC,27419,6.75,,,, +US-NC-27420,US,NC,27420,6.75,,,, +US-NC-27425,US,NC,27425,6.75,,,, +US-NC-27427,US,NC,27427,6.75,,,, +US-NC-27429,US,NC,27429,6.75,,,, +US-NC-27435,US,NC,27435,6.75,,,, +US-NC-27438,US,NC,27438,6.75,,,, +US-NC-27455,US,NC,27455,6.75,,,, +US-NC-27495,US,NC,27495,6.75,,,, +US-NC-27497,US,NC,27497,6.75,,,, +US-NC-27498,US,NC,27498,6.75,,,, +US-NC-27499,US,NC,27499,6.75,,,, +US-NC-27501,US,NC,27501,6.75,,,, +US-NC-27502,US,NC,27502,6.75,,,, +US-NC-27503,US,NC,27503,7.5,,,, +US-NC-27504,US,NC,27504,6.75,,,, +US-NC-27505,US,NC,27505,6.75,,,, +US-NC-27506,US,NC,27506,6.75,,,, +US-NC-27507,US,NC,27507,6.75,,,, +US-NC-27508,US,NC,27508,6.75,,,, +US-NC-27509,US,NC,27509,6.75,,,, +US-NC-27510,US,NC,27510,7.5,,,, +US-NC-27511,US,NC,27511,6.75,,,, +US-NC-27512,US,NC,27512,6.75,,,, +US-NC-27513,US,NC,27513,6.75,,,, +US-NC-27514,US,NC,27514,7.5,,,, +US-NC-27515,US,NC,27515,7.5,,,, +US-NC-27516,US,NC,27516,7.5,,,, +US-NC-27517,US,NC,27517,6.75,,,, +US-NC-27518,US,NC,27518,6.75,,,, +US-NC-27519,US,NC,27519,6.75,,,, +US-NC-27520,US,NC,27520,6.75,,,, +US-NC-27521,US,NC,27521,6.75,,,, +US-NC-27522,US,NC,27522,6.75,,,, +US-NC-27523,US,NC,27523,6.75,,,, +US-NC-27524,US,NC,27524,6.75,,,, +US-NC-27525,US,NC,27525,6.75,,,, +US-NC-27526,US,NC,27526,6.75,,,, +US-NC-27527,US,NC,27527,6.75,,,, +US-NC-27528,US,NC,27528,6.75,,,, +US-NC-27529,US,NC,27529,6.75,,,, +US-NC-27530,US,NC,27530,6.75,,,, +US-NC-27531,US,NC,27531,6.75,,,, +US-NC-27532,US,NC,27532,6.75,,,, +US-NC-27533,US,NC,27533,6.75,,,, +US-NC-27534,US,NC,27534,6.75,,,, +US-NC-27536,US,NC,27536,6.75,,,, +US-NC-27537,US,NC,27537,6.75,,,, +US-NC-27539,US,NC,27539,6.75,,,, +US-NC-27540,US,NC,27540,6.75,,,, +US-NC-27541,US,NC,27541,6.75,,,, +US-NC-27542,US,NC,27542,6.75,,,, +US-NC-27543,US,NC,27543,6.75,,,, +US-NC-27544,US,NC,27544,6.75,,,, +US-NC-27545,US,NC,27545,6.75,,,, +US-NC-27546,US,NC,27546,6.75,,,, +US-NC-27549,US,NC,27549,6.75,,,, +US-NC-27551,US,NC,27551,6.75,,,, +US-NC-27552,US,NC,27552,6.75,,,, +US-NC-27553,US,NC,27553,6.75,,,, +US-NC-27555,US,NC,27555,6.75,,,, +US-NC-27556,US,NC,27556,6.75,,,, +US-NC-27557,US,NC,27557,6.75,,,, +US-NC-27559,US,NC,27559,6.75,,,, +US-NC-27560,US,NC,27560,6.75,,,, +US-NC-27562,US,NC,27562,6.75,,,, +US-NC-27563,US,NC,27563,6.75,,,, +US-NC-27565,US,NC,27565,6.75,,,, +US-NC-27568,US,NC,27568,6.75,,,, +US-NC-27569,US,NC,27569,6.75,,,, +US-NC-27570,US,NC,27570,6.75,,,, +US-NC-27571,US,NC,27571,6.75,,,, +US-NC-27572,US,NC,27572,7.5,,,, +US-NC-27573,US,NC,27573,6.75,,,, +US-NC-27574,US,NC,27574,6.75,,,, +US-NC-27576,US,NC,27576,6.75,,,, +US-NC-27577,US,NC,27577,6.75,,,, +US-NC-27581,US,NC,27581,6.75,,,, +US-NC-27582,US,NC,27582,6.75,,,, +US-NC-27583,US,NC,27583,6.75,,,, +US-NC-27584,US,NC,27584,6.75,,,, +US-NC-27586,US,NC,27586,6.75,,,, +US-NC-27587,US,NC,27587,6.75,,,, +US-NC-27588,US,NC,27588,6.75,,,, +US-NC-27589,US,NC,27589,6.75,,,, +US-NC-27591,US,NC,27591,6.75,,,, +US-NC-27592,US,NC,27592,6.75,,,, +US-NC-27593,US,NC,27593,6.75,,,, +US-NC-27594,US,NC,27594,6.75,,,, +US-NC-27596,US,NC,27596,6.75,,,, +US-NC-27597,US,NC,27597,6.75,,,, +US-NC-27599,US,NC,27599,7.5,,,, +US-NC-27601,US,NC,27601,6.75,,,, +US-NC-27602,US,NC,27602,6.75,,,, +US-NC-27603,US,NC,27603,6.75,,,, +US-NC-27604,US,NC,27604,6.75,,,, +US-NC-27605,US,NC,27605,6.75,,,, +US-NC-27606,US,NC,27606,6.75,,,, +US-NC-27607,US,NC,27607,6.75,,,, +US-NC-27608,US,NC,27608,6.75,,,, +US-NC-27609,US,NC,27609,6.75,,,, +US-NC-27610,US,NC,27610,6.75,,,, +US-NC-27611,US,NC,27611,6.75,,,, +US-NC-27612,US,NC,27612,6.75,,,, +US-NC-27613,US,NC,27613,6.75,,,, +US-NC-27614,US,NC,27614,6.75,,,, +US-NC-27615,US,NC,27615,6.75,,,, +US-NC-27616,US,NC,27616,6.75,,,, +US-NC-27617,US,NC,27617,6.75,,,, +US-NC-27619,US,NC,27619,6.75,,,, +US-NC-27620,US,NC,27620,6.75,,,, +US-NC-27621,US,NC,27621,6.75,,,, +US-NC-27622,US,NC,27622,6.75,,,, +US-NC-27623,US,NC,27623,6.75,,,, +US-NC-27624,US,NC,27624,6.75,,,, +US-NC-27625,US,NC,27625,6.75,,,, +US-NC-27626,US,NC,27626,6.75,,,, +US-NC-27627,US,NC,27627,6.75,,,, +US-NC-27628,US,NC,27628,6.75,,,, +US-NC-27629,US,NC,27629,6.75,,,, +US-NC-27634,US,NC,27634,6.75,,,, +US-NC-27635,US,NC,27635,6.75,,,, +US-NC-27636,US,NC,27636,6.75,,,, +US-NC-27640,US,NC,27640,6.75,,,, +US-NC-27650,US,NC,27650,6.75,,,, +US-NC-27656,US,NC,27656,6.75,,,, +US-NC-27658,US,NC,27658,6.75,,,, +US-NC-27661,US,NC,27661,6.75,,,, +US-NC-27668,US,NC,27668,6.75,,,, +US-NC-27675,US,NC,27675,6.75,,,, +US-NC-27676,US,NC,27676,6.75,,,, +US-NC-27690,US,NC,27690,6.75,,,, +US-NC-27695,US,NC,27695,6.75,,,, +US-NC-27697,US,NC,27697,6.75,,,, +US-NC-27698,US,NC,27698,6.75,,,, +US-NC-27699,US,NC,27699,6.75,,,, +US-NC-27701,US,NC,27701,7.5,,,, +US-NC-27702,US,NC,27702,7.5,,,, +US-NC-27703,US,NC,27703,7.5,,,, +US-NC-27704,US,NC,27704,7.5,,,, +US-NC-27705,US,NC,27705,7.5,,,, +US-NC-27706,US,NC,27706,7.5,,,, +US-NC-27707,US,NC,27707,7.5,,,, +US-NC-27708,US,NC,27708,7.5,,,, +US-NC-27709,US,NC,27709,7.5,,,, +US-NC-27710,US,NC,27710,7.5,,,, +US-NC-27711,US,NC,27711,7.5,,,, +US-NC-27712,US,NC,27712,7.5,,,, +US-NC-27713,US,NC,27713,7.5,,,, +US-NC-27715,US,NC,27715,7.5,,,, +US-NC-27717,US,NC,27717,7.5,,,, +US-NC-27722,US,NC,27722,7.5,,,, +US-NC-27801,US,NC,27801,7,,,, +US-NC-27802,US,NC,27802,7,,,, +US-NC-27803,US,NC,27803,6.75,,,, +US-NC-27804,US,NC,27804,6.75,,,, +US-NC-27805,US,NC,27805,6.75,,,, +US-NC-27806,US,NC,27806,6.75,,,, +US-NC-27807,US,NC,27807,6.75,,,, +US-NC-27808,US,NC,27808,6.75,,,, +US-NC-27809,US,NC,27809,6.75,,,, +US-NC-27810,US,NC,27810,6.75,,,, +US-NC-27811,US,NC,27811,7,,,, +US-NC-27812,US,NC,27812,7,,,, +US-NC-27813,US,NC,27813,6.75,,,, +US-NC-27814,US,NC,27814,6.75,,,, +US-NC-27815,US,NC,27815,7,,,, +US-NC-27816,US,NC,27816,6.75,,,, +US-NC-27817,US,NC,27817,6.75,,,, +US-NC-27818,US,NC,27818,7,,,, +US-NC-27819,US,NC,27819,7,,,, +US-NC-27820,US,NC,27820,6.75,,,, +US-NC-27821,US,NC,27821,6.75,,,, +US-NC-27822,US,NC,27822,6.75,,,, +US-NC-27823,US,NC,27823,7,,,, +US-NC-27824,US,NC,27824,6.75,,,, +US-NC-27825,US,NC,27825,7,,,, +US-NC-27826,US,NC,27826,6.75,,,, +US-NC-27827,US,NC,27827,7,,,, +US-NC-27828,US,NC,27828,7,,,, +US-NC-27829,US,NC,27829,7,,,, +US-NC-27830,US,NC,27830,6.75,,,, +US-NC-27831,US,NC,27831,6.75,,,, +US-NC-27832,US,NC,27832,6.75,,,, +US-NC-27833,US,NC,27833,7,,,, +US-NC-27834,US,NC,27834,7,,,, +US-NC-27835,US,NC,27835,7,,,, +US-NC-27836,US,NC,27836,7,,,, +US-NC-27837,US,NC,27837,7,,,, +US-NC-27839,US,NC,27839,7,,,, +US-NC-27840,US,NC,27840,7,,,, +US-NC-27841,US,NC,27841,7,,,, +US-NC-27842,US,NC,27842,6.75,,,, +US-NC-27843,US,NC,27843,7,,,, +US-NC-27844,US,NC,27844,7,,,, +US-NC-27845,US,NC,27845,6.75,,,, +US-NC-27846,US,NC,27846,7,,,, +US-NC-27847,US,NC,27847,6.75,,,, +US-NC-27849,US,NC,27849,6.75,,,, +US-NC-27850,US,NC,27850,7,,,, +US-NC-27851,US,NC,27851,6.75,,,, +US-NC-27852,US,NC,27852,7,,,, +US-NC-27853,US,NC,27853,6.75,,,, +US-NC-27855,US,NC,27855,7,,,, +US-NC-27856,US,NC,27856,6.75,,,, +US-NC-27857,US,NC,27857,7,,,, +US-NC-27858,US,NC,27858,7,,,, +US-NC-27860,US,NC,27860,6.75,,,, +US-NC-27861,US,NC,27861,7,,,, +US-NC-27862,US,NC,27862,6.75,,,, +US-NC-27863,US,NC,27863,6.75,,,, +US-NC-27864,US,NC,27864,7,,,, +US-NC-27865,US,NC,27865,6.75,,,, +US-NC-27866,US,NC,27866,6.75,,,, +US-NC-27867,US,NC,27867,6.75,,,, +US-NC-27868,US,NC,27868,6.75,,,, +US-NC-27869,US,NC,27869,6.75,,,, +US-NC-27870,US,NC,27870,7,,,, +US-NC-27871,US,NC,27871,7,,,, +US-NC-27872,US,NC,27872,6.75,,,, +US-NC-27873,US,NC,27873,6.75,,,, +US-NC-27874,US,NC,27874,7,,,, +US-NC-27875,US,NC,27875,6.75,,,, +US-NC-27876,US,NC,27876,6.75,,,, +US-NC-27877,US,NC,27877,6.75,,,, +US-NC-27878,US,NC,27878,6.75,,,, +US-NC-27879,US,NC,27879,7,,,, +US-NC-27880,US,NC,27880,6.75,,,, +US-NC-27881,US,NC,27881,7,,,, +US-NC-27882,US,NC,27882,6.75,,,, +US-NC-27883,US,NC,27883,6.75,,,, +US-NC-27884,US,NC,27884,7,,,, +US-NC-27885,US,NC,27885,6.75,,,, +US-NC-27886,US,NC,27886,7,,,, +US-NC-27887,US,NC,27887,7,,,, +US-NC-27888,US,NC,27888,7,,,, +US-NC-27889,US,NC,27889,6.75,,,, +US-NC-27890,US,NC,27890,7,,,, +US-NC-27891,US,NC,27891,6.75,,,, +US-NC-27892,US,NC,27892,7,,,, +US-NC-27893,US,NC,27893,6.75,,,, +US-NC-27894,US,NC,27894,6.75,,,, +US-NC-27895,US,NC,27895,6.75,,,, +US-NC-27896,US,NC,27896,6.75,,,, +US-NC-27897,US,NC,27897,6.75,,,, +US-NC-27906,US,NC,27906,6.75,,,, +US-NC-27907,US,NC,27907,6.75,,,, +US-NC-27909,US,NC,27909,6.75,,,, +US-NC-27910,US,NC,27910,7,,,, +US-NC-27915,US,NC,27915,6.75,,,, +US-NC-27916,US,NC,27916,6.75,,,, +US-NC-27917,US,NC,27917,6.75,,,, +US-NC-27919,US,NC,27919,6.75,,,, +US-NC-27920,US,NC,27920,6.75,,,, +US-NC-27921,US,NC,27921,6.75,,,, +US-NC-27922,US,NC,27922,7,,,, +US-NC-27923,US,NC,27923,6.75,,,, +US-NC-27924,US,NC,27924,6.75,,,, +US-NC-27925,US,NC,27925,6.75,,,, +US-NC-27926,US,NC,27926,6.75,,,, +US-NC-27927,US,NC,27927,6.75,,,, +US-NC-27928,US,NC,27928,6.75,,,, +US-NC-27929,US,NC,27929,6.75,,,, +US-NC-27930,US,NC,27930,6.75,,,, +US-NC-27932,US,NC,27932,6.75,,,, +US-NC-27935,US,NC,27935,6.75,,,, +US-NC-27936,US,NC,27936,6.75,,,, +US-NC-27937,US,NC,27937,6.75,,,, +US-NC-27938,US,NC,27938,6.75,,,, +US-NC-27939,US,NC,27939,6.75,,,, +US-NC-27941,US,NC,27941,6.75,,,, +US-NC-27942,US,NC,27942,7,,,, +US-NC-27943,US,NC,27943,6.75,,,, +US-NC-27944,US,NC,27944,6.75,,,, +US-NC-27946,US,NC,27946,6.75,,,, +US-NC-27947,US,NC,27947,6.75,,,, +US-NC-27948,US,NC,27948,6.75,,,, +US-NC-27949,US,NC,27949,6.75,,,, +US-NC-27950,US,NC,27950,6.75,,,, +US-NC-27953,US,NC,27953,6.75,,,, +US-NC-27954,US,NC,27954,6.75,,,, +US-NC-27956,US,NC,27956,6.75,,,, +US-NC-27957,US,NC,27957,6.75,,,, +US-NC-27958,US,NC,27958,6.75,,,, +US-NC-27959,US,NC,27959,6.75,,,, +US-NC-27960,US,NC,27960,6.75,,,, +US-NC-27962,US,NC,27962,6.75,,,, +US-NC-27964,US,NC,27964,6.75,,,, +US-NC-27965,US,NC,27965,6.75,,,, +US-NC-27966,US,NC,27966,6.75,,,, +US-NC-27967,US,NC,27967,6.75,,,, +US-NC-27968,US,NC,27968,6.75,,,, +US-NC-27969,US,NC,27969,6.75,,,, +US-NC-27970,US,NC,27970,6.75,,,, +US-NC-27972,US,NC,27972,6.75,,,, +US-NC-27973,US,NC,27973,6.75,,,, +US-NC-27974,US,NC,27974,6.75,,,, +US-NC-27976,US,NC,27976,6.75,,,, +US-NC-27978,US,NC,27978,6.75,,,, +US-NC-27979,US,NC,27979,6.75,,,, +US-NC-27980,US,NC,27980,6.75,,,, +US-NC-27981,US,NC,27981,6.75,,,, +US-NC-27982,US,NC,27982,6.75,,,, +US-NC-27983,US,NC,27983,6.75,,,, +US-NC-27985,US,NC,27985,6.75,,,, +US-NC-27986,US,NC,27986,7,,,, +US-NC-28001,US,NC,28001,6.75,,,, +US-NC-28002,US,NC,28002,6.75,,,, +US-NC-28006,US,NC,28006,6.75,,,, +US-NC-28007,US,NC,28007,6.75,,,, +US-NC-28009,US,NC,28009,6.75,,,, +US-NC-28010,US,NC,28010,6.75,,,, +US-NC-28012,US,NC,28012,6.75,,,, +US-NC-28016,US,NC,28016,6.75,,,, +US-NC-28017,US,NC,28017,6.75,,,, +US-NC-28018,US,NC,28018,6.75,,,, +US-NC-28019,US,NC,28019,6.75,,,, +US-NC-28020,US,NC,28020,6.75,,,, +US-NC-28021,US,NC,28021,6.75,,,, +US-NC-28023,US,NC,28023,7,,,, +US-NC-28024,US,NC,28024,6.75,,,, +US-NC-28025,US,NC,28025,7,,,, +US-NC-28026,US,NC,28026,7,,,, +US-NC-28027,US,NC,28027,7,,,, +US-NC-28031,US,NC,28031,7.25,,,, +US-NC-28032,US,NC,28032,6.75,,,, +US-NC-28033,US,NC,28033,6.75,,,, +US-NC-28034,US,NC,28034,6.75,,,, +US-NC-28035,US,NC,28035,7.25,,,, +US-NC-28036,US,NC,28036,7.25,,,, +US-NC-28037,US,NC,28037,6.75,,,, +US-NC-28038,US,NC,28038,6.75,,,, +US-NC-28039,US,NC,28039,7,,,, +US-NC-28040,US,NC,28040,6.75,,,, +US-NC-28041,US,NC,28041,7,,,, +US-NC-28042,US,NC,28042,6.75,,,, +US-NC-28043,US,NC,28043,6.75,,,, +US-NC-28052,US,NC,28052,6.75,,,, +US-NC-28053,US,NC,28053,6.75,,,, +US-NC-28054,US,NC,28054,6.75,,,, +US-NC-28055,US,NC,28055,6.75,,,, +US-NC-28056,US,NC,28056,6.75,,,, +US-NC-28070,US,NC,28070,7.25,,,, +US-NC-28071,US,NC,28071,7,,,, +US-NC-28072,US,NC,28072,7,,,, +US-NC-28073,US,NC,28073,6.75,,,, +US-NC-28074,US,NC,28074,6.75,,,, +US-NC-28075,US,NC,28075,7,,,, +US-NC-28076,US,NC,28076,6.75,,,, +US-NC-28077,US,NC,28077,6.75,,,, +US-NC-28078,US,NC,28078,7.25,,,, +US-NC-28079,US,NC,28079,6.75,,,, +US-NC-28080,US,NC,28080,6.75,,,, +US-NC-28081,US,NC,28081,7,,,, +US-NC-28082,US,NC,28082,7,,,, +US-NC-28083,US,NC,28083,7,,,, +US-NC-28086,US,NC,28086,6.75,,,, +US-NC-28088,US,NC,28088,7,,,, +US-NC-28089,US,NC,28089,6.75,,,, +US-NC-28090,US,NC,28090,6.75,,,, +US-NC-28091,US,NC,28091,6.75,,,, +US-NC-28092,US,NC,28092,6.75,,,, +US-NC-28093,US,NC,28093,6.75,,,, +US-NC-28097,US,NC,28097,6.75,,,, +US-NC-28098,US,NC,28098,6.75,,,, +US-NC-28101,US,NC,28101,6.75,,,, +US-NC-28102,US,NC,28102,6.75,,,, +US-NC-28103,US,NC,28103,6.75,,,, +US-NC-28104,US,NC,28104,6.75,,,, +US-NC-28105,US,NC,28105,7.25,,,, +US-NC-28106,US,NC,28106,7.25,,,, +US-NC-28107,US,NC,28107,7,,,, +US-NC-28108,US,NC,28108,6.75,,,, +US-NC-28109,US,NC,28109,6.75,,,, +US-NC-28110,US,NC,28110,6.75,,,, +US-NC-28111,US,NC,28111,6.75,,,, +US-NC-28112,US,NC,28112,6.75,,,, +US-NC-28114,US,NC,28114,6.75,,,, +US-NC-28115,US,NC,28115,6.75,,,, +US-NC-28117,US,NC,28117,6.75,,,, +US-NC-28119,US,NC,28119,6.75,,,, +US-NC-28120,US,NC,28120,6.75,,,, +US-NC-28123,US,NC,28123,6.75,,,, +US-NC-28124,US,NC,28124,7,,,, +US-NC-28125,US,NC,28125,7,,,, +US-NC-28126,US,NC,28126,7.25,,,, +US-NC-28127,US,NC,28127,6.75,,,, +US-NC-28128,US,NC,28128,6.75,,,, +US-NC-28129,US,NC,28129,6.75,,,, +US-NC-28130,US,NC,28130,7.25,,,, +US-NC-28133,US,NC,28133,6.75,,,, +US-NC-28134,US,NC,28134,7.25,,,, +US-NC-28135,US,NC,28135,6.75,,,, +US-NC-28136,US,NC,28136,6.75,,,, +US-NC-28137,US,NC,28137,6.75,,,, +US-NC-28138,US,NC,28138,7,,,, +US-NC-28139,US,NC,28139,6.75,,,, +US-NC-28144,US,NC,28144,7,,,, +US-NC-28145,US,NC,28145,7,,,, +US-NC-28146,US,NC,28146,7,,,, +US-NC-28147,US,NC,28147,7,,,, +US-NC-28150,US,NC,28150,6.75,,,, +US-NC-28151,US,NC,28151,6.75,,,, +US-NC-28152,US,NC,28152,6.75,,,, +US-NC-28159,US,NC,28159,7,,,, +US-NC-28160,US,NC,28160,6.75,,,, +US-NC-28163,US,NC,28163,6.75,,,, +US-NC-28164,US,NC,28164,6.75,,,, +US-NC-28166,US,NC,28166,6.75,,,, +US-NC-28167,US,NC,28167,6.75,,,, +US-NC-28168,US,NC,28168,6.75,,,, +US-NC-28169,US,NC,28169,6.75,,,, +US-NC-28170,US,NC,28170,6.75,,,, +US-NC-28173,US,NC,28173,6.75,,,, +US-NC-28174,US,NC,28174,6.75,,,, +US-NC-28201,US,NC,28201,7.25,,,, +US-NC-28202,US,NC,28202,7.25,,,, +US-NC-28203,US,NC,28203,7.25,,,, +US-NC-28204,US,NC,28204,7.25,,,, +US-NC-28205,US,NC,28205,7.25,,,, +US-NC-28206,US,NC,28206,7.25,,,, +US-NC-28207,US,NC,28207,7.25,,,, +US-NC-28208,US,NC,28208,7.25,,,, +US-NC-28209,US,NC,28209,7.25,,,, +US-NC-28210,US,NC,28210,7.25,,,, +US-NC-28211,US,NC,28211,7.25,,,, +US-NC-28212,US,NC,28212,7.25,,,, +US-NC-28213,US,NC,28213,7.25,,,, +US-NC-28214,US,NC,28214,7.25,,,, +US-NC-28215,US,NC,28215,7.25,,,, +US-NC-28216,US,NC,28216,7.25,,,, +US-NC-28217,US,NC,28217,7.25,,,, +US-NC-28218,US,NC,28218,7.25,,,, +US-NC-28219,US,NC,28219,7.25,,,, +US-NC-28220,US,NC,28220,7.25,,,, +US-NC-28221,US,NC,28221,7.25,,,, +US-NC-28222,US,NC,28222,7.25,,,, +US-NC-28223,US,NC,28223,7.25,,,, +US-NC-28224,US,NC,28224,7.25,,,, +US-NC-28226,US,NC,28226,7.25,,,, +US-NC-28227,US,NC,28227,7.25,,,, +US-NC-28228,US,NC,28228,7.25,,,, +US-NC-28229,US,NC,28229,7.25,,,, +US-NC-28230,US,NC,28230,7.25,,,, +US-NC-28231,US,NC,28231,7.25,,,, +US-NC-28232,US,NC,28232,7.25,,,, +US-NC-28233,US,NC,28233,7.25,,,, +US-NC-28234,US,NC,28234,7.25,,,, +US-NC-28235,US,NC,28235,7.25,,,, +US-NC-28236,US,NC,28236,7.25,,,, +US-NC-28237,US,NC,28237,7.25,,,, +US-NC-28241,US,NC,28241,7.25,,,, +US-NC-28242,US,NC,28242,7.25,,,, +US-NC-28243,US,NC,28243,7.25,,,, +US-NC-28244,US,NC,28244,7.25,,,, +US-NC-28246,US,NC,28246,7.25,,,, +US-NC-28247,US,NC,28247,7.25,,,, +US-NC-28250,US,NC,28250,7.25,,,, +US-NC-28253,US,NC,28253,7.25,,,, +US-NC-28254,US,NC,28254,7.25,,,, +US-NC-28255,US,NC,28255,7.25,,,, +US-NC-28256,US,NC,28256,7.25,,,, +US-NC-28258,US,NC,28258,7.25,,,, +US-NC-28260,US,NC,28260,7.25,,,, +US-NC-28262,US,NC,28262,7.25,,,, +US-NC-28263,US,NC,28263,7.25,,,, +US-NC-28265,US,NC,28265,7.25,,,, +US-NC-28266,US,NC,28266,7.25,,,, +US-NC-28269,US,NC,28269,7.25,,,, +US-NC-28270,US,NC,28270,7.25,,,, +US-NC-28271,US,NC,28271,7.25,,,, +US-NC-28272,US,NC,28272,7.25,,,, +US-NC-28273,US,NC,28273,7.25,,,, +US-NC-28274,US,NC,28274,7.25,,,, +US-NC-28275,US,NC,28275,7.25,,,, +US-NC-28277,US,NC,28277,7.25,,,, +US-NC-28278,US,NC,28278,7.25,,,, +US-NC-28280,US,NC,28280,7.25,,,, +US-NC-28281,US,NC,28281,7.25,,,, +US-NC-28282,US,NC,28282,7.25,,,, +US-NC-28284,US,NC,28284,7.25,,,, +US-NC-28285,US,NC,28285,7.25,,,, +US-NC-28287,US,NC,28287,7.25,,,, +US-NC-28288,US,NC,28288,7.25,,,, +US-NC-28289,US,NC,28289,7.25,,,, +US-NC-28290,US,NC,28290,7.25,,,, +US-NC-28296,US,NC,28296,7.25,,,, +US-NC-28297,US,NC,28297,7.25,,,, +US-NC-28299,US,NC,28299,7.25,,,, +US-NC-28301,US,NC,28301,7,,,, +US-NC-28302,US,NC,28302,7,,,, +US-NC-28303,US,NC,28303,7,,,, +US-NC-28304,US,NC,28304,7,,,, +US-NC-28305,US,NC,28305,7,,,, +US-NC-28306,US,NC,28306,7,,,, +US-NC-28307,US,NC,28307,7,,,, +US-NC-28308,US,NC,28308,7,,,, +US-NC-28309,US,NC,28309,7,,,, +US-NC-28310,US,NC,28310,7,,,, +US-NC-28311,US,NC,28311,7,,,, +US-NC-28312,US,NC,28312,7,,,, +US-NC-28314,US,NC,28314,7,,,, +US-NC-28315,US,NC,28315,6.75,,,, +US-NC-28318,US,NC,28318,7,,,, +US-NC-28319,US,NC,28319,7,,,, +US-NC-28320,US,NC,28320,6.75,,,, +US-NC-28323,US,NC,28323,6.75,,,, +US-NC-28325,US,NC,28325,7,,,, +US-NC-28326,US,NC,28326,6.75,,,, +US-NC-28327,US,NC,28327,6.75,,,, +US-NC-28328,US,NC,28328,7,,,, +US-NC-28329,US,NC,28329,7,,,, +US-NC-28330,US,NC,28330,6.75,,,, +US-NC-28331,US,NC,28331,7,,,, +US-NC-28332,US,NC,28332,6.75,,,, +US-NC-28333,US,NC,28333,6.75,,,, +US-NC-28334,US,NC,28334,6.75,,,, +US-NC-28335,US,NC,28335,6.75,,,, +US-NC-28337,US,NC,28337,6.75,,,, +US-NC-28338,US,NC,28338,6.75,,,, +US-NC-28339,US,NC,28339,6.75,,,, +US-NC-28340,US,NC,28340,7,,,, +US-NC-28341,US,NC,28341,7,,,, +US-NC-28342,US,NC,28342,7,,,, +US-NC-28343,US,NC,28343,6.75,,,, +US-NC-28344,US,NC,28344,7,,,, +US-NC-28345,US,NC,28345,6.75,,,, +US-NC-28347,US,NC,28347,6.75,,,, +US-NC-28348,US,NC,28348,7,,,, +US-NC-28349,US,NC,28349,7,,,, +US-NC-28350,US,NC,28350,6.75,,,, +US-NC-28351,US,NC,28351,6.75,,,, +US-NC-28352,US,NC,28352,6.75,,,, +US-NC-28353,US,NC,28353,6.75,,,, +US-NC-28355,US,NC,28355,7,,,, +US-NC-28356,US,NC,28356,7,,,, +US-NC-28357,US,NC,28357,7,,,, +US-NC-28358,US,NC,28358,7,,,, +US-NC-28359,US,NC,28359,7,,,, +US-NC-28360,US,NC,28360,7,,,, +US-NC-28362,US,NC,28362,7,,,, +US-NC-28363,US,NC,28363,6.75,,,, +US-NC-28364,US,NC,28364,7,,,, +US-NC-28365,US,NC,28365,6.75,,,, +US-NC-28366,US,NC,28366,7,,,, +US-NC-28367,US,NC,28367,6.75,,,, +US-NC-28368,US,NC,28368,6.75,,,, +US-NC-28369,US,NC,28369,7,,,, +US-NC-28370,US,NC,28370,6.75,,,, +US-NC-28371,US,NC,28371,7,,,, +US-NC-28372,US,NC,28372,7,,,, +US-NC-28373,US,NC,28373,6.75,,,, +US-NC-28374,US,NC,28374,6.75,,,, +US-NC-28375,US,NC,28375,7,,,, +US-NC-28376,US,NC,28376,6.75,,,, +US-NC-28377,US,NC,28377,7,,,, +US-NC-28378,US,NC,28378,7,,,, +US-NC-28379,US,NC,28379,6.75,,,, +US-NC-28380,US,NC,28380,6.75,,,, +US-NC-28382,US,NC,28382,7,,,, +US-NC-28383,US,NC,28383,7,,,, +US-NC-28384,US,NC,28384,7,,,, +US-NC-28385,US,NC,28385,7,,,, +US-NC-28386,US,NC,28386,7,,,, +US-NC-28387,US,NC,28387,6.75,,,, +US-NC-28388,US,NC,28388,6.75,,,, +US-NC-28390,US,NC,28390,6.75,,,, +US-NC-28391,US,NC,28391,7,,,, +US-NC-28392,US,NC,28392,6.75,,,, +US-NC-28393,US,NC,28393,7,,,, +US-NC-28394,US,NC,28394,6.75,,,, +US-NC-28395,US,NC,28395,7,,,, +US-NC-28396,US,NC,28396,6.75,,,, +US-NC-28398,US,NC,28398,7,,,, +US-NC-28399,US,NC,28399,6.75,,,, +US-NC-28401,US,NC,28401,7,,,, +US-NC-28402,US,NC,28402,7,,,, +US-NC-28403,US,NC,28403,7,,,, +US-NC-28404,US,NC,28404,7,,,, +US-NC-28405,US,NC,28405,7,,,, +US-NC-28406,US,NC,28406,7,,,, +US-NC-28407,US,NC,28407,7,,,, +US-NC-28408,US,NC,28408,7,,,, +US-NC-28409,US,NC,28409,7,,,, +US-NC-28410,US,NC,28410,7,,,, +US-NC-28411,US,NC,28411,7,,,, +US-NC-28412,US,NC,28412,7,,,, +US-NC-28420,US,NC,28420,6.75,,,, +US-NC-28421,US,NC,28421,6.75,,,, +US-NC-28422,US,NC,28422,6.75,,,, +US-NC-28423,US,NC,28423,6.75,,,, +US-NC-28424,US,NC,28424,6.75,,,, +US-NC-28425,US,NC,28425,6.75,,,, +US-NC-28428,US,NC,28428,7,,,, +US-NC-28429,US,NC,28429,7,,,, +US-NC-28430,US,NC,28430,6.75,,,, +US-NC-28431,US,NC,28431,6.75,,,, +US-NC-28432,US,NC,28432,6.75,,,, +US-NC-28433,US,NC,28433,6.75,,,, +US-NC-28434,US,NC,28434,6.75,,,, +US-NC-28435,US,NC,28435,6.75,,,, +US-NC-28436,US,NC,28436,6.75,,,, +US-NC-28438,US,NC,28438,6.75,,,, +US-NC-28439,US,NC,28439,6.75,,,, +US-NC-28441,US,NC,28441,7,,,, +US-NC-28442,US,NC,28442,6.75,,,, +US-NC-28443,US,NC,28443,6.75,,,, +US-NC-28444,US,NC,28444,7,,,, +US-NC-28445,US,NC,28445,7,,,, +US-NC-28447,US,NC,28447,7,,,, +US-NC-28448,US,NC,28448,6.75,,,, +US-NC-28449,US,NC,28449,7,,,, +US-NC-28450,US,NC,28450,6.75,,,, +US-NC-28451,US,NC,28451,6.75,,,, +US-NC-28452,US,NC,28452,6.75,,,, +US-NC-28453,US,NC,28453,7,,,, +US-NC-28454,US,NC,28454,6.75,,,, +US-NC-28455,US,NC,28455,6.75,,,, +US-NC-28456,US,NC,28456,6.75,,,, +US-NC-28457,US,NC,28457,6.75,,,, +US-NC-28458,US,NC,28458,7,,,, +US-NC-28459,US,NC,28459,6.75,,,, +US-NC-28460,US,NC,28460,7,,,, +US-NC-28461,US,NC,28461,6.75,,,, +US-NC-28462,US,NC,28462,6.75,,,, +US-NC-28463,US,NC,28463,6.75,,,, +US-NC-28464,US,NC,28464,7,,,, +US-NC-28465,US,NC,28465,6.75,,,, +US-NC-28466,US,NC,28466,7,,,, +US-NC-28467,US,NC,28467,6.75,,,, +US-NC-28468,US,NC,28468,6.75,,,, +US-NC-28469,US,NC,28469,6.75,,,, +US-NC-28470,US,NC,28470,6.75,,,, +US-NC-28472,US,NC,28472,6.75,,,, +US-NC-28478,US,NC,28478,6.75,,,, +US-NC-28479,US,NC,28479,6.75,,,, +US-NC-28480,US,NC,28480,7,,,, +US-NC-28501,US,NC,28501,6.75,,,, +US-NC-28502,US,NC,28502,6.75,,,, +US-NC-28503,US,NC,28503,6.75,,,, +US-NC-28504,US,NC,28504,6.75,,,, +US-NC-28508,US,NC,28508,7,,,, +US-NC-28509,US,NC,28509,6.75,,,, +US-NC-28510,US,NC,28510,6.75,,,, +US-NC-28511,US,NC,28511,6.75,,,, +US-NC-28512,US,NC,28512,6.75,,,, +US-NC-28513,US,NC,28513,7,,,, +US-NC-28515,US,NC,28515,6.75,,,, +US-NC-28516,US,NC,28516,6.75,,,, +US-NC-28518,US,NC,28518,7,,,, +US-NC-28519,US,NC,28519,6.75,,,, +US-NC-28520,US,NC,28520,6.75,,,, +US-NC-28521,US,NC,28521,7,,,, +US-NC-28522,US,NC,28522,6.75,,,, +US-NC-28523,US,NC,28523,6.75,,,, +US-NC-28524,US,NC,28524,6.75,,,, +US-NC-28525,US,NC,28525,6.75,,,, +US-NC-28526,US,NC,28526,6.75,,,, +US-NC-28527,US,NC,28527,6.75,,,, +US-NC-28528,US,NC,28528,6.75,,,, +US-NC-28529,US,NC,28529,6.75,,,, +US-NC-28530,US,NC,28530,7,,,, +US-NC-28531,US,NC,28531,6.75,,,, +US-NC-28532,US,NC,28532,6.75,,,, +US-NC-28537,US,NC,28537,6.75,,,, +US-NC-28538,US,NC,28538,7,,,, +US-NC-28539,US,NC,28539,7,,,, +US-NC-28540,US,NC,28540,7,,,, +US-NC-28541,US,NC,28541,7,,,, +US-NC-28543,US,NC,28543,7,,,, +US-NC-28544,US,NC,28544,7,,,, +US-NC-28545,US,NC,28545,7,,,, +US-NC-28546,US,NC,28546,7,,,, +US-NC-28547,US,NC,28547,7,,,, +US-NC-28551,US,NC,28551,6.75,,,, +US-NC-28552,US,NC,28552,6.75,,,, +US-NC-28553,US,NC,28553,6.75,,,, +US-NC-28554,US,NC,28554,7,,,, +US-NC-28555,US,NC,28555,7,,,, +US-NC-28556,US,NC,28556,6.75,,,, +US-NC-28557,US,NC,28557,6.75,,,, +US-NC-28560,US,NC,28560,6.75,,,, +US-NC-28561,US,NC,28561,6.75,,,, +US-NC-28562,US,NC,28562,6.75,,,, +US-NC-28563,US,NC,28563,6.75,,,, +US-NC-28564,US,NC,28564,6.75,,,, +US-NC-28570,US,NC,28570,6.75,,,, +US-NC-28571,US,NC,28571,6.75,,,, +US-NC-28572,US,NC,28572,7,,,, +US-NC-28573,US,NC,28573,6.75,,,, +US-NC-28574,US,NC,28574,7,,,, +US-NC-28575,US,NC,28575,6.75,,,, +US-NC-28577,US,NC,28577,6.75,,,, +US-NC-28578,US,NC,28578,6.75,,,, +US-NC-28579,US,NC,28579,6.75,,,, +US-NC-28580,US,NC,28580,7,,,, +US-NC-28581,US,NC,28581,6.75,,,, +US-NC-28582,US,NC,28582,7,,,, +US-NC-28583,US,NC,28583,6.75,,,, +US-NC-28584,US,NC,28584,6.75,,,, +US-NC-28585,US,NC,28585,6.75,,,, +US-NC-28586,US,NC,28586,6.75,,,, +US-NC-28587,US,NC,28587,6.75,,,, +US-NC-28589,US,NC,28589,6.75,,,, +US-NC-28590,US,NC,28590,7,,,, +US-NC-28594,US,NC,28594,6.75,,,, +US-NC-28601,US,NC,28601,7,,,, +US-NC-28602,US,NC,28602,7,,,, +US-NC-28603,US,NC,28603,7,,,, +US-NC-28604,US,NC,28604,6.75,,,, +US-NC-28605,US,NC,28605,6.75,,,, +US-NC-28606,US,NC,28606,7,,,, +US-NC-28607,US,NC,28607,6.75,,,, +US-NC-28608,US,NC,28608,6.75,,,, +US-NC-28609,US,NC,28609,7,,,, +US-NC-28610,US,NC,28610,7,,,, +US-NC-28611,US,NC,28611,6.75,,,, +US-NC-28612,US,NC,28612,6.75,,,, +US-NC-28613,US,NC,28613,7,,,, +US-NC-28615,US,NC,28615,6.75,,,, +US-NC-28616,US,NC,28616,6.75,,,, +US-NC-28617,US,NC,28617,6.75,,,, +US-NC-28618,US,NC,28618,6.75,,,, +US-NC-28619,US,NC,28619,6.75,,,, +US-NC-28621,US,NC,28621,7,,,, +US-NC-28622,US,NC,28622,6.75,,,, +US-NC-28623,US,NC,28623,6.75,,,, +US-NC-28624,US,NC,28624,7,,,, +US-NC-28625,US,NC,28625,6.75,,,, +US-NC-28626,US,NC,28626,6.75,,,, +US-NC-28627,US,NC,28627,6.75,,,, +US-NC-28628,US,NC,28628,6.75,,,, +US-NC-28629,US,NC,28629,6.75,,,, +US-NC-28630,US,NC,28630,6.75,,,, +US-NC-28631,US,NC,28631,6.75,,,, +US-NC-28633,US,NC,28633,6.75,,,, +US-NC-28634,US,NC,28634,6.75,,,, +US-NC-28635,US,NC,28635,7,,,, +US-NC-28636,US,NC,28636,7,,,, +US-NC-28637,US,NC,28637,6.75,,,, +US-NC-28638,US,NC,28638,6.75,,,, +US-NC-28640,US,NC,28640,6.75,,,, +US-NC-28641,US,NC,28641,6.75,,,, +US-NC-28642,US,NC,28642,6.75,,,, +US-NC-28643,US,NC,28643,6.75,,,, +US-NC-28644,US,NC,28644,6.75,,,, +US-NC-28645,US,NC,28645,6.75,,,, +US-NC-28646,US,NC,28646,6.75,,,, +US-NC-28647,US,NC,28647,6.75,,,, +US-NC-28649,US,NC,28649,7,,,, +US-NC-28650,US,NC,28650,7,,,, +US-NC-28651,US,NC,28651,7,,,, +US-NC-28652,US,NC,28652,6.75,,,, +US-NC-28653,US,NC,28653,6.75,,,, +US-NC-28654,US,NC,28654,7,,,, +US-NC-28655,US,NC,28655,6.75,,,, +US-NC-28656,US,NC,28656,7,,,, +US-NC-28657,US,NC,28657,6.75,,,, +US-NC-28658,US,NC,28658,7,,,, +US-NC-28659,US,NC,28659,7,,,, +US-NC-28660,US,NC,28660,6.75,,,, +US-NC-28661,US,NC,28661,6.75,,,, +US-NC-28662,US,NC,28662,6.75,,,, +US-NC-28663,US,NC,28663,6.75,,,, +US-NC-28664,US,NC,28664,6.75,,,, +US-NC-28665,US,NC,28665,7,,,, +US-NC-28666,US,NC,28666,6.75,,,, +US-NC-28667,US,NC,28667,6.75,,,, +US-NC-28668,US,NC,28668,6.75,,,, +US-NC-28669,US,NC,28669,7,,,, +US-NC-28670,US,NC,28670,7,,,, +US-NC-28671,US,NC,28671,6.75,,,, +US-NC-28672,US,NC,28672,6.75,,,, +US-NC-28673,US,NC,28673,7,,,, +US-NC-28675,US,NC,28675,6.75,,,, +US-NC-28676,US,NC,28676,7,,,, +US-NC-28677,US,NC,28677,6.75,,,, +US-NC-28678,US,NC,28678,7,,,, +US-NC-28679,US,NC,28679,6.75,,,, +US-NC-28680,US,NC,28680,6.75,,,, +US-NC-28681,US,NC,28681,7,,,, +US-NC-28682,US,NC,28682,7,,,, +US-NC-28683,US,NC,28683,7,,,, +US-NC-28684,US,NC,28684,6.75,,,, +US-NC-28685,US,NC,28685,7,,,, +US-NC-28687,US,NC,28687,6.75,,,, +US-NC-28688,US,NC,28688,6.75,,,, +US-NC-28689,US,NC,28689,6.75,,,, +US-NC-28690,US,NC,28690,6.75,,,, +US-NC-28691,US,NC,28691,6.75,,,, +US-NC-28692,US,NC,28692,6.75,,,, +US-NC-28693,US,NC,28693,6.75,,,, +US-NC-28694,US,NC,28694,6.75,,,, +US-NC-28697,US,NC,28697,7,,,, +US-NC-28698,US,NC,28698,6.75,,,, +US-NC-28699,US,NC,28699,6.75,,,, +US-NC-28701,US,NC,28701,7,,,, +US-NC-28702,US,NC,28702,6.75,,,, +US-NC-28704,US,NC,28704,7,,,, +US-NC-28705,US,NC,28705,6.75,,,, +US-NC-28707,US,NC,28707,6.75,,,, +US-NC-28708,US,NC,28708,6.75,,,, +US-NC-28709,US,NC,28709,7,,,, +US-NC-28710,US,NC,28710,6.75,,,, +US-NC-28711,US,NC,28711,7,,,, +US-NC-28712,US,NC,28712,6.75,,,, +US-NC-28713,US,NC,28713,6.75,,,, +US-NC-28714,US,NC,28714,6.75,,,, +US-NC-28715,US,NC,28715,7,,,, +US-NC-28716,US,NC,28716,7,,,, +US-NC-28717,US,NC,28717,6.75,,,, +US-NC-28718,US,NC,28718,6.75,,,, +US-NC-28719,US,NC,28719,6.75,,,, +US-NC-28720,US,NC,28720,6.75,,,, +US-NC-28721,US,NC,28721,7,,,, +US-NC-28722,US,NC,28722,6.75,,,, +US-NC-28723,US,NC,28723,6.75,,,, +US-NC-28724,US,NC,28724,6.75,,,, +US-NC-28725,US,NC,28725,6.75,,,, +US-NC-28726,US,NC,28726,6.75,,,, +US-NC-28727,US,NC,28727,6.75,,,, +US-NC-28728,US,NC,28728,7,,,, +US-NC-28729,US,NC,28729,6.75,,,, +US-NC-28730,US,NC,28730,7,,,, +US-NC-28731,US,NC,28731,6.75,,,, +US-NC-28732,US,NC,28732,6.75,,,, +US-NC-28733,US,NC,28733,6.75,,,, +US-NC-28734,US,NC,28734,6.75,,,, +US-NC-28735,US,NC,28735,6.75,,,, +US-NC-28736,US,NC,28736,6.75,,,, +US-NC-28737,US,NC,28737,6.75,,,, +US-NC-28738,US,NC,28738,7,,,, +US-NC-28739,US,NC,28739,6.75,,,, +US-NC-28740,US,NC,28740,6.75,,,, +US-NC-28741,US,NC,28741,6.75,,,, +US-NC-28742,US,NC,28742,6.75,,,, +US-NC-28743,US,NC,28743,6.75,,,, +US-NC-28744,US,NC,28744,6.75,,,, +US-NC-28745,US,NC,28745,7,,,, +US-NC-28746,US,NC,28746,6.75,,,, +US-NC-28747,US,NC,28747,6.75,,,, +US-NC-28748,US,NC,28748,7,,,, +US-NC-28749,US,NC,28749,6.75,,,, +US-NC-28750,US,NC,28750,6.75,,,, +US-NC-28751,US,NC,28751,7,,,, +US-NC-28752,US,NC,28752,6.75,,,, +US-NC-28753,US,NC,28753,6.75,,,, +US-NC-28754,US,NC,28754,6.75,,,, +US-NC-28755,US,NC,28755,6.75,,,, +US-NC-28756,US,NC,28756,6.75,,,, +US-NC-28757,US,NC,28757,7,,,, +US-NC-28758,US,NC,28758,6.75,,,, +US-NC-28759,US,NC,28759,6.75,,,, +US-NC-28760,US,NC,28760,6.75,,,, +US-NC-28761,US,NC,28761,6.75,,,, +US-NC-28762,US,NC,28762,6.75,,,, +US-NC-28763,US,NC,28763,6.75,,,, +US-NC-28765,US,NC,28765,6.75,,,, +US-NC-28766,US,NC,28766,6.75,,,, +US-NC-28768,US,NC,28768,6.75,,,, +US-NC-28770,US,NC,28770,7,,,, +US-NC-28771,US,NC,28771,6.75,,,, +US-NC-28772,US,NC,28772,6.75,,,, +US-NC-28773,US,NC,28773,6.75,,,, +US-NC-28774,US,NC,28774,6.75,,,, +US-NC-28775,US,NC,28775,6.75,,,, +US-NC-28776,US,NC,28776,7,,,, +US-NC-28777,US,NC,28777,6.75,,,, +US-NC-28778,US,NC,28778,7,,,, +US-NC-28779,US,NC,28779,6.75,,,, +US-NC-28781,US,NC,28781,6.75,,,, +US-NC-28782,US,NC,28782,6.75,,,, +US-NC-28783,US,NC,28783,6.75,,,, +US-NC-28784,US,NC,28784,6.75,,,, +US-NC-28785,US,NC,28785,7,,,, +US-NC-28786,US,NC,28786,7,,,, +US-NC-28787,US,NC,28787,7,,,, +US-NC-28788,US,NC,28788,6.75,,,, +US-NC-28789,US,NC,28789,6.75,,,, +US-NC-28790,US,NC,28790,6.75,,,, +US-NC-28791,US,NC,28791,6.75,,,, +US-NC-28792,US,NC,28792,6.75,,,, +US-NC-28793,US,NC,28793,6.75,,,, +US-NC-28801,US,NC,28801,7,,,, +US-NC-28802,US,NC,28802,7,,,, +US-NC-28803,US,NC,28803,7,,,, +US-NC-28804,US,NC,28804,7,,,, +US-NC-28805,US,NC,28805,7,,,, +US-NC-28806,US,NC,28806,7,,,, +US-NC-28810,US,NC,28810,7,,,, +US-NC-28813,US,NC,28813,7,,,, +US-NC-28814,US,NC,28814,7,,,, +US-NC-28815,US,NC,28815,7,,,, +US-NC-28816,US,NC,28816,7,,,, +US-NC-28901,US,NC,28901,6.75,,,, +US-NC-28902,US,NC,28902,6.75,,,, +US-NC-28903,US,NC,28903,6.75,,,, +US-NC-28904,US,NC,28904,6.75,,,, +US-NC-28905,US,NC,28905,6.75,,,, +US-NC-28906,US,NC,28906,6.75,,,, +US-NC-28909,US,NC,28909,6.75,,,, +US-ND-58001,US,ND,58001,5,,,, +US-ND-58002,US,ND,58002,5.5,,,, +US-ND-58004,US,ND,58004,5.5,,,, +US-ND-58005,US,ND,58005,5.5,,,, +US-ND-58006,US,ND,58006,5.5,,,, +US-ND-58007,US,ND,58007,5.5,,,, +US-ND-58008,US,ND,58008,5,,,, +US-ND-58009,US,ND,58009,5,,,, +US-ND-58011,US,ND,58011,5.5,,,, +US-ND-58012,US,ND,58012,6.5,,,, +US-ND-58013,US,ND,58013,5,,,, +US-ND-58015,US,ND,58015,5,,,, +US-ND-58016,US,ND,58016,5,,,, +US-ND-58017,US,ND,58017,5,,,, +US-ND-58018,US,ND,58018,5,,,, +US-ND-58021,US,ND,58021,5.5,,,, +US-ND-58027,US,ND,58027,7,,,, +US-ND-58029,US,ND,58029,5.5,,,, +US-ND-58030,US,ND,58030,5,,,, +US-ND-58031,US,ND,58031,5,,,, +US-ND-58032,US,ND,58032,6.5,,,, +US-ND-58033,US,ND,58033,5,,,, +US-ND-58035,US,ND,58035,5,,,, +US-ND-58036,US,ND,58036,5.5,,,, +US-ND-58038,US,ND,58038,5.5,,,, +US-ND-58040,US,ND,58040,6,,,, +US-ND-58041,US,ND,58041,7,,,, +US-ND-58042,US,ND,58042,5.5,,,, +US-ND-58043,US,ND,58043,5,,,, +US-ND-58045,US,ND,58045,7,,,, +US-ND-58046,US,ND,58046,8,,,, +US-ND-58047,US,ND,58047,5.5,,,, +US-ND-58048,US,ND,58048,5.5,,,, +US-ND-58049,US,ND,58049,5,,,, +US-ND-58051,US,ND,58051,7,,,, +US-ND-58052,US,ND,58052,5.5,,,, +US-ND-58053,US,ND,58053,5,,,, +US-ND-58054,US,ND,58054,7,,,, +US-ND-58056,US,ND,58056,5,,,, +US-ND-58057,US,ND,58057,5,,,, +US-ND-58058,US,ND,58058,5,,,, +US-ND-58059,US,ND,58059,5.5,,,, +US-ND-58060,US,ND,58060,5,,,, +US-ND-58061,US,ND,58061,5,,,, +US-ND-58062,US,ND,58062,5,,,, +US-ND-58063,US,ND,58063,5,,,, +US-ND-58064,US,ND,58064,5.5,,,, +US-ND-58065,US,ND,58065,5,,,, +US-ND-58067,US,ND,58067,5,,,, +US-ND-58068,US,ND,58068,5,,,, +US-ND-58069,US,ND,58069,5,,,, +US-ND-58071,US,ND,58071,6.5,,,, +US-ND-58072,US,ND,58072,7.5,,,, +US-ND-58074,US,ND,58074,7,,,, +US-ND-58075,US,ND,58075,7,,,, +US-ND-58076,US,ND,58076,7,,,, +US-ND-58077,US,ND,58077,5,,,, +US-ND-58078,US,ND,58078,6.5,,,, +US-ND-58079,US,ND,58079,5.5,,,, +US-ND-58081,US,ND,58081,5,,,, +US-ND-58102,US,ND,58102,7.5,,,, +US-ND-58103,US,ND,58103,7.5,,,, +US-ND-58104,US,ND,58104,7.5,,,, +US-ND-58105,US,ND,58105,7.5,,,, +US-ND-58106,US,ND,58106,7.5,,,, +US-ND-58107,US,ND,58107,7.5,,,, +US-ND-58108,US,ND,58108,7.5,,,, +US-ND-58109,US,ND,58109,7.5,,,, +US-ND-58121,US,ND,58121,7.5,,,, +US-ND-58122,US,ND,58122,7.5,,,, +US-ND-58124,US,ND,58124,7.5,,,, +US-ND-58125,US,ND,58125,7.5,,,, +US-ND-58126,US,ND,58126,7.5,,,, +US-ND-58201,US,ND,58201,6.75,,,, +US-ND-58202,US,ND,58202,6.75,,,, +US-ND-58203,US,ND,58203,6.75,,,, +US-ND-58204,US,ND,58204,5,,,, +US-ND-58205,US,ND,58205,5,,,, +US-ND-58206,US,ND,58206,6.75,,,, +US-ND-58207,US,ND,58207,6.75,,,, +US-ND-58208,US,ND,58208,6.75,,,, +US-ND-58210,US,ND,58210,5.25,,,, +US-ND-58212,US,ND,58212,5,,,, +US-ND-58214,US,ND,58214,5,,,, +US-ND-58216,US,ND,58216,5,,,, +US-ND-58218,US,ND,58218,5,,,, +US-ND-58219,US,ND,58219,5,,,, +US-ND-58220,US,ND,58220,7,,,, +US-ND-58222,US,ND,58222,5,,,, +US-ND-58223,US,ND,58223,5,,,, +US-ND-58224,US,ND,58224,5,,,, +US-ND-58225,US,ND,58225,6.5,,,, +US-ND-58227,US,ND,58227,5,,,, +US-ND-58228,US,ND,58228,5,,,, +US-ND-58229,US,ND,58229,5.25,,,, +US-ND-58230,US,ND,58230,8,,,, +US-ND-58231,US,ND,58231,5.25,,,, +US-ND-58233,US,ND,58233,5.25,,,, +US-ND-58235,US,ND,58235,5,,,, +US-ND-58236,US,ND,58236,5,,,, +US-ND-58237,US,ND,58237,7.25,,,, +US-ND-58238,US,ND,58238,5,,,, +US-ND-58239,US,ND,58239,5,,,, +US-ND-58240,US,ND,58240,7,,,, +US-ND-58241,US,ND,58241,5,,,, +US-ND-58243,US,ND,58243,5.25,,,, +US-ND-58244,US,ND,58244,5,,,, +US-ND-58249,US,ND,58249,7,,,, +US-ND-58250,US,ND,58250,5.25,,,, +US-ND-58251,US,ND,58251,5,,,, +US-ND-58254,US,ND,58254,5,,,, +US-ND-58255,US,ND,58255,5,,,, +US-ND-58256,US,ND,58256,5,,,, +US-ND-58257,US,ND,58257,7,,,, +US-ND-58258,US,ND,58258,5,,,, +US-ND-58259,US,ND,58259,5,,,, +US-ND-58260,US,ND,58260,5,,,, +US-ND-58261,US,ND,58261,5.25,,,, +US-ND-58262,US,ND,58262,5,,,, +US-ND-58265,US,ND,58265,7,,,, +US-ND-58266,US,ND,58266,5,,,, +US-ND-58267,US,ND,58267,5,,,, +US-ND-58269,US,ND,58269,5,,,, +US-ND-58270,US,ND,58270,7.25,,,, +US-ND-58271,US,ND,58271,7.5,,,, +US-ND-58272,US,ND,58272,5,,,, +US-ND-58273,US,ND,58273,5.25,,,, +US-ND-58274,US,ND,58274,7,,,, +US-ND-58275,US,ND,58275,5,,,, +US-ND-58276,US,ND,58276,5,,,, +US-ND-58277,US,ND,58277,6,,,, +US-ND-58278,US,ND,58278,5,,,, +US-ND-58281,US,ND,58281,5,,,, +US-ND-58282,US,ND,58282,7,,,, +US-ND-58301,US,ND,58301,7,,,, +US-ND-58310,US,ND,58310,5,,,, +US-ND-58311,US,ND,58311,5,,,, +US-ND-58313,US,ND,58313,5,,,, +US-ND-58316,US,ND,58316,5,,,, +US-ND-58317,US,ND,58317,5,,,, +US-ND-58318,US,ND,58318,7,,,, +US-ND-58321,US,ND,58321,5,,,, +US-ND-58323,US,ND,58323,5,,,, +US-ND-58324,US,ND,58324,7,,,, +US-ND-58325,US,ND,58325,5,,,, +US-ND-58327,US,ND,58327,5,,,, +US-ND-58329,US,ND,58329,6,,,, +US-ND-58330,US,ND,58330,5,,,, +US-ND-58331,US,ND,58331,5,,,, +US-ND-58332,US,ND,58332,5,,,, +US-ND-58335,US,ND,58335,5,,,, +US-ND-58338,US,ND,58338,5,,,, +US-ND-58339,US,ND,58339,5,,,, +US-ND-58341,US,ND,58341,6,,,, +US-ND-58343,US,ND,58343,5,,,, +US-ND-58344,US,ND,58344,6,,,, +US-ND-58345,US,ND,58345,5,,,, +US-ND-58346,US,ND,58346,5,,,, +US-ND-58348,US,ND,58348,5,,,, +US-ND-58351,US,ND,58351,5,,,, +US-ND-58352,US,ND,58352,5,,,, +US-ND-58353,US,ND,58353,5,,,, +US-ND-58355,US,ND,58355,5,,,, +US-ND-58356,US,ND,58356,7,,,, +US-ND-58357,US,ND,58357,5,,,, +US-ND-58361,US,ND,58361,5,,,, +US-ND-58362,US,ND,58362,5,,,, +US-ND-58363,US,ND,58363,5,,,, +US-ND-58365,US,ND,58365,5,,,, +US-ND-58366,US,ND,58366,6,,,, +US-ND-58367,US,ND,58367,7,,,, +US-ND-58368,US,ND,58368,7,,,, +US-ND-58369,US,ND,58369,6,,,, +US-ND-58370,US,ND,58370,5,,,, +US-ND-58372,US,ND,58372,5,,,, +US-ND-58374,US,ND,58374,5,,,, +US-ND-58377,US,ND,58377,5,,,, +US-ND-58379,US,ND,58379,5,,,, +US-ND-58380,US,ND,58380,5,,,, +US-ND-58381,US,ND,58381,5,,,, +US-ND-58382,US,ND,58382,5,,,, +US-ND-58384,US,ND,58384,5,,,, +US-ND-58385,US,ND,58385,5,,,, +US-ND-58386,US,ND,58386,5,,,, +US-ND-58401,US,ND,58401,7,,,, +US-ND-58402,US,ND,58402,7,,,, +US-ND-58405,US,ND,58405,7,,,, +US-ND-58413,US,ND,58413,6,,,, +US-ND-58415,US,ND,58415,5,,,, +US-ND-58416,US,ND,58416,5,,,, +US-ND-58418,US,ND,58418,5,,,, +US-ND-58420,US,ND,58420,5,,,, +US-ND-58421,US,ND,58421,6,,,, +US-ND-58422,US,ND,58422,5,,,, +US-ND-58423,US,ND,58423,5,,,, +US-ND-58424,US,ND,58424,5,,,, +US-ND-58425,US,ND,58425,6.5,,,, +US-ND-58426,US,ND,58426,5,,,, +US-ND-58428,US,ND,58428,5,,,, +US-ND-58429,US,ND,58429,5,,,, +US-ND-58430,US,ND,58430,5,,,, +US-ND-58431,US,ND,58431,5,,,, +US-ND-58433,US,ND,58433,5,,,, +US-ND-58436,US,ND,58436,6,,,, +US-ND-58438,US,ND,58438,5,,,, +US-ND-58439,US,ND,58439,5,,,, +US-ND-58440,US,ND,58440,5,,,, +US-ND-58441,US,ND,58441,5,,,, +US-ND-58442,US,ND,58442,5,,,, +US-ND-58443,US,ND,58443,5,,,, +US-ND-58444,US,ND,58444,5,,,, +US-ND-58445,US,ND,58445,5,,,, +US-ND-58448,US,ND,58448,5,,,, +US-ND-58451,US,ND,58451,5,,,, +US-ND-58452,US,ND,58452,5,,,, +US-ND-58454,US,ND,58454,5,,,, +US-ND-58455,US,ND,58455,5,,,, +US-ND-58456,US,ND,58456,5,,,, +US-ND-58458,US,ND,58458,7,,,, +US-ND-58460,US,ND,58460,5,,,, +US-ND-58461,US,ND,58461,5,,,, +US-ND-58463,US,ND,58463,5,,,, +US-ND-58464,US,ND,58464,5,,,, +US-ND-58466,US,ND,58466,5,,,, +US-ND-58467,US,ND,58467,5,,,, +US-ND-58472,US,ND,58472,5,,,, +US-ND-58474,US,ND,58474,7,,,, +US-ND-58475,US,ND,58475,5,,,, +US-ND-58476,US,ND,58476,5,,,, +US-ND-58477,US,ND,58477,5,,,, +US-ND-58478,US,ND,58478,5,,,, +US-ND-58479,US,ND,58479,5,,,, +US-ND-58480,US,ND,58480,5,,,, +US-ND-58481,US,ND,58481,5,,,, +US-ND-58482,US,ND,58482,7,,,, +US-ND-58483,US,ND,58483,5,,,, +US-ND-58484,US,ND,58484,5,,,, +US-ND-58486,US,ND,58486,5,,,, +US-ND-58487,US,ND,58487,5,,,, +US-ND-58488,US,ND,58488,5,,,, +US-ND-58490,US,ND,58490,5,,,, +US-ND-58492,US,ND,58492,5,,,, +US-ND-58494,US,ND,58494,5,,,, +US-ND-58495,US,ND,58495,6.5,,,, +US-ND-58496,US,ND,58496,5,,,, +US-ND-58497,US,ND,58497,5,,,, +US-ND-58501,US,ND,58501,6,,,, +US-ND-58502,US,ND,58502,6,,,, +US-ND-58503,US,ND,58503,6,,,, +US-ND-58504,US,ND,58504,6,,,, +US-ND-58505,US,ND,58505,6,,,, +US-ND-58506,US,ND,58506,6,,,, +US-ND-58507,US,ND,58507,6,,,, +US-ND-58520,US,ND,58520,5,,,, +US-ND-58521,US,ND,58521,5,,,, +US-ND-58523,US,ND,58523,6,,,, +US-ND-58524,US,ND,58524,5,,,, +US-ND-58528,US,ND,58528,5,,,, +US-ND-58529,US,ND,58529,5,,,, +US-ND-58530,US,ND,58530,5,,,, +US-ND-58531,US,ND,58531,5,,,, +US-ND-58532,US,ND,58532,5,,,, +US-ND-58533,US,ND,58533,6,,,, +US-ND-58535,US,ND,58535,5,,,, +US-ND-58538,US,ND,58538,5,,,, +US-ND-58540,US,ND,58540,5,,,, +US-ND-58541,US,ND,58541,5,,,, +US-ND-58542,US,ND,58542,5,,,, +US-ND-58544,US,ND,58544,5,,,, +US-ND-58545,US,ND,58545,6,,,, +US-ND-58549,US,ND,58549,5,,,, +US-ND-58552,US,ND,58552,7,,,, +US-ND-58554,US,ND,58554,6,,,, +US-ND-58558,US,ND,58558,5,,,, +US-ND-58559,US,ND,58559,5,,,, +US-ND-58560,US,ND,58560,5,,,, +US-ND-58561,US,ND,58561,7,,,, +US-ND-58562,US,ND,58562,5,,,, +US-ND-58563,US,ND,58563,5,,,, +US-ND-58564,US,ND,58564,5,,,, +US-ND-58565,US,ND,58565,5,,,, +US-ND-58566,US,ND,58566,5,,,, +US-ND-58568,US,ND,58568,5,,,, +US-ND-58569,US,ND,58569,5,,,, +US-ND-58570,US,ND,58570,5,,,, +US-ND-58571,US,ND,58571,5,,,, +US-ND-58572,US,ND,58572,5,,,, +US-ND-58573,US,ND,58573,5,,,, +US-ND-58575,US,ND,58575,5,,,, +US-ND-58576,US,ND,58576,6.5,,,, +US-ND-58577,US,ND,58577,7,,,, +US-ND-58579,US,ND,58579,5,,,, +US-ND-58580,US,ND,58580,5,,,, +US-ND-58581,US,ND,58581,5,,,, +US-ND-58601,US,ND,58601,6.5,,,, +US-ND-58602,US,ND,58602,6.5,,,, +US-ND-58620,US,ND,58620,5,,,, +US-ND-58621,US,ND,58621,5,,,, +US-ND-58622,US,ND,58622,5,,,, +US-ND-58623,US,ND,58623,6,,,, +US-ND-58625,US,ND,58625,5,,,, +US-ND-58626,US,ND,58626,5,,,, +US-ND-58627,US,ND,58627,5,,,, +US-ND-58630,US,ND,58630,5,,,, +US-ND-58631,US,ND,58631,6,,,, +US-ND-58632,US,ND,58632,5,,,, +US-ND-58634,US,ND,58634,5,,,, +US-ND-58636,US,ND,58636,5,,,, +US-ND-58638,US,ND,58638,5,,,, +US-ND-58639,US,ND,58639,6.5,,,, +US-ND-58640,US,ND,58640,5,,,, +US-ND-58641,US,ND,58641,5,,,, +US-ND-58642,US,ND,58642,5,,,, +US-ND-58643,US,ND,58643,5,,,, +US-ND-58644,US,ND,58644,5,,,, +US-ND-58645,US,ND,58645,5,,,, +US-ND-58646,US,ND,58646,7,,,, +US-ND-58647,US,ND,58647,7,,,, +US-ND-58649,US,ND,58649,6,,,, +US-ND-58650,US,ND,58650,7,,,, +US-ND-58651,US,ND,58651,5,,,, +US-ND-58652,US,ND,58652,5,,,, +US-ND-58653,US,ND,58653,6,,,, +US-ND-58654,US,ND,58654,5,,,, +US-ND-58655,US,ND,58655,5,,,, +US-ND-58656,US,ND,58656,5,,,, +US-ND-58701,US,ND,58701,7.5,,,, +US-ND-58702,US,ND,58702,7.5,,,, +US-ND-58703,US,ND,58703,7.5,,,, +US-ND-58704,US,ND,58704,5.5,,,, +US-ND-58705,US,ND,58705,5.5,,,, +US-ND-58707,US,ND,58707,7.5,,,, +US-ND-58710,US,ND,58710,5,,,, +US-ND-58711,US,ND,58711,5,,,, +US-ND-58712,US,ND,58712,5,,,, +US-ND-58713,US,ND,58713,5,,,, +US-ND-58716,US,ND,58716,5,,,, +US-ND-58718,US,ND,58718,5.5,,,, +US-ND-58721,US,ND,58721,5,,,, +US-ND-58722,US,ND,58722,5.5,,,, +US-ND-58723,US,ND,58723,5,,,, +US-ND-58725,US,ND,58725,5.5,,,, +US-ND-58727,US,ND,58727,5,,,, +US-ND-58730,US,ND,58730,5,,,, +US-ND-58731,US,ND,58731,5,,,, +US-ND-58733,US,ND,58733,5.5,,,, +US-ND-58734,US,ND,58734,5.5,,,, +US-ND-58735,US,ND,58735,5.5,,,, +US-ND-58736,US,ND,58736,7,,,, +US-ND-58737,US,ND,58737,5,,,, +US-ND-58740,US,ND,58740,7,,,, +US-ND-58741,US,ND,58741,5,,,, +US-ND-58744,US,ND,58744,5,,,, +US-ND-58746,US,ND,58746,7.5,,,, +US-ND-58748,US,ND,58748,5,,,, +US-ND-58750,US,ND,58750,5,,,, +US-ND-58752,US,ND,58752,5,,,, +US-ND-58755,US,ND,58755,5,,,, +US-ND-58756,US,ND,58756,5.5,,,, +US-ND-58757,US,ND,58757,5,,,, +US-ND-58758,US,ND,58758,5,,,, +US-ND-58759,US,ND,58759,5.5,,,, +US-ND-58760,US,ND,58760,5,,,, +US-ND-58761,US,ND,58761,5,,,, +US-ND-58762,US,ND,58762,5,,,, +US-ND-58763,US,ND,58763,5,,,, +US-ND-58765,US,ND,58765,5,,,, +US-ND-58768,US,ND,58768,5.5,,,, +US-ND-58769,US,ND,58769,5,,,, +US-ND-58770,US,ND,58770,5,,,, +US-ND-58771,US,ND,58771,5,,,, +US-ND-58772,US,ND,58772,5,,,, +US-ND-58773,US,ND,58773,5,,,, +US-ND-58775,US,ND,58775,5,,,, +US-ND-58776,US,ND,58776,5,,,, +US-ND-58778,US,ND,58778,5,,,, +US-ND-58779,US,ND,58779,5.5,,,, +US-ND-58781,US,ND,58781,5.5,,,, +US-ND-58782,US,ND,58782,5,,,, +US-ND-58783,US,ND,58783,5,,,, +US-ND-58784,US,ND,58784,6.5,,,, +US-ND-58785,US,ND,58785,7.5,,,, +US-ND-58787,US,ND,58787,5,,,, +US-ND-58788,US,ND,58788,5,,,, +US-ND-58789,US,ND,58789,5,,,, +US-ND-58790,US,ND,58790,7,,,, +US-ND-58792,US,ND,58792,5,,,, +US-ND-58793,US,ND,58793,6,,,, +US-ND-58794,US,ND,58794,5,,,, +US-ND-58795,US,ND,58795,5,,,, +US-ND-58801,US,ND,58801,7,,,, +US-ND-58802,US,ND,58802,7,,,, +US-ND-58830,US,ND,58830,5,,,, +US-ND-58831,US,ND,58831,5,,,, +US-ND-58833,US,ND,58833,5,,,, +US-ND-58835,US,ND,58835,5,,,, +US-ND-58838,US,ND,58838,5,,,, +US-ND-58843,US,ND,58843,5,,,, +US-ND-58844,US,ND,58844,5,,,, +US-ND-58845,US,ND,58845,5,,,, +US-ND-58847,US,ND,58847,5,,,, +US-ND-58849,US,ND,58849,5,,,, +US-ND-58852,US,ND,58852,5,,,, +US-ND-58853,US,ND,58853,5,,,, +US-ND-58854,US,ND,58854,5,,,, +US-ND-58856,US,ND,58856,5,,,, +US-NE-68001,US,NE,68001,5.5,,,, +US-NE-68002,US,NE,68002,5.5,,,, +US-NE-68003,US,NE,68003,7,,,, +US-NE-68004,US,NE,68004,6.5,,,, +US-NE-68005,US,NE,68005,7,,,, +US-NE-68007,US,NE,68007,5.5,,,, +US-NE-68008,US,NE,68008,7,,,, +US-NE-68009,US,NE,68009,7,,,, +US-NE-68010,US,NE,68010,5.5,,,, +US-NE-68014,US,NE,68014,5.5,,,, +US-NE-68015,US,NE,68015,5.5,,,, +US-NE-68016,US,NE,68016,5.5,,,, +US-NE-68017,US,NE,68017,5.5,,,, +US-NE-68018,US,NE,68018,5.5,,,, +US-NE-68019,US,NE,68019,5.5,,,, +US-NE-68020,US,NE,68020,5.5,,,, +US-NE-68022,US,NE,68022,5.5,,,, +US-NE-68023,US,NE,68023,5.5,,,, +US-NE-68025,US,NE,68025,7,,,, +US-NE-68026,US,NE,68026,7,,,, +US-NE-68028,US,NE,68028,5.5,,,, +US-NE-68029,US,NE,68029,5.5,,,, +US-NE-68030,US,NE,68030,6,,,, +US-NE-68031,US,NE,68031,5.5,,,, +US-NE-68033,US,NE,68033,5.5,,,, +US-NE-68034,US,NE,68034,5.5,,,, +US-NE-68036,US,NE,68036,5.5,,,, +US-NE-68037,US,NE,68037,5.5,,,, +US-NE-68038,US,NE,68038,7,,,, +US-NE-68039,US,NE,68039,5.5,,,, +US-NE-68040,US,NE,68040,5.5,,,, +US-NE-68041,US,NE,68041,5.5,,,, +US-NE-68042,US,NE,68042,5.5,,,, +US-NE-68044,US,NE,68044,5.5,,,, +US-NE-68045,US,NE,68045,6.5,,,, +US-NE-68046,US,NE,68046,7,,,, +US-NE-68047,US,NE,68047,5.5,,,, +US-NE-68048,US,NE,68048,7,,,, +US-NE-68050,US,NE,68050,5.5,,,, +US-NE-68055,US,NE,68055,5.5,,,, +US-NE-68056,US,NE,68056,5.5,,,, +US-NE-68057,US,NE,68057,5.5,,,, +US-NE-68058,US,NE,68058,5.5,,,, +US-NE-68059,US,NE,68059,5.5,,,, +US-NE-68061,US,NE,68061,7,,,, +US-NE-68062,US,NE,68062,5.5,,,, +US-NE-68063,US,NE,68063,6.5,,,, +US-NE-68064,US,NE,68064,5.5,,,, +US-NE-68065,US,NE,68065,5.5,,,, +US-NE-68066,US,NE,68066,7,,,, +US-NE-68067,US,NE,68067,5.5,,,, +US-NE-68068,US,NE,68068,5.5,,,, +US-NE-68069,US,NE,68069,5.5,,,, +US-NE-68070,US,NE,68070,5.5,,,, +US-NE-68071,US,NE,68071,5.5,,,, +US-NE-68072,US,NE,68072,5.5,,,, +US-NE-68073,US,NE,68073,5.5,,,, +US-NE-68101,US,NE,68101,7,,,, +US-NE-68102,US,NE,68102,7,,,, +US-NE-68103,US,NE,68103,7,,,, +US-NE-68104,US,NE,68104,7,,,, +US-NE-68105,US,NE,68105,7,,,, +US-NE-68106,US,NE,68106,7,,,, +US-NE-68107,US,NE,68107,7,,,, +US-NE-68108,US,NE,68108,7,,,, +US-NE-68109,US,NE,68109,7,,,, +US-NE-68110,US,NE,68110,7,,,, +US-NE-68111,US,NE,68111,7,,,, +US-NE-68112,US,NE,68112,7,,,, +US-NE-68113,US,NE,68113,5.5,,,, +US-NE-68114,US,NE,68114,7,,,, +US-NE-68116,US,NE,68116,5.5,,,, +US-NE-68117,US,NE,68117,7,,,, +US-NE-68118,US,NE,68118,7,,,, +US-NE-68119,US,NE,68119,7,,,, +US-NE-68120,US,NE,68120,7,,,, +US-NE-68122,US,NE,68122,5.5,,,, +US-NE-68123,US,NE,68123,5.5,,,, +US-NE-68124,US,NE,68124,7,,,, +US-NE-68127,US,NE,68127,7,,,, +US-NE-68128,US,NE,68128,7,,,, +US-NE-68130,US,NE,68130,7,,,, +US-NE-68131,US,NE,68131,7,,,, +US-NE-68132,US,NE,68132,7,,,, +US-NE-68133,US,NE,68133,5.5,,,, +US-NE-68134,US,NE,68134,7,,,, +US-NE-68135,US,NE,68135,5.5,,,, +US-NE-68136,US,NE,68136,5.5,,,, +US-NE-68137,US,NE,68137,7,,,, +US-NE-68138,US,NE,68138,5.5,,,, +US-NE-68139,US,NE,68139,7,,,, +US-NE-68142,US,NE,68142,5.5,,,, +US-NE-68144,US,NE,68144,7,,,, +US-NE-68145,US,NE,68145,7,,,, +US-NE-68147,US,NE,68147,7,,,, +US-NE-68152,US,NE,68152,7,,,, +US-NE-68154,US,NE,68154,7,,,, +US-NE-68155,US,NE,68155,7,,,, +US-NE-68157,US,NE,68157,7,,,, +US-NE-68164,US,NE,68164,7,,,, +US-NE-68172,US,NE,68172,7,,,, +US-NE-68175,US,NE,68175,7,,,, +US-NE-68176,US,NE,68176,7,,,, +US-NE-68178,US,NE,68178,7,,,, +US-NE-68179,US,NE,68179,7,,,, +US-NE-68180,US,NE,68180,7,,,, +US-NE-68182,US,NE,68182,7,,,, +US-NE-68183,US,NE,68183,7,,,, +US-NE-68197,US,NE,68197,7,,,, +US-NE-68198,US,NE,68198,7,,,, +US-NE-68301,US,NE,68301,5.5,,,, +US-NE-68303,US,NE,68303,5.5,,,, +US-NE-68304,US,NE,68304,5.5,,,, +US-NE-68305,US,NE,68305,6.5,,,, +US-NE-68307,US,NE,68307,5.5,,,, +US-NE-68309,US,NE,68309,5.5,,,, +US-NE-68310,US,NE,68310,7,,,, +US-NE-68313,US,NE,68313,5.5,,,, +US-NE-68314,US,NE,68314,5.5,,,, +US-NE-68315,US,NE,68315,5.5,,,, +US-NE-68316,US,NE,68316,5.5,,,, +US-NE-68317,US,NE,68317,5.5,,,, +US-NE-68318,US,NE,68318,5.5,,,, +US-NE-68319,US,NE,68319,5.5,,,, +US-NE-68320,US,NE,68320,5.5,,,, +US-NE-68321,US,NE,68321,6.5,,,, +US-NE-68322,US,NE,68322,5.5,,,, +US-NE-68323,US,NE,68323,5.5,,,, +US-NE-68324,US,NE,68324,5.5,,,, +US-NE-68325,US,NE,68325,5.5,,,, +US-NE-68326,US,NE,68326,5.5,,,, +US-NE-68327,US,NE,68327,6.5,,,, +US-NE-68328,US,NE,68328,5.5,,,, +US-NE-68329,US,NE,68329,5.5,,,, +US-NE-68330,US,NE,68330,6.5,,,, +US-NE-68331,US,NE,68331,5.5,,,, +US-NE-68332,US,NE,68332,5.5,,,, +US-NE-68333,US,NE,68333,7,,,, +US-NE-68335,US,NE,68335,5.5,,,, +US-NE-68336,US,NE,68336,5.5,,,, +US-NE-68337,US,NE,68337,5.5,,,, +US-NE-68338,US,NE,68338,5.5,,,, +US-NE-68339,US,NE,68339,5.5,,,, +US-NE-68340,US,NE,68340,5.5,,,, +US-NE-68341,US,NE,68341,5.5,,,, +US-NE-68342,US,NE,68342,5.5,,,, +US-NE-68343,US,NE,68343,5.5,,,, +US-NE-68344,US,NE,68344,7,,,, +US-NE-68345,US,NE,68345,5.5,,,, +US-NE-68346,US,NE,68346,5.5,,,, +US-NE-68347,US,NE,68347,5.5,,,, +US-NE-68348,US,NE,68348,5.5,,,, +US-NE-68349,US,NE,68349,5.5,,,, +US-NE-68350,US,NE,68350,5.5,,,, +US-NE-68351,US,NE,68351,7,,,, +US-NE-68352,US,NE,68352,7,,,, +US-NE-68354,US,NE,68354,5.5,,,, +US-NE-68355,US,NE,68355,7,,,, +US-NE-68357,US,NE,68357,5.5,,,, +US-NE-68358,US,NE,68358,5.5,,,, +US-NE-68359,US,NE,68359,6.5,,,, +US-NE-68360,US,NE,68360,5.5,,,, +US-NE-68361,US,NE,68361,7,,,, +US-NE-68362,US,NE,68362,6.5,,,, +US-NE-68364,US,NE,68364,5.5,,,, +US-NE-68365,US,NE,68365,5.5,,,, +US-NE-68366,US,NE,68366,5.5,,,, +US-NE-68367,US,NE,68367,5.5,,,, +US-NE-68368,US,NE,68368,5.5,,,, +US-NE-68370,US,NE,68370,6.5,,,, +US-NE-68371,US,NE,68371,7,,,, +US-NE-68372,US,NE,68372,5.5,,,, +US-NE-68375,US,NE,68375,6.5,,,, +US-NE-68376,US,NE,68376,5.5,,,, +US-NE-68377,US,NE,68377,5.5,,,, +US-NE-68378,US,NE,68378,5.5,,,, +US-NE-68379,US,NE,68379,5.5,,,, +US-NE-68380,US,NE,68380,5.5,,,, +US-NE-68381,US,NE,68381,5.5,,,, +US-NE-68382,US,NE,68382,5.5,,,, +US-NE-68401,US,NE,68401,5.5,,,, +US-NE-68402,US,NE,68402,5.5,,,, +US-NE-68403,US,NE,68403,5.5,,,, +US-NE-68404,US,NE,68404,5.5,,,, +US-NE-68405,US,NE,68405,6.5,,,, +US-NE-68406,US,NE,68406,5.5,,,, +US-NE-68407,US,NE,68407,5.5,,,, +US-NE-68409,US,NE,68409,5.5,,,, +US-NE-68410,US,NE,68410,7,,,, +US-NE-68413,US,NE,68413,5.5,,,, +US-NE-68414,US,NE,68414,5.5,,,, +US-NE-68415,US,NE,68415,6.5,,,, +US-NE-68416,US,NE,68416,5.5,,,, +US-NE-68417,US,NE,68417,5.5,,,, +US-NE-68418,US,NE,68418,6.5,,,, +US-NE-68419,US,NE,68419,5.5,,,, +US-NE-68420,US,NE,68420,7,,,, +US-NE-68421,US,NE,68421,6.5,,,, +US-NE-68422,US,NE,68422,5.5,,,, +US-NE-68423,US,NE,68423,5.5,,,, +US-NE-68424,US,NE,68424,5.5,,,, +US-NE-68428,US,NE,68428,5.5,,,, +US-NE-68429,US,NE,68429,5.5,,,, +US-NE-68430,US,NE,68430,5.5,,,, +US-NE-68431,US,NE,68431,5.5,,,, +US-NE-68433,US,NE,68433,5.5,,,, +US-NE-68434,US,NE,68434,6.5,,,, +US-NE-68436,US,NE,68436,5.5,,,, +US-NE-68437,US,NE,68437,5.5,,,, +US-NE-68438,US,NE,68438,5.5,,,, +US-NE-68439,US,NE,68439,5.5,,,, +US-NE-68440,US,NE,68440,5.5,,,, +US-NE-68441,US,NE,68441,5.5,,,, +US-NE-68442,US,NE,68442,5.5,,,, +US-NE-68443,US,NE,68443,6.5,,,, +US-NE-68444,US,NE,68444,5.5,,,, +US-NE-68445,US,NE,68445,5.5,,,, +US-NE-68446,US,NE,68446,6.5,,,, +US-NE-68447,US,NE,68447,5.5,,,, +US-NE-68448,US,NE,68448,5.5,,,, +US-NE-68450,US,NE,68450,7,,,, +US-NE-68452,US,NE,68452,5.5,,,, +US-NE-68453,US,NE,68453,5.5,,,, +US-NE-68454,US,NE,68454,5.5,,,, +US-NE-68455,US,NE,68455,5.5,,,, +US-NE-68456,US,NE,68456,5.5,,,, +US-NE-68457,US,NE,68457,5.5,,,, +US-NE-68458,US,NE,68458,5.5,,,, +US-NE-68460,US,NE,68460,5.5,,,, +US-NE-68461,US,NE,68461,5.5,,,, +US-NE-68462,US,NE,68462,6.5,,,, +US-NE-68463,US,NE,68463,5.5,,,, +US-NE-68464,US,NE,68464,5.5,,,, +US-NE-68465,US,NE,68465,6.5,,,, +US-NE-68466,US,NE,68466,7,,,, +US-NE-68467,US,NE,68467,7,,,, +US-NE-68501,US,NE,68501,7,,,, +US-NE-68502,US,NE,68502,7,,,, +US-NE-68503,US,NE,68503,7,,,, +US-NE-68504,US,NE,68504,7,,,, +US-NE-68505,US,NE,68505,7,,,, +US-NE-68506,US,NE,68506,7,,,, +US-NE-68507,US,NE,68507,7,,,, +US-NE-68508,US,NE,68508,7,,,, +US-NE-68509,US,NE,68509,7,,,, +US-NE-68510,US,NE,68510,7,,,, +US-NE-68512,US,NE,68512,7,,,, +US-NE-68514,US,NE,68514,5.5,,,, +US-NE-68516,US,NE,68516,7,,,, +US-NE-68517,US,NE,68517,5.5,,,, +US-NE-68520,US,NE,68520,5.5,,,, +US-NE-68521,US,NE,68521,7,,,, +US-NE-68522,US,NE,68522,7,,,, +US-NE-68523,US,NE,68523,5.5,,,, +US-NE-68524,US,NE,68524,7,,,, +US-NE-68526,US,NE,68526,7,,,, +US-NE-68527,US,NE,68527,5.5,,,, +US-NE-68528,US,NE,68528,7,,,, +US-NE-68529,US,NE,68529,7,,,, +US-NE-68531,US,NE,68531,5.5,,,, +US-NE-68532,US,NE,68532,5.5,,,, +US-NE-68542,US,NE,68542,7,,,, +US-NE-68544,US,NE,68544,7,,,, +US-NE-68583,US,NE,68583,7,,,, +US-NE-68588,US,NE,68588,7,,,, +US-NE-68601,US,NE,68601,7,,,, +US-NE-68602,US,NE,68602,7,,,, +US-NE-68620,US,NE,68620,7,,,, +US-NE-68621,US,NE,68621,5.5,,,, +US-NE-68622,US,NE,68622,5.5,,,, +US-NE-68623,US,NE,68623,5.5,,,, +US-NE-68624,US,NE,68624,5.5,,,, +US-NE-68626,US,NE,68626,6.5,,,, +US-NE-68627,US,NE,68627,6.5,,,, +US-NE-68628,US,NE,68628,5.5,,,, +US-NE-68629,US,NE,68629,5.5,,,, +US-NE-68631,US,NE,68631,5.5,,,, +US-NE-68632,US,NE,68632,7,,,, +US-NE-68633,US,NE,68633,5.5,,,, +US-NE-68634,US,NE,68634,6.5,,,, +US-NE-68635,US,NE,68635,5.5,,,, +US-NE-68636,US,NE,68636,6.5,,,, +US-NE-68637,US,NE,68637,5.5,,,, +US-NE-68638,US,NE,68638,7,,,, +US-NE-68640,US,NE,68640,7,,,, +US-NE-68641,US,NE,68641,6.5,,,, +US-NE-68642,US,NE,68642,7,,,, +US-NE-68643,US,NE,68643,5.5,,,, +US-NE-68644,US,NE,68644,5.5,,,, +US-NE-68647,US,NE,68647,5.5,,,, +US-NE-68648,US,NE,68648,5.5,,,, +US-NE-68649,US,NE,68649,7,,,, +US-NE-68651,US,NE,68651,7,,,, +US-NE-68652,US,NE,68652,5.5,,,, +US-NE-68653,US,NE,68653,5.5,,,, +US-NE-68654,US,NE,68654,5.5,,,, +US-NE-68655,US,NE,68655,5.5,,,, +US-NE-68658,US,NE,68658,5.5,,,, +US-NE-68659,US,NE,68659,5.5,,,, +US-NE-68660,US,NE,68660,6.5,,,, +US-NE-68661,US,NE,68661,7,,,, +US-NE-68662,US,NE,68662,5.5,,,, +US-NE-68663,US,NE,68663,6.5,,,, +US-NE-68664,US,NE,68664,5.5,,,, +US-NE-68665,US,NE,68665,5.5,,,, +US-NE-68666,US,NE,68666,7,,,, +US-NE-68667,US,NE,68667,5.5,,,, +US-NE-68669,US,NE,68669,5.5,,,, +US-NE-68701,US,NE,68701,7,,,, +US-NE-68702,US,NE,68702,7,,,, +US-NE-68710,US,NE,68710,5.5,,,, +US-NE-68711,US,NE,68711,5.5,,,, +US-NE-68713,US,NE,68713,6.5,,,, +US-NE-68714,US,NE,68714,6.5,,,, +US-NE-68715,US,NE,68715,5.5,,,, +US-NE-68716,US,NE,68716,5.5,,,, +US-NE-68717,US,NE,68717,5.5,,,, +US-NE-68718,US,NE,68718,5.5,,,, +US-NE-68719,US,NE,68719,5.5,,,, +US-NE-68720,US,NE,68720,5.5,,,, +US-NE-68722,US,NE,68722,5.5,,,, +US-NE-68723,US,NE,68723,5.5,,,, +US-NE-68724,US,NE,68724,5.5,,,, +US-NE-68725,US,NE,68725,6.5,,,, +US-NE-68726,US,NE,68726,7,,,, +US-NE-68727,US,NE,68727,5.5,,,, +US-NE-68728,US,NE,68728,5.5,,,, +US-NE-68729,US,NE,68729,6.5,,,, +US-NE-68730,US,NE,68730,5.5,,,, +US-NE-68731,US,NE,68731,6,,,, +US-NE-68732,US,NE,68732,5.5,,,, +US-NE-68733,US,NE,68733,6,,,, +US-NE-68734,US,NE,68734,5.5,,,, +US-NE-68735,US,NE,68735,5.5,,,, +US-NE-68736,US,NE,68736,5.5,,,, +US-NE-68738,US,NE,68738,5.5,,,, +US-NE-68739,US,NE,68739,5.5,,,, +US-NE-68740,US,NE,68740,5.5,,,, +US-NE-68741,US,NE,68741,6,,,, +US-NE-68742,US,NE,68742,5.5,,,, +US-NE-68743,US,NE,68743,6,,,, +US-NE-68745,US,NE,68745,5.5,,,, +US-NE-68746,US,NE,68746,5.5,,,, +US-NE-68747,US,NE,68747,5.5,,,, +US-NE-68748,US,NE,68748,7,,,, +US-NE-68749,US,NE,68749,5.5,,,, +US-NE-68751,US,NE,68751,5.5,,,, +US-NE-68752,US,NE,68752,5.5,,,, +US-NE-68753,US,NE,68753,5.5,,,, +US-NE-68755,US,NE,68755,5.5,,,, +US-NE-68756,US,NE,68756,6.5,,,, +US-NE-68757,US,NE,68757,5.5,,,, +US-NE-68758,US,NE,68758,7,,,, +US-NE-68759,US,NE,68759,5.5,,,, +US-NE-68760,US,NE,68760,6.5,,,, +US-NE-68761,US,NE,68761,5.5,,,, +US-NE-68763,US,NE,68763,7,,,, +US-NE-68764,US,NE,68764,5.5,,,, +US-NE-68765,US,NE,68765,6.5,,,, +US-NE-68766,US,NE,68766,5.5,,,, +US-NE-68767,US,NE,68767,6.5,,,, +US-NE-68768,US,NE,68768,5.5,,,, +US-NE-68769,US,NE,68769,7,,,, +US-NE-68770,US,NE,68770,7,,,, +US-NE-68771,US,NE,68771,5.5,,,, +US-NE-68773,US,NE,68773,5.5,,,, +US-NE-68774,US,NE,68774,5.5,,,, +US-NE-68776,US,NE,68776,6,,,, +US-NE-68777,US,NE,68777,5.5,,,, +US-NE-68778,US,NE,68778,5.5,,,, +US-NE-68779,US,NE,68779,5.5,,,, +US-NE-68780,US,NE,68780,5.5,,,, +US-NE-68781,US,NE,68781,5.5,,,, +US-NE-68783,US,NE,68783,5.5,,,, +US-NE-68784,US,NE,68784,6.5,,,, +US-NE-68785,US,NE,68785,5.5,,,, +US-NE-68786,US,NE,68786,6.5,,,, +US-NE-68787,US,NE,68787,6.5,,,, +US-NE-68788,US,NE,68788,7,,,, +US-NE-68789,US,NE,68789,5.5,,,, +US-NE-68790,US,NE,68790,5.5,,,, +US-NE-68791,US,NE,68791,7,,,, +US-NE-68792,US,NE,68792,5.5,,,, +US-NE-68801,US,NE,68801,7,,,, +US-NE-68802,US,NE,68802,7,,,, +US-NE-68803,US,NE,68803,7,,,, +US-NE-68810,US,NE,68810,5.5,,,, +US-NE-68812,US,NE,68812,5.5,,,, +US-NE-68813,US,NE,68813,5.5,,,, +US-NE-68814,US,NE,68814,5.5,,,, +US-NE-68815,US,NE,68815,5.5,,,, +US-NE-68816,US,NE,68816,5.5,,,, +US-NE-68817,US,NE,68817,5.5,,,, +US-NE-68818,US,NE,68818,5.5,,,, +US-NE-68820,US,NE,68820,5.5,,,, +US-NE-68821,US,NE,68821,5.5,,,, +US-NE-68822,US,NE,68822,7,,,, +US-NE-68823,US,NE,68823,5.5,,,, +US-NE-68824,US,NE,68824,5.5,,,, +US-NE-68825,US,NE,68825,5.5,,,, +US-NE-68826,US,NE,68826,6.5,,,, +US-NE-68827,US,NE,68827,5.5,,,, +US-NE-68828,US,NE,68828,5.5,,,, +US-NE-68831,US,NE,68831,5.5,,,, +US-NE-68832,US,NE,68832,5.5,,,, +US-NE-68833,US,NE,68833,5.5,,,, +US-NE-68834,US,NE,68834,5.5,,,, +US-NE-68835,US,NE,68835,5.5,,,, +US-NE-68836,US,NE,68836,5.5,,,, +US-NE-68837,US,NE,68837,5.5,,,, +US-NE-68838,US,NE,68838,5.5,,,, +US-NE-68840,US,NE,68840,5.5,,,, +US-NE-68841,US,NE,68841,5.5,,,, +US-NE-68842,US,NE,68842,5.5,,,, +US-NE-68843,US,NE,68843,5.5,,,, +US-NE-68844,US,NE,68844,5.5,,,, +US-NE-68845,US,NE,68845,7,,,, +US-NE-68846,US,NE,68846,5.5,,,, +US-NE-68847,US,NE,68847,7,,,, +US-NE-68848,US,NE,68848,7,,,, +US-NE-68849,US,NE,68849,7,,,, +US-NE-68850,US,NE,68850,7,,,, +US-NE-68852,US,NE,68852,5.5,,,, +US-NE-68853,US,NE,68853,7,,,, +US-NE-68854,US,NE,68854,5.5,,,, +US-NE-68855,US,NE,68855,5.5,,,, +US-NE-68856,US,NE,68856,5.5,,,, +US-NE-68858,US,NE,68858,5.5,,,, +US-NE-68859,US,NE,68859,5.5,,,, +US-NE-68860,US,NE,68860,6.5,,,, +US-NE-68861,US,NE,68861,5.5,,,, +US-NE-68862,US,NE,68862,7,,,, +US-NE-68863,US,NE,68863,5.5,,,, +US-NE-68864,US,NE,68864,5.5,,,, +US-NE-68865,US,NE,68865,5.5,,,, +US-NE-68866,US,NE,68866,5.5,,,, +US-NE-68869,US,NE,68869,5.5,,,, +US-NE-68870,US,NE,68870,5.5,,,, +US-NE-68871,US,NE,68871,5.5,,,, +US-NE-68872,US,NE,68872,5.5,,,, +US-NE-68873,US,NE,68873,6.5,,,, +US-NE-68874,US,NE,68874,7,,,, +US-NE-68875,US,NE,68875,5.5,,,, +US-NE-68876,US,NE,68876,5.5,,,, +US-NE-68878,US,NE,68878,5.5,,,, +US-NE-68879,US,NE,68879,5.5,,,, +US-NE-68881,US,NE,68881,5.5,,,, +US-NE-68882,US,NE,68882,5.5,,,, +US-NE-68883,US,NE,68883,5.5,,,, +US-NE-68901,US,NE,68901,7,,,, +US-NE-68902,US,NE,68902,7,,,, +US-NE-68920,US,NE,68920,7.5,,,, +US-NE-68922,US,NE,68922,6.5,,,, +US-NE-68923,US,NE,68923,5.5,,,, +US-NE-68924,US,NE,68924,5.5,,,, +US-NE-68925,US,NE,68925,5.5,,,, +US-NE-68926,US,NE,68926,6.5,,,, +US-NE-68927,US,NE,68927,5.5,,,, +US-NE-68928,US,NE,68928,5.5,,,, +US-NE-68929,US,NE,68929,5.5,,,, +US-NE-68930,US,NE,68930,6.5,,,, +US-NE-68932,US,NE,68932,5.5,,,, +US-NE-68933,US,NE,68933,6.5,,,, +US-NE-68934,US,NE,68934,6.5,,,, +US-NE-68935,US,NE,68935,6.5,,,, +US-NE-68936,US,NE,68936,5.5,,,, +US-NE-68937,US,NE,68937,5.5,,,, +US-NE-68938,US,NE,68938,5.5,,,, +US-NE-68939,US,NE,68939,6.5,,,, +US-NE-68940,US,NE,68940,5.5,,,, +US-NE-68941,US,NE,68941,5.5,,,, +US-NE-68942,US,NE,68942,6.5,,,, +US-NE-68943,US,NE,68943,5.5,,,, +US-NE-68944,US,NE,68944,6.5,,,, +US-NE-68945,US,NE,68945,5.5,,,, +US-NE-68946,US,NE,68946,5.5,,,, +US-NE-68947,US,NE,68947,6.5,,,, +US-NE-68948,US,NE,68948,5.5,,,, +US-NE-68949,US,NE,68949,7,,,, +US-NE-68950,US,NE,68950,5.5,,,, +US-NE-68952,US,NE,68952,5.5,,,, +US-NE-68954,US,NE,68954,5.5,,,, +US-NE-68955,US,NE,68955,5.5,,,, +US-NE-68956,US,NE,68956,5.5,,,, +US-NE-68957,US,NE,68957,5.5,,,, +US-NE-68958,US,NE,68958,5.5,,,, +US-NE-68959,US,NE,68959,6.5,,,, +US-NE-68960,US,NE,68960,5.5,,,, +US-NE-68961,US,NE,68961,6.5,,,, +US-NE-68964,US,NE,68964,5.5,,,, +US-NE-68966,US,NE,68966,5.5,,,, +US-NE-68967,US,NE,68967,7,,,, +US-NE-68969,US,NE,68969,5.5,,,, +US-NE-68970,US,NE,68970,7,,,, +US-NE-68971,US,NE,68971,5.5,,,, +US-NE-68972,US,NE,68972,5.5,,,, +US-NE-68973,US,NE,68973,5.5,,,, +US-NE-68974,US,NE,68974,5.5,,,, +US-NE-68975,US,NE,68975,5.5,,,, +US-NE-68976,US,NE,68976,5.5,,,, +US-NE-68977,US,NE,68977,5.5,,,, +US-NE-68978,US,NE,68978,6.5,,,, +US-NE-68979,US,NE,68979,7,,,, +US-NE-68980,US,NE,68980,5.5,,,, +US-NE-68981,US,NE,68981,5.5,,,, +US-NE-68982,US,NE,68982,5.5,,,, +US-NE-69001,US,NE,69001,7,,,, +US-NE-69020,US,NE,69020,5.5,,,, +US-NE-69021,US,NE,69021,7,,,, +US-NE-69022,US,NE,69022,7,,,, +US-NE-69023,US,NE,69023,5.5,,,, +US-NE-69024,US,NE,69024,5.5,,,, +US-NE-69025,US,NE,69025,6.5,,,, +US-NE-69026,US,NE,69026,5.5,,,, +US-NE-69027,US,NE,69027,5.5,,,, +US-NE-69028,US,NE,69028,5.5,,,, +US-NE-69029,US,NE,69029,5.5,,,, +US-NE-69030,US,NE,69030,5.5,,,, +US-NE-69032,US,NE,69032,5.5,,,, +US-NE-69033,US,NE,69033,6.5,,,, +US-NE-69034,US,NE,69034,5.5,,,, +US-NE-69036,US,NE,69036,5.5,,,, +US-NE-69037,US,NE,69037,5.5,,,, +US-NE-69038,US,NE,69038,5.5,,,, +US-NE-69039,US,NE,69039,5.5,,,, +US-NE-69040,US,NE,69040,5.5,,,, +US-NE-69041,US,NE,69041,5.5,,,, +US-NE-69042,US,NE,69042,5.5,,,, +US-NE-69043,US,NE,69043,5.5,,,, +US-NE-69044,US,NE,69044,5.5,,,, +US-NE-69045,US,NE,69045,5.5,,,, +US-NE-69046,US,NE,69046,5.5,,,, +US-NE-69101,US,NE,69101,7,,,, +US-NE-69103,US,NE,69103,7,,,, +US-NE-69120,US,NE,69120,6.5,,,, +US-NE-69121,US,NE,69121,5.5,,,, +US-NE-69122,US,NE,69122,5.5,,,, +US-NE-69123,US,NE,69123,5.5,,,, +US-NE-69125,US,NE,69125,5.5,,,, +US-NE-69127,US,NE,69127,5.5,,,, +US-NE-69128,US,NE,69128,5.5,,,, +US-NE-69129,US,NE,69129,5.5,,,, +US-NE-69130,US,NE,69130,7,,,, +US-NE-69131,US,NE,69131,5.5,,,, +US-NE-69132,US,NE,69132,5.5,,,, +US-NE-69133,US,NE,69133,5.5,,,, +US-NE-69134,US,NE,69134,5.5,,,, +US-NE-69135,US,NE,69135,5.5,,,, +US-NE-69138,US,NE,69138,7,,,, +US-NE-69140,US,NE,69140,6.5,,,, +US-NE-69141,US,NE,69141,5.5,,,, +US-NE-69142,US,NE,69142,5.5,,,, +US-NE-69143,US,NE,69143,5.5,,,, +US-NE-69144,US,NE,69144,5.5,,,, +US-NE-69145,US,NE,69145,7,,,, +US-NE-69146,US,NE,69146,5.5,,,, +US-NE-69147,US,NE,69147,5.5,,,, +US-NE-69148,US,NE,69148,5.5,,,, +US-NE-69149,US,NE,69149,5.5,,,, +US-NE-69150,US,NE,69150,5.5,,,, +US-NE-69151,US,NE,69151,5.5,,,, +US-NE-69152,US,NE,69152,5.5,,,, +US-NE-69153,US,NE,69153,7,,,, +US-NE-69154,US,NE,69154,7,,,, +US-NE-69155,US,NE,69155,5.5,,,, +US-NE-69156,US,NE,69156,5.5,,,, +US-NE-69157,US,NE,69157,5.5,,,, +US-NE-69160,US,NE,69160,7.5,,,, +US-NE-69161,US,NE,69161,5.5,,,, +US-NE-69162,US,NE,69162,7.5,,,, +US-NE-69163,US,NE,69163,5.5,,,, +US-NE-69165,US,NE,69165,5.5,,,, +US-NE-69166,US,NE,69166,5.5,,,, +US-NE-69167,US,NE,69167,5.5,,,, +US-NE-69168,US,NE,69168,5.5,,,, +US-NE-69169,US,NE,69169,5.5,,,, +US-NE-69170,US,NE,69170,5.5,,,, +US-NE-69171,US,NE,69171,5.5,,,, +US-NE-69190,US,NE,69190,7,,,, +US-NE-69201,US,NE,69201,7,,,, +US-NE-69210,US,NE,69210,7,,,, +US-NE-69211,US,NE,69211,5.5,,,, +US-NE-69212,US,NE,69212,5.5,,,, +US-NE-69214,US,NE,69214,5.5,,,, +US-NE-69216,US,NE,69216,5.5,,,, +US-NE-69217,US,NE,69217,5.5,,,, +US-NE-69218,US,NE,69218,5.5,,,, +US-NE-69219,US,NE,69219,5.5,,,, +US-NE-69220,US,NE,69220,5.5,,,, +US-NE-69221,US,NE,69221,5.5,,,, +US-NE-69301,US,NE,69301,7,,,, +US-NE-69331,US,NE,69331,5.5,,,, +US-NE-69333,US,NE,69333,5.5,,,, +US-NE-69334,US,NE,69334,5.5,,,, +US-NE-69335,US,NE,69335,5.5,,,, +US-NE-69336,US,NE,69336,6.5,,,, +US-NE-69337,US,NE,69337,7,,,, +US-NE-69339,US,NE,69339,7,,,, +US-NE-69340,US,NE,69340,5.5,,,, +US-NE-69341,US,NE,69341,7,,,, +US-NE-69343,US,NE,69343,6.5,,,, +US-NE-69345,US,NE,69345,5.5,,,, +US-NE-69346,US,NE,69346,5.5,,,, +US-NE-69347,US,NE,69347,5.5,,,, +US-NE-69348,US,NE,69348,5.5,,,, +US-NE-69350,US,NE,69350,5.5,,,, +US-NE-69351,US,NE,69351,5.5,,,, +US-NE-69352,US,NE,69352,5.5,,,, +US-NE-69353,US,NE,69353,5.5,,,, +US-NE-69354,US,NE,69354,5.5,,,, +US-NE-69355,US,NE,69355,5.5,,,, +US-NE-69356,US,NE,69356,5.5,,,, +US-NE-69357,US,NE,69357,5.5,,,, +US-NE-69358,US,NE,69358,5.5,,,, +US-NE-69360,US,NE,69360,5.5,,,, +US-NE-69361,US,NE,69361,7,,,, +US-NE-69363,US,NE,69363,7,,,, +US-NE-69365,US,NE,69365,6.5,,,, +US-NE-69366,US,NE,69366,5.5,,,, +US-NE-69367,US,NE,69367,5.5,,,, +US-NJ-07001,US,NJ,07001,7,,,, +US-NJ-07002,US,NJ,07002,7,,,, +US-NJ-07003,US,NJ,07003,7,,,, +US-NJ-07004,US,NJ,07004,7,,,, +US-NJ-07005,US,NJ,07005,7,,,, +US-NJ-07006,US,NJ,07006,7,,,, +US-NJ-07007,US,NJ,07007,7,,,, +US-NJ-07008,US,NJ,07008,7,,,, +US-NJ-07009,US,NJ,07009,7,,,, +US-NJ-07010,US,NJ,07010,7,,,, +US-NJ-07011,US,NJ,07011,7,,,, +US-NJ-07012,US,NJ,07012,7,,,, +US-NJ-07013,US,NJ,07013,7,,,, +US-NJ-07014,US,NJ,07014,7,,,, +US-NJ-07015,US,NJ,07015,7,,,, +US-NJ-07016,US,NJ,07016,7,,,, +US-NJ-07017,US,NJ,07017,7,,,, +US-NJ-07018,US,NJ,07018,7,,,, +US-NJ-07019,US,NJ,07019,7,,,, +US-NJ-07020,US,NJ,07020,7,,,, +US-NJ-07021,US,NJ,07021,7,,,, +US-NJ-07022,US,NJ,07022,7,,,, +US-NJ-07023,US,NJ,07023,7,,,, +US-NJ-07024,US,NJ,07024,7,,,, +US-NJ-07026,US,NJ,07026,7,,,, +US-NJ-07027,US,NJ,07027,7,,,, +US-NJ-07028,US,NJ,07028,7,,,, +US-NJ-07029,US,NJ,07029,7,,,, +US-NJ-07030,US,NJ,07030,7,,,, +US-NJ-07031,US,NJ,07031,7,,,, +US-NJ-07032,US,NJ,07032,7,,,, +US-NJ-07033,US,NJ,07033,7,,,, +US-NJ-07034,US,NJ,07034,7,,,, +US-NJ-07035,US,NJ,07035,7,,,, +US-NJ-07036,US,NJ,07036,7,,,, +US-NJ-07039,US,NJ,07039,7,,,, +US-NJ-07040,US,NJ,07040,7,,,, +US-NJ-07041,US,NJ,07041,7,,,, +US-NJ-07042,US,NJ,07042,7,,,, +US-NJ-07043,US,NJ,07043,7,,,, +US-NJ-07044,US,NJ,07044,7,,,, +US-NJ-07045,US,NJ,07045,7,,,, +US-NJ-07046,US,NJ,07046,7,,,, +US-NJ-07047,US,NJ,07047,7,,,, +US-NJ-07050,US,NJ,07050,7,,,, +US-NJ-07051,US,NJ,07051,7,,,, +US-NJ-07052,US,NJ,07052,7,,,, +US-NJ-07054,US,NJ,07054,7,,,, +US-NJ-07055,US,NJ,07055,7,,,, +US-NJ-07057,US,NJ,07057,7,,,, +US-NJ-07058,US,NJ,07058,7,,,, +US-NJ-07059,US,NJ,07059,7,,,, +US-NJ-07060,US,NJ,07060,7,,,, +US-NJ-07061,US,NJ,07061,7,,,, +US-NJ-07062,US,NJ,07062,7,,,, +US-NJ-07063,US,NJ,07063,7,,,, +US-NJ-07064,US,NJ,07064,7,,,, +US-NJ-07065,US,NJ,07065,7,,,, +US-NJ-07066,US,NJ,07066,7,,,, +US-NJ-07067,US,NJ,07067,7,,,, +US-NJ-07068,US,NJ,07068,7,,,, +US-NJ-07069,US,NJ,07069,7,,,, +US-NJ-07070,US,NJ,07070,7,,,, +US-NJ-07071,US,NJ,07071,7,,,, +US-NJ-07072,US,NJ,07072,7,,,, +US-NJ-07073,US,NJ,07073,7,,,, +US-NJ-07074,US,NJ,07074,7,,,, +US-NJ-07075,US,NJ,07075,7,,,, +US-NJ-07076,US,NJ,07076,7,,,, +US-NJ-07077,US,NJ,07077,7,,,, +US-NJ-07078,US,NJ,07078,7,,,, +US-NJ-07079,US,NJ,07079,7,,,, +US-NJ-07080,US,NJ,07080,7,,,, +US-NJ-07081,US,NJ,07081,7,,,, +US-NJ-07082,US,NJ,07082,7,,,, +US-NJ-07083,US,NJ,07083,7,,,, +US-NJ-07086,US,NJ,07086,7,,,, +US-NJ-07087,US,NJ,07087,7,,,, +US-NJ-07088,US,NJ,07088,7,,,, +US-NJ-07090,US,NJ,07090,7,,,, +US-NJ-07091,US,NJ,07091,7,,,, +US-NJ-07092,US,NJ,07092,7,,,, +US-NJ-07093,US,NJ,07093,7,,,, +US-NJ-07094,US,NJ,07094,7,,,, +US-NJ-07095,US,NJ,07095,7,,,, +US-NJ-07096,US,NJ,07096,7,,,, +US-NJ-07097,US,NJ,07097,7,,,, +US-NJ-07099,US,NJ,07099,7,,,, +US-NJ-07101,US,NJ,07101,7,,,, +US-NJ-07102,US,NJ,07102,7,,,, +US-NJ-07103,US,NJ,07103,7,,,, +US-NJ-07104,US,NJ,07104,7,,,, +US-NJ-07105,US,NJ,07105,7,,,, +US-NJ-07106,US,NJ,07106,7,,,, +US-NJ-07107,US,NJ,07107,7,,,, +US-NJ-07108,US,NJ,07108,7,,,, +US-NJ-07109,US,NJ,07109,7,,,, +US-NJ-07110,US,NJ,07110,7,,,, +US-NJ-07111,US,NJ,07111,7,,,, +US-NJ-07112,US,NJ,07112,7,,,, +US-NJ-07114,US,NJ,07114,7,,,, +US-NJ-07175,US,NJ,07175,7,,,, +US-NJ-07184,US,NJ,07184,7,,,, +US-NJ-07188,US,NJ,07188,7,,,, +US-NJ-07189,US,NJ,07189,7,,,, +US-NJ-07191,US,NJ,07191,7,,,, +US-NJ-07192,US,NJ,07192,7,,,, +US-NJ-07193,US,NJ,07193,7,,,, +US-NJ-07195,US,NJ,07195,7,,,, +US-NJ-07198,US,NJ,07198,7,,,, +US-NJ-07199,US,NJ,07199,7,,,, +US-NJ-07201,US,NJ,07201,7,,,, +US-NJ-07202,US,NJ,07202,7,,,, +US-NJ-07203,US,NJ,07203,7,,,, +US-NJ-07204,US,NJ,07204,7,,,, +US-NJ-07205,US,NJ,07205,7,,,, +US-NJ-07206,US,NJ,07206,7,,,, +US-NJ-07207,US,NJ,07207,7,,,, +US-NJ-07208,US,NJ,07208,7,,,, +US-NJ-07302,US,NJ,07302,7,,,, +US-NJ-07303,US,NJ,07303,7,,,, +US-NJ-07304,US,NJ,07304,7,,,, +US-NJ-07305,US,NJ,07305,7,,,, +US-NJ-07306,US,NJ,07306,7,,,, +US-NJ-07307,US,NJ,07307,7,,,, +US-NJ-07308,US,NJ,07308,7,,,, +US-NJ-07310,US,NJ,07310,7,,,, +US-NJ-07311,US,NJ,07311,7,,,, +US-NJ-07395,US,NJ,07395,7,,,, +US-NJ-07399,US,NJ,07399,7,,,, +US-NJ-07401,US,NJ,07401,7,,,, +US-NJ-07403,US,NJ,07403,7,,,, +US-NJ-07405,US,NJ,07405,7,,,, +US-NJ-07407,US,NJ,07407,7,,,, +US-NJ-07410,US,NJ,07410,7,,,, +US-NJ-07416,US,NJ,07416,7,,,, +US-NJ-07417,US,NJ,07417,7,,,, +US-NJ-07418,US,NJ,07418,7,,,, +US-NJ-07419,US,NJ,07419,7,,,, +US-NJ-07420,US,NJ,07420,7,,,, +US-NJ-07421,US,NJ,07421,7,,,, +US-NJ-07422,US,NJ,07422,7,,,, +US-NJ-07423,US,NJ,07423,7,,,, +US-NJ-07424,US,NJ,07424,7,,,, +US-NJ-07428,US,NJ,07428,7,,,, +US-NJ-07430,US,NJ,07430,7,,,, +US-NJ-07432,US,NJ,07432,7,,,, +US-NJ-07435,US,NJ,07435,7,,,, +US-NJ-07436,US,NJ,07436,7,,,, +US-NJ-07438,US,NJ,07438,7,,,, +US-NJ-07439,US,NJ,07439,7,,,, +US-NJ-07440,US,NJ,07440,7,,,, +US-NJ-07442,US,NJ,07442,7,,,, +US-NJ-07444,US,NJ,07444,7,,,, +US-NJ-07446,US,NJ,07446,7,,,, +US-NJ-07450,US,NJ,07450,7,,,, +US-NJ-07451,US,NJ,07451,7,,,, +US-NJ-07452,US,NJ,07452,7,,,, +US-NJ-07456,US,NJ,07456,7,,,, +US-NJ-07457,US,NJ,07457,7,,,, +US-NJ-07458,US,NJ,07458,7,,,, +US-NJ-07460,US,NJ,07460,7,,,, +US-NJ-07461,US,NJ,07461,7,,,, +US-NJ-07462,US,NJ,07462,7,,,, +US-NJ-07463,US,NJ,07463,7,,,, +US-NJ-07465,US,NJ,07465,7,,,, +US-NJ-07470,US,NJ,07470,7,,,, +US-NJ-07474,US,NJ,07474,7,,,, +US-NJ-07480,US,NJ,07480,7,,,, +US-NJ-07481,US,NJ,07481,7,,,, +US-NJ-07495,US,NJ,07495,7,,,, +US-NJ-07501,US,NJ,07501,7,,,, +US-NJ-07502,US,NJ,07502,7,,,, +US-NJ-07503,US,NJ,07503,7,,,, +US-NJ-07504,US,NJ,07504,7,,,, +US-NJ-07505,US,NJ,07505,7,,,, +US-NJ-07506,US,NJ,07506,7,,,, +US-NJ-07507,US,NJ,07507,7,,,, +US-NJ-07508,US,NJ,07508,7,,,, +US-NJ-07509,US,NJ,07509,7,,,, +US-NJ-07510,US,NJ,07510,7,,,, +US-NJ-07511,US,NJ,07511,7,,,, +US-NJ-07512,US,NJ,07512,7,,,, +US-NJ-07513,US,NJ,07513,7,,,, +US-NJ-07514,US,NJ,07514,7,,,, +US-NJ-07522,US,NJ,07522,7,,,, +US-NJ-07524,US,NJ,07524,7,,,, +US-NJ-07533,US,NJ,07533,7,,,, +US-NJ-07538,US,NJ,07538,7,,,, +US-NJ-07543,US,NJ,07543,7,,,, +US-NJ-07544,US,NJ,07544,7,,,, +US-NJ-07601,US,NJ,07601,7,,,, +US-NJ-07602,US,NJ,07602,7,,,, +US-NJ-07603,US,NJ,07603,7,,,, +US-NJ-07604,US,NJ,07604,7,,,, +US-NJ-07605,US,NJ,07605,7,,,, +US-NJ-07606,US,NJ,07606,7,,,, +US-NJ-07607,US,NJ,07607,7,,,, +US-NJ-07608,US,NJ,07608,7,,,, +US-NJ-07620,US,NJ,07620,7,,,, +US-NJ-07621,US,NJ,07621,7,,,, +US-NJ-07624,US,NJ,07624,7,,,, +US-NJ-07626,US,NJ,07626,7,,,, +US-NJ-07627,US,NJ,07627,7,,,, +US-NJ-07628,US,NJ,07628,7,,,, +US-NJ-07630,US,NJ,07630,7,,,, +US-NJ-07631,US,NJ,07631,7,,,, +US-NJ-07632,US,NJ,07632,7,,,, +US-NJ-07640,US,NJ,07640,7,,,, +US-NJ-07641,US,NJ,07641,7,,,, +US-NJ-07642,US,NJ,07642,7,,,, +US-NJ-07643,US,NJ,07643,7,,,, +US-NJ-07644,US,NJ,07644,7,,,, +US-NJ-07645,US,NJ,07645,7,,,, +US-NJ-07646,US,NJ,07646,7,,,, +US-NJ-07647,US,NJ,07647,7,,,, +US-NJ-07648,US,NJ,07648,7,,,, +US-NJ-07649,US,NJ,07649,7,,,, +US-NJ-07650,US,NJ,07650,7,,,, +US-NJ-07652,US,NJ,07652,7,,,, +US-NJ-07653,US,NJ,07653,7,,,, +US-NJ-07656,US,NJ,07656,7,,,, +US-NJ-07657,US,NJ,07657,7,,,, +US-NJ-07660,US,NJ,07660,7,,,, +US-NJ-07661,US,NJ,07661,7,,,, +US-NJ-07662,US,NJ,07662,7,,,, +US-NJ-07663,US,NJ,07663,7,,,, +US-NJ-07666,US,NJ,07666,7,,,, +US-NJ-07670,US,NJ,07670,7,,,, +US-NJ-07675,US,NJ,07675,7,,,, +US-NJ-07676,US,NJ,07676,7,,,, +US-NJ-07677,US,NJ,07677,7,,,, +US-NJ-07699,US,NJ,07699,7,,,, +US-NJ-07701,US,NJ,07701,7,,,, +US-NJ-07702,US,NJ,07702,7,,,, +US-NJ-07703,US,NJ,07703,7,,,, +US-NJ-07704,US,NJ,07704,7,,,, +US-NJ-07709,US,NJ,07709,7,,,, +US-NJ-07710,US,NJ,07710,7,,,, +US-NJ-07711,US,NJ,07711,7,,,, +US-NJ-07712,US,NJ,07712,7,,,, +US-NJ-07715,US,NJ,07715,7,,,, +US-NJ-07716,US,NJ,07716,7,,,, +US-NJ-07717,US,NJ,07717,7,,,, +US-NJ-07718,US,NJ,07718,7,,,, +US-NJ-07719,US,NJ,07719,7,,,, +US-NJ-07720,US,NJ,07720,7,,,, +US-NJ-07721,US,NJ,07721,7,,,, +US-NJ-07722,US,NJ,07722,7,,,, +US-NJ-07723,US,NJ,07723,7,,,, +US-NJ-07724,US,NJ,07724,7,,,, +US-NJ-07726,US,NJ,07726,7,,,, +US-NJ-07727,US,NJ,07727,7,,,, +US-NJ-07728,US,NJ,07728,7,,,, +US-NJ-07730,US,NJ,07730,7,,,, +US-NJ-07731,US,NJ,07731,7,,,, +US-NJ-07732,US,NJ,07732,7,,,, +US-NJ-07733,US,NJ,07733,7,,,, +US-NJ-07734,US,NJ,07734,7,,,, +US-NJ-07735,US,NJ,07735,7,,,, +US-NJ-07737,US,NJ,07737,7,,,, +US-NJ-07738,US,NJ,07738,7,,,, +US-NJ-07739,US,NJ,07739,7,,,, +US-NJ-07740,US,NJ,07740,7,,,, +US-NJ-07746,US,NJ,07746,7,,,, +US-NJ-07747,US,NJ,07747,7,,,, +US-NJ-07748,US,NJ,07748,7,,,, +US-NJ-07750,US,NJ,07750,7,,,, +US-NJ-07751,US,NJ,07751,7,,,, +US-NJ-07752,US,NJ,07752,7,,,, +US-NJ-07753,US,NJ,07753,7,,,, +US-NJ-07754,US,NJ,07754,7,,,, +US-NJ-07755,US,NJ,07755,7,,,, +US-NJ-07756,US,NJ,07756,7,,,, +US-NJ-07757,US,NJ,07757,7,,,, +US-NJ-07758,US,NJ,07758,7,,,, +US-NJ-07760,US,NJ,07760,7,,,, +US-NJ-07762,US,NJ,07762,7,,,, +US-NJ-07763,US,NJ,07763,7,,,, +US-NJ-07764,US,NJ,07764,7,,,, +US-NJ-07765,US,NJ,07765,7,,,, +US-NJ-07799,US,NJ,07799,7,,,, +US-NJ-07801,US,NJ,07801,7,,,, +US-NJ-07802,US,NJ,07802,7,,,, +US-NJ-07803,US,NJ,07803,7,,,, +US-NJ-07806,US,NJ,07806,7,,,, +US-NJ-07820,US,NJ,07820,7,,,, +US-NJ-07821,US,NJ,07821,7,,,, +US-NJ-07822,US,NJ,07822,7,,,, +US-NJ-07823,US,NJ,07823,7,,,, +US-NJ-07825,US,NJ,07825,7,,,, +US-NJ-07826,US,NJ,07826,7,,,, +US-NJ-07827,US,NJ,07827,7,,,, +US-NJ-07828,US,NJ,07828,7,,,, +US-NJ-07829,US,NJ,07829,7,,,, +US-NJ-07830,US,NJ,07830,7,,,, +US-NJ-07831,US,NJ,07831,7,,,, +US-NJ-07832,US,NJ,07832,7,,,, +US-NJ-07833,US,NJ,07833,7,,,, +US-NJ-07834,US,NJ,07834,7,,,, +US-NJ-07836,US,NJ,07836,7,,,, +US-NJ-07837,US,NJ,07837,7,,,, +US-NJ-07838,US,NJ,07838,7,,,, +US-NJ-07839,US,NJ,07839,7,,,, +US-NJ-07840,US,NJ,07840,7,,,, +US-NJ-07842,US,NJ,07842,7,,,, +US-NJ-07843,US,NJ,07843,7,,,, +US-NJ-07844,US,NJ,07844,7,,,, +US-NJ-07845,US,NJ,07845,7,,,, +US-NJ-07846,US,NJ,07846,7,,,, +US-NJ-07847,US,NJ,07847,7,,,, +US-NJ-07848,US,NJ,07848,7,,,, +US-NJ-07849,US,NJ,07849,7,,,, +US-NJ-07850,US,NJ,07850,7,,,, +US-NJ-07851,US,NJ,07851,7,,,, +US-NJ-07852,US,NJ,07852,7,,,, +US-NJ-07853,US,NJ,07853,7,,,, +US-NJ-07855,US,NJ,07855,7,,,, +US-NJ-07856,US,NJ,07856,7,,,, +US-NJ-07857,US,NJ,07857,7,,,, +US-NJ-07860,US,NJ,07860,7,,,, +US-NJ-07863,US,NJ,07863,7,,,, +US-NJ-07865,US,NJ,07865,7,,,, +US-NJ-07866,US,NJ,07866,7,,,, +US-NJ-07869,US,NJ,07869,7,,,, +US-NJ-07870,US,NJ,07870,7,,,, +US-NJ-07871,US,NJ,07871,7,,,, +US-NJ-07874,US,NJ,07874,7,,,, +US-NJ-07875,US,NJ,07875,7,,,, +US-NJ-07876,US,NJ,07876,7,,,, +US-NJ-07877,US,NJ,07877,7,,,, +US-NJ-07878,US,NJ,07878,7,,,, +US-NJ-07879,US,NJ,07879,7,,,, +US-NJ-07880,US,NJ,07880,7,,,, +US-NJ-07881,US,NJ,07881,7,,,, +US-NJ-07882,US,NJ,07882,7,,,, +US-NJ-07885,US,NJ,07885,7,,,, +US-NJ-07890,US,NJ,07890,7,,,, +US-NJ-07901,US,NJ,07901,7,,,, +US-NJ-07902,US,NJ,07902,7,,,, +US-NJ-07920,US,NJ,07920,7,,,, +US-NJ-07921,US,NJ,07921,7,,,, +US-NJ-07922,US,NJ,07922,7,,,, +US-NJ-07924,US,NJ,07924,7,,,, +US-NJ-07926,US,NJ,07926,7,,,, +US-NJ-07927,US,NJ,07927,7,,,, +US-NJ-07928,US,NJ,07928,7,,,, +US-NJ-07930,US,NJ,07930,7,,,, +US-NJ-07931,US,NJ,07931,7,,,, +US-NJ-07932,US,NJ,07932,7,,,, +US-NJ-07933,US,NJ,07933,7,,,, +US-NJ-07934,US,NJ,07934,7,,,, +US-NJ-07935,US,NJ,07935,7,,,, +US-NJ-07936,US,NJ,07936,7,,,, +US-NJ-07938,US,NJ,07938,7,,,, +US-NJ-07939,US,NJ,07939,7,,,, +US-NJ-07940,US,NJ,07940,7,,,, +US-NJ-07945,US,NJ,07945,7,,,, +US-NJ-07946,US,NJ,07946,7,,,, +US-NJ-07950,US,NJ,07950,7,,,, +US-NJ-07960,US,NJ,07960,7,,,, +US-NJ-07961,US,NJ,07961,7,,,, +US-NJ-07962,US,NJ,07962,7,,,, +US-NJ-07963,US,NJ,07963,7,,,, +US-NJ-07970,US,NJ,07970,7,,,, +US-NJ-07974,US,NJ,07974,7,,,, +US-NJ-07976,US,NJ,07976,7,,,, +US-NJ-07977,US,NJ,07977,7,,,, +US-NJ-07978,US,NJ,07978,7,,,, +US-NJ-07979,US,NJ,07979,7,,,, +US-NJ-07980,US,NJ,07980,7,,,, +US-NJ-07981,US,NJ,07981,7,,,, +US-NJ-07999,US,NJ,07999,7,,,, +US-NJ-08001,US,NJ,08001,7,,,, +US-NJ-08002,US,NJ,08002,7,,,, +US-NJ-08003,US,NJ,08003,7,,,, +US-NJ-08004,US,NJ,08004,7,,,, +US-NJ-08005,US,NJ,08005,7,,,, +US-NJ-08006,US,NJ,08006,7,,,, +US-NJ-08007,US,NJ,08007,7,,,, +US-NJ-08008,US,NJ,08008,7,,,, +US-NJ-08009,US,NJ,08009,7,,,, +US-NJ-08010,US,NJ,08010,7,,,, +US-NJ-08011,US,NJ,08011,7,,,, +US-NJ-08012,US,NJ,08012,7,,,, +US-NJ-08014,US,NJ,08014,7,,,, +US-NJ-08015,US,NJ,08015,7,,,, +US-NJ-08016,US,NJ,08016,7,,,, +US-NJ-08018,US,NJ,08018,7,,,, +US-NJ-08019,US,NJ,08019,7,,,, +US-NJ-08020,US,NJ,08020,7,,,, +US-NJ-08021,US,NJ,08021,7,,,, +US-NJ-08022,US,NJ,08022,7,,,, +US-NJ-08023,US,NJ,08023,7,,,, +US-NJ-08025,US,NJ,08025,7,,,, +US-NJ-08026,US,NJ,08026,7,,,, +US-NJ-08027,US,NJ,08027,7,,,, +US-NJ-08028,US,NJ,08028,7,,,, +US-NJ-08029,US,NJ,08029,7,,,, +US-NJ-08030,US,NJ,08030,7,,,, +US-NJ-08031,US,NJ,08031,7,,,, +US-NJ-08032,US,NJ,08032,7,,,, +US-NJ-08033,US,NJ,08033,7,,,, +US-NJ-08034,US,NJ,08034,7,,,, +US-NJ-08035,US,NJ,08035,7,,,, +US-NJ-08036,US,NJ,08036,7,,,, +US-NJ-08037,US,NJ,08037,7,,,, +US-NJ-08038,US,NJ,08038,7,,,, +US-NJ-08039,US,NJ,08039,7,,,, +US-NJ-08041,US,NJ,08041,7,,,, +US-NJ-08042,US,NJ,08042,7,,,, +US-NJ-08043,US,NJ,08043,7,,,, +US-NJ-08045,US,NJ,08045,7,,,, +US-NJ-08046,US,NJ,08046,7,,,, +US-NJ-08048,US,NJ,08048,7,,,, +US-NJ-08049,US,NJ,08049,7,,,, +US-NJ-08050,US,NJ,08050,7,,,, +US-NJ-08051,US,NJ,08051,7,,,, +US-NJ-08052,US,NJ,08052,7,,,, +US-NJ-08053,US,NJ,08053,7,,,, +US-NJ-08054,US,NJ,08054,7,,,, +US-NJ-08055,US,NJ,08055,7,,,, +US-NJ-08056,US,NJ,08056,7,,,, +US-NJ-08057,US,NJ,08057,7,,,, +US-NJ-08059,US,NJ,08059,7,,,, +US-NJ-08060,US,NJ,08060,7,,,, +US-NJ-08061,US,NJ,08061,7,,,, +US-NJ-08062,US,NJ,08062,7,,,, +US-NJ-08063,US,NJ,08063,7,,,, +US-NJ-08064,US,NJ,08064,7,,,, +US-NJ-08065,US,NJ,08065,7,,,, +US-NJ-08066,US,NJ,08066,7,,,, +US-NJ-08067,US,NJ,08067,7,,,, +US-NJ-08068,US,NJ,08068,7,,,, +US-NJ-08069,US,NJ,08069,7,,,, +US-NJ-08070,US,NJ,08070,7,,,, +US-NJ-08071,US,NJ,08071,7,,,, +US-NJ-08072,US,NJ,08072,7,,,, +US-NJ-08073,US,NJ,08073,7,,,, +US-NJ-08074,US,NJ,08074,7,,,, +US-NJ-08075,US,NJ,08075,7,,,, +US-NJ-08076,US,NJ,08076,7,,,, +US-NJ-08077,US,NJ,08077,7,,,, +US-NJ-08078,US,NJ,08078,7,,,, +US-NJ-08079,US,NJ,08079,7,,,, +US-NJ-08080,US,NJ,08080,7,,,, +US-NJ-08081,US,NJ,08081,7,,,, +US-NJ-08083,US,NJ,08083,7,,,, +US-NJ-08084,US,NJ,08084,7,,,, +US-NJ-08085,US,NJ,08085,7,,,, +US-NJ-08086,US,NJ,08086,7,,,, +US-NJ-08087,US,NJ,08087,7,,,, +US-NJ-08088,US,NJ,08088,7,,,, +US-NJ-08089,US,NJ,08089,7,,,, +US-NJ-08090,US,NJ,08090,7,,,, +US-NJ-08091,US,NJ,08091,7,,,, +US-NJ-08092,US,NJ,08092,7,,,, +US-NJ-08093,US,NJ,08093,7,,,, +US-NJ-08094,US,NJ,08094,7,,,, +US-NJ-08095,US,NJ,08095,7,,,, +US-NJ-08096,US,NJ,08096,7,,,, +US-NJ-08097,US,NJ,08097,7,,,, +US-NJ-08098,US,NJ,08098,7,,,, +US-NJ-08099,US,NJ,08099,7,,,, +US-NJ-08101,US,NJ,08101,7,,,, +US-NJ-08102,US,NJ,08102,7,,,, +US-NJ-08103,US,NJ,08103,7,,,, +US-NJ-08104,US,NJ,08104,7,,,, +US-NJ-08105,US,NJ,08105,7,,,, +US-NJ-08106,US,NJ,08106,7,,,, +US-NJ-08107,US,NJ,08107,7,,,, +US-NJ-08108,US,NJ,08108,7,,,, +US-NJ-08109,US,NJ,08109,7,,,, +US-NJ-08110,US,NJ,08110,7,,,, +US-NJ-08201,US,NJ,08201,7,,,, +US-NJ-08202,US,NJ,08202,7,,,, +US-NJ-08203,US,NJ,08203,7,,,, +US-NJ-08204,US,NJ,08204,7,,,, +US-NJ-08205,US,NJ,08205,7,,,, +US-NJ-08210,US,NJ,08210,7,,,, +US-NJ-08212,US,NJ,08212,7,,,, +US-NJ-08213,US,NJ,08213,7,,,, +US-NJ-08214,US,NJ,08214,7,,,, +US-NJ-08215,US,NJ,08215,7,,,, +US-NJ-08217,US,NJ,08217,7,,,, +US-NJ-08218,US,NJ,08218,7,,,, +US-NJ-08219,US,NJ,08219,7,,,, +US-NJ-08220,US,NJ,08220,7,,,, +US-NJ-08221,US,NJ,08221,7,,,, +US-NJ-08223,US,NJ,08223,7,,,, +US-NJ-08224,US,NJ,08224,7,,,, +US-NJ-08225,US,NJ,08225,7,,,, +US-NJ-08226,US,NJ,08226,7,,,, +US-NJ-08230,US,NJ,08230,7,,,, +US-NJ-08231,US,NJ,08231,7,,,, +US-NJ-08232,US,NJ,08232,7,,,, +US-NJ-08234,US,NJ,08234,7,,,, +US-NJ-08240,US,NJ,08240,7,,,, +US-NJ-08241,US,NJ,08241,7,,,, +US-NJ-08242,US,NJ,08242,7,,,, +US-NJ-08243,US,NJ,08243,7,,,, +US-NJ-08244,US,NJ,08244,7,,,, +US-NJ-08245,US,NJ,08245,7,,,, +US-NJ-08246,US,NJ,08246,7,,,, +US-NJ-08247,US,NJ,08247,7,,,, +US-NJ-08248,US,NJ,08248,7,,,, +US-NJ-08250,US,NJ,08250,7,,,, +US-NJ-08251,US,NJ,08251,7,,,, +US-NJ-08252,US,NJ,08252,7,,,, +US-NJ-08260,US,NJ,08260,7,,,, +US-NJ-08270,US,NJ,08270,7,,,, +US-NJ-08302,US,NJ,08302,7,,,, +US-NJ-08310,US,NJ,08310,7,,,, +US-NJ-08311,US,NJ,08311,7,,,, +US-NJ-08312,US,NJ,08312,7,,,, +US-NJ-08313,US,NJ,08313,7,,,, +US-NJ-08314,US,NJ,08314,7,,,, +US-NJ-08315,US,NJ,08315,7,,,, +US-NJ-08316,US,NJ,08316,7,,,, +US-NJ-08317,US,NJ,08317,7,,,, +US-NJ-08318,US,NJ,08318,7,,,, +US-NJ-08319,US,NJ,08319,7,,,, +US-NJ-08320,US,NJ,08320,7,,,, +US-NJ-08321,US,NJ,08321,7,,,, +US-NJ-08322,US,NJ,08322,7,,,, +US-NJ-08323,US,NJ,08323,7,,,, +US-NJ-08324,US,NJ,08324,7,,,, +US-NJ-08326,US,NJ,08326,7,,,, +US-NJ-08327,US,NJ,08327,7,,,, +US-NJ-08328,US,NJ,08328,7,,,, +US-NJ-08329,US,NJ,08329,7,,,, +US-NJ-08330,US,NJ,08330,7,,,, +US-NJ-08332,US,NJ,08332,7,,,, +US-NJ-08340,US,NJ,08340,7,,,, +US-NJ-08341,US,NJ,08341,7,,,, +US-NJ-08342,US,NJ,08342,7,,,, +US-NJ-08343,US,NJ,08343,7,,,, +US-NJ-08344,US,NJ,08344,7,,,, +US-NJ-08345,US,NJ,08345,7,,,, +US-NJ-08346,US,NJ,08346,7,,,, +US-NJ-08347,US,NJ,08347,7,,,, +US-NJ-08348,US,NJ,08348,7,,,, +US-NJ-08349,US,NJ,08349,7,,,, +US-NJ-08350,US,NJ,08350,7,,,, +US-NJ-08352,US,NJ,08352,7,,,, +US-NJ-08353,US,NJ,08353,7,,,, +US-NJ-08360,US,NJ,08360,7,,,, +US-NJ-08361,US,NJ,08361,7,,,, +US-NJ-08362,US,NJ,08362,7,,,, +US-NJ-08401,US,NJ,08401,7,,,, +US-NJ-08402,US,NJ,08402,7,,,, +US-NJ-08403,US,NJ,08403,7,,,, +US-NJ-08404,US,NJ,08404,7,,,, +US-NJ-08405,US,NJ,08405,7,,,, +US-NJ-08406,US,NJ,08406,7,,,, +US-NJ-08501,US,NJ,08501,7,,,, +US-NJ-08502,US,NJ,08502,7,,,, +US-NJ-08504,US,NJ,08504,7,,,, +US-NJ-08505,US,NJ,08505,7,,,, +US-NJ-08510,US,NJ,08510,7,,,, +US-NJ-08511,US,NJ,08511,7,,,, +US-NJ-08512,US,NJ,08512,7,,,, +US-NJ-08514,US,NJ,08514,7,,,, +US-NJ-08515,US,NJ,08515,7,,,, +US-NJ-08518,US,NJ,08518,7,,,, +US-NJ-08520,US,NJ,08520,7,,,, +US-NJ-08525,US,NJ,08525,7,,,, +US-NJ-08526,US,NJ,08526,7,,,, +US-NJ-08527,US,NJ,08527,7,,,, +US-NJ-08528,US,NJ,08528,7,,,, +US-NJ-08530,US,NJ,08530,7,,,, +US-NJ-08533,US,NJ,08533,7,,,, +US-NJ-08534,US,NJ,08534,7,,,, +US-NJ-08535,US,NJ,08535,7,,,, +US-NJ-08536,US,NJ,08536,7,,,, +US-NJ-08540,US,NJ,08540,7,,,, +US-NJ-08541,US,NJ,08541,7,,,, +US-NJ-08542,US,NJ,08542,7,,,, +US-NJ-08543,US,NJ,08543,7,,,, +US-NJ-08544,US,NJ,08544,7,,,, +US-NJ-08550,US,NJ,08550,7,,,, +US-NJ-08551,US,NJ,08551,7,,,, +US-NJ-08553,US,NJ,08553,7,,,, +US-NJ-08554,US,NJ,08554,7,,,, +US-NJ-08555,US,NJ,08555,7,,,, +US-NJ-08556,US,NJ,08556,7,,,, +US-NJ-08557,US,NJ,08557,7,,,, +US-NJ-08558,US,NJ,08558,7,,,, +US-NJ-08559,US,NJ,08559,7,,,, +US-NJ-08560,US,NJ,08560,7,,,, +US-NJ-08561,US,NJ,08561,7,,,, +US-NJ-08562,US,NJ,08562,7,,,, +US-NJ-08601,US,NJ,08601,7,,,, +US-NJ-08602,US,NJ,08602,7,,,, +US-NJ-08603,US,NJ,08603,7,,,, +US-NJ-08604,US,NJ,08604,7,,,, +US-NJ-08605,US,NJ,08605,7,,,, +US-NJ-08606,US,NJ,08606,7,,,, +US-NJ-08607,US,NJ,08607,7,,,, +US-NJ-08608,US,NJ,08608,7,,,, +US-NJ-08609,US,NJ,08609,7,,,, +US-NJ-08610,US,NJ,08610,7,,,, +US-NJ-08611,US,NJ,08611,7,,,, +US-NJ-08618,US,NJ,08618,7,,,, +US-NJ-08619,US,NJ,08619,7,,,, +US-NJ-08620,US,NJ,08620,7,,,, +US-NJ-08625,US,NJ,08625,7,,,, +US-NJ-08628,US,NJ,08628,7,,,, +US-NJ-08629,US,NJ,08629,7,,,, +US-NJ-08638,US,NJ,08638,7,,,, +US-NJ-08640,US,NJ,08640,7,,,, +US-NJ-08641,US,NJ,08641,7,,,, +US-NJ-08645,US,NJ,08645,7,,,, +US-NJ-08646,US,NJ,08646,7,,,, +US-NJ-08647,US,NJ,08647,7,,,, +US-NJ-08648,US,NJ,08648,7,,,, +US-NJ-08650,US,NJ,08650,7,,,, +US-NJ-08666,US,NJ,08666,7,,,, +US-NJ-08690,US,NJ,08690,7,,,, +US-NJ-08691,US,NJ,08691,7,,,, +US-NJ-08695,US,NJ,08695,7,,,, +US-NJ-08701,US,NJ,08701,7,,,, +US-NJ-08720,US,NJ,08720,7,,,, +US-NJ-08721,US,NJ,08721,7,,,, +US-NJ-08722,US,NJ,08722,7,,,, +US-NJ-08723,US,NJ,08723,7,,,, +US-NJ-08724,US,NJ,08724,7,,,, +US-NJ-08730,US,NJ,08730,7,,,, +US-NJ-08731,US,NJ,08731,7,,,, +US-NJ-08732,US,NJ,08732,7,,,, +US-NJ-08733,US,NJ,08733,7,,,, +US-NJ-08734,US,NJ,08734,7,,,, +US-NJ-08735,US,NJ,08735,7,,,, +US-NJ-08736,US,NJ,08736,7,,,, +US-NJ-08738,US,NJ,08738,7,,,, +US-NJ-08739,US,NJ,08739,7,,,, +US-NJ-08740,US,NJ,08740,7,,,, +US-NJ-08741,US,NJ,08741,7,,,, +US-NJ-08742,US,NJ,08742,7,,,, +US-NJ-08750,US,NJ,08750,7,,,, +US-NJ-08751,US,NJ,08751,7,,,, +US-NJ-08752,US,NJ,08752,7,,,, +US-NJ-08753,US,NJ,08753,7,,,, +US-NJ-08754,US,NJ,08754,7,,,, +US-NJ-08755,US,NJ,08755,7,,,, +US-NJ-08756,US,NJ,08756,7,,,, +US-NJ-08757,US,NJ,08757,7,,,, +US-NJ-08758,US,NJ,08758,7,,,, +US-NJ-08759,US,NJ,08759,7,,,, +US-NJ-08801,US,NJ,08801,7,,,, +US-NJ-08802,US,NJ,08802,7,,,, +US-NJ-08803,US,NJ,08803,7,,,, +US-NJ-08804,US,NJ,08804,7,,,, +US-NJ-08805,US,NJ,08805,7,,,, +US-NJ-08807,US,NJ,08807,7,,,, +US-NJ-08808,US,NJ,08808,7,,,, +US-NJ-08809,US,NJ,08809,7,,,, +US-NJ-08810,US,NJ,08810,7,,,, +US-NJ-08812,US,NJ,08812,7,,,, +US-NJ-08816,US,NJ,08816,7,,,, +US-NJ-08817,US,NJ,08817,7,,,, +US-NJ-08818,US,NJ,08818,7,,,, +US-NJ-08820,US,NJ,08820,7,,,, +US-NJ-08821,US,NJ,08821,7,,,, +US-NJ-08822,US,NJ,08822,7,,,, +US-NJ-08823,US,NJ,08823,7,,,, +US-NJ-08824,US,NJ,08824,7,,,, +US-NJ-08825,US,NJ,08825,7,,,, +US-NJ-08826,US,NJ,08826,7,,,, +US-NJ-08827,US,NJ,08827,7,,,, +US-NJ-08828,US,NJ,08828,7,,,, +US-NJ-08829,US,NJ,08829,7,,,, +US-NJ-08830,US,NJ,08830,7,,,, +US-NJ-08831,US,NJ,08831,7,,,, +US-NJ-08832,US,NJ,08832,7,,,, +US-NJ-08833,US,NJ,08833,7,,,, +US-NJ-08834,US,NJ,08834,7,,,, +US-NJ-08835,US,NJ,08835,7,,,, +US-NJ-08836,US,NJ,08836,7,,,, +US-NJ-08837,US,NJ,08837,7,,,, +US-NJ-08840,US,NJ,08840,7,,,, +US-NJ-08844,US,NJ,08844,7,,,, +US-NJ-08846,US,NJ,08846,7,,,, +US-NJ-08848,US,NJ,08848,7,,,, +US-NJ-08850,US,NJ,08850,7,,,, +US-NJ-08852,US,NJ,08852,7,,,, +US-NJ-08853,US,NJ,08853,7,,,, +US-NJ-08854,US,NJ,08854,7,,,, +US-NJ-08855,US,NJ,08855,7,,,, +US-NJ-08857,US,NJ,08857,7,,,, +US-NJ-08858,US,NJ,08858,7,,,, +US-NJ-08859,US,NJ,08859,7,,,, +US-NJ-08861,US,NJ,08861,7,,,, +US-NJ-08862,US,NJ,08862,7,,,, +US-NJ-08863,US,NJ,08863,7,,,, +US-NJ-08865,US,NJ,08865,7,,,, +US-NJ-08867,US,NJ,08867,7,,,, +US-NJ-08868,US,NJ,08868,7,,,, +US-NJ-08869,US,NJ,08869,7,,,, +US-NJ-08870,US,NJ,08870,7,,,, +US-NJ-08871,US,NJ,08871,7,,,, +US-NJ-08872,US,NJ,08872,7,,,, +US-NJ-08873,US,NJ,08873,7,,,, +US-NJ-08875,US,NJ,08875,7,,,, +US-NJ-08876,US,NJ,08876,7,,,, +US-NJ-08879,US,NJ,08879,7,,,, +US-NJ-08880,US,NJ,08880,7,,,, +US-NJ-08882,US,NJ,08882,7,,,, +US-NJ-08884,US,NJ,08884,7,,,, +US-NJ-08885,US,NJ,08885,7,,,, +US-NJ-08886,US,NJ,08886,7,,,, +US-NJ-08887,US,NJ,08887,7,,,, +US-NJ-08888,US,NJ,08888,7,,,, +US-NJ-08889,US,NJ,08889,7,,,, +US-NJ-08890,US,NJ,08890,7,,,, +US-NJ-08899,US,NJ,08899,7,,,, +US-NJ-08901,US,NJ,08901,7,,,, +US-NJ-08902,US,NJ,08902,7,,,, +US-NJ-08903,US,NJ,08903,7,,,, +US-NJ-08904,US,NJ,08904,7,,,, +US-NJ-08906,US,NJ,08906,7,,,, +US-NJ-08933,US,NJ,08933,7,,,, +US-NJ-08989,US,NJ,08989,7,,,, +US-NM-87001,US,NM,87001,6.25,,,, +US-NM-87002,US,NM,87002,6.375,,,, +US-NM-87004,US,NM,87004,7.0625,,,, +US-NM-87005,US,NM,87005,6.6875,,,, +US-NM-87006,US,NM,87006,6,,,, +US-NM-87007,US,NM,87007,6.6875,,,, +US-NM-87008,US,NM,87008,6.0625,,,, +US-NM-87009,US,NM,87009,7.5625,,,, +US-NM-87010,US,NM,87010,6.875,,,, +US-NM-87011,US,NM,87011,6,,,, +US-NM-87012,US,NM,87012,6.5,,,, +US-NM-87013,US,NM,87013,7.8125,,,, +US-NM-87014,US,NM,87014,6.6875,,,, +US-NM-87015,US,NM,87015,6.875,,,, +US-NM-87016,US,NM,87016,6.5,,,, +US-NM-87017,US,NM,87017,6.5,,,, +US-NM-87018,US,NM,87018,6.3125,,,, +US-NM-87020,US,NM,87020,8,,,, +US-NM-87021,US,NM,87021,8,,,, +US-NM-87022,US,NM,87022,6.0625,,,, +US-NM-87023,US,NM,87023,6.375,,,, +US-NM-87024,US,NM,87024,6.25,,,, +US-NM-87025,US,NM,87025,6.25,,,, +US-NM-87026,US,NM,87026,6.375,,,, +US-NM-87027,US,NM,87027,6.25,,,, +US-NM-87028,US,NM,87028,6,,,, +US-NM-87029,US,NM,87029,6.5,,,, +US-NM-87031,US,NM,87031,6.375,,,, +US-NM-87032,US,NM,87032,6.5,,,, +US-NM-87034,US,NM,87034,6.6875,,,, +US-NM-87035,US,NM,87035,6.5,,,, +US-NM-87036,US,NM,87036,7.6875,,,, +US-NM-87037,US,NM,87037,6.3125,,,, +US-NM-87038,US,NM,87038,6.6875,,,, +US-NM-87040,US,NM,87040,6.6875,,,, +US-NM-87041,US,NM,87041,6.25,,,, +US-NM-87042,US,NM,87042,7.4375,,,, +US-NM-87043,US,NM,87043,6.25,,,, +US-NM-87044,US,NM,87044,6.25,,,, +US-NM-87045,US,NM,87045,6.75,,,, +US-NM-87046,US,NM,87046,6.25,,,, +US-NM-87047,US,NM,87047,6.0625,,,, +US-NM-87048,US,NM,87048,7.1875,,,, +US-NM-87049,US,NM,87049,6.6875,,,, +US-NM-87051,US,NM,87051,6.6875,,,, +US-NM-87052,US,NM,87052,6.25,,,, +US-NM-87053,US,NM,87053,6.25,,,, +US-NM-87056,US,NM,87056,6.875,,,, +US-NM-87059,US,NM,87059,6.0625,,,, +US-NM-87060,US,NM,87060,6.375,,,, +US-NM-87061,US,NM,87061,6.5,,,, +US-NM-87062,US,NM,87062,6,,,, +US-NM-87063,US,NM,87063,7.5625,,,, +US-NM-87064,US,NM,87064,6.5,,,, +US-NM-87068,US,NM,87068,7.6875,,,, +US-NM-87070,US,NM,87070,7.4375,,,, +US-NM-87072,US,NM,87072,6.25,,,, +US-NM-87083,US,NM,87083,6.25,,,, +US-NM-87101,US,NM,87101,7,,,, +US-NM-87102,US,NM,87102,7,,,, +US-NM-87103,US,NM,87103,7,,,, +US-NM-87104,US,NM,87104,7,,,, +US-NM-87105,US,NM,87105,6.0625,,,, +US-NM-87106,US,NM,87106,7,,,, +US-NM-87107,US,NM,87107,7,,,, +US-NM-87108,US,NM,87108,7,,,, +US-NM-87109,US,NM,87109,7,,,, +US-NM-87110,US,NM,87110,7,,,, +US-NM-87111,US,NM,87111,7,,,, +US-NM-87112,US,NM,87112,7,,,, +US-NM-87113,US,NM,87113,7,,,, +US-NM-87114,US,NM,87114,7,,,, +US-NM-87115,US,NM,87115,6.0625,,,, +US-NM-87116,US,NM,87116,6.0625,,,, +US-NM-87117,US,NM,87117,6.0625,,,, +US-NM-87119,US,NM,87119,7,,,, +US-NM-87120,US,NM,87120,7,,,, +US-NM-87121,US,NM,87121,7,,,, +US-NM-87122,US,NM,87122,6.0625,,,, +US-NM-87123,US,NM,87123,7,,,, +US-NM-87124,US,NM,87124,7.4375,,,, +US-NM-87125,US,NM,87125,7,,,, +US-NM-87131,US,NM,87131,7,,,, +US-NM-87144,US,NM,87144,7.4375,,,, +US-NM-87151,US,NM,87151,7,,,, +US-NM-87153,US,NM,87153,7,,,, +US-NM-87154,US,NM,87154,7,,,, +US-NM-87158,US,NM,87158,7,,,, +US-NM-87174,US,NM,87174,7.4375,,,, +US-NM-87176,US,NM,87176,7,,,, +US-NM-87181,US,NM,87181,7,,,, +US-NM-87184,US,NM,87184,6.0625,,,, +US-NM-87185,US,NM,87185,6.0625,,,, +US-NM-87187,US,NM,87187,7,,,, +US-NM-87190,US,NM,87190,7,,,, +US-NM-87191,US,NM,87191,7,,,, +US-NM-87192,US,NM,87192,7,,,, +US-NM-87193,US,NM,87193,7,,,, +US-NM-87194,US,NM,87194,7,,,, +US-NM-87195,US,NM,87195,6.0625,,,, +US-NM-87196,US,NM,87196,7,,,, +US-NM-87197,US,NM,87197,7,,,, +US-NM-87198,US,NM,87198,7,,,, +US-NM-87199,US,NM,87199,7,,,, +US-NM-87301,US,NM,87301,8.3125,,,, +US-NM-87302,US,NM,87302,8.3125,,,, +US-NM-87305,US,NM,87305,8.3125,,,, +US-NM-87310,US,NM,87310,6.75,,,, +US-NM-87311,US,NM,87311,6.75,,,, +US-NM-87312,US,NM,87312,6.75,,,, +US-NM-87313,US,NM,87313,6.75,,,, +US-NM-87315,US,NM,87315,6.6875,,,, +US-NM-87316,US,NM,87316,6.75,,,, +US-NM-87317,US,NM,87317,8.3125,,,, +US-NM-87319,US,NM,87319,8.3125,,,, +US-NM-87320,US,NM,87320,6.75,,,, +US-NM-87321,US,NM,87321,6.75,,,, +US-NM-87322,US,NM,87322,6.75,,,, +US-NM-87323,US,NM,87323,6.75,,,, +US-NM-87325,US,NM,87325,6.75,,,, +US-NM-87326,US,NM,87326,8.3125,,,, +US-NM-87327,US,NM,87327,6.75,,,, +US-NM-87347,US,NM,87347,6.75,,,, +US-NM-87357,US,NM,87357,6.75,,,, +US-NM-87365,US,NM,87365,6.75,,,, +US-NM-87375,US,NM,87375,8.3125,,,, +US-NM-87401,US,NM,87401,7.125,,,, +US-NM-87402,US,NM,87402,7.125,,,, +US-NM-87410,US,NM,87410,7.75,,,, +US-NM-87412,US,NM,87412,6.3125,,,, +US-NM-87413,US,NM,87413,7.6875,,,, +US-NM-87415,US,NM,87415,6.3125,,,, +US-NM-87416,US,NM,87416,6.3125,,,, +US-NM-87417,US,NM,87417,6.3125,,,, +US-NM-87418,US,NM,87418,6.3125,,,, +US-NM-87419,US,NM,87419,6.3125,,,, +US-NM-87420,US,NM,87420,6.3125,,,, +US-NM-87421,US,NM,87421,6.3125,,,, +US-NM-87455,US,NM,87455,6.3125,,,, +US-NM-87461,US,NM,87461,6.3125,,,, +US-NM-87499,US,NM,87499,7.125,,,, +US-NM-87501,US,NM,87501,8.1875,,,, +US-NM-87502,US,NM,87502,8.1875,,,, +US-NM-87503,US,NM,87503,8.1875,,,, +US-NM-87504,US,NM,87504,8.1875,,,, +US-NM-87505,US,NM,87505,8.1875,,,, +US-NM-87506,US,NM,87506,6.875,,,, +US-NM-87507,US,NM,87507,8.1875,,,, +US-NM-87508,US,NM,87508,6.875,,,, +US-NM-87509,US,NM,87509,8.1875,,,, +US-NM-87510,US,NM,87510,6.5,,,, +US-NM-87511,US,NM,87511,6.5,,,, +US-NM-87512,US,NM,87512,7.125,,,, +US-NM-87513,US,NM,87513,7.125,,,, +US-NM-87514,US,NM,87514,7.125,,,, +US-NM-87515,US,NM,87515,6.5,,,, +US-NM-87516,US,NM,87516,6.5,,,, +US-NM-87517,US,NM,87517,7.125,,,, +US-NM-87518,US,NM,87518,6.5,,,, +US-NM-87519,US,NM,87519,7.125,,,, +US-NM-87520,US,NM,87520,8.1875,,,, +US-NM-87521,US,NM,87521,7.125,,,, +US-NM-87522,US,NM,87522,6.5,,,, +US-NM-87523,US,NM,87523,6.5,,,, +US-NM-87524,US,NM,87524,7.125,,,, +US-NM-87525,US,NM,87525,8.1875,,,, +US-NM-87527,US,NM,87527,6.5,,,, +US-NM-87528,US,NM,87528,6.5,,,, +US-NM-87529,US,NM,87529,7.125,,,, +US-NM-87530,US,NM,87530,6.5,,,, +US-NM-87531,US,NM,87531,6.5,,,, +US-NM-87532,US,NM,87532,8.1875,,,, +US-NM-87533,US,NM,87533,8.1875,,,, +US-NM-87535,US,NM,87535,6.875,,,, +US-NM-87537,US,NM,87537,6.5,,,, +US-NM-87538,US,NM,87538,6.5,,,, +US-NM-87539,US,NM,87539,6.5,,,, +US-NM-87540,US,NM,87540,6.875,,,, +US-NM-87543,US,NM,87543,7.125,,,, +US-NM-87544,US,NM,87544,7.3125,,,, +US-NM-87545,US,NM,87545,7.3125,,,, +US-NM-87548,US,NM,87548,6.5,,,, +US-NM-87549,US,NM,87549,6.5,,,, +US-NM-87551,US,NM,87551,6.5,,,, +US-NM-87552,US,NM,87552,6.5,,,, +US-NM-87553,US,NM,87553,7.125,,,, +US-NM-87554,US,NM,87554,6.5,,,, +US-NM-87556,US,NM,87556,8.1875,,,, +US-NM-87557,US,NM,87557,8.4375,,,, +US-NM-87558,US,NM,87558,8.4375,,,, +US-NM-87560,US,NM,87560,6.5,,,, +US-NM-87562,US,NM,87562,6.5,,,, +US-NM-87564,US,NM,87564,7.125,,,, +US-NM-87565,US,NM,87565,6.5,,,, +US-NM-87566,US,NM,87566,6.5,,,, +US-NM-87567,US,NM,87567,8.1875,,,, +US-NM-87569,US,NM,87569,6.5,,,, +US-NM-87571,US,NM,87571,8.1875,,,, +US-NM-87573,US,NM,87573,6.5,,,, +US-NM-87574,US,NM,87574,6.875,,,, +US-NM-87575,US,NM,87575,6.5,,,, +US-NM-87576,US,NM,87576,7.125,,,, +US-NM-87577,US,NM,87577,7.125,,,, +US-NM-87578,US,NM,87578,6.5,,,, +US-NM-87579,US,NM,87579,7.125,,,, +US-NM-87580,US,NM,87580,7.125,,,, +US-NM-87581,US,NM,87581,6.5,,,, +US-NM-87582,US,NM,87582,6.5,,,, +US-NM-87583,US,NM,87583,6.5,,,, +US-NM-87592,US,NM,87592,8.1875,,,, +US-NM-87594,US,NM,87594,8.1875,,,, +US-NM-87701,US,NM,87701,8.0625,,,, +US-NM-87710,US,NM,87710,7.4375,,,, +US-NM-87711,US,NM,87711,6.4375,,,, +US-NM-87712,US,NM,87712,6.1875,,,, +US-NM-87713,US,NM,87713,6.1875,,,, +US-NM-87714,US,NM,87714,6.8125,,,, +US-NM-87715,US,NM,87715,6.1875,,,, +US-NM-87718,US,NM,87718,7.1875,,,, +US-NM-87722,US,NM,87722,6.1875,,,, +US-NM-87723,US,NM,87723,6.1875,,,, +US-NM-87724,US,NM,87724,6.4375,,,, +US-NM-87728,US,NM,87728,5.75,,,, +US-NM-87729,US,NM,87729,5.75,,,, +US-NM-87730,US,NM,87730,5.75,,,, +US-NM-87731,US,NM,87731,6.5,,,, +US-NM-87732,US,NM,87732,6.1875,,,, +US-NM-87733,US,NM,87733,5.75,,,, +US-NM-87734,US,NM,87734,6.1875,,,, +US-NM-87735,US,NM,87735,6.1875,,,, +US-NM-87736,US,NM,87736,6.1875,,,, +US-NM-87740,US,NM,87740,7.9375,,,, +US-NM-87742,US,NM,87742,6.5,,,, +US-NM-87743,US,NM,87743,5.75,,,, +US-NM-87745,US,NM,87745,6.5,,,, +US-NM-87746,US,NM,87746,5.75,,,, +US-NM-87747,US,NM,87747,6.8125,,,, +US-NM-87749,US,NM,87749,5.75,,,, +US-NM-87752,US,NM,87752,7.1875,,,, +US-NM-87753,US,NM,87753,6.1875,,,, +US-NM-87801,US,NM,87801,7.0625,,,, +US-NM-87820,US,NM,87820,5.625,,,, +US-NM-87821,US,NM,87821,5.625,,,, +US-NM-87823,US,NM,87823,6,,,, +US-NM-87824,US,NM,87824,5.625,,,, +US-NM-87825,US,NM,87825,6.9375,,,, +US-NM-87827,US,NM,87827,5.625,,,, +US-NM-87828,US,NM,87828,6,,,, +US-NM-87829,US,NM,87829,5.625,,,, +US-NM-87830,US,NM,87830,5.625,,,, +US-NM-87831,US,NM,87831,6,,,, +US-NM-87832,US,NM,87832,6,,,, +US-NM-87901,US,NM,87901,7.875,,,, +US-NM-87930,US,NM,87930,6.3125,,,, +US-NM-87931,US,NM,87931,6.3125,,,, +US-NM-87933,US,NM,87933,6.3125,,,, +US-NM-87935,US,NM,87935,7.5625,,,, +US-NM-87936,US,NM,87936,6.375,,,, +US-NM-87937,US,NM,87937,7.4375,,,, +US-NM-87939,US,NM,87939,6.3125,,,, +US-NM-87940,US,NM,87940,6.375,,,, +US-NM-87941,US,NM,87941,6.375,,,, +US-NM-87942,US,NM,87942,7.5625,,,, +US-NM-87943,US,NM,87943,6.3125,,,, +US-NM-88001,US,NM,88001,7.5625,,,, +US-NM-88002,US,NM,88002,6.375,,,, +US-NM-88003,US,NM,88003,6.375,,,, +US-NM-88004,US,NM,88004,7.5625,,,, +US-NM-88005,US,NM,88005,7.5625,,,, +US-NM-88006,US,NM,88006,7.5625,,,, +US-NM-88007,US,NM,88007,6.375,,,, +US-NM-88008,US,NM,88008,6.375,,,, +US-NM-88009,US,NM,88009,7.25,,,, +US-NM-88011,US,NM,88011,7.5625,,,, +US-NM-88012,US,NM,88012,7.5625,,,, +US-NM-88013,US,NM,88013,7.5625,,,, +US-NM-88020,US,NM,88020,5.9375,,,, +US-NM-88021,US,NM,88021,6.375,,,, +US-NM-88022,US,NM,88022,6.1875,,,, +US-NM-88023,US,NM,88023,7.25,,,, +US-NM-88024,US,NM,88024,7.5625,,,, +US-NM-88025,US,NM,88025,6.1875,,,, +US-NM-88026,US,NM,88026,7.25,,,, +US-NM-88027,US,NM,88027,6.375,,,, +US-NM-88028,US,NM,88028,6.1875,,,, +US-NM-88029,US,NM,88029,7.5625,,,, +US-NM-88030,US,NM,88030,6.5,,,, +US-NM-88031,US,NM,88031,7.5,,,, +US-NM-88032,US,NM,88032,6.375,,,, +US-NM-88033,US,NM,88033,6.375,,,, +US-NM-88034,US,NM,88034,6.1875,,,, +US-NM-88036,US,NM,88036,7.375,,,, +US-NM-88038,US,NM,88038,6.1875,,,, +US-NM-88039,US,NM,88039,5.625,,,, +US-NM-88040,US,NM,88040,6.1875,,,, +US-NM-88041,US,NM,88041,6.1875,,,, +US-NM-88042,US,NM,88042,6.3125,,,, +US-NM-88043,US,NM,88043,7.25,,,, +US-NM-88044,US,NM,88044,6.375,,,, +US-NM-88045,US,NM,88045,7.25,,,, +US-NM-88046,US,NM,88046,7.8125,,,, +US-NM-88047,US,NM,88047,6.375,,,, +US-NM-88048,US,NM,88048,6.375,,,, +US-NM-88049,US,NM,88049,6.1875,,,, +US-NM-88051,US,NM,88051,6.1875,,,, +US-NM-88052,US,NM,88052,6.375,,,, +US-NM-88053,US,NM,88053,7.375,,,, +US-NM-88054,US,NM,88054,6.375,,,, +US-NM-88055,US,NM,88055,7.25,,,, +US-NM-88056,US,NM,88056,5.9375,,,, +US-NM-88058,US,NM,88058,6.375,,,, +US-NM-88061,US,NM,88061,7.375,,,, +US-NM-88062,US,NM,88062,7.375,,,, +US-NM-88063,US,NM,88063,7.6875,,,, +US-NM-88065,US,NM,88065,6.1875,,,, +US-NM-88072,US,NM,88072,6.375,,,, +US-NM-88081,US,NM,88081,6.375,,,, +US-NM-88101,US,NM,88101,7.8125,,,, +US-NM-88102,US,NM,88102,7.8125,,,, +US-NM-88103,US,NM,88103,5.875,,,, +US-NM-88112,US,NM,88112,5.875,,,, +US-NM-88113,US,NM,88113,6.6875,,,, +US-NM-88114,US,NM,88114,5.5,,,, +US-NM-88115,US,NM,88115,6.9375,,,, +US-NM-88116,US,NM,88116,6.1875,,,, +US-NM-88118,US,NM,88118,6.1875,,,, +US-NM-88119,US,NM,88119,6.3125,,,, +US-NM-88120,US,NM,88120,5.875,,,, +US-NM-88121,US,NM,88121,6.4375,,,, +US-NM-88122,US,NM,88122,7.5625,,,, +US-NM-88123,US,NM,88123,6.1875,,,, +US-NM-88124,US,NM,88124,7.5,,,, +US-NM-88125,US,NM,88125,6.1875,,,, +US-NM-88126,US,NM,88126,6.1875,,,, +US-NM-88130,US,NM,88130,7.75,,,, +US-NM-88132,US,NM,88132,6.1875,,,, +US-NM-88133,US,NM,88133,5.875,,,, +US-NM-88134,US,NM,88134,6.3125,,,, +US-NM-88135,US,NM,88135,5.875,,,, +US-NM-88136,US,NM,88136,6.3125,,,, +US-NM-88201,US,NM,88201,7.125,,,, +US-NM-88202,US,NM,88202,7.125,,,, +US-NM-88203,US,NM,88203,7.125,,,, +US-NM-88210,US,NM,88210,7.4375,,,, +US-NM-88211,US,NM,88211,7.4375,,,, +US-NM-88213,US,NM,88213,5.5,,,, +US-NM-88220,US,NM,88220,7.4375,,,, +US-NM-88221,US,NM,88221,7.4375,,,, +US-NM-88230,US,NM,88230,6.0625,,,, +US-NM-88231,US,NM,88231,6.8125,,,, +US-NM-88232,US,NM,88232,7.125,,,, +US-NM-88240,US,NM,88240,6.8125,,,, +US-NM-88241,US,NM,88241,6.8125,,,, +US-NM-88242,US,NM,88242,5.5,,,, +US-NM-88244,US,NM,88244,6.8125,,,, +US-NM-88250,US,NM,88250,6.625,,,, +US-NM-88252,US,NM,88252,7.0625,,,, +US-NM-88253,US,NM,88253,5.75,,,, +US-NM-88254,US,NM,88254,5.75,,,, +US-NM-88255,US,NM,88255,5.75,,,, +US-NM-88256,US,NM,88256,5.75,,,, +US-NM-88260,US,NM,88260,6.875,,,, +US-NM-88262,US,NM,88262,6.875,,,, +US-NM-88263,US,NM,88263,5.75,,,, +US-NM-88264,US,NM,88264,5.5,,,, +US-NM-88265,US,NM,88265,5.5,,,, +US-NM-88267,US,NM,88267,5.5,,,, +US-NM-88268,US,NM,88268,5.75,,,, +US-NM-88301,US,NM,88301,5.6875,,,, +US-NM-88310,US,NM,88310,7.625,,,, +US-NM-88311,US,NM,88311,7.625,,,, +US-NM-88312,US,NM,88312,5.6875,,,, +US-NM-88314,US,NM,88314,5.9375,,,, +US-NM-88316,US,NM,88316,7,,,, +US-NM-88317,US,NM,88317,5.9375,,,, +US-NM-88318,US,NM,88318,7.125,,,, +US-NM-88321,US,NM,88321,7.0625,,,, +US-NM-88323,US,NM,88323,5.6875,,,, +US-NM-88324,US,NM,88324,5.6875,,,, +US-NM-88325,US,NM,88325,5.9375,,,, +US-NM-88330,US,NM,88330,5.9375,,,, +US-NM-88336,US,NM,88336,5.6875,,,, +US-NM-88337,US,NM,88337,5.9375,,,, +US-NM-88338,US,NM,88338,5.6875,,,, +US-NM-88339,US,NM,88339,5.9375,,,, +US-NM-88340,US,NM,88340,5.9375,,,, +US-NM-88341,US,NM,88341,5.6875,,,, +US-NM-88342,US,NM,88342,5.9375,,,, +US-NM-88343,US,NM,88343,5.6875,,,, +US-NM-88344,US,NM,88344,6.0625,,,, +US-NM-88345,US,NM,88345,8.625,,,, +US-NM-88346,US,NM,88346,7.625,,,, +US-NM-88347,US,NM,88347,5.9375,,,, +US-NM-88348,US,NM,88348,5.6875,,,, +US-NM-88349,US,NM,88349,5.9375,,,, +US-NM-88350,US,NM,88350,7.375,,,, +US-NM-88351,US,NM,88351,5.6875,,,, +US-NM-88352,US,NM,88352,7.375,,,, +US-NM-88353,US,NM,88353,7.5,,,, +US-NM-88354,US,NM,88354,5.9375,,,, +US-NM-88355,US,NM,88355,8.625,,,, +US-NM-88401,US,NM,88401,8.125,,,, +US-NM-88410,US,NM,88410,6.0625,,,, +US-NM-88411,US,NM,88411,6.4375,,,, +US-NM-88414,US,NM,88414,6.0625,,,, +US-NM-88415,US,NM,88415,7.875,,,, +US-NM-88416,US,NM,88416,8.125,,,, +US-NM-88417,US,NM,88417,6.4375,,,, +US-NM-88418,US,NM,88418,7.5,,,, +US-NM-88419,US,NM,88419,6.0625,,,, +US-NM-88421,US,NM,88421,6.5,,,, +US-NM-88422,US,NM,88422,6.0625,,,, +US-NM-88424,US,NM,88424,6.0625,,,, +US-NM-88426,US,NM,88426,8.125,,,, +US-NM-88427,US,NM,88427,6.4375,,,, +US-NM-88430,US,NM,88430,6.4375,,,, +US-NM-88431,US,NM,88431,6.4375,,,, +US-NM-88434,US,NM,88434,6.4375,,,, +US-NM-88435,US,NM,88435,8,,,, +US-NM-88436,US,NM,88436,6.0625,,,, +US-NM-88439,US,NM,88439,6.5,,,, +US-NV-88901,US,NV,88901,8.1,,,, +US-NV-88905,US,NV,88905,8.1,,,, +US-NV-89001,US,NV,89001,7.1,,,, +US-NV-89002,US,NV,89002,8.1,,,, +US-NV-89003,US,NV,89003,7.1,,,, +US-NV-89004,US,NV,89004,8.1,,,, +US-NV-89005,US,NV,89005,8.1,,,, +US-NV-89006,US,NV,89006,8.1,,,, +US-NV-89007,US,NV,89007,8.1,,,, +US-NV-89008,US,NV,89008,7.1,,,, +US-NV-89009,US,NV,89009,8.1,,,, +US-NV-89010,US,NV,89010,6.85,,,, +US-NV-89011,US,NV,89011,8.1,,,, +US-NV-89012,US,NV,89012,8.1,,,, +US-NV-89013,US,NV,89013,6.85,,,, +US-NV-89014,US,NV,89014,8.1,,,, +US-NV-89015,US,NV,89015,8.1,,,, +US-NV-89016,US,NV,89016,8.1,,,, +US-NV-89017,US,NV,89017,7.1,,,, +US-NV-89018,US,NV,89018,8.1,,,, +US-NV-89019,US,NV,89019,8.1,,,, +US-NV-89020,US,NV,89020,7.1,,,, +US-NV-89021,US,NV,89021,8.1,,,, +US-NV-89022,US,NV,89022,7.1,,,, +US-NV-89023,US,NV,89023,7.1,,,, +US-NV-89024,US,NV,89024,8.1,,,, +US-NV-89025,US,NV,89025,8.1,,,, +US-NV-89026,US,NV,89026,8.1,,,, +US-NV-89027,US,NV,89027,8.1,,,, +US-NV-89028,US,NV,89028,8.1,,,, +US-NV-89029,US,NV,89029,8.1,,,, +US-NV-89030,US,NV,89030,8.1,,,, +US-NV-89031,US,NV,89031,8.1,,,, +US-NV-89032,US,NV,89032,8.1,,,, +US-NV-89033,US,NV,89033,8.1,,,, +US-NV-89034,US,NV,89034,8.1,,,, +US-NV-89036,US,NV,89036,8.1,,,, +US-NV-89037,US,NV,89037,8.1,,,, +US-NV-89039,US,NV,89039,8.1,,,, +US-NV-89040,US,NV,89040,8.1,,,, +US-NV-89041,US,NV,89041,7.1,,,, +US-NV-89042,US,NV,89042,7.1,,,, +US-NV-89043,US,NV,89043,7.1,,,, +US-NV-89044,US,NV,89044,8.1,,,, +US-NV-89045,US,NV,89045,7.1,,,, +US-NV-89046,US,NV,89046,8.1,,,, +US-NV-89047,US,NV,89047,6.85,,,, +US-NV-89048,US,NV,89048,7.1,,,, +US-NV-89049,US,NV,89049,7.1,,,, +US-NV-89052,US,NV,89052,8.1,,,, +US-NV-89053,US,NV,89053,8.1,,,, +US-NV-89054,US,NV,89054,8.1,,,, +US-NV-89060,US,NV,89060,7.1,,,, +US-NV-89061,US,NV,89061,7.1,,,, +US-NV-89067,US,NV,89067,8.1,,,, +US-NV-89070,US,NV,89070,8.1,,,, +US-NV-89074,US,NV,89074,8.1,,,, +US-NV-89077,US,NV,89077,8.1,,,, +US-NV-89081,US,NV,89081,8.1,,,, +US-NV-89084,US,NV,89084,8.1,,,, +US-NV-89085,US,NV,89085,8.1,,,, +US-NV-89086,US,NV,89086,8.1,,,, +US-NV-89087,US,NV,89087,8.1,,,, +US-NV-89101,US,NV,89101,8.1,,,, +US-NV-89102,US,NV,89102,8.1,,,, +US-NV-89103,US,NV,89103,8.1,,,, +US-NV-89104,US,NV,89104,8.1,,,, +US-NV-89105,US,NV,89105,8.1,,,, +US-NV-89106,US,NV,89106,8.1,,,, +US-NV-89107,US,NV,89107,8.1,,,, +US-NV-89108,US,NV,89108,8.1,,,, +US-NV-89109,US,NV,89109,8.1,,,, +US-NV-89110,US,NV,89110,8.1,,,, +US-NV-89111,US,NV,89111,8.1,,,, +US-NV-89112,US,NV,89112,8.1,,,, +US-NV-89113,US,NV,89113,8.1,,,, +US-NV-89114,US,NV,89114,8.1,,,, +US-NV-89115,US,NV,89115,8.1,,,, +US-NV-89116,US,NV,89116,8.1,,,, +US-NV-89117,US,NV,89117,8.1,,,, +US-NV-89118,US,NV,89118,8.1,,,, +US-NV-89119,US,NV,89119,8.1,,,, +US-NV-89120,US,NV,89120,8.1,,,, +US-NV-89121,US,NV,89121,8.1,,,, +US-NV-89122,US,NV,89122,8.1,,,, +US-NV-89123,US,NV,89123,8.1,,,, +US-NV-89124,US,NV,89124,8.1,,,, +US-NV-89125,US,NV,89125,8.1,,,, +US-NV-89126,US,NV,89126,8.1,,,, +US-NV-89127,US,NV,89127,8.1,,,, +US-NV-89128,US,NV,89128,8.1,,,, +US-NV-89129,US,NV,89129,8.1,,,, +US-NV-89130,US,NV,89130,8.1,,,, +US-NV-89131,US,NV,89131,8.1,,,, +US-NV-89132,US,NV,89132,8.1,,,, +US-NV-89133,US,NV,89133,8.1,,,, +US-NV-89134,US,NV,89134,8.1,,,, +US-NV-89135,US,NV,89135,8.1,,,, +US-NV-89136,US,NV,89136,8.1,,,, +US-NV-89137,US,NV,89137,8.1,,,, +US-NV-89138,US,NV,89138,8.1,,,, +US-NV-89139,US,NV,89139,8.1,,,, +US-NV-89140,US,NV,89140,8.1,,,, +US-NV-89141,US,NV,89141,8.1,,,, +US-NV-89142,US,NV,89142,8.1,,,, +US-NV-89143,US,NV,89143,8.1,,,, +US-NV-89144,US,NV,89144,8.1,,,, +US-NV-89145,US,NV,89145,8.1,,,, +US-NV-89146,US,NV,89146,8.1,,,, +US-NV-89147,US,NV,89147,8.1,,,, +US-NV-89148,US,NV,89148,8.1,,,, +US-NV-89149,US,NV,89149,8.1,,,, +US-NV-89150,US,NV,89150,8.1,,,, +US-NV-89151,US,NV,89151,8.1,,,, +US-NV-89152,US,NV,89152,8.1,,,, +US-NV-89153,US,NV,89153,8.1,,,, +US-NV-89154,US,NV,89154,8.1,,,, +US-NV-89155,US,NV,89155,8.1,,,, +US-NV-89156,US,NV,89156,8.1,,,, +US-NV-89157,US,NV,89157,8.1,,,, +US-NV-89158,US,NV,89158,8.1,,,, +US-NV-89159,US,NV,89159,8.1,,,, +US-NV-89160,US,NV,89160,8.1,,,, +US-NV-89161,US,NV,89161,8.1,,,, +US-NV-89162,US,NV,89162,8.1,,,, +US-NV-89163,US,NV,89163,8.1,,,, +US-NV-89164,US,NV,89164,8.1,,,, +US-NV-89165,US,NV,89165,8.1,,,, +US-NV-89166,US,NV,89166,8.1,,,, +US-NV-89169,US,NV,89169,8.1,,,, +US-NV-89170,US,NV,89170,8.1,,,, +US-NV-89173,US,NV,89173,8.1,,,, +US-NV-89177,US,NV,89177,8.1,,,, +US-NV-89178,US,NV,89178,8.1,,,, +US-NV-89179,US,NV,89179,8.1,,,, +US-NV-89180,US,NV,89180,8.1,,,, +US-NV-89183,US,NV,89183,8.1,,,, +US-NV-89185,US,NV,89185,8.1,,,, +US-NV-89191,US,NV,89191,8.1,,,, +US-NV-89193,US,NV,89193,8.1,,,, +US-NV-89195,US,NV,89195,8.1,,,, +US-NV-89199,US,NV,89199,8.1,,,, +US-NV-89301,US,NV,89301,7.725,,,, +US-NV-89310,US,NV,89310,7.1,,,, +US-NV-89311,US,NV,89311,7.725,,,, +US-NV-89314,US,NV,89314,7.1,,,, +US-NV-89315,US,NV,89315,7.725,,,, +US-NV-89316,US,NV,89316,6.85,,,, +US-NV-89317,US,NV,89317,7.725,,,, +US-NV-89318,US,NV,89318,7.725,,,, +US-NV-89319,US,NV,89319,7.725,,,, +US-NV-89402,US,NV,89402,7.725,,,, +US-NV-89403,US,NV,89403,7.1,,,, +US-NV-89404,US,NV,89404,6.85,,,, +US-NV-89405,US,NV,89405,7.725,,,, +US-NV-89406,US,NV,89406,7.6,,,, +US-NV-89407,US,NV,89407,7.6,,,, +US-NV-89408,US,NV,89408,7.1,,,, +US-NV-89409,US,NV,89409,7.1,,,, +US-NV-89410,US,NV,89410,7.1,,,, +US-NV-89411,US,NV,89411,7.1,,,, +US-NV-89412,US,NV,89412,7.725,,,, +US-NV-89413,US,NV,89413,7.1,,,, +US-NV-89414,US,NV,89414,6.85,,,, +US-NV-89415,US,NV,89415,6.85,,,, +US-NV-89418,US,NV,89418,7.1,,,, +US-NV-89419,US,NV,89419,7.1,,,, +US-NV-89420,US,NV,89420,6.85,,,, +US-NV-89421,US,NV,89421,6.85,,,, +US-NV-89422,US,NV,89422,6.85,,,, +US-NV-89423,US,NV,89423,7.1,,,, +US-NV-89424,US,NV,89424,7.725,,,, +US-NV-89425,US,NV,89425,6.85,,,, +US-NV-89426,US,NV,89426,6.85,,,, +US-NV-89427,US,NV,89427,6.85,,,, +US-NV-89428,US,NV,89428,7.1,,,, +US-NV-89429,US,NV,89429,7.1,,,, +US-NV-89430,US,NV,89430,7.1,,,, +US-NV-89431,US,NV,89431,7.725,,,, +US-NV-89432,US,NV,89432,7.725,,,, +US-NV-89433,US,NV,89433,7.725,,,, +US-NV-89434,US,NV,89434,7.725,,,, +US-NV-89435,US,NV,89435,7.725,,,, +US-NV-89436,US,NV,89436,7.725,,,, +US-NV-89438,US,NV,89438,6.85,,,, +US-NV-89439,US,NV,89439,7.725,,,, +US-NV-89440,US,NV,89440,7.6,,,, +US-NV-89441,US,NV,89441,7.725,,,, +US-NV-89442,US,NV,89442,7.725,,,, +US-NV-89444,US,NV,89444,7.1,,,, +US-NV-89445,US,NV,89445,6.85,,,, +US-NV-89446,US,NV,89446,6.85,,,, +US-NV-89447,US,NV,89447,7.1,,,, +US-NV-89448,US,NV,89448,7.1,,,, +US-NV-89449,US,NV,89449,7.1,,,, +US-NV-89450,US,NV,89450,7.725,,,, +US-NV-89451,US,NV,89451,7.725,,,, +US-NV-89452,US,NV,89452,7.725,,,, +US-NV-89460,US,NV,89460,7.1,,,, +US-NV-89496,US,NV,89496,7.6,,,, +US-NV-89501,US,NV,89501,7.725,,,, +US-NV-89502,US,NV,89502,7.725,,,, +US-NV-89503,US,NV,89503,7.725,,,, +US-NV-89504,US,NV,89504,7.725,,,, +US-NV-89505,US,NV,89505,7.725,,,, +US-NV-89506,US,NV,89506,7.725,,,, +US-NV-89507,US,NV,89507,7.725,,,, +US-NV-89508,US,NV,89508,7.725,,,, +US-NV-89509,US,NV,89509,7.725,,,, +US-NV-89510,US,NV,89510,7.725,,,, +US-NV-89511,US,NV,89511,7.725,,,, +US-NV-89512,US,NV,89512,7.725,,,, +US-NV-89513,US,NV,89513,7.725,,,, +US-NV-89515,US,NV,89515,7.725,,,, +US-NV-89519,US,NV,89519,7.725,,,, +US-NV-89520,US,NV,89520,7.725,,,, +US-NV-89521,US,NV,89521,7.725,,,, +US-NV-89523,US,NV,89523,7.725,,,, +US-NV-89533,US,NV,89533,7.725,,,, +US-NV-89555,US,NV,89555,7.725,,,, +US-NV-89557,US,NV,89557,7.725,,,, +US-NV-89570,US,NV,89570,7.725,,,, +US-NV-89595,US,NV,89595,7.725,,,, +US-NV-89599,US,NV,89599,7.725,,,, +US-NV-89701,US,NV,89701,7.475,,,, +US-NV-89702,US,NV,89702,7.475,,,, +US-NV-89703,US,NV,89703,7.475,,,, +US-NV-89704,US,NV,89704,7.725,,,, +US-NV-89705,US,NV,89705,7.1,,,, +US-NV-89706,US,NV,89706,7.475,,,, +US-NV-89711,US,NV,89711,7.475,,,, +US-NV-89712,US,NV,89712,7.475,,,, +US-NV-89713,US,NV,89713,7.475,,,, +US-NV-89714,US,NV,89714,7.475,,,, +US-NV-89721,US,NV,89721,7.475,,,, +US-NV-89801,US,NV,89801,6.85,,,, +US-NV-89802,US,NV,89802,6.85,,,, +US-NV-89803,US,NV,89803,6.85,,,, +US-NV-89815,US,NV,89815,6.85,,,, +US-NV-89820,US,NV,89820,7.1,,,, +US-NV-89821,US,NV,89821,6.85,,,, +US-NV-89822,US,NV,89822,6.85,,,, +US-NV-89823,US,NV,89823,6.85,,,, +US-NV-89825,US,NV,89825,6.85,,,, +US-NV-89826,US,NV,89826,6.85,,,, +US-NV-89828,US,NV,89828,6.85,,,, +US-NV-89830,US,NV,89830,6.85,,,, +US-NV-89831,US,NV,89831,6.85,,,, +US-NV-89832,US,NV,89832,6.85,,,, +US-NV-89834,US,NV,89834,6.85,,,, +US-NV-89835,US,NV,89835,6.85,,,, +US-NV-89883,US,NV,89883,6.85,,,, +US-NY-00501,US,NY,00501,8.625,,,, +US-NY-00544,US,NY,00544,8.625,,,, +US-NY-06390,US,NY,06390,8.625,,,, +US-NY-10001,US,NY,10001,8.875,,,, +US-NY-10002,US,NY,10002,8.875,,,, +US-NY-10003,US,NY,10003,8.875,,,, +US-NY-10004,US,NY,10004,8.875,,,, +US-NY-10005,US,NY,10005,8.875,,,, +US-NY-10006,US,NY,10006,8.875,,,, +US-NY-10007,US,NY,10007,8.875,,,, +US-NY-10008,US,NY,10008,8.875,,,, +US-NY-10009,US,NY,10009,8.875,,,, +US-NY-10010,US,NY,10010,8.875,,,, +US-NY-10011,US,NY,10011,8.875,,,, +US-NY-10012,US,NY,10012,8.875,,,, +US-NY-10013,US,NY,10013,8.875,,,, +US-NY-10014,US,NY,10014,8.875,,,, +US-NY-10016,US,NY,10016,8.875,,,, +US-NY-10017,US,NY,10017,8.875,,,, +US-NY-10018,US,NY,10018,8.875,,,, +US-NY-10019,US,NY,10019,8.875,,,, +US-NY-10020,US,NY,10020,8.875,,,, +US-NY-10021,US,NY,10021,8.875,,,, +US-NY-10022,US,NY,10022,8.875,,,, +US-NY-10023,US,NY,10023,8.875,,,, +US-NY-10024,US,NY,10024,8.875,,,, +US-NY-10025,US,NY,10025,8.875,,,, +US-NY-10026,US,NY,10026,8.875,,,, +US-NY-10027,US,NY,10027,8.875,,,, +US-NY-10028,US,NY,10028,8.875,,,, +US-NY-10029,US,NY,10029,8.875,,,, +US-NY-10030,US,NY,10030,8.875,,,, +US-NY-10031,US,NY,10031,8.875,,,, +US-NY-10032,US,NY,10032,8.875,,,, +US-NY-10033,US,NY,10033,8.875,,,, +US-NY-10034,US,NY,10034,8.875,,,, +US-NY-10035,US,NY,10035,8.875,,,, +US-NY-10036,US,NY,10036,8.875,,,, +US-NY-10037,US,NY,10037,8.875,,,, +US-NY-10038,US,NY,10038,8.875,,,, +US-NY-10039,US,NY,10039,8.875,,,, +US-NY-10040,US,NY,10040,8.875,,,, +US-NY-10041,US,NY,10041,8.875,,,, +US-NY-10043,US,NY,10043,8.875,,,, +US-NY-10044,US,NY,10044,8.875,,,, +US-NY-10045,US,NY,10045,8.875,,,, +US-NY-10055,US,NY,10055,8.875,,,, +US-NY-10060,US,NY,10060,8.875,,,, +US-NY-10065,US,NY,10065,8.875,,,, +US-NY-10069,US,NY,10069,8.875,,,, +US-NY-10075,US,NY,10075,8.875,,,, +US-NY-10080,US,NY,10080,8.875,,,, +US-NY-10081,US,NY,10081,8.875,,,, +US-NY-10087,US,NY,10087,8.875,,,, +US-NY-10090,US,NY,10090,8.875,,,, +US-NY-10095,US,NY,10095,8.875,,,, +US-NY-10101,US,NY,10101,8.875,,,, +US-NY-10102,US,NY,10102,8.875,,,, +US-NY-10103,US,NY,10103,8.875,,,, +US-NY-10104,US,NY,10104,8.875,,,, +US-NY-10105,US,NY,10105,8.875,,,, +US-NY-10106,US,NY,10106,8.875,,,, +US-NY-10107,US,NY,10107,8.875,,,, +US-NY-10108,US,NY,10108,8.875,,,, +US-NY-10109,US,NY,10109,8.875,,,, +US-NY-10110,US,NY,10110,8.875,,,, +US-NY-10111,US,NY,10111,8.875,,,, +US-NY-10112,US,NY,10112,8.875,,,, +US-NY-10113,US,NY,10113,8.875,,,, +US-NY-10114,US,NY,10114,8.875,,,, +US-NY-10115,US,NY,10115,8.875,,,, +US-NY-10116,US,NY,10116,8.875,,,, +US-NY-10117,US,NY,10117,8.875,,,, +US-NY-10118,US,NY,10118,8.875,,,, +US-NY-10119,US,NY,10119,8.875,,,, +US-NY-10120,US,NY,10120,8.875,,,, +US-NY-10121,US,NY,10121,8.875,,,, +US-NY-10122,US,NY,10122,8.875,,,, +US-NY-10123,US,NY,10123,8.875,,,, +US-NY-10124,US,NY,10124,8.875,,,, +US-NY-10125,US,NY,10125,8.875,,,, +US-NY-10126,US,NY,10126,8.875,,,, +US-NY-10128,US,NY,10128,8.875,,,, +US-NY-10129,US,NY,10129,8.875,,,, +US-NY-10130,US,NY,10130,8.875,,,, +US-NY-10131,US,NY,10131,8.875,,,, +US-NY-10132,US,NY,10132,8.875,,,, +US-NY-10133,US,NY,10133,8.875,,,, +US-NY-10138,US,NY,10138,8.875,,,, +US-NY-10150,US,NY,10150,8.875,,,, +US-NY-10151,US,NY,10151,8.875,,,, +US-NY-10152,US,NY,10152,8.875,,,, +US-NY-10153,US,NY,10153,8.875,,,, +US-NY-10154,US,NY,10154,8.875,,,, +US-NY-10155,US,NY,10155,8.875,,,, +US-NY-10156,US,NY,10156,8.875,,,, +US-NY-10157,US,NY,10157,8.875,,,, +US-NY-10158,US,NY,10158,8.875,,,, +US-NY-10159,US,NY,10159,8.875,,,, +US-NY-10160,US,NY,10160,8.875,,,, +US-NY-10161,US,NY,10161,8.875,,,, +US-NY-10162,US,NY,10162,8.875,,,, +US-NY-10163,US,NY,10163,8.875,,,, +US-NY-10164,US,NY,10164,8.875,,,, +US-NY-10165,US,NY,10165,8.875,,,, +US-NY-10166,US,NY,10166,8.875,,,, +US-NY-10167,US,NY,10167,8.875,,,, +US-NY-10168,US,NY,10168,8.875,,,, +US-NY-10169,US,NY,10169,8.875,,,, +US-NY-10170,US,NY,10170,8.875,,,, +US-NY-10171,US,NY,10171,8.875,,,, +US-NY-10172,US,NY,10172,8.875,,,, +US-NY-10173,US,NY,10173,8.875,,,, +US-NY-10174,US,NY,10174,8.875,,,, +US-NY-10175,US,NY,10175,8.875,,,, +US-NY-10176,US,NY,10176,8.875,,,, +US-NY-10177,US,NY,10177,8.875,,,, +US-NY-10178,US,NY,10178,8.875,,,, +US-NY-10179,US,NY,10179,8.875,,,, +US-NY-10185,US,NY,10185,8.875,,,, +US-NY-10199,US,NY,10199,8.875,,,, +US-NY-10203,US,NY,10203,8.875,,,, +US-NY-10211,US,NY,10211,8.875,,,, +US-NY-10212,US,NY,10212,8.875,,,, +US-NY-10213,US,NY,10213,8.875,,,, +US-NY-10242,US,NY,10242,8.875,,,, +US-NY-10249,US,NY,10249,8.875,,,, +US-NY-10256,US,NY,10256,8.875,,,, +US-NY-10257,US,NY,10257,8.875,,,, +US-NY-10258,US,NY,10258,8.875,,,, +US-NY-10259,US,NY,10259,8.875,,,, +US-NY-10260,US,NY,10260,8.875,,,, +US-NY-10261,US,NY,10261,8.875,,,, +US-NY-10265,US,NY,10265,8.875,,,, +US-NY-10268,US,NY,10268,8.875,,,, +US-NY-10269,US,NY,10269,8.875,,,, +US-NY-10270,US,NY,10270,8.875,,,, +US-NY-10271,US,NY,10271,8.875,,,, +US-NY-10272,US,NY,10272,8.875,,,, +US-NY-10273,US,NY,10273,8.875,,,, +US-NY-10274,US,NY,10274,8.875,,,, +US-NY-10275,US,NY,10275,8.875,,,, +US-NY-10276,US,NY,10276,8.875,,,, +US-NY-10277,US,NY,10277,8.875,,,, +US-NY-10278,US,NY,10278,8.875,,,, +US-NY-10279,US,NY,10279,8.875,,,, +US-NY-10280,US,NY,10280,8.875,,,, +US-NY-10281,US,NY,10281,8.875,,,, +US-NY-10282,US,NY,10282,8.875,,,, +US-NY-10285,US,NY,10285,8.875,,,, +US-NY-10286,US,NY,10286,8.875,,,, +US-NY-10292,US,NY,10292,8.875,,,, +US-NY-10301,US,NY,10301,8.875,,,, +US-NY-10302,US,NY,10302,8.875,,,, +US-NY-10303,US,NY,10303,8.875,,,, +US-NY-10304,US,NY,10304,8.875,,,, +US-NY-10305,US,NY,10305,8.875,,,, +US-NY-10306,US,NY,10306,8.875,,,, +US-NY-10307,US,NY,10307,8.875,,,, +US-NY-10308,US,NY,10308,8.875,,,, +US-NY-10309,US,NY,10309,8.875,,,, +US-NY-10310,US,NY,10310,8.875,,,, +US-NY-10311,US,NY,10311,8.875,,,, +US-NY-10312,US,NY,10312,8.875,,,, +US-NY-10313,US,NY,10313,8.875,,,, +US-NY-10314,US,NY,10314,8.875,,,, +US-NY-10451,US,NY,10451,8.875,,,, +US-NY-10452,US,NY,10452,8.875,,,, +US-NY-10453,US,NY,10453,8.875,,,, +US-NY-10454,US,NY,10454,8.875,,,, +US-NY-10455,US,NY,10455,8.875,,,, +US-NY-10456,US,NY,10456,8.875,,,, +US-NY-10457,US,NY,10457,8.875,,,, +US-NY-10458,US,NY,10458,8.875,,,, +US-NY-10459,US,NY,10459,8.875,,,, +US-NY-10460,US,NY,10460,8.875,,,, +US-NY-10461,US,NY,10461,8.875,,,, +US-NY-10462,US,NY,10462,8.875,,,, +US-NY-10463,US,NY,10463,8.875,,,, +US-NY-10464,US,NY,10464,8.875,,,, +US-NY-10465,US,NY,10465,8.875,,,, +US-NY-10466,US,NY,10466,8.875,,,, +US-NY-10467,US,NY,10467,8.875,,,, +US-NY-10468,US,NY,10468,8.875,,,, +US-NY-10469,US,NY,10469,8.875,,,, +US-NY-10470,US,NY,10470,8.875,,,, +US-NY-10471,US,NY,10471,8.875,,,, +US-NY-10472,US,NY,10472,8.875,,,, +US-NY-10473,US,NY,10473,8.875,,,, +US-NY-10474,US,NY,10474,8.875,,,, +US-NY-10475,US,NY,10475,8.875,,,, +US-NY-10499,US,NY,10499,8.875,,,, +US-NY-10501,US,NY,10501,7.375,,,, +US-NY-10502,US,NY,10502,7.375,,,, +US-NY-10503,US,NY,10503,7.375,,,, +US-NY-10504,US,NY,10504,7.375,,,, +US-NY-10505,US,NY,10505,7.375,,,, +US-NY-10506,US,NY,10506,7.375,,,, +US-NY-10507,US,NY,10507,7.375,,,, +US-NY-10509,US,NY,10509,8.375,,,, +US-NY-10510,US,NY,10510,7.375,,,, +US-NY-10511,US,NY,10511,7.375,,,, +US-NY-10512,US,NY,10512,8.375,,,, +US-NY-10514,US,NY,10514,7.375,,,, +US-NY-10516,US,NY,10516,8.375,,,, +US-NY-10517,US,NY,10517,7.375,,,, +US-NY-10518,US,NY,10518,7.375,,,, +US-NY-10519,US,NY,10519,7.375,,,, +US-NY-10520,US,NY,10520,7.375,,,, +US-NY-10521,US,NY,10521,7.375,,,, +US-NY-10522,US,NY,10522,7.375,,,, +US-NY-10523,US,NY,10523,7.375,,,, +US-NY-10524,US,NY,10524,8.375,,,, +US-NY-10526,US,NY,10526,7.375,,,, +US-NY-10527,US,NY,10527,7.375,,,, +US-NY-10528,US,NY,10528,7.375,,,, +US-NY-10530,US,NY,10530,7.375,,,, +US-NY-10532,US,NY,10532,7.375,,,, +US-NY-10533,US,NY,10533,7.375,,,, +US-NY-10535,US,NY,10535,7.375,,,, +US-NY-10536,US,NY,10536,7.375,,,, +US-NY-10537,US,NY,10537,8.375,,,, +US-NY-10538,US,NY,10538,7.375,,,, +US-NY-10540,US,NY,10540,7.375,,,, +US-NY-10541,US,NY,10541,8.375,,,, +US-NY-10542,US,NY,10542,8.375,,,, +US-NY-10543,US,NY,10543,7.375,,,, +US-NY-10545,US,NY,10545,7.375,,,, +US-NY-10546,US,NY,10546,7.375,,,, +US-NY-10547,US,NY,10547,7.375,,,, +US-NY-10548,US,NY,10548,7.375,,,, +US-NY-10549,US,NY,10549,7.375,,,, +US-NY-10550,US,NY,10550,8.375,,,, +US-NY-10551,US,NY,10551,8.375,,,, +US-NY-10552,US,NY,10552,8.375,,,, +US-NY-10553,US,NY,10553,8.375,,,, +US-NY-10560,US,NY,10560,7.375,,,, +US-NY-10562,US,NY,10562,7.375,,,, +US-NY-10566,US,NY,10566,7.375,,,, +US-NY-10567,US,NY,10567,7.375,,,, +US-NY-10570,US,NY,10570,7.375,,,, +US-NY-10573,US,NY,10573,7.375,,,, +US-NY-10576,US,NY,10576,7.375,,,, +US-NY-10577,US,NY,10577,7.375,,,, +US-NY-10578,US,NY,10578,7.375,,,, +US-NY-10579,US,NY,10579,8.375,,,, +US-NY-10580,US,NY,10580,7.375,,,, +US-NY-10583,US,NY,10583,7.375,,,, +US-NY-10587,US,NY,10587,7.375,,,, +US-NY-10588,US,NY,10588,7.375,,,, +US-NY-10589,US,NY,10589,7.375,,,, +US-NY-10590,US,NY,10590,7.375,,,, +US-NY-10591,US,NY,10591,7.375,,,, +US-NY-10594,US,NY,10594,7.375,,,, +US-NY-10595,US,NY,10595,7.375,,,, +US-NY-10596,US,NY,10596,7.375,,,, +US-NY-10597,US,NY,10597,7.375,,,, +US-NY-10598,US,NY,10598,7.375,,,, +US-NY-10601,US,NY,10601,8.375,,,, +US-NY-10602,US,NY,10602,8.375,,,, +US-NY-10603,US,NY,10603,7.375,,,, +US-NY-10604,US,NY,10604,7.375,,,, +US-NY-10605,US,NY,10605,8.375,,,, +US-NY-10606,US,NY,10606,8.375,,,, +US-NY-10607,US,NY,10607,7.375,,,, +US-NY-10610,US,NY,10610,8.375,,,, +US-NY-10701,US,NY,10701,8.375,,,, +US-NY-10702,US,NY,10702,8.375,,,, +US-NY-10703,US,NY,10703,8.375,,,, +US-NY-10704,US,NY,10704,8.375,,,, +US-NY-10705,US,NY,10705,8.375,,,, +US-NY-10706,US,NY,10706,7.375,,,, +US-NY-10707,US,NY,10707,7.375,,,, +US-NY-10708,US,NY,10708,8.375,,,, +US-NY-10709,US,NY,10709,7.375,,,, +US-NY-10710,US,NY,10710,8.375,,,, +US-NY-10801,US,NY,10801,8.375,,,, +US-NY-10802,US,NY,10802,8.375,,,, +US-NY-10803,US,NY,10803,7.375,,,, +US-NY-10804,US,NY,10804,8.375,,,, +US-NY-10805,US,NY,10805,8.375,,,, +US-NY-10901,US,NY,10901,8.375,,,, +US-NY-10910,US,NY,10910,8.125,,,, +US-NY-10911,US,NY,10911,8.125,,,, +US-NY-10912,US,NY,10912,8.125,,,, +US-NY-10913,US,NY,10913,8.375,,,, +US-NY-10914,US,NY,10914,8.125,,,, +US-NY-10915,US,NY,10915,8.125,,,, +US-NY-10916,US,NY,10916,8.125,,,, +US-NY-10917,US,NY,10917,8.125,,,, +US-NY-10918,US,NY,10918,8.125,,,, +US-NY-10919,US,NY,10919,8.125,,,, +US-NY-10920,US,NY,10920,8.375,,,, +US-NY-10921,US,NY,10921,8.125,,,, +US-NY-10922,US,NY,10922,8.125,,,, +US-NY-10923,US,NY,10923,8.375,,,, +US-NY-10924,US,NY,10924,8.125,,,, +US-NY-10925,US,NY,10925,8.125,,,, +US-NY-10926,US,NY,10926,8.125,,,, +US-NY-10927,US,NY,10927,8.375,,,, +US-NY-10928,US,NY,10928,8.125,,,, +US-NY-10930,US,NY,10930,8.125,,,, +US-NY-10931,US,NY,10931,8.375,,,, +US-NY-10932,US,NY,10932,8.125,,,, +US-NY-10933,US,NY,10933,8.125,,,, +US-NY-10940,US,NY,10940,8.125,,,, +US-NY-10941,US,NY,10941,8.125,,,, +US-NY-10949,US,NY,10949,8.125,,,, +US-NY-10950,US,NY,10950,8.125,,,, +US-NY-10952,US,NY,10952,8.375,,,, +US-NY-10953,US,NY,10953,8.125,,,, +US-NY-10954,US,NY,10954,8.375,,,, +US-NY-10956,US,NY,10956,8.375,,,, +US-NY-10958,US,NY,10958,8.125,,,, +US-NY-10959,US,NY,10959,8.125,,,, +US-NY-10960,US,NY,10960,8.375,,,, +US-NY-10962,US,NY,10962,8.375,,,, +US-NY-10963,US,NY,10963,8.125,,,, +US-NY-10964,US,NY,10964,8.375,,,, +US-NY-10965,US,NY,10965,8.375,,,, +US-NY-10968,US,NY,10968,8.375,,,, +US-NY-10969,US,NY,10969,8.125,,,, +US-NY-10970,US,NY,10970,8.375,,,, +US-NY-10973,US,NY,10973,8.125,,,, +US-NY-10974,US,NY,10974,8.375,,,, +US-NY-10975,US,NY,10975,8.125,,,, +US-NY-10976,US,NY,10976,8.375,,,, +US-NY-10977,US,NY,10977,8.375,,,, +US-NY-10979,US,NY,10979,8.125,,,, +US-NY-10980,US,NY,10980,8.375,,,, +US-NY-10981,US,NY,10981,8.125,,,, +US-NY-10982,US,NY,10982,8.375,,,, +US-NY-10983,US,NY,10983,8.375,,,, +US-NY-10984,US,NY,10984,8.375,,,, +US-NY-10985,US,NY,10985,8.125,,,, +US-NY-10986,US,NY,10986,8.375,,,, +US-NY-10987,US,NY,10987,8.125,,,, +US-NY-10988,US,NY,10988,8.125,,,, +US-NY-10989,US,NY,10989,8.375,,,, +US-NY-10990,US,NY,10990,8.125,,,, +US-NY-10992,US,NY,10992,8.125,,,, +US-NY-10993,US,NY,10993,8.375,,,, +US-NY-10994,US,NY,10994,8.375,,,, +US-NY-10996,US,NY,10996,8.125,,,, +US-NY-10997,US,NY,10997,8.125,,,, +US-NY-10998,US,NY,10998,8.125,,,, +US-NY-11001,US,NY,11001,8.625,,,, +US-NY-11002,US,NY,11002,8.625,,,, +US-NY-11003,US,NY,11003,8.625,,,, +US-NY-11004,US,NY,11004,8.875,,,, +US-NY-11005,US,NY,11005,8.875,,,, +US-NY-11010,US,NY,11010,8.625,,,, +US-NY-11020,US,NY,11020,8.625,,,, +US-NY-11021,US,NY,11021,8.625,,,, +US-NY-11022,US,NY,11022,8.625,,,, +US-NY-11023,US,NY,11023,8.625,,,, +US-NY-11024,US,NY,11024,8.625,,,, +US-NY-11026,US,NY,11026,8.625,,,, +US-NY-11027,US,NY,11027,8.625,,,, +US-NY-11030,US,NY,11030,8.625,,,, +US-NY-11040,US,NY,11040,8.625,,,, +US-NY-11042,US,NY,11042,8.625,,,, +US-NY-11050,US,NY,11050,8.625,,,, +US-NY-11051,US,NY,11051,8.625,,,, +US-NY-11052,US,NY,11052,8.625,,,, +US-NY-11053,US,NY,11053,8.625,,,, +US-NY-11054,US,NY,11054,8.625,,,, +US-NY-11055,US,NY,11055,8.625,,,, +US-NY-11096,US,NY,11096,8.625,,,, +US-NY-11101,US,NY,11101,8.875,,,, +US-NY-11102,US,NY,11102,8.875,,,, +US-NY-11103,US,NY,11103,8.875,,,, +US-NY-11104,US,NY,11104,8.875,,,, +US-NY-11105,US,NY,11105,8.875,,,, +US-NY-11106,US,NY,11106,8.875,,,, +US-NY-11109,US,NY,11109,8.875,,,, +US-NY-11120,US,NY,11120,8.875,,,, +US-NY-11201,US,NY,11201,8.875,,,, +US-NY-11202,US,NY,11202,8.875,,,, +US-NY-11203,US,NY,11203,8.875,,,, +US-NY-11204,US,NY,11204,8.875,,,, +US-NY-11205,US,NY,11205,8.875,,,, +US-NY-11206,US,NY,11206,8.875,,,, +US-NY-11207,US,NY,11207,8.875,,,, +US-NY-11208,US,NY,11208,8.875,,,, +US-NY-11209,US,NY,11209,8.875,,,, +US-NY-11210,US,NY,11210,8.875,,,, +US-NY-11211,US,NY,11211,8.875,,,, +US-NY-11212,US,NY,11212,8.875,,,, +US-NY-11213,US,NY,11213,8.875,,,, +US-NY-11214,US,NY,11214,8.875,,,, +US-NY-11215,US,NY,11215,8.875,,,, +US-NY-11216,US,NY,11216,8.875,,,, +US-NY-11217,US,NY,11217,8.875,,,, +US-NY-11218,US,NY,11218,8.875,,,, +US-NY-11219,US,NY,11219,8.875,,,, +US-NY-11220,US,NY,11220,8.875,,,, +US-NY-11221,US,NY,11221,8.875,,,, +US-NY-11222,US,NY,11222,8.875,,,, +US-NY-11223,US,NY,11223,8.875,,,, +US-NY-11224,US,NY,11224,8.875,,,, +US-NY-11225,US,NY,11225,8.875,,,, +US-NY-11226,US,NY,11226,8.875,,,, +US-NY-11228,US,NY,11228,8.875,,,, +US-NY-11229,US,NY,11229,8.875,,,, +US-NY-11230,US,NY,11230,8.875,,,, +US-NY-11231,US,NY,11231,8.875,,,, +US-NY-11232,US,NY,11232,8.875,,,, +US-NY-11233,US,NY,11233,8.875,,,, +US-NY-11234,US,NY,11234,8.875,,,, +US-NY-11235,US,NY,11235,8.875,,,, +US-NY-11236,US,NY,11236,8.875,,,, +US-NY-11237,US,NY,11237,8.875,,,, +US-NY-11238,US,NY,11238,8.875,,,, +US-NY-11239,US,NY,11239,8.875,,,, +US-NY-11241,US,NY,11241,8.875,,,, +US-NY-11242,US,NY,11242,8.875,,,, +US-NY-11243,US,NY,11243,8.875,,,, +US-NY-11245,US,NY,11245,8.875,,,, +US-NY-11247,US,NY,11247,8.875,,,, +US-NY-11249,US,NY,11249,8.875,,,, +US-NY-11252,US,NY,11252,8.875,,,, +US-NY-11256,US,NY,11256,8.875,,,, +US-NY-11351,US,NY,11351,8.875,,,, +US-NY-11352,US,NY,11352,8.875,,,, +US-NY-11354,US,NY,11354,8.875,,,, +US-NY-11355,US,NY,11355,8.875,,,, +US-NY-11356,US,NY,11356,8.875,,,, +US-NY-11357,US,NY,11357,8.875,,,, +US-NY-11358,US,NY,11358,8.875,,,, +US-NY-11359,US,NY,11359,8.875,,,, +US-NY-11360,US,NY,11360,8.875,,,, +US-NY-11361,US,NY,11361,8.875,,,, +US-NY-11362,US,NY,11362,8.875,,,, +US-NY-11363,US,NY,11363,8.875,,,, +US-NY-11364,US,NY,11364,8.875,,,, +US-NY-11365,US,NY,11365,8.875,,,, +US-NY-11366,US,NY,11366,8.875,,,, +US-NY-11367,US,NY,11367,8.875,,,, +US-NY-11368,US,NY,11368,8.875,,,, +US-NY-11369,US,NY,11369,8.875,,,, +US-NY-11370,US,NY,11370,8.875,,,, +US-NY-11371,US,NY,11371,8.875,,,, +US-NY-11372,US,NY,11372,8.875,,,, +US-NY-11373,US,NY,11373,8.875,,,, +US-NY-11374,US,NY,11374,8.875,,,, +US-NY-11375,US,NY,11375,8.875,,,, +US-NY-11377,US,NY,11377,8.875,,,, +US-NY-11378,US,NY,11378,8.875,,,, +US-NY-11379,US,NY,11379,8.875,,,, +US-NY-11380,US,NY,11380,8.875,,,, +US-NY-11381,US,NY,11381,8.875,,,, +US-NY-11385,US,NY,11385,8.875,,,, +US-NY-11386,US,NY,11386,8.875,,,, +US-NY-11405,US,NY,11405,8.875,,,, +US-NY-11411,US,NY,11411,8.875,,,, +US-NY-11412,US,NY,11412,8.875,,,, +US-NY-11413,US,NY,11413,8.875,,,, +US-NY-11414,US,NY,11414,8.875,,,, +US-NY-11415,US,NY,11415,8.875,,,, +US-NY-11416,US,NY,11416,8.875,,,, +US-NY-11417,US,NY,11417,8.875,,,, +US-NY-11418,US,NY,11418,8.875,,,, +US-NY-11419,US,NY,11419,8.875,,,, +US-NY-11420,US,NY,11420,8.875,,,, +US-NY-11421,US,NY,11421,8.875,,,, +US-NY-11422,US,NY,11422,8.875,,,, +US-NY-11423,US,NY,11423,8.875,,,, +US-NY-11424,US,NY,11424,8.875,,,, +US-NY-11425,US,NY,11425,8.875,,,, +US-NY-11426,US,NY,11426,8.875,,,, +US-NY-11427,US,NY,11427,8.875,,,, +US-NY-11428,US,NY,11428,8.875,,,, +US-NY-11429,US,NY,11429,8.875,,,, +US-NY-11430,US,NY,11430,8.875,,,, +US-NY-11431,US,NY,11431,8.875,,,, +US-NY-11432,US,NY,11432,8.875,,,, +US-NY-11433,US,NY,11433,8.875,,,, +US-NY-11434,US,NY,11434,8.875,,,, +US-NY-11435,US,NY,11435,8.875,,,, +US-NY-11436,US,NY,11436,8.875,,,, +US-NY-11439,US,NY,11439,8.875,,,, +US-NY-11451,US,NY,11451,8.875,,,, +US-NY-11499,US,NY,11499,8.875,,,, +US-NY-11501,US,NY,11501,8.625,,,, +US-NY-11507,US,NY,11507,8.625,,,, +US-NY-11509,US,NY,11509,8.625,,,, +US-NY-11510,US,NY,11510,8.625,,,, +US-NY-11514,US,NY,11514,8.625,,,, +US-NY-11516,US,NY,11516,8.625,,,, +US-NY-11518,US,NY,11518,8.625,,,, +US-NY-11520,US,NY,11520,8.625,,,, +US-NY-11530,US,NY,11530,8.625,,,, +US-NY-11531,US,NY,11531,8.625,,,, +US-NY-11542,US,NY,11542,8.625,,,, +US-NY-11545,US,NY,11545,8.625,,,, +US-NY-11547,US,NY,11547,8.625,,,, +US-NY-11548,US,NY,11548,8.625,,,, +US-NY-11549,US,NY,11549,8.625,,,, +US-NY-11550,US,NY,11550,8.625,,,, +US-NY-11551,US,NY,11551,8.625,,,, +US-NY-11552,US,NY,11552,8.625,,,, +US-NY-11553,US,NY,11553,8.625,,,, +US-NY-11554,US,NY,11554,8.625,,,, +US-NY-11555,US,NY,11555,8.625,,,, +US-NY-11556,US,NY,11556,8.625,,,, +US-NY-11557,US,NY,11557,8.625,,,, +US-NY-11558,US,NY,11558,8.625,,,, +US-NY-11559,US,NY,11559,8.625,,,, +US-NY-11560,US,NY,11560,8.625,,,, +US-NY-11561,US,NY,11561,8.625,,,, +US-NY-11563,US,NY,11563,8.625,,,, +US-NY-11565,US,NY,11565,8.625,,,, +US-NY-11566,US,NY,11566,8.625,,,, +US-NY-11568,US,NY,11568,8.625,,,, +US-NY-11569,US,NY,11569,8.625,,,, +US-NY-11570,US,NY,11570,8.625,,,, +US-NY-11571,US,NY,11571,8.625,,,, +US-NY-11572,US,NY,11572,8.625,,,, +US-NY-11575,US,NY,11575,8.625,,,, +US-NY-11576,US,NY,11576,8.625,,,, +US-NY-11577,US,NY,11577,8.625,,,, +US-NY-11579,US,NY,11579,8.625,,,, +US-NY-11580,US,NY,11580,8.625,,,, +US-NY-11581,US,NY,11581,8.625,,,, +US-NY-11582,US,NY,11582,8.625,,,, +US-NY-11590,US,NY,11590,8.625,,,, +US-NY-11596,US,NY,11596,8.625,,,, +US-NY-11598,US,NY,11598,8.625,,,, +US-NY-11599,US,NY,11599,8.625,,,, +US-NY-11690,US,NY,11690,8.875,,,, +US-NY-11691,US,NY,11691,8.875,,,, +US-NY-11692,US,NY,11692,8.875,,,, +US-NY-11693,US,NY,11693,8.875,,,, +US-NY-11694,US,NY,11694,8.875,,,, +US-NY-11695,US,NY,11695,8.875,,,, +US-NY-11697,US,NY,11697,8.875,,,, +US-NY-11701,US,NY,11701,8.625,,,, +US-NY-11702,US,NY,11702,8.625,,,, +US-NY-11703,US,NY,11703,8.625,,,, +US-NY-11704,US,NY,11704,8.625,,,, +US-NY-11705,US,NY,11705,8.625,,,, +US-NY-11706,US,NY,11706,8.625,,,, +US-NY-11707,US,NY,11707,8.625,,,, +US-NY-11709,US,NY,11709,8.625,,,, +US-NY-11710,US,NY,11710,8.625,,,, +US-NY-11713,US,NY,11713,8.625,,,, +US-NY-11714,US,NY,11714,8.625,,,, +US-NY-11715,US,NY,11715,8.625,,,, +US-NY-11716,US,NY,11716,8.625,,,, +US-NY-11717,US,NY,11717,8.625,,,, +US-NY-11718,US,NY,11718,8.625,,,, +US-NY-11719,US,NY,11719,8.625,,,, +US-NY-11720,US,NY,11720,8.625,,,, +US-NY-11721,US,NY,11721,8.625,,,, +US-NY-11722,US,NY,11722,8.625,,,, +US-NY-11724,US,NY,11724,8.625,,,, +US-NY-11725,US,NY,11725,8.625,,,, +US-NY-11726,US,NY,11726,8.625,,,, +US-NY-11727,US,NY,11727,8.625,,,, +US-NY-11729,US,NY,11729,8.625,,,, +US-NY-11730,US,NY,11730,8.625,,,, +US-NY-11731,US,NY,11731,8.625,,,, +US-NY-11732,US,NY,11732,8.625,,,, +US-NY-11733,US,NY,11733,8.625,,,, +US-NY-11735,US,NY,11735,8.625,,,, +US-NY-11737,US,NY,11737,8.625,,,, +US-NY-11738,US,NY,11738,8.625,,,, +US-NY-11739,US,NY,11739,8.625,,,, +US-NY-11740,US,NY,11740,8.625,,,, +US-NY-11741,US,NY,11741,8.625,,,, +US-NY-11742,US,NY,11742,8.625,,,, +US-NY-11743,US,NY,11743,8.625,,,, +US-NY-11746,US,NY,11746,8.625,,,, +US-NY-11747,US,NY,11747,8.625,,,, +US-NY-11749,US,NY,11749,8.625,,,, +US-NY-11751,US,NY,11751,8.625,,,, +US-NY-11752,US,NY,11752,8.625,,,, +US-NY-11753,US,NY,11753,8.625,,,, +US-NY-11754,US,NY,11754,8.625,,,, +US-NY-11755,US,NY,11755,8.625,,,, +US-NY-11756,US,NY,11756,8.625,,,, +US-NY-11757,US,NY,11757,8.625,,,, +US-NY-11758,US,NY,11758,8.625,,,, +US-NY-11760,US,NY,11760,8.625,,,, +US-NY-11762,US,NY,11762,8.625,,,, +US-NY-11763,US,NY,11763,8.625,,,, +US-NY-11764,US,NY,11764,8.625,,,, +US-NY-11765,US,NY,11765,8.625,,,, +US-NY-11766,US,NY,11766,8.625,,,, +US-NY-11767,US,NY,11767,8.625,,,, +US-NY-11768,US,NY,11768,8.625,,,, +US-NY-11769,US,NY,11769,8.625,,,, +US-NY-11770,US,NY,11770,8.625,,,, +US-NY-11771,US,NY,11771,8.625,,,, +US-NY-11772,US,NY,11772,8.625,,,, +US-NY-11773,US,NY,11773,8.625,,,, +US-NY-11775,US,NY,11775,8.625,,,, +US-NY-11776,US,NY,11776,8.625,,,, +US-NY-11777,US,NY,11777,8.625,,,, +US-NY-11778,US,NY,11778,8.625,,,, +US-NY-11779,US,NY,11779,8.625,,,, +US-NY-11780,US,NY,11780,8.625,,,, +US-NY-11782,US,NY,11782,8.625,,,, +US-NY-11783,US,NY,11783,8.625,,,, +US-NY-11784,US,NY,11784,8.625,,,, +US-NY-11786,US,NY,11786,8.625,,,, +US-NY-11787,US,NY,11787,8.625,,,, +US-NY-11788,US,NY,11788,8.625,,,, +US-NY-11789,US,NY,11789,8.625,,,, +US-NY-11790,US,NY,11790,8.625,,,, +US-NY-11791,US,NY,11791,8.625,,,, +US-NY-11792,US,NY,11792,8.625,,,, +US-NY-11793,US,NY,11793,8.625,,,, +US-NY-11794,US,NY,11794,8.625,,,, +US-NY-11795,US,NY,11795,8.625,,,, +US-NY-11796,US,NY,11796,8.625,,,, +US-NY-11797,US,NY,11797,8.625,,,, +US-NY-11798,US,NY,11798,8.625,,,, +US-NY-11801,US,NY,11801,8.625,,,, +US-NY-11802,US,NY,11802,8.625,,,, +US-NY-11803,US,NY,11803,8.625,,,, +US-NY-11804,US,NY,11804,8.625,,,, +US-NY-11815,US,NY,11815,8.625,,,, +US-NY-11819,US,NY,11819,8.625,,,, +US-NY-11853,US,NY,11853,8.625,,,, +US-NY-11854,US,NY,11854,8.625,,,, +US-NY-11901,US,NY,11901,8.625,,,, +US-NY-11930,US,NY,11930,8.625,,,, +US-NY-11931,US,NY,11931,8.625,,,, +US-NY-11932,US,NY,11932,8.625,,,, +US-NY-11933,US,NY,11933,8.625,,,, +US-NY-11934,US,NY,11934,8.625,,,, +US-NY-11935,US,NY,11935,8.625,,,, +US-NY-11937,US,NY,11937,8.625,,,, +US-NY-11939,US,NY,11939,8.625,,,, +US-NY-11940,US,NY,11940,8.625,,,, +US-NY-11941,US,NY,11941,8.625,,,, +US-NY-11942,US,NY,11942,8.625,,,, +US-NY-11944,US,NY,11944,8.625,,,, +US-NY-11946,US,NY,11946,8.625,,,, +US-NY-11947,US,NY,11947,8.625,,,, +US-NY-11948,US,NY,11948,8.625,,,, +US-NY-11949,US,NY,11949,8.625,,,, +US-NY-11950,US,NY,11950,8.625,,,, +US-NY-11951,US,NY,11951,8.625,,,, +US-NY-11952,US,NY,11952,8.625,,,, +US-NY-11953,US,NY,11953,8.625,,,, +US-NY-11954,US,NY,11954,8.625,,,, +US-NY-11955,US,NY,11955,8.625,,,, +US-NY-11956,US,NY,11956,8.625,,,, +US-NY-11957,US,NY,11957,8.625,,,, +US-NY-11958,US,NY,11958,8.625,,,, +US-NY-11959,US,NY,11959,8.625,,,, +US-NY-11960,US,NY,11960,8.625,,,, +US-NY-11961,US,NY,11961,8.625,,,, +US-NY-11962,US,NY,11962,8.625,,,, +US-NY-11963,US,NY,11963,8.625,,,, +US-NY-11964,US,NY,11964,8.625,,,, +US-NY-11965,US,NY,11965,8.625,,,, +US-NY-11967,US,NY,11967,8.625,,,, +US-NY-11968,US,NY,11968,8.625,,,, +US-NY-11969,US,NY,11969,8.625,,,, +US-NY-11970,US,NY,11970,8.625,,,, +US-NY-11971,US,NY,11971,8.625,,,, +US-NY-11972,US,NY,11972,8.625,,,, +US-NY-11973,US,NY,11973,8.625,,,, +US-NY-11975,US,NY,11975,8.625,,,, +US-NY-11976,US,NY,11976,8.625,,,, +US-NY-11977,US,NY,11977,8.625,,,, +US-NY-11978,US,NY,11978,8.625,,,, +US-NY-11980,US,NY,11980,8.625,,,, +US-NY-12007,US,NY,12007,8,,,, +US-NY-12008,US,NY,12008,8,,,, +US-NY-12009,US,NY,12009,8,,,, +US-NY-12010,US,NY,12010,8,,,, +US-NY-12015,US,NY,12015,8,,,, +US-NY-12016,US,NY,12016,8,,,, +US-NY-12017,US,NY,12017,8,,,, +US-NY-12018,US,NY,12018,8,,,, +US-NY-12019,US,NY,12019,7,,,, +US-NY-12020,US,NY,12020,7,,,, +US-NY-12022,US,NY,12022,8,,,, +US-NY-12023,US,NY,12023,8,,,, +US-NY-12024,US,NY,12024,8,,,, +US-NY-12025,US,NY,12025,8,,,, +US-NY-12027,US,NY,12027,7,,,, +US-NY-12028,US,NY,12028,7,,,, +US-NY-12029,US,NY,12029,8,,,, +US-NY-12031,US,NY,12031,8,,,, +US-NY-12032,US,NY,12032,8,,,, +US-NY-12033,US,NY,12033,8,,,, +US-NY-12035,US,NY,12035,8,,,, +US-NY-12036,US,NY,12036,8,,,, +US-NY-12037,US,NY,12037,8,,,, +US-NY-12040,US,NY,12040,8,,,, +US-NY-12041,US,NY,12041,8,,,, +US-NY-12042,US,NY,12042,8,,,, +US-NY-12043,US,NY,12043,8,,,, +US-NY-12045,US,NY,12045,8,,,, +US-NY-12046,US,NY,12046,8,,,, +US-NY-12047,US,NY,12047,8,,,, +US-NY-12050,US,NY,12050,8,,,, +US-NY-12051,US,NY,12051,8,,,, +US-NY-12052,US,NY,12052,8,,,, +US-NY-12053,US,NY,12053,8,,,, +US-NY-12054,US,NY,12054,8,,,, +US-NY-12055,US,NY,12055,8,,,, +US-NY-12056,US,NY,12056,8,,,, +US-NY-12057,US,NY,12057,7,,,, +US-NY-12058,US,NY,12058,8,,,, +US-NY-12059,US,NY,12059,8,,,, +US-NY-12060,US,NY,12060,8,,,, +US-NY-12061,US,NY,12061,8,,,, +US-NY-12062,US,NY,12062,8,,,, +US-NY-12063,US,NY,12063,8,,,, +US-NY-12064,US,NY,12064,8,,,, +US-NY-12065,US,NY,12065,7,,,, +US-NY-12066,US,NY,12066,8,,,, +US-NY-12067,US,NY,12067,8,,,, +US-NY-12068,US,NY,12068,8,,,, +US-NY-12069,US,NY,12069,8,,,, +US-NY-12070,US,NY,12070,8,,,, +US-NY-12071,US,NY,12071,8,,,, +US-NY-12072,US,NY,12072,8,,,, +US-NY-12073,US,NY,12073,8,,,, +US-NY-12074,US,NY,12074,7,,,, +US-NY-12075,US,NY,12075,8,,,, +US-NY-12076,US,NY,12076,8,,,, +US-NY-12077,US,NY,12077,8,,,, +US-NY-12078,US,NY,12078,8,,,, +US-NY-12082,US,NY,12082,8,,,, +US-NY-12083,US,NY,12083,8,,,, +US-NY-12084,US,NY,12084,8,,,, +US-NY-12085,US,NY,12085,8,,,, +US-NY-12086,US,NY,12086,8,,,, +US-NY-12087,US,NY,12087,8,,,, +US-NY-12089,US,NY,12089,8,,,, +US-NY-12090,US,NY,12090,8,,,, +US-NY-12092,US,NY,12092,8,,,, +US-NY-12093,US,NY,12093,8,,,, +US-NY-12094,US,NY,12094,8,,,, +US-NY-12095,US,NY,12095,8,,,, +US-NY-12106,US,NY,12106,8,,,, +US-NY-12107,US,NY,12107,8,,,, +US-NY-12108,US,NY,12108,7,,,, +US-NY-12110,US,NY,12110,8,,,, +US-NY-12115,US,NY,12115,8,,,, +US-NY-12116,US,NY,12116,8,,,, +US-NY-12117,US,NY,12117,8,,,, +US-NY-12118,US,NY,12118,7,,,, +US-NY-12120,US,NY,12120,8,,,, +US-NY-12121,US,NY,12121,8,,,, +US-NY-12122,US,NY,12122,8,,,, +US-NY-12123,US,NY,12123,8,,,, +US-NY-12124,US,NY,12124,8,,,, +US-NY-12125,US,NY,12125,8,,,, +US-NY-12128,US,NY,12128,8,,,, +US-NY-12130,US,NY,12130,8,,,, +US-NY-12131,US,NY,12131,8,,,, +US-NY-12132,US,NY,12132,8,,,, +US-NY-12133,US,NY,12133,8,,,, +US-NY-12134,US,NY,12134,8,,,, +US-NY-12136,US,NY,12136,8,,,, +US-NY-12137,US,NY,12137,8,,,, +US-NY-12138,US,NY,12138,8,,,, +US-NY-12139,US,NY,12139,7,,,, +US-NY-12140,US,NY,12140,8,,,, +US-NY-12141,US,NY,12141,8,,,, +US-NY-12143,US,NY,12143,8,,,, +US-NY-12144,US,NY,12144,8,,,, +US-NY-12147,US,NY,12147,8,,,, +US-NY-12148,US,NY,12148,7,,,, +US-NY-12149,US,NY,12149,8,,,, +US-NY-12150,US,NY,12150,8,,,, +US-NY-12151,US,NY,12151,7,,,, +US-NY-12153,US,NY,12153,8,,,, +US-NY-12154,US,NY,12154,8,,,, +US-NY-12155,US,NY,12155,8,,,, +US-NY-12156,US,NY,12156,8,,,, +US-NY-12157,US,NY,12157,8,,,, +US-NY-12158,US,NY,12158,8,,,, +US-NY-12159,US,NY,12159,8,,,, +US-NY-12160,US,NY,12160,8,,,, +US-NY-12161,US,NY,12161,8,,,, +US-NY-12164,US,NY,12164,7,,,, +US-NY-12165,US,NY,12165,8,,,, +US-NY-12166,US,NY,12166,8,,,, +US-NY-12167,US,NY,12167,8,,,, +US-NY-12168,US,NY,12168,8,,,, +US-NY-12169,US,NY,12169,8,,,, +US-NY-12170,US,NY,12170,7,,,, +US-NY-12172,US,NY,12172,8,,,, +US-NY-12173,US,NY,12173,8,,,, +US-NY-12174,US,NY,12174,8,,,, +US-NY-12175,US,NY,12175,8,,,, +US-NY-12176,US,NY,12176,8,,,, +US-NY-12177,US,NY,12177,8,,,, +US-NY-12180,US,NY,12180,8,,,, +US-NY-12181,US,NY,12181,8,,,, +US-NY-12182,US,NY,12182,8,,,, +US-NY-12183,US,NY,12183,8,,,, +US-NY-12184,US,NY,12184,8,,,, +US-NY-12185,US,NY,12185,8,,,, +US-NY-12186,US,NY,12186,8,,,, +US-NY-12187,US,NY,12187,8,,,, +US-NY-12188,US,NY,12188,7,,,, +US-NY-12189,US,NY,12189,8,,,, +US-NY-12190,US,NY,12190,7,,,, +US-NY-12192,US,NY,12192,8,,,, +US-NY-12193,US,NY,12193,8,,,, +US-NY-12194,US,NY,12194,8,,,, +US-NY-12195,US,NY,12195,8,,,, +US-NY-12196,US,NY,12196,8,,,, +US-NY-12197,US,NY,12197,8,,,, +US-NY-12198,US,NY,12198,8,,,, +US-NY-12201,US,NY,12201,8,,,, +US-NY-12202,US,NY,12202,8,,,, +US-NY-12203,US,NY,12203,8,,,, +US-NY-12204,US,NY,12204,8,,,, +US-NY-12205,US,NY,12205,8,,,, +US-NY-12206,US,NY,12206,8,,,, +US-NY-12207,US,NY,12207,8,,,, +US-NY-12208,US,NY,12208,8,,,, +US-NY-12209,US,NY,12209,8,,,, +US-NY-12210,US,NY,12210,8,,,, +US-NY-12211,US,NY,12211,8,,,, +US-NY-12212,US,NY,12212,8,,,, +US-NY-12214,US,NY,12214,8,,,, +US-NY-12220,US,NY,12220,8,,,, +US-NY-12222,US,NY,12222,8,,,, +US-NY-12223,US,NY,12223,8,,,, +US-NY-12224,US,NY,12224,8,,,, +US-NY-12225,US,NY,12225,8,,,, +US-NY-12226,US,NY,12226,8,,,, +US-NY-12227,US,NY,12227,8,,,, +US-NY-12228,US,NY,12228,8,,,, +US-NY-12229,US,NY,12229,8,,,, +US-NY-12230,US,NY,12230,8,,,, +US-NY-12231,US,NY,12231,8,,,, +US-NY-12232,US,NY,12232,8,,,, +US-NY-12233,US,NY,12233,8,,,, +US-NY-12234,US,NY,12234,8,,,, +US-NY-12235,US,NY,12235,8,,,, +US-NY-12236,US,NY,12236,8,,,, +US-NY-12237,US,NY,12237,8,,,, +US-NY-12238,US,NY,12238,8,,,, +US-NY-12239,US,NY,12239,8,,,, +US-NY-12240,US,NY,12240,8,,,, +US-NY-12241,US,NY,12241,8,,,, +US-NY-12242,US,NY,12242,8,,,, +US-NY-12243,US,NY,12243,8,,,, +US-NY-12244,US,NY,12244,8,,,, +US-NY-12245,US,NY,12245,8,,,, +US-NY-12246,US,NY,12246,8,,,, +US-NY-12247,US,NY,12247,8,,,, +US-NY-12248,US,NY,12248,8,,,, +US-NY-12249,US,NY,12249,8,,,, +US-NY-12250,US,NY,12250,8,,,, +US-NY-12252,US,NY,12252,8,,,, +US-NY-12255,US,NY,12255,8,,,, +US-NY-12256,US,NY,12256,8,,,, +US-NY-12257,US,NY,12257,8,,,, +US-NY-12260,US,NY,12260,8,,,, +US-NY-12261,US,NY,12261,8,,,, +US-NY-12288,US,NY,12288,8,,,, +US-NY-12301,US,NY,12301,8,,,, +US-NY-12302,US,NY,12302,8,,,, +US-NY-12303,US,NY,12303,8,,,, +US-NY-12304,US,NY,12304,8,,,, +US-NY-12305,US,NY,12305,8,,,, +US-NY-12306,US,NY,12306,8,,,, +US-NY-12307,US,NY,12307,8,,,, +US-NY-12308,US,NY,12308,8,,,, +US-NY-12309,US,NY,12309,8,,,, +US-NY-12325,US,NY,12325,8,,,, +US-NY-12345,US,NY,12345,8,,,, +US-NY-12401,US,NY,12401,8,,,, +US-NY-12402,US,NY,12402,8,,,, +US-NY-12404,US,NY,12404,8,,,, +US-NY-12405,US,NY,12405,8,,,, +US-NY-12406,US,NY,12406,8,,,, +US-NY-12407,US,NY,12407,8,,,, +US-NY-12409,US,NY,12409,8,,,, +US-NY-12410,US,NY,12410,8,,,, +US-NY-12411,US,NY,12411,8,,,, +US-NY-12412,US,NY,12412,8,,,, +US-NY-12413,US,NY,12413,8,,,, +US-NY-12414,US,NY,12414,8,,,, +US-NY-12416,US,NY,12416,8,,,, +US-NY-12417,US,NY,12417,8,,,, +US-NY-12418,US,NY,12418,8,,,, +US-NY-12419,US,NY,12419,8,,,, +US-NY-12420,US,NY,12420,8,,,, +US-NY-12421,US,NY,12421,8,,,, +US-NY-12422,US,NY,12422,8,,,, +US-NY-12423,US,NY,12423,8,,,, +US-NY-12424,US,NY,12424,8,,,, +US-NY-12427,US,NY,12427,8,,,, +US-NY-12428,US,NY,12428,8,,,, +US-NY-12429,US,NY,12429,8,,,, +US-NY-12430,US,NY,12430,8,,,, +US-NY-12431,US,NY,12431,8,,,, +US-NY-12432,US,NY,12432,8,,,, +US-NY-12433,US,NY,12433,8,,,, +US-NY-12434,US,NY,12434,8,,,, +US-NY-12435,US,NY,12435,8,,,, +US-NY-12436,US,NY,12436,8,,,, +US-NY-12438,US,NY,12438,8,,,, +US-NY-12439,US,NY,12439,8,,,, +US-NY-12440,US,NY,12440,8,,,, +US-NY-12441,US,NY,12441,8,,,, +US-NY-12442,US,NY,12442,8,,,, +US-NY-12443,US,NY,12443,8,,,, +US-NY-12444,US,NY,12444,8,,,, +US-NY-12446,US,NY,12446,8,,,, +US-NY-12448,US,NY,12448,8,,,, +US-NY-12449,US,NY,12449,8,,,, +US-NY-12450,US,NY,12450,8,,,, +US-NY-12451,US,NY,12451,8,,,, +US-NY-12452,US,NY,12452,8,,,, +US-NY-12453,US,NY,12453,8,,,, +US-NY-12454,US,NY,12454,8,,,, +US-NY-12455,US,NY,12455,8,,,, +US-NY-12456,US,NY,12456,8,,,, +US-NY-12457,US,NY,12457,8,,,, +US-NY-12458,US,NY,12458,8,,,, +US-NY-12459,US,NY,12459,8,,,, +US-NY-12460,US,NY,12460,8,,,, +US-NY-12461,US,NY,12461,8,,,, +US-NY-12463,US,NY,12463,8,,,, +US-NY-12464,US,NY,12464,8,,,, +US-NY-12465,US,NY,12465,8,,,, +US-NY-12466,US,NY,12466,8,,,, +US-NY-12468,US,NY,12468,8,,,, +US-NY-12469,US,NY,12469,8,,,, +US-NY-12470,US,NY,12470,8,,,, +US-NY-12471,US,NY,12471,8,,,, +US-NY-12472,US,NY,12472,8,,,, +US-NY-12473,US,NY,12473,8,,,, +US-NY-12474,US,NY,12474,8,,,, +US-NY-12475,US,NY,12475,8,,,, +US-NY-12477,US,NY,12477,8,,,, +US-NY-12480,US,NY,12480,8,,,, +US-NY-12481,US,NY,12481,8,,,, +US-NY-12482,US,NY,12482,8,,,, +US-NY-12483,US,NY,12483,8,,,, +US-NY-12484,US,NY,12484,8,,,, +US-NY-12485,US,NY,12485,8,,,, +US-NY-12486,US,NY,12486,8,,,, +US-NY-12487,US,NY,12487,8,,,, +US-NY-12489,US,NY,12489,8,,,, +US-NY-12490,US,NY,12490,8,,,, +US-NY-12491,US,NY,12491,8,,,, +US-NY-12492,US,NY,12492,8,,,, +US-NY-12493,US,NY,12493,8,,,, +US-NY-12494,US,NY,12494,8,,,, +US-NY-12495,US,NY,12495,8,,,, +US-NY-12496,US,NY,12496,8,,,, +US-NY-12498,US,NY,12498,8,,,, +US-NY-12501,US,NY,12501,8.125,,,, +US-NY-12502,US,NY,12502,8,,,, +US-NY-12503,US,NY,12503,8,,,, +US-NY-12504,US,NY,12504,8.125,,,, +US-NY-12506,US,NY,12506,8.125,,,, +US-NY-12507,US,NY,12507,8.125,,,, +US-NY-12508,US,NY,12508,8.125,,,, +US-NY-12510,US,NY,12510,8.125,,,, +US-NY-12511,US,NY,12511,8.125,,,, +US-NY-12512,US,NY,12512,8.125,,,, +US-NY-12513,US,NY,12513,8,,,, +US-NY-12514,US,NY,12514,8.125,,,, +US-NY-12515,US,NY,12515,8,,,, +US-NY-12516,US,NY,12516,8,,,, +US-NY-12517,US,NY,12517,8,,,, +US-NY-12518,US,NY,12518,8.125,,,, +US-NY-12520,US,NY,12520,8.125,,,, +US-NY-12521,US,NY,12521,8,,,, +US-NY-12522,US,NY,12522,8.125,,,, +US-NY-12523,US,NY,12523,8,,,, +US-NY-12524,US,NY,12524,8.125,,,, +US-NY-12525,US,NY,12525,8,,,, +US-NY-12526,US,NY,12526,8,,,, +US-NY-12527,US,NY,12527,8.125,,,, +US-NY-12528,US,NY,12528,8,,,, +US-NY-12529,US,NY,12529,8,,,, +US-NY-12530,US,NY,12530,8,,,, +US-NY-12531,US,NY,12531,8.125,,,, +US-NY-12533,US,NY,12533,8.125,,,, +US-NY-12534,US,NY,12534,8,,,, +US-NY-12537,US,NY,12537,8.125,,,, +US-NY-12538,US,NY,12538,8.125,,,, +US-NY-12540,US,NY,12540,8.125,,,, +US-NY-12541,US,NY,12541,8,,,, +US-NY-12542,US,NY,12542,8,,,, +US-NY-12543,US,NY,12543,8.125,,,, +US-NY-12544,US,NY,12544,8,,,, +US-NY-12545,US,NY,12545,8.125,,,, +US-NY-12546,US,NY,12546,8.125,,,, +US-NY-12547,US,NY,12547,8,,,, +US-NY-12548,US,NY,12548,8,,,, +US-NY-12549,US,NY,12549,8.125,,,, +US-NY-12550,US,NY,12550,8.125,,,, +US-NY-12551,US,NY,12551,8.125,,,, +US-NY-12552,US,NY,12552,8.125,,,, +US-NY-12553,US,NY,12553,8.125,,,, +US-NY-12555,US,NY,12555,8.125,,,, +US-NY-12561,US,NY,12561,8,,,, +US-NY-12563,US,NY,12563,8.375,,,, +US-NY-12564,US,NY,12564,8.125,,,, +US-NY-12565,US,NY,12565,8,,,, +US-NY-12566,US,NY,12566,8,,,, +US-NY-12567,US,NY,12567,8.125,,,, +US-NY-12568,US,NY,12568,8,,,, +US-NY-12569,US,NY,12569,8.125,,,, +US-NY-12570,US,NY,12570,8.125,,,, +US-NY-12571,US,NY,12571,8.125,,,, +US-NY-12572,US,NY,12572,8.125,,,, +US-NY-12574,US,NY,12574,8.125,,,, +US-NY-12575,US,NY,12575,8.125,,,, +US-NY-12577,US,NY,12577,8.125,,,, +US-NY-12578,US,NY,12578,8.125,,,, +US-NY-12580,US,NY,12580,8.125,,,, +US-NY-12581,US,NY,12581,8.125,,,, +US-NY-12582,US,NY,12582,8.125,,,, +US-NY-12583,US,NY,12583,8.125,,,, +US-NY-12584,US,NY,12584,8.125,,,, +US-NY-12585,US,NY,12585,8.125,,,, +US-NY-12586,US,NY,12586,8.125,,,, +US-NY-12588,US,NY,12588,8,,,, +US-NY-12589,US,NY,12589,8,,,, +US-NY-12590,US,NY,12590,8.125,,,, +US-NY-12592,US,NY,12592,8.125,,,, +US-NY-12594,US,NY,12594,8.125,,,, +US-NY-12601,US,NY,12601,8.125,,,, +US-NY-12602,US,NY,12602,8.125,,,, +US-NY-12603,US,NY,12603,8.125,,,, +US-NY-12604,US,NY,12604,8.125,,,, +US-NY-12701,US,NY,12701,8,,,, +US-NY-12719,US,NY,12719,8,,,, +US-NY-12720,US,NY,12720,8,,,, +US-NY-12721,US,NY,12721,8,,,, +US-NY-12722,US,NY,12722,8,,,, +US-NY-12723,US,NY,12723,8,,,, +US-NY-12724,US,NY,12724,8,,,, +US-NY-12725,US,NY,12725,8,,,, +US-NY-12726,US,NY,12726,8,,,, +US-NY-12727,US,NY,12727,8,,,, +US-NY-12729,US,NY,12729,8.125,,,, +US-NY-12732,US,NY,12732,8,,,, +US-NY-12733,US,NY,12733,8,,,, +US-NY-12734,US,NY,12734,8,,,, +US-NY-12736,US,NY,12736,8,,,, +US-NY-12737,US,NY,12737,8,,,, +US-NY-12738,US,NY,12738,8,,,, +US-NY-12740,US,NY,12740,8,,,, +US-NY-12741,US,NY,12741,8,,,, +US-NY-12742,US,NY,12742,8,,,, +US-NY-12743,US,NY,12743,8,,,, +US-NY-12745,US,NY,12745,8,,,, +US-NY-12746,US,NY,12746,8.125,,,, +US-NY-12747,US,NY,12747,8,,,, +US-NY-12748,US,NY,12748,8,,,, +US-NY-12749,US,NY,12749,8,,,, +US-NY-12750,US,NY,12750,8,,,, +US-NY-12751,US,NY,12751,8,,,, +US-NY-12752,US,NY,12752,8,,,, +US-NY-12754,US,NY,12754,8,,,, +US-NY-12758,US,NY,12758,8,,,, +US-NY-12759,US,NY,12759,8,,,, +US-NY-12760,US,NY,12760,8,,,, +US-NY-12762,US,NY,12762,8,,,, +US-NY-12763,US,NY,12763,8,,,, +US-NY-12764,US,NY,12764,8,,,, +US-NY-12765,US,NY,12765,8,,,, +US-NY-12766,US,NY,12766,8,,,, +US-NY-12767,US,NY,12767,8,,,, +US-NY-12768,US,NY,12768,8,,,, +US-NY-12769,US,NY,12769,8,,,, +US-NY-12770,US,NY,12770,8,,,, +US-NY-12771,US,NY,12771,8.125,,,, +US-NY-12775,US,NY,12775,8,,,, +US-NY-12776,US,NY,12776,8,,,, +US-NY-12777,US,NY,12777,8,,,, +US-NY-12778,US,NY,12778,8,,,, +US-NY-12779,US,NY,12779,8,,,, +US-NY-12780,US,NY,12780,8.125,,,, +US-NY-12781,US,NY,12781,8,,,, +US-NY-12783,US,NY,12783,8,,,, +US-NY-12784,US,NY,12784,8,,,, +US-NY-12785,US,NY,12785,8.125,,,, +US-NY-12786,US,NY,12786,8,,,, +US-NY-12787,US,NY,12787,8,,,, +US-NY-12788,US,NY,12788,8,,,, +US-NY-12789,US,NY,12789,8,,,, +US-NY-12790,US,NY,12790,8,,,, +US-NY-12791,US,NY,12791,8,,,, +US-NY-12792,US,NY,12792,8,,,, +US-NY-12801,US,NY,12801,7,,,, +US-NY-12803,US,NY,12803,7,,,, +US-NY-12804,US,NY,12804,7,,,, +US-NY-12808,US,NY,12808,7,,,, +US-NY-12809,US,NY,12809,7,,,, +US-NY-12810,US,NY,12810,7,,,, +US-NY-12811,US,NY,12811,7,,,, +US-NY-12812,US,NY,12812,7,,,, +US-NY-12814,US,NY,12814,7,,,, +US-NY-12815,US,NY,12815,7,,,, +US-NY-12816,US,NY,12816,7,,,, +US-NY-12817,US,NY,12817,7,,,, +US-NY-12819,US,NY,12819,7,,,, +US-NY-12820,US,NY,12820,7,,,, +US-NY-12821,US,NY,12821,7,,,, +US-NY-12822,US,NY,12822,7,,,, +US-NY-12823,US,NY,12823,7,,,, +US-NY-12824,US,NY,12824,7,,,, +US-NY-12827,US,NY,12827,7,,,, +US-NY-12828,US,NY,12828,7,,,, +US-NY-12831,US,NY,12831,7,,,, +US-NY-12832,US,NY,12832,7,,,, +US-NY-12833,US,NY,12833,7,,,, +US-NY-12834,US,NY,12834,7,,,, +US-NY-12835,US,NY,12835,7,,,, +US-NY-12836,US,NY,12836,7,,,, +US-NY-12837,US,NY,12837,7,,,, +US-NY-12838,US,NY,12838,7,,,, +US-NY-12839,US,NY,12839,7,,,, +US-NY-12841,US,NY,12841,7,,,, +US-NY-12842,US,NY,12842,7,,,, +US-NY-12843,US,NY,12843,7,,,, +US-NY-12844,US,NY,12844,7,,,, +US-NY-12845,US,NY,12845,7,,,, +US-NY-12846,US,NY,12846,7,,,, +US-NY-12847,US,NY,12847,7,,,, +US-NY-12848,US,NY,12848,7,,,, +US-NY-12849,US,NY,12849,7,,,, +US-NY-12850,US,NY,12850,7,,,, +US-NY-12851,US,NY,12851,7.75,,,, +US-NY-12852,US,NY,12852,7.75,,,, +US-NY-12853,US,NY,12853,7,,,, +US-NY-12854,US,NY,12854,7,,,, +US-NY-12855,US,NY,12855,7.75,,,, +US-NY-12856,US,NY,12856,7,,,, +US-NY-12857,US,NY,12857,7.75,,,, +US-NY-12858,US,NY,12858,7.75,,,, +US-NY-12859,US,NY,12859,7,,,, +US-NY-12860,US,NY,12860,7,,,, +US-NY-12861,US,NY,12861,7,,,, +US-NY-12862,US,NY,12862,7,,,, +US-NY-12863,US,NY,12863,7,,,, +US-NY-12864,US,NY,12864,7,,,, +US-NY-12865,US,NY,12865,7,,,, +US-NY-12866,US,NY,12866,7,,,, +US-NY-12870,US,NY,12870,7.75,,,, +US-NY-12871,US,NY,12871,7,,,, +US-NY-12872,US,NY,12872,7.75,,,, +US-NY-12873,US,NY,12873,7,,,, +US-NY-12874,US,NY,12874,7,,,, +US-NY-12878,US,NY,12878,7,,,, +US-NY-12879,US,NY,12879,7.75,,,, +US-NY-12883,US,NY,12883,7.75,,,, +US-NY-12884,US,NY,12884,7,,,, +US-NY-12885,US,NY,12885,7,,,, +US-NY-12886,US,NY,12886,7,,,, +US-NY-12887,US,NY,12887,7,,,, +US-NY-12901,US,NY,12901,8,,,, +US-NY-12903,US,NY,12903,8,,,, +US-NY-12910,US,NY,12910,8,,,, +US-NY-12911,US,NY,12911,8,,,, +US-NY-12912,US,NY,12912,8,,,, +US-NY-12913,US,NY,12913,7.75,,,, +US-NY-12914,US,NY,12914,8,,,, +US-NY-12915,US,NY,12915,8,,,, +US-NY-12916,US,NY,12916,8,,,, +US-NY-12917,US,NY,12917,8,,,, +US-NY-12918,US,NY,12918,8,,,, +US-NY-12919,US,NY,12919,8,,,, +US-NY-12920,US,NY,12920,8,,,, +US-NY-12921,US,NY,12921,8,,,, +US-NY-12922,US,NY,12922,7,,,, +US-NY-12923,US,NY,12923,8,,,, +US-NY-12924,US,NY,12924,8,,,, +US-NY-12926,US,NY,12926,8,,,, +US-NY-12927,US,NY,12927,7,,,, +US-NY-12928,US,NY,12928,7.75,,,, +US-NY-12929,US,NY,12929,8,,,, +US-NY-12930,US,NY,12930,8,,,, +US-NY-12932,US,NY,12932,7.75,,,, +US-NY-12933,US,NY,12933,8,,,, +US-NY-12934,US,NY,12934,8,,,, +US-NY-12935,US,NY,12935,8,,,, +US-NY-12936,US,NY,12936,7.75,,,, +US-NY-12937,US,NY,12937,8,,,, +US-NY-12939,US,NY,12939,8,,,, +US-NY-12941,US,NY,12941,7.75,,,, +US-NY-12942,US,NY,12942,7.75,,,, +US-NY-12943,US,NY,12943,7.75,,,, +US-NY-12944,US,NY,12944,7.75,,,, +US-NY-12945,US,NY,12945,8,,,, +US-NY-12946,US,NY,12946,7.75,,,, +US-NY-12949,US,NY,12949,7,,,, +US-NY-12950,US,NY,12950,7.75,,,, +US-NY-12952,US,NY,12952,8,,,, +US-NY-12953,US,NY,12953,8,,,, +US-NY-12955,US,NY,12955,8,,,, +US-NY-12956,US,NY,12956,7.75,,,, +US-NY-12957,US,NY,12957,8,,,, +US-NY-12958,US,NY,12958,8,,,, +US-NY-12959,US,NY,12959,8,,,, +US-NY-12960,US,NY,12960,7.75,,,, +US-NY-12961,US,NY,12961,7.75,,,, +US-NY-12962,US,NY,12962,8,,,, +US-NY-12964,US,NY,12964,7.75,,,, +US-NY-12965,US,NY,12965,7,,,, +US-NY-12966,US,NY,12966,8,,,, +US-NY-12967,US,NY,12967,7,,,, +US-NY-12969,US,NY,12969,8,,,, +US-NY-12970,US,NY,12970,8,,,, +US-NY-12972,US,NY,12972,8,,,, +US-NY-12973,US,NY,12973,7,,,, +US-NY-12974,US,NY,12974,7.75,,,, +US-NY-12975,US,NY,12975,7.75,,,, +US-NY-12976,US,NY,12976,8,,,, +US-NY-12977,US,NY,12977,7.75,,,, +US-NY-12978,US,NY,12978,8,,,, +US-NY-12979,US,NY,12979,8,,,, +US-NY-12980,US,NY,12980,8,,,, +US-NY-12981,US,NY,12981,8,,,, +US-NY-12983,US,NY,12983,8,,,, +US-NY-12985,US,NY,12985,8,,,, +US-NY-12986,US,NY,12986,8,,,, +US-NY-12987,US,NY,12987,7.75,,,, +US-NY-12989,US,NY,12989,8,,,, +US-NY-12992,US,NY,12992,8,,,, +US-NY-12993,US,NY,12993,7.75,,,, +US-NY-12995,US,NY,12995,8,,,, +US-NY-12996,US,NY,12996,7.75,,,, +US-NY-12997,US,NY,12997,7.75,,,, +US-NY-12998,US,NY,12998,7.75,,,, +US-NY-13020,US,NY,13020,8,,,, +US-NY-13021,US,NY,13021,8,,,, +US-NY-13022,US,NY,13022,8,,,, +US-NY-13024,US,NY,13024,8,,,, +US-NY-13026,US,NY,13026,8,,,, +US-NY-13027,US,NY,13027,8,,,, +US-NY-13028,US,NY,13028,8,,,, +US-NY-13029,US,NY,13029,8,,,, +US-NY-13030,US,NY,13030,8,,,, +US-NY-13031,US,NY,13031,8,,,, +US-NY-13032,US,NY,13032,8,,,, +US-NY-13033,US,NY,13033,8,,,, +US-NY-13034,US,NY,13034,8,,,, +US-NY-13035,US,NY,13035,8,,,, +US-NY-13036,US,NY,13036,8,,,, +US-NY-13037,US,NY,13037,8,,,, +US-NY-13039,US,NY,13039,8,,,, +US-NY-13040,US,NY,13040,8,,,, +US-NY-13041,US,NY,13041,8,,,, +US-NY-13042,US,NY,13042,8.75,,,, +US-NY-13043,US,NY,13043,8,,,, +US-NY-13044,US,NY,13044,8,,,, +US-NY-13045,US,NY,13045,8,,,, +US-NY-13051,US,NY,13051,8,,,, +US-NY-13052,US,NY,13052,8,,,, +US-NY-13053,US,NY,13053,8,,,, +US-NY-13054,US,NY,13054,8.75,,,, +US-NY-13056,US,NY,13056,8,,,, +US-NY-13057,US,NY,13057,8,,,, +US-NY-13060,US,NY,13060,8,,,, +US-NY-13061,US,NY,13061,8,,,, +US-NY-13062,US,NY,13062,8,,,, +US-NY-13063,US,NY,13063,8,,,, +US-NY-13064,US,NY,13064,8,,,, +US-NY-13065,US,NY,13065,8,,,, +US-NY-13066,US,NY,13066,8,,,, +US-NY-13068,US,NY,13068,8,,,, +US-NY-13069,US,NY,13069,8,,,, +US-NY-13071,US,NY,13071,8,,,, +US-NY-13072,US,NY,13072,8,,,, +US-NY-13073,US,NY,13073,8,,,, +US-NY-13074,US,NY,13074,8,,,, +US-NY-13076,US,NY,13076,8,,,, +US-NY-13077,US,NY,13077,8,,,, +US-NY-13078,US,NY,13078,8,,,, +US-NY-13080,US,NY,13080,8,,,, +US-NY-13081,US,NY,13081,8,,,, +US-NY-13082,US,NY,13082,8,,,, +US-NY-13083,US,NY,13083,8,,,, +US-NY-13084,US,NY,13084,8,,,, +US-NY-13087,US,NY,13087,8,,,, +US-NY-13088,US,NY,13088,8,,,, +US-NY-13089,US,NY,13089,8,,,, +US-NY-13090,US,NY,13090,8,,,, +US-NY-13092,US,NY,13092,8,,,, +US-NY-13093,US,NY,13093,8,,,, +US-NY-13101,US,NY,13101,8,,,, +US-NY-13102,US,NY,13102,8,,,, +US-NY-13103,US,NY,13103,8,,,, +US-NY-13104,US,NY,13104,8,,,, +US-NY-13107,US,NY,13107,8,,,, +US-NY-13108,US,NY,13108,8,,,, +US-NY-13110,US,NY,13110,8,,,, +US-NY-13111,US,NY,13111,8,,,, +US-NY-13112,US,NY,13112,8,,,, +US-NY-13113,US,NY,13113,8,,,, +US-NY-13114,US,NY,13114,8,,,, +US-NY-13115,US,NY,13115,8,,,, +US-NY-13116,US,NY,13116,8,,,, +US-NY-13117,US,NY,13117,8,,,, +US-NY-13118,US,NY,13118,8,,,, +US-NY-13119,US,NY,13119,8,,,, +US-NY-13120,US,NY,13120,8,,,, +US-NY-13121,US,NY,13121,8,,,, +US-NY-13122,US,NY,13122,8,,,, +US-NY-13123,US,NY,13123,8.75,,,, +US-NY-13124,US,NY,13124,8,,,, +US-NY-13126,US,NY,13126,8,,,, +US-NY-13131,US,NY,13131,8,,,, +US-NY-13132,US,NY,13132,8,,,, +US-NY-13134,US,NY,13134,8,,,, +US-NY-13135,US,NY,13135,8,,,, +US-NY-13136,US,NY,13136,8,,,, +US-NY-13137,US,NY,13137,8,,,, +US-NY-13138,US,NY,13138,8,,,, +US-NY-13139,US,NY,13139,8,,,, +US-NY-13140,US,NY,13140,8,,,, +US-NY-13141,US,NY,13141,8,,,, +US-NY-13142,US,NY,13142,8,,,, +US-NY-13143,US,NY,13143,8,,,, +US-NY-13144,US,NY,13144,8,,,, +US-NY-13145,US,NY,13145,8,,,, +US-NY-13146,US,NY,13146,8,,,, +US-NY-13147,US,NY,13147,8,,,, +US-NY-13148,US,NY,13148,8,,,, +US-NY-13152,US,NY,13152,8,,,, +US-NY-13153,US,NY,13153,8,,,, +US-NY-13154,US,NY,13154,8,,,, +US-NY-13155,US,NY,13155,8,,,, +US-NY-13156,US,NY,13156,8,,,, +US-NY-13157,US,NY,13157,8.75,,,, +US-NY-13158,US,NY,13158,8,,,, +US-NY-13159,US,NY,13159,8,,,, +US-NY-13160,US,NY,13160,8,,,, +US-NY-13162,US,NY,13162,8.75,,,, +US-NY-13163,US,NY,13163,8,,,, +US-NY-13164,US,NY,13164,8,,,, +US-NY-13165,US,NY,13165,8,,,, +US-NY-13166,US,NY,13166,8,,,, +US-NY-13167,US,NY,13167,8,,,, +US-NY-13201,US,NY,13201,8,,,, +US-NY-13202,US,NY,13202,8,,,, +US-NY-13203,US,NY,13203,8,,,, +US-NY-13204,US,NY,13204,8,,,, +US-NY-13205,US,NY,13205,8,,,, +US-NY-13206,US,NY,13206,8,,,, +US-NY-13207,US,NY,13207,8,,,, +US-NY-13208,US,NY,13208,8,,,, +US-NY-13209,US,NY,13209,8,,,, +US-NY-13210,US,NY,13210,8,,,, +US-NY-13211,US,NY,13211,8,,,, +US-NY-13212,US,NY,13212,8,,,, +US-NY-13214,US,NY,13214,8,,,, +US-NY-13215,US,NY,13215,8,,,, +US-NY-13217,US,NY,13217,8,,,, +US-NY-13218,US,NY,13218,8,,,, +US-NY-13219,US,NY,13219,8,,,, +US-NY-13220,US,NY,13220,8,,,, +US-NY-13221,US,NY,13221,8,,,, +US-NY-13224,US,NY,13224,8,,,, +US-NY-13225,US,NY,13225,8,,,, +US-NY-13235,US,NY,13235,8,,,, +US-NY-13244,US,NY,13244,8,,,, +US-NY-13250,US,NY,13250,8,,,, +US-NY-13251,US,NY,13251,8,,,, +US-NY-13252,US,NY,13252,8,,,, +US-NY-13261,US,NY,13261,8,,,, +US-NY-13290,US,NY,13290,8,,,, +US-NY-13301,US,NY,13301,8.75,,,, +US-NY-13302,US,NY,13302,8,,,, +US-NY-13303,US,NY,13303,8.75,,,, +US-NY-13304,US,NY,13304,8.75,,,, +US-NY-13305,US,NY,13305,7.75,,,, +US-NY-13308,US,NY,13308,8.75,,,, +US-NY-13309,US,NY,13309,8.75,,,, +US-NY-13310,US,NY,13310,8,,,, +US-NY-13312,US,NY,13312,7.75,,,, +US-NY-13313,US,NY,13313,8.75,,,, +US-NY-13314,US,NY,13314,8,,,, +US-NY-13315,US,NY,13315,8,,,, +US-NY-13316,US,NY,13316,8.75,,,, +US-NY-13317,US,NY,13317,8,,,, +US-NY-13318,US,NY,13318,8.75,,,, +US-NY-13319,US,NY,13319,8.75,,,, +US-NY-13320,US,NY,13320,8,,,, +US-NY-13321,US,NY,13321,8.75,,,, +US-NY-13322,US,NY,13322,8.75,,,, +US-NY-13323,US,NY,13323,8.75,,,, +US-NY-13324,US,NY,13324,8.25,,,, +US-NY-13325,US,NY,13325,7.75,,,, +US-NY-13326,US,NY,13326,8,,,, +US-NY-13327,US,NY,13327,7.75,,,, +US-NY-13328,US,NY,13328,8.75,,,, +US-NY-13329,US,NY,13329,8.25,,,, +US-NY-13331,US,NY,13331,8.25,,,, +US-NY-13332,US,NY,13332,8,,,, +US-NY-13333,US,NY,13333,8,,,, +US-NY-13334,US,NY,13334,8,,,, +US-NY-13335,US,NY,13335,8,,,, +US-NY-13337,US,NY,13337,8,,,, +US-NY-13338,US,NY,13338,8.75,,,, +US-NY-13339,US,NY,13339,8,,,, +US-NY-13340,US,NY,13340,8.25,,,, +US-NY-13341,US,NY,13341,8.75,,,, +US-NY-13342,US,NY,13342,8,,,, +US-NY-13343,US,NY,13343,7.75,,,, +US-NY-13345,US,NY,13345,7.75,,,, +US-NY-13346,US,NY,13346,8,,,, +US-NY-13348,US,NY,13348,8,,,, +US-NY-13350,US,NY,13350,8.25,,,, +US-NY-13352,US,NY,13352,8.75,,,, +US-NY-13353,US,NY,13353,7,,,, +US-NY-13354,US,NY,13354,8.75,,,, +US-NY-13355,US,NY,13355,8,,,, +US-NY-13357,US,NY,13357,8.25,,,, +US-NY-13360,US,NY,13360,7,,,, +US-NY-13361,US,NY,13361,8.25,,,, +US-NY-13362,US,NY,13362,8.75,,,, +US-NY-13363,US,NY,13363,8.75,,,, +US-NY-13364,US,NY,13364,8,,,, +US-NY-13365,US,NY,13365,8.25,,,, +US-NY-13367,US,NY,13367,7.75,,,, +US-NY-13368,US,NY,13368,7.75,,,, +US-NY-13401,US,NY,13401,8.75,,,, +US-NY-13402,US,NY,13402,8,,,, +US-NY-13403,US,NY,13403,8.75,,,, +US-NY-13404,US,NY,13404,7.75,,,, +US-NY-13406,US,NY,13406,8.25,,,, +US-NY-13407,US,NY,13407,8.25,,,, +US-NY-13408,US,NY,13408,8,,,, +US-NY-13409,US,NY,13409,8,,,, +US-NY-13410,US,NY,13410,8,,,, +US-NY-13411,US,NY,13411,8,,,, +US-NY-13413,US,NY,13413,8.75,,,, +US-NY-13415,US,NY,13415,8,,,, +US-NY-13416,US,NY,13416,8.25,,,, +US-NY-13417,US,NY,13417,8.75,,,, +US-NY-13418,US,NY,13418,8,,,, +US-NY-13420,US,NY,13420,8.25,,,, +US-NY-13421,US,NY,13421,8,,,, +US-NY-13424,US,NY,13424,8.75,,,, +US-NY-13425,US,NY,13425,8.75,,,, +US-NY-13426,US,NY,13426,8,,,, +US-NY-13428,US,NY,13428,8,,,, +US-NY-13431,US,NY,13431,8.25,,,, +US-NY-13433,US,NY,13433,7.75,,,, +US-NY-13435,US,NY,13435,8.75,,,, +US-NY-13436,US,NY,13436,7,,,, +US-NY-13437,US,NY,13437,8,,,, +US-NY-13438,US,NY,13438,8.75,,,, +US-NY-13439,US,NY,13439,8,,,, +US-NY-13440,US,NY,13440,8.75,,,, +US-NY-13441,US,NY,13441,8.75,,,, +US-NY-13442,US,NY,13442,8.75,,,, +US-NY-13449,US,NY,13449,8.75,,,, +US-NY-13450,US,NY,13450,8,,,, +US-NY-13452,US,NY,13452,8,,,, +US-NY-13454,US,NY,13454,8.25,,,, +US-NY-13455,US,NY,13455,8.75,,,, +US-NY-13456,US,NY,13456,8.75,,,, +US-NY-13457,US,NY,13457,8,,,, +US-NY-13459,US,NY,13459,8,,,, +US-NY-13460,US,NY,13460,8,,,, +US-NY-13461,US,NY,13461,8.75,,,, +US-NY-13464,US,NY,13464,8,,,, +US-NY-13465,US,NY,13465,8,,,, +US-NY-13468,US,NY,13468,8,,,, +US-NY-13469,US,NY,13469,8.75,,,, +US-NY-13470,US,NY,13470,8,,,, +US-NY-13471,US,NY,13471,8.75,,,, +US-NY-13472,US,NY,13472,8.25,,,, +US-NY-13473,US,NY,13473,7.75,,,, +US-NY-13475,US,NY,13475,8,,,, +US-NY-13476,US,NY,13476,8.75,,,, +US-NY-13477,US,NY,13477,8.75,,,, +US-NY-13478,US,NY,13478,8.75,,,, +US-NY-13479,US,NY,13479,8.75,,,, +US-NY-13480,US,NY,13480,8.75,,,, +US-NY-13482,US,NY,13482,8,,,, +US-NY-13483,US,NY,13483,8.75,,,, +US-NY-13484,US,NY,13484,8,,,, +US-NY-13485,US,NY,13485,8,,,, +US-NY-13486,US,NY,13486,8.75,,,, +US-NY-13488,US,NY,13488,8,,,, +US-NY-13489,US,NY,13489,7.75,,,, +US-NY-13490,US,NY,13490,8.75,,,, +US-NY-13491,US,NY,13491,8.25,,,, +US-NY-13492,US,NY,13492,8.75,,,, +US-NY-13493,US,NY,13493,8,,,, +US-NY-13494,US,NY,13494,8.75,,,, +US-NY-13495,US,NY,13495,8.75,,,, +US-NY-13501,US,NY,13501,8.75,,,, +US-NY-13502,US,NY,13502,8.75,,,, +US-NY-13503,US,NY,13503,8.75,,,, +US-NY-13504,US,NY,13504,8.75,,,, +US-NY-13505,US,NY,13505,8.75,,,, +US-NY-13599,US,NY,13599,8.75,,,, +US-NY-13601,US,NY,13601,7.75,,,, +US-NY-13602,US,NY,13602,7.75,,,, +US-NY-13603,US,NY,13603,7.75,,,, +US-NY-13605,US,NY,13605,7.75,,,, +US-NY-13606,US,NY,13606,7.75,,,, +US-NY-13607,US,NY,13607,7.75,,,, +US-NY-13608,US,NY,13608,7.75,,,, +US-NY-13611,US,NY,13611,7.75,,,, +US-NY-13612,US,NY,13612,7.75,,,, +US-NY-13613,US,NY,13613,7,,,, +US-NY-13614,US,NY,13614,7,,,, +US-NY-13615,US,NY,13615,7.75,,,, +US-NY-13616,US,NY,13616,7.75,,,, +US-NY-13617,US,NY,13617,7,,,, +US-NY-13618,US,NY,13618,7.75,,,, +US-NY-13619,US,NY,13619,7.75,,,, +US-NY-13620,US,NY,13620,7.75,,,, +US-NY-13621,US,NY,13621,7,,,, +US-NY-13622,US,NY,13622,7.75,,,, +US-NY-13623,US,NY,13623,7,,,, +US-NY-13624,US,NY,13624,7.75,,,, +US-NY-13625,US,NY,13625,7,,,, +US-NY-13626,US,NY,13626,7.75,,,, +US-NY-13627,US,NY,13627,7.75,,,, +US-NY-13628,US,NY,13628,7.75,,,, +US-NY-13630,US,NY,13630,7,,,, +US-NY-13631,US,NY,13631,7.75,,,, +US-NY-13632,US,NY,13632,7.75,,,, +US-NY-13633,US,NY,13633,7,,,, +US-NY-13634,US,NY,13634,7.75,,,, +US-NY-13635,US,NY,13635,7,,,, +US-NY-13636,US,NY,13636,7.75,,,, +US-NY-13637,US,NY,13637,7.75,,,, +US-NY-13638,US,NY,13638,7.75,,,, +US-NY-13639,US,NY,13639,7,,,, +US-NY-13640,US,NY,13640,7.75,,,, +US-NY-13641,US,NY,13641,7.75,,,, +US-NY-13642,US,NY,13642,7,,,, +US-NY-13643,US,NY,13643,7.75,,,, +US-NY-13645,US,NY,13645,7,,,, +US-NY-13646,US,NY,13646,7,,,, +US-NY-13647,US,NY,13647,7,,,, +US-NY-13648,US,NY,13648,7.75,,,, +US-NY-13649,US,NY,13649,7,,,, +US-NY-13650,US,NY,13650,7.75,,,, +US-NY-13651,US,NY,13651,7.75,,,, +US-NY-13652,US,NY,13652,7,,,, +US-NY-13654,US,NY,13654,7,,,, +US-NY-13655,US,NY,13655,8,,,, +US-NY-13656,US,NY,13656,7.75,,,, +US-NY-13657,US,NY,13657,7.75,,,, +US-NY-13658,US,NY,13658,7,,,, +US-NY-13659,US,NY,13659,7.75,,,, +US-NY-13660,US,NY,13660,7,,,, +US-NY-13661,US,NY,13661,7.75,,,, +US-NY-13662,US,NY,13662,7,,,, +US-NY-13664,US,NY,13664,7,,,, +US-NY-13665,US,NY,13665,7.75,,,, +US-NY-13666,US,NY,13666,7,,,, +US-NY-13667,US,NY,13667,7,,,, +US-NY-13668,US,NY,13668,7,,,, +US-NY-13669,US,NY,13669,7,,,, +US-NY-13670,US,NY,13670,7,,,, +US-NY-13671,US,NY,13671,7.75,,,, +US-NY-13672,US,NY,13672,7,,,, +US-NY-13673,US,NY,13673,7.75,,,, +US-NY-13674,US,NY,13674,7.75,,,, +US-NY-13675,US,NY,13675,7.75,,,, +US-NY-13676,US,NY,13676,7,,,, +US-NY-13677,US,NY,13677,7,,,, +US-NY-13678,US,NY,13678,7,,,, +US-NY-13679,US,NY,13679,7.75,,,, +US-NY-13680,US,NY,13680,7,,,, +US-NY-13681,US,NY,13681,7,,,, +US-NY-13682,US,NY,13682,7.75,,,, +US-NY-13683,US,NY,13683,7,,,, +US-NY-13684,US,NY,13684,7,,,, +US-NY-13685,US,NY,13685,7.75,,,, +US-NY-13687,US,NY,13687,7,,,, +US-NY-13690,US,NY,13690,7,,,, +US-NY-13691,US,NY,13691,7.75,,,, +US-NY-13692,US,NY,13692,7.75,,,, +US-NY-13693,US,NY,13693,7.75,,,, +US-NY-13694,US,NY,13694,7,,,, +US-NY-13695,US,NY,13695,7,,,, +US-NY-13696,US,NY,13696,7,,,, +US-NY-13697,US,NY,13697,7,,,, +US-NY-13699,US,NY,13699,7,,,, +US-NY-13730,US,NY,13730,8,,,, +US-NY-13731,US,NY,13731,8,,,, +US-NY-13732,US,NY,13732,8,,,, +US-NY-13733,US,NY,13733,8,,,, +US-NY-13734,US,NY,13734,8,,,, +US-NY-13736,US,NY,13736,8,,,, +US-NY-13737,US,NY,13737,8,,,, +US-NY-13738,US,NY,13738,8,,,, +US-NY-13739,US,NY,13739,8,,,, +US-NY-13740,US,NY,13740,8,,,, +US-NY-13743,US,NY,13743,8,,,, +US-NY-13744,US,NY,13744,8,,,, +US-NY-13745,US,NY,13745,8,,,, +US-NY-13746,US,NY,13746,8,,,, +US-NY-13747,US,NY,13747,8,,,, +US-NY-13748,US,NY,13748,8,,,, +US-NY-13749,US,NY,13749,8,,,, +US-NY-13750,US,NY,13750,8,,,, +US-NY-13751,US,NY,13751,8,,,, +US-NY-13752,US,NY,13752,8,,,, +US-NY-13753,US,NY,13753,8,,,, +US-NY-13754,US,NY,13754,8,,,, +US-NY-13755,US,NY,13755,8,,,, +US-NY-13756,US,NY,13756,8,,,, +US-NY-13757,US,NY,13757,8,,,, +US-NY-13758,US,NY,13758,8,,,, +US-NY-13760,US,NY,13760,8,,,, +US-NY-13761,US,NY,13761,8,,,, +US-NY-13762,US,NY,13762,8,,,, +US-NY-13763,US,NY,13763,8,,,, +US-NY-13774,US,NY,13774,8,,,, +US-NY-13775,US,NY,13775,8,,,, +US-NY-13776,US,NY,13776,8,,,, +US-NY-13777,US,NY,13777,8,,,, +US-NY-13778,US,NY,13778,8,,,, +US-NY-13780,US,NY,13780,8,,,, +US-NY-13782,US,NY,13782,8,,,, +US-NY-13783,US,NY,13783,8,,,, +US-NY-13784,US,NY,13784,8,,,, +US-NY-13786,US,NY,13786,8,,,, +US-NY-13787,US,NY,13787,8,,,, +US-NY-13788,US,NY,13788,8,,,, +US-NY-13790,US,NY,13790,8,,,, +US-NY-13794,US,NY,13794,8,,,, +US-NY-13795,US,NY,13795,8,,,, +US-NY-13796,US,NY,13796,8,,,, +US-NY-13797,US,NY,13797,8,,,, +US-NY-13801,US,NY,13801,8,,,, +US-NY-13802,US,NY,13802,8,,,, +US-NY-13803,US,NY,13803,8,,,, +US-NY-13804,US,NY,13804,8,,,, +US-NY-13806,US,NY,13806,8,,,, +US-NY-13807,US,NY,13807,8,,,, +US-NY-13808,US,NY,13808,8,,,, +US-NY-13809,US,NY,13809,8,,,, +US-NY-13810,US,NY,13810,8,,,, +US-NY-13811,US,NY,13811,8,,,, +US-NY-13812,US,NY,13812,8,,,, +US-NY-13813,US,NY,13813,8,,,, +US-NY-13814,US,NY,13814,8,,,, +US-NY-13815,US,NY,13815,8,,,, +US-NY-13820,US,NY,13820,8,,,, +US-NY-13825,US,NY,13825,8,,,, +US-NY-13826,US,NY,13826,8,,,, +US-NY-13827,US,NY,13827,8,,,, +US-NY-13830,US,NY,13830,8,,,, +US-NY-13832,US,NY,13832,8,,,, +US-NY-13833,US,NY,13833,8,,,, +US-NY-13834,US,NY,13834,8,,,, +US-NY-13835,US,NY,13835,8,,,, +US-NY-13838,US,NY,13838,8,,,, +US-NY-13839,US,NY,13839,8,,,, +US-NY-13840,US,NY,13840,8,,,, +US-NY-13841,US,NY,13841,8,,,, +US-NY-13842,US,NY,13842,8,,,, +US-NY-13843,US,NY,13843,8,,,, +US-NY-13844,US,NY,13844,8,,,, +US-NY-13845,US,NY,13845,8,,,, +US-NY-13846,US,NY,13846,8,,,, +US-NY-13847,US,NY,13847,8,,,, +US-NY-13848,US,NY,13848,8,,,, +US-NY-13849,US,NY,13849,8,,,, +US-NY-13850,US,NY,13850,8,,,, +US-NY-13851,US,NY,13851,8,,,, +US-NY-13856,US,NY,13856,8,,,, +US-NY-13859,US,NY,13859,8,,,, +US-NY-13860,US,NY,13860,8,,,, +US-NY-13861,US,NY,13861,8,,,, +US-NY-13862,US,NY,13862,8,,,, +US-NY-13863,US,NY,13863,8,,,, +US-NY-13864,US,NY,13864,8,,,, +US-NY-13865,US,NY,13865,8,,,, +US-NY-13901,US,NY,13901,8,,,, +US-NY-13902,US,NY,13902,8,,,, +US-NY-13903,US,NY,13903,8,,,, +US-NY-13904,US,NY,13904,8,,,, +US-NY-13905,US,NY,13905,8,,,, +US-NY-14001,US,NY,14001,8.75,,,, +US-NY-14004,US,NY,14004,8.75,,,, +US-NY-14005,US,NY,14005,8,,,, +US-NY-14006,US,NY,14006,8.75,,,, +US-NY-14008,US,NY,14008,8,,,, +US-NY-14009,US,NY,14009,8,,,, +US-NY-14010,US,NY,14010,8.75,,,, +US-NY-14011,US,NY,14011,8,,,, +US-NY-14012,US,NY,14012,8,,,, +US-NY-14013,US,NY,14013,8,,,, +US-NY-14020,US,NY,14020,8,,,, +US-NY-14021,US,NY,14021,8,,,, +US-NY-14024,US,NY,14024,8,,,, +US-NY-14025,US,NY,14025,8.75,,,, +US-NY-14026,US,NY,14026,8.75,,,, +US-NY-14027,US,NY,14027,8.75,,,, +US-NY-14028,US,NY,14028,8,,,, +US-NY-14029,US,NY,14029,8.5,,,, +US-NY-14030,US,NY,14030,8.75,,,, +US-NY-14031,US,NY,14031,8.75,,,, +US-NY-14032,US,NY,14032,8.75,,,, +US-NY-14033,US,NY,14033,8.75,,,, +US-NY-14034,US,NY,14034,8.75,,,, +US-NY-14035,US,NY,14035,8.75,,,, +US-NY-14036,US,NY,14036,8,,,, +US-NY-14037,US,NY,14037,8,,,, +US-NY-14038,US,NY,14038,8.75,,,, +US-NY-14039,US,NY,14039,8,,,, +US-NY-14040,US,NY,14040,8,,,, +US-NY-14041,US,NY,14041,8,,,, +US-NY-14042,US,NY,14042,8,,,, +US-NY-14043,US,NY,14043,8.75,,,, +US-NY-14047,US,NY,14047,8.75,,,, +US-NY-14048,US,NY,14048,7.5,,,, +US-NY-14051,US,NY,14051,8.75,,,, +US-NY-14052,US,NY,14052,8.75,,,, +US-NY-14054,US,NY,14054,8,,,, +US-NY-14055,US,NY,14055,8.75,,,, +US-NY-14056,US,NY,14056,8,,,, +US-NY-14057,US,NY,14057,8.75,,,, +US-NY-14058,US,NY,14058,8,,,, +US-NY-14059,US,NY,14059,8.75,,,, +US-NY-14060,US,NY,14060,8.5,,,, +US-NY-14061,US,NY,14061,8.75,,,, +US-NY-14062,US,NY,14062,7.5,,,, +US-NY-14063,US,NY,14063,7.5,,,, +US-NY-14065,US,NY,14065,8,,,, +US-NY-14066,US,NY,14066,8,,,, +US-NY-14067,US,NY,14067,8,,,, +US-NY-14068,US,NY,14068,8.75,,,, +US-NY-14069,US,NY,14069,8.75,,,, +US-NY-14070,US,NY,14070,8,,,, +US-NY-14072,US,NY,14072,8.75,,,, +US-NY-14075,US,NY,14075,8.75,,,, +US-NY-14080,US,NY,14080,8.75,,,, +US-NY-14081,US,NY,14081,8.75,,,, +US-NY-14082,US,NY,14082,8,,,, +US-NY-14083,US,NY,14083,8,,,, +US-NY-14085,US,NY,14085,8.75,,,, +US-NY-14086,US,NY,14086,8.75,,,, +US-NY-14091,US,NY,14091,8.75,,,, +US-NY-14092,US,NY,14092,8,,,, +US-NY-14094,US,NY,14094,8,,,, +US-NY-14095,US,NY,14095,8,,,, +US-NY-14098,US,NY,14098,8,,,, +US-NY-14101,US,NY,14101,8,,,, +US-NY-14102,US,NY,14102,8.75,,,, +US-NY-14103,US,NY,14103,8,,,, +US-NY-14105,US,NY,14105,8,,,, +US-NY-14107,US,NY,14107,8,,,, +US-NY-14108,US,NY,14108,8,,,, +US-NY-14109,US,NY,14109,8,,,, +US-NY-14110,US,NY,14110,8.75,,,, +US-NY-14111,US,NY,14111,8.75,,,, +US-NY-14112,US,NY,14112,8.75,,,, +US-NY-14113,US,NY,14113,8,,,, +US-NY-14120,US,NY,14120,8,,,, +US-NY-14125,US,NY,14125,8,,,, +US-NY-14126,US,NY,14126,8,,,, +US-NY-14127,US,NY,14127,8.75,,,, +US-NY-14129,US,NY,14129,8,,,, +US-NY-14130,US,NY,14130,8,,,, +US-NY-14131,US,NY,14131,8,,,, +US-NY-14132,US,NY,14132,8,,,, +US-NY-14133,US,NY,14133,8,,,, +US-NY-14134,US,NY,14134,8.75,,,, +US-NY-14135,US,NY,14135,7.5,,,, +US-NY-14136,US,NY,14136,7.5,,,, +US-NY-14138,US,NY,14138,8,,,, +US-NY-14139,US,NY,14139,8.75,,,, +US-NY-14140,US,NY,14140,8.75,,,, +US-NY-14141,US,NY,14141,8.75,,,, +US-NY-14143,US,NY,14143,8,,,, +US-NY-14144,US,NY,14144,8,,,, +US-NY-14145,US,NY,14145,8,,,, +US-NY-14150,US,NY,14150,8.75,,,, +US-NY-14151,US,NY,14151,8.75,,,, +US-NY-14166,US,NY,14166,7.5,,,, +US-NY-14167,US,NY,14167,8,,,, +US-NY-14168,US,NY,14168,8,,,, +US-NY-14169,US,NY,14169,8.75,,,, +US-NY-14170,US,NY,14170,8.75,,,, +US-NY-14171,US,NY,14171,8,,,, +US-NY-14172,US,NY,14172,8,,,, +US-NY-14173,US,NY,14173,8,,,, +US-NY-14174,US,NY,14174,8,,,, +US-NY-14201,US,NY,14201,8.75,,,, +US-NY-14202,US,NY,14202,8.75,,,, +US-NY-14203,US,NY,14203,8.75,,,, +US-NY-14204,US,NY,14204,8.75,,,, +US-NY-14205,US,NY,14205,8.75,,,, +US-NY-14206,US,NY,14206,8.75,,,, +US-NY-14207,US,NY,14207,8.75,,,, +US-NY-14208,US,NY,14208,8.75,,,, +US-NY-14209,US,NY,14209,8.75,,,, +US-NY-14210,US,NY,14210,8.75,,,, +US-NY-14211,US,NY,14211,8.75,,,, +US-NY-14212,US,NY,14212,8.75,,,, +US-NY-14213,US,NY,14213,8.75,,,, +US-NY-14214,US,NY,14214,8.75,,,, +US-NY-14215,US,NY,14215,8.75,,,, +US-NY-14216,US,NY,14216,8.75,,,, +US-NY-14217,US,NY,14217,8.75,,,, +US-NY-14218,US,NY,14218,8.75,,,, +US-NY-14219,US,NY,14219,8.75,,,, +US-NY-14220,US,NY,14220,8.75,,,, +US-NY-14221,US,NY,14221,8.75,,,, +US-NY-14222,US,NY,14222,8.75,,,, +US-NY-14223,US,NY,14223,8.75,,,, +US-NY-14224,US,NY,14224,8.75,,,, +US-NY-14225,US,NY,14225,8.75,,,, +US-NY-14226,US,NY,14226,8.75,,,, +US-NY-14227,US,NY,14227,8.75,,,, +US-NY-14228,US,NY,14228,8.75,,,, +US-NY-14231,US,NY,14231,8.75,,,, +US-NY-14233,US,NY,14233,8.75,,,, +US-NY-14240,US,NY,14240,8.75,,,, +US-NY-14241,US,NY,14241,8.75,,,, +US-NY-14260,US,NY,14260,8.75,,,, +US-NY-14261,US,NY,14261,8.75,,,, +US-NY-14263,US,NY,14263,8.75,,,, +US-NY-14264,US,NY,14264,8.75,,,, +US-NY-14265,US,NY,14265,8.75,,,, +US-NY-14267,US,NY,14267,8.75,,,, +US-NY-14269,US,NY,14269,8.75,,,, +US-NY-14270,US,NY,14270,8.75,,,, +US-NY-14272,US,NY,14272,8.75,,,, +US-NY-14273,US,NY,14273,8.75,,,, +US-NY-14276,US,NY,14276,8.75,,,, +US-NY-14280,US,NY,14280,8.75,,,, +US-NY-14301,US,NY,14301,8,,,, +US-NY-14302,US,NY,14302,8,,,, +US-NY-14303,US,NY,14303,8,,,, +US-NY-14304,US,NY,14304,8,,,, +US-NY-14305,US,NY,14305,8,,,, +US-NY-14410,US,NY,14410,8,,,, +US-NY-14411,US,NY,14411,8,,,, +US-NY-14413,US,NY,14413,8,,,, +US-NY-14414,US,NY,14414,8,,,, +US-NY-14415,US,NY,14415,8,,,, +US-NY-14416,US,NY,14416,8,,,, +US-NY-14418,US,NY,14418,8,,,, +US-NY-14420,US,NY,14420,8,,,, +US-NY-14422,US,NY,14422,8,,,, +US-NY-14423,US,NY,14423,8,,,, +US-NY-14424,US,NY,14424,7.5,,,, +US-NY-14425,US,NY,14425,7.5,,,, +US-NY-14427,US,NY,14427,8,,,, +US-NY-14428,US,NY,14428,8,,,, +US-NY-14429,US,NY,14429,8,,,, +US-NY-14430,US,NY,14430,8,,,, +US-NY-14432,US,NY,14432,7.5,,,, +US-NY-14433,US,NY,14433,8,,,, +US-NY-14435,US,NY,14435,8,,,, +US-NY-14437,US,NY,14437,8,,,, +US-NY-14441,US,NY,14441,8,,,, +US-NY-14443,US,NY,14443,7.5,,,, +US-NY-14445,US,NY,14445,8,,,, +US-NY-14449,US,NY,14449,8,,,, +US-NY-14450,US,NY,14450,8,,,, +US-NY-14452,US,NY,14452,8,,,, +US-NY-14453,US,NY,14453,7.5,,,, +US-NY-14454,US,NY,14454,8,,,, +US-NY-14456,US,NY,14456,7.5,,,, +US-NY-14461,US,NY,14461,7.5,,,, +US-NY-14462,US,NY,14462,8,,,, +US-NY-14463,US,NY,14463,7.5,,,, +US-NY-14464,US,NY,14464,8,,,, +US-NY-14466,US,NY,14466,7.5,,,, +US-NY-14467,US,NY,14467,8,,,, +US-NY-14468,US,NY,14468,8,,,, +US-NY-14469,US,NY,14469,7.5,,,, +US-NY-14470,US,NY,14470,8,,,, +US-NY-14471,US,NY,14471,7.5,,,, +US-NY-14472,US,NY,14472,8,,,, +US-NY-14475,US,NY,14475,7.5,,,, +US-NY-14476,US,NY,14476,8,,,, +US-NY-14477,US,NY,14477,8,,,, +US-NY-14478,US,NY,14478,8,,,, +US-NY-14479,US,NY,14479,8,,,, +US-NY-14480,US,NY,14480,8,,,, +US-NY-14481,US,NY,14481,8,,,, +US-NY-14482,US,NY,14482,8,,,, +US-NY-14485,US,NY,14485,8,,,, +US-NY-14486,US,NY,14486,8,,,, +US-NY-14487,US,NY,14487,8,,,, +US-NY-14488,US,NY,14488,8,,,, +US-NY-14489,US,NY,14489,8,,,, +US-NY-14502,US,NY,14502,8,,,, +US-NY-14504,US,NY,14504,7.5,,,, +US-NY-14505,US,NY,14505,8,,,, +US-NY-14506,US,NY,14506,8,,,, +US-NY-14507,US,NY,14507,8,,,, +US-NY-14508,US,NY,14508,8,,,, +US-NY-14510,US,NY,14510,8,,,, +US-NY-14511,US,NY,14511,8,,,, +US-NY-14512,US,NY,14512,7.5,,,, +US-NY-14513,US,NY,14513,8,,,, +US-NY-14514,US,NY,14514,8,,,, +US-NY-14515,US,NY,14515,8,,,, +US-NY-14516,US,NY,14516,8,,,, +US-NY-14517,US,NY,14517,8,,,, +US-NY-14518,US,NY,14518,7.5,,,, +US-NY-14519,US,NY,14519,8,,,, +US-NY-14520,US,NY,14520,8,,,, +US-NY-14521,US,NY,14521,8,,,, +US-NY-14522,US,NY,14522,8,,,, +US-NY-14525,US,NY,14525,8,,,, +US-NY-14526,US,NY,14526,8,,,, +US-NY-14527,US,NY,14527,8,,,, +US-NY-14529,US,NY,14529,8,,,, +US-NY-14530,US,NY,14530,8,,,, +US-NY-14532,US,NY,14532,7.5,,,, +US-NY-14533,US,NY,14533,8,,,, +US-NY-14534,US,NY,14534,8,,,, +US-NY-14536,US,NY,14536,8,,,, +US-NY-14537,US,NY,14537,7.5,,,, +US-NY-14538,US,NY,14538,8,,,, +US-NY-14539,US,NY,14539,8,,,, +US-NY-14541,US,NY,14541,8,,,, +US-NY-14542,US,NY,14542,8,,,, +US-NY-14543,US,NY,14543,8,,,, +US-NY-14544,US,NY,14544,8,,,, +US-NY-14545,US,NY,14545,8,,,, +US-NY-14546,US,NY,14546,8,,,, +US-NY-14547,US,NY,14547,7.5,,,, +US-NY-14548,US,NY,14548,7.5,,,, +US-NY-14549,US,NY,14549,8,,,, +US-NY-14550,US,NY,14550,8,,,, +US-NY-14551,US,NY,14551,8,,,, +US-NY-14555,US,NY,14555,8,,,, +US-NY-14556,US,NY,14556,8,,,, +US-NY-14557,US,NY,14557,8,,,, +US-NY-14558,US,NY,14558,8,,,, +US-NY-14559,US,NY,14559,8,,,, +US-NY-14560,US,NY,14560,7.5,,,, +US-NY-14561,US,NY,14561,7.5,,,, +US-NY-14563,US,NY,14563,8,,,, +US-NY-14564,US,NY,14564,7.5,,,, +US-NY-14568,US,NY,14568,8,,,, +US-NY-14569,US,NY,14569,8,,,, +US-NY-14571,US,NY,14571,8,,,, +US-NY-14572,US,NY,14572,8,,,, +US-NY-14580,US,NY,14580,8,,,, +US-NY-14585,US,NY,14585,7.5,,,, +US-NY-14586,US,NY,14586,8,,,, +US-NY-14588,US,NY,14588,8,,,, +US-NY-14589,US,NY,14589,8,,,, +US-NY-14590,US,NY,14590,8,,,, +US-NY-14591,US,NY,14591,8,,,, +US-NY-14592,US,NY,14592,8,,,, +US-NY-14602,US,NY,14602,8,,,, +US-NY-14603,US,NY,14603,8,,,, +US-NY-14604,US,NY,14604,8,,,, +US-NY-14605,US,NY,14605,8,,,, +US-NY-14606,US,NY,14606,8,,,, +US-NY-14607,US,NY,14607,8,,,, +US-NY-14608,US,NY,14608,8,,,, +US-NY-14609,US,NY,14609,8,,,, +US-NY-14610,US,NY,14610,8,,,, +US-NY-14611,US,NY,14611,8,,,, +US-NY-14612,US,NY,14612,8,,,, +US-NY-14613,US,NY,14613,8,,,, +US-NY-14614,US,NY,14614,8,,,, +US-NY-14615,US,NY,14615,8,,,, +US-NY-14616,US,NY,14616,8,,,, +US-NY-14617,US,NY,14617,8,,,, +US-NY-14618,US,NY,14618,8,,,, +US-NY-14619,US,NY,14619,8,,,, +US-NY-14620,US,NY,14620,8,,,, +US-NY-14621,US,NY,14621,8,,,, +US-NY-14622,US,NY,14622,8,,,, +US-NY-14623,US,NY,14623,8,,,, +US-NY-14624,US,NY,14624,8,,,, +US-NY-14625,US,NY,14625,8,,,, +US-NY-14626,US,NY,14626,8,,,, +US-NY-14627,US,NY,14627,8,,,, +US-NY-14638,US,NY,14638,8,,,, +US-NY-14639,US,NY,14639,8,,,, +US-NY-14642,US,NY,14642,8,,,, +US-NY-14643,US,NY,14643,8,,,, +US-NY-14644,US,NY,14644,8,,,, +US-NY-14646,US,NY,14646,8,,,, +US-NY-14647,US,NY,14647,8,,,, +US-NY-14649,US,NY,14649,8,,,, +US-NY-14650,US,NY,14650,8,,,, +US-NY-14651,US,NY,14651,8,,,, +US-NY-14652,US,NY,14652,8,,,, +US-NY-14653,US,NY,14653,8,,,, +US-NY-14692,US,NY,14692,8,,,, +US-NY-14694,US,NY,14694,8,,,, +US-NY-14701,US,NY,14701,7.5,,,, +US-NY-14702,US,NY,14702,7.5,,,, +US-NY-14706,US,NY,14706,8,,,, +US-NY-14707,US,NY,14707,8.5,,,, +US-NY-14708,US,NY,14708,8.5,,,, +US-NY-14709,US,NY,14709,8.5,,,, +US-NY-14710,US,NY,14710,7.5,,,, +US-NY-14711,US,NY,14711,8.5,,,, +US-NY-14712,US,NY,14712,7.5,,,, +US-NY-14714,US,NY,14714,8.5,,,, +US-NY-14715,US,NY,14715,8.5,,,, +US-NY-14716,US,NY,14716,7.5,,,, +US-NY-14717,US,NY,14717,8.5,,,, +US-NY-14718,US,NY,14718,7.5,,,, +US-NY-14719,US,NY,14719,8,,,, +US-NY-14720,US,NY,14720,7.5,,,, +US-NY-14721,US,NY,14721,8.5,,,, +US-NY-14722,US,NY,14722,7.5,,,, +US-NY-14723,US,NY,14723,7.5,,,, +US-NY-14724,US,NY,14724,7.5,,,, +US-NY-14726,US,NY,14726,8,,,, +US-NY-14727,US,NY,14727,8.5,,,, +US-NY-14728,US,NY,14728,7.5,,,, +US-NY-14729,US,NY,14729,8,,,, +US-NY-14730,US,NY,14730,8,,,, +US-NY-14731,US,NY,14731,8,,,, +US-NY-14732,US,NY,14732,7.5,,,, +US-NY-14733,US,NY,14733,7.5,,,, +US-NY-14735,US,NY,14735,8.5,,,, +US-NY-14736,US,NY,14736,7.5,,,, +US-NY-14737,US,NY,14737,8,,,, +US-NY-14738,US,NY,14738,7.5,,,, +US-NY-14739,US,NY,14739,8.5,,,, +US-NY-14740,US,NY,14740,7.5,,,, +US-NY-14741,US,NY,14741,8,,,, +US-NY-14742,US,NY,14742,7.5,,,, +US-NY-14743,US,NY,14743,8,,,, +US-NY-14744,US,NY,14744,8.5,,,, +US-NY-14745,US,NY,14745,8.5,,,, +US-NY-14747,US,NY,14747,7.5,,,, +US-NY-14748,US,NY,14748,8,,,, +US-NY-14750,US,NY,14750,7.5,,,, +US-NY-14751,US,NY,14751,8,,,, +US-NY-14752,US,NY,14752,7.5,,,, +US-NY-14753,US,NY,14753,8,,,, +US-NY-14754,US,NY,14754,8.5,,,, +US-NY-14755,US,NY,14755,8,,,, +US-NY-14756,US,NY,14756,7.5,,,, +US-NY-14757,US,NY,14757,7.5,,,, +US-NY-14758,US,NY,14758,7.5,,,, +US-NY-14760,US,NY,14760,8,,,, +US-NY-14766,US,NY,14766,8,,,, +US-NY-14767,US,NY,14767,7.5,,,, +US-NY-14769,US,NY,14769,7.5,,,, +US-NY-14770,US,NY,14770,8,,,, +US-NY-14772,US,NY,14772,8,,,, +US-NY-14774,US,NY,14774,8.5,,,, +US-NY-14775,US,NY,14775,7.5,,,, +US-NY-14777,US,NY,14777,8.5,,,, +US-NY-14778,US,NY,14778,8,,,, +US-NY-14779,US,NY,14779,8,,,, +US-NY-14781,US,NY,14781,7.5,,,, +US-NY-14782,US,NY,14782,7.5,,,, +US-NY-14783,US,NY,14783,8,,,, +US-NY-14784,US,NY,14784,7.5,,,, +US-NY-14785,US,NY,14785,7.5,,,, +US-NY-14786,US,NY,14786,8.5,,,, +US-NY-14787,US,NY,14787,7.5,,,, +US-NY-14788,US,NY,14788,8,,,, +US-NY-14801,US,NY,14801,8,,,, +US-NY-14802,US,NY,14802,8.5,,,, +US-NY-14803,US,NY,14803,8.5,,,, +US-NY-14804,US,NY,14804,8.5,,,, +US-NY-14805,US,NY,14805,8,,,, +US-NY-14806,US,NY,14806,8.5,,,, +US-NY-14807,US,NY,14807,8,,,, +US-NY-14808,US,NY,14808,8,,,, +US-NY-14809,US,NY,14809,8,,,, +US-NY-14810,US,NY,14810,8,,,, +US-NY-14812,US,NY,14812,8,,,, +US-NY-14813,US,NY,14813,8.5,,,, +US-NY-14814,US,NY,14814,8,,,, +US-NY-14815,US,NY,14815,8,,,, +US-NY-14816,US,NY,14816,8,,,, +US-NY-14817,US,NY,14817,8,,,, +US-NY-14818,US,NY,14818,8,,,, +US-NY-14819,US,NY,14819,8,,,, +US-NY-14820,US,NY,14820,8,,,, +US-NY-14821,US,NY,14821,8,,,, +US-NY-14822,US,NY,14822,8.5,,,, +US-NY-14823,US,NY,14823,8,,,, +US-NY-14824,US,NY,14824,8,,,, +US-NY-14825,US,NY,14825,8,,,, +US-NY-14826,US,NY,14826,8,,,, +US-NY-14827,US,NY,14827,8,,,, +US-NY-14830,US,NY,14830,8,,,, +US-NY-14831,US,NY,14831,8,,,, +US-NY-14836,US,NY,14836,8,,,, +US-NY-14837,US,NY,14837,8,,,, +US-NY-14838,US,NY,14838,8,,,, +US-NY-14839,US,NY,14839,8,,,, +US-NY-14840,US,NY,14840,8,,,, +US-NY-14841,US,NY,14841,8,,,, +US-NY-14842,US,NY,14842,8,,,, +US-NY-14843,US,NY,14843,8,,,, +US-NY-14845,US,NY,14845,8,,,, +US-NY-14846,US,NY,14846,8,,,, +US-NY-14847,US,NY,14847,8,,,, +US-NY-14850,US,NY,14850,8,,,, +US-NY-14851,US,NY,14851,8,,,, +US-NY-14852,US,NY,14852,8,,,, +US-NY-14853,US,NY,14853,8,,,, +US-NY-14854,US,NY,14854,8,,,, +US-NY-14855,US,NY,14855,8,,,, +US-NY-14856,US,NY,14856,8,,,, +US-NY-14857,US,NY,14857,8,,,, +US-NY-14858,US,NY,14858,8,,,, +US-NY-14859,US,NY,14859,8,,,, +US-NY-14860,US,NY,14860,8,,,, +US-NY-14861,US,NY,14861,8,,,, +US-NY-14863,US,NY,14863,8,,,, +US-NY-14864,US,NY,14864,8,,,, +US-NY-14865,US,NY,14865,8,,,, +US-NY-14867,US,NY,14867,8,,,, +US-NY-14869,US,NY,14869,8,,,, +US-NY-14870,US,NY,14870,8,,,, +US-NY-14871,US,NY,14871,8,,,, +US-NY-14872,US,NY,14872,8,,,, +US-NY-14873,US,NY,14873,8,,,, +US-NY-14874,US,NY,14874,8,,,, +US-NY-14876,US,NY,14876,8,,,, +US-NY-14877,US,NY,14877,8,,,, +US-NY-14878,US,NY,14878,8,,,, +US-NY-14879,US,NY,14879,8,,,, +US-NY-14880,US,NY,14880,8.5,,,, +US-NY-14881,US,NY,14881,8,,,, +US-NY-14882,US,NY,14882,8,,,, +US-NY-14883,US,NY,14883,8,,,, +US-NY-14884,US,NY,14884,8.5,,,, +US-NY-14885,US,NY,14885,8,,,, +US-NY-14886,US,NY,14886,8,,,, +US-NY-14887,US,NY,14887,8,,,, +US-NY-14889,US,NY,14889,8,,,, +US-NY-14891,US,NY,14891,8,,,, +US-NY-14892,US,NY,14892,8,,,, +US-NY-14893,US,NY,14893,8,,,, +US-NY-14894,US,NY,14894,8,,,, +US-NY-14895,US,NY,14895,8.5,,,, +US-NY-14897,US,NY,14897,8.5,,,, +US-NY-14898,US,NY,14898,8,,,, +US-NY-14901,US,NY,14901,8,,,, +US-NY-14902,US,NY,14902,8,,,, +US-NY-14903,US,NY,14903,8,,,, +US-NY-14904,US,NY,14904,8,,,, +US-NY-14905,US,NY,14905,8,,,, +US-NY-14925,US,NY,14925,8,,,, +US-OH-43001,US,OH,43001,7.25,,,, +US-OH-43002,US,OH,43002,7,,,, +US-OH-43003,US,OH,43003,7,,,, +US-OH-43004,US,OH,43004,7,,,, +US-OH-43005,US,OH,43005,6.75,,,, +US-OH-43006,US,OH,43006,6.75,,,, +US-OH-43007,US,OH,43007,7,,,, +US-OH-43008,US,OH,43008,7.25,,,, +US-OH-43009,US,OH,43009,7.25,,,, +US-OH-43010,US,OH,43010,7.25,,,, +US-OH-43011,US,OH,43011,6.75,,,, +US-OH-43013,US,OH,43013,7.25,,,, +US-OH-43014,US,OH,43014,6.75,,,, +US-OH-43015,US,OH,43015,7,,,, +US-OH-43016,US,OH,43016,7,,,, +US-OH-43017,US,OH,43017,7,,,, +US-OH-43018,US,OH,43018,7.25,,,, +US-OH-43019,US,OH,43019,6.75,,,, +US-OH-43021,US,OH,43021,7,,,, +US-OH-43022,US,OH,43022,6.75,,,, +US-OH-43023,US,OH,43023,7.25,,,, +US-OH-43025,US,OH,43025,7.25,,,, +US-OH-43026,US,OH,43026,7,,,, +US-OH-43027,US,OH,43027,7.25,,,, +US-OH-43028,US,OH,43028,6.75,,,, +US-OH-43029,US,OH,43029,7,,,, +US-OH-43030,US,OH,43030,7.25,,,, +US-OH-43031,US,OH,43031,7.25,,,, +US-OH-43032,US,OH,43032,7,,,, +US-OH-43033,US,OH,43033,7.25,,,, +US-OH-43035,US,OH,43035,7,,,, +US-OH-43036,US,OH,43036,7,,,, +US-OH-43037,US,OH,43037,6.75,,,, +US-OH-43040,US,OH,43040,7,,,, +US-OH-43041,US,OH,43041,7,,,, +US-OH-43044,US,OH,43044,7.25,,,, +US-OH-43045,US,OH,43045,7,,,, +US-OH-43046,US,OH,43046,6.75,,,, +US-OH-43047,US,OH,43047,7.25,,,, +US-OH-43048,US,OH,43048,6.75,,,, +US-OH-43050,US,OH,43050,6.75,,,, +US-OH-43054,US,OH,43054,7,,,, +US-OH-43055,US,OH,43055,7.25,,,, +US-OH-43056,US,OH,43056,7.25,,,, +US-OH-43058,US,OH,43058,7.25,,,, +US-OH-43060,US,OH,43060,7.25,,,, +US-OH-43061,US,OH,43061,7,,,, +US-OH-43062,US,OH,43062,7.25,,,, +US-OH-43064,US,OH,43064,7,,,, +US-OH-43065,US,OH,43065,7,,,, +US-OH-43066,US,OH,43066,7,,,, +US-OH-43067,US,OH,43067,7,,,, +US-OH-43068,US,OH,43068,7,,,, +US-OH-43069,US,OH,43069,7.25,,,, +US-OH-43070,US,OH,43070,7.25,,,, +US-OH-43071,US,OH,43071,7.25,,,, +US-OH-43072,US,OH,43072,7.25,,,, +US-OH-43073,US,OH,43073,7.25,,,, +US-OH-43074,US,OH,43074,7,,,, +US-OH-43076,US,OH,43076,7.25,,,, +US-OH-43077,US,OH,43077,7,,,, +US-OH-43078,US,OH,43078,7.25,,,, +US-OH-43080,US,OH,43080,7.25,,,, +US-OH-43081,US,OH,43081,7,,,, +US-OH-43082,US,OH,43082,7,,,, +US-OH-43083,US,OH,43083,7.25,,,, +US-OH-43084,US,OH,43084,7.25,,,, +US-OH-43085,US,OH,43085,7,,,, +US-OH-43086,US,OH,43086,7,,,, +US-OH-43093,US,OH,43093,7.25,,,, +US-OH-43101,US,OH,43101,7.25,,,, +US-OH-43102,US,OH,43102,6.75,,,, +US-OH-43103,US,OH,43103,7.25,,,, +US-OH-43105,US,OH,43105,6.75,,,, +US-OH-43106,US,OH,43106,7.25,,,, +US-OH-43107,US,OH,43107,6.75,,,, +US-OH-43109,US,OH,43109,7,,,, +US-OH-43110,US,OH,43110,7,,,, +US-OH-43111,US,OH,43111,7,,,, +US-OH-43112,US,OH,43112,6.75,,,, +US-OH-43113,US,OH,43113,7.25,,,, +US-OH-43115,US,OH,43115,7.25,,,, +US-OH-43116,US,OH,43116,7.25,,,, +US-OH-43117,US,OH,43117,7.25,,,, +US-OH-43119,US,OH,43119,7,,,, +US-OH-43123,US,OH,43123,7,,,, +US-OH-43125,US,OH,43125,7,,,, +US-OH-43126,US,OH,43126,7,,,, +US-OH-43127,US,OH,43127,7,,,, +US-OH-43128,US,OH,43128,7.25,,,, +US-OH-43130,US,OH,43130,6.75,,,, +US-OH-43135,US,OH,43135,7,,,, +US-OH-43136,US,OH,43136,6.75,,,, +US-OH-43137,US,OH,43137,7,,,, +US-OH-43138,US,OH,43138,7,,,, +US-OH-43140,US,OH,43140,7,,,, +US-OH-43142,US,OH,43142,7.25,,,, +US-OH-43143,US,OH,43143,7,,,, +US-OH-43144,US,OH,43144,7,,,, +US-OH-43145,US,OH,43145,7.25,,,, +US-OH-43146,US,OH,43146,7.25,,,, +US-OH-43147,US,OH,43147,6.75,,,, +US-OH-43148,US,OH,43148,6.75,,,, +US-OH-43149,US,OH,43149,7,,,, +US-OH-43150,US,OH,43150,6.75,,,, +US-OH-43151,US,OH,43151,7,,,, +US-OH-43152,US,OH,43152,7,,,, +US-OH-43153,US,OH,43153,7,,,, +US-OH-43154,US,OH,43154,6.75,,,, +US-OH-43155,US,OH,43155,6.75,,,, +US-OH-43156,US,OH,43156,6.75,,,, +US-OH-43157,US,OH,43157,6.75,,,, +US-OH-43158,US,OH,43158,7,,,, +US-OH-43160,US,OH,43160,7.25,,,, +US-OH-43162,US,OH,43162,7,,,, +US-OH-43164,US,OH,43164,7.25,,,, +US-OH-43194,US,OH,43194,7,,,, +US-OH-43195,US,OH,43195,7,,,, +US-OH-43199,US,OH,43199,7,,,, +US-OH-43201,US,OH,43201,7,,,, +US-OH-43202,US,OH,43202,7,,,, +US-OH-43203,US,OH,43203,7,,,, +US-OH-43204,US,OH,43204,7,,,, +US-OH-43205,US,OH,43205,7,,,, +US-OH-43206,US,OH,43206,7,,,, +US-OH-43207,US,OH,43207,7,,,, +US-OH-43209,US,OH,43209,7,,,, +US-OH-43210,US,OH,43210,7,,,, +US-OH-43211,US,OH,43211,7,,,, +US-OH-43212,US,OH,43212,7,,,, +US-OH-43213,US,OH,43213,7,,,, +US-OH-43214,US,OH,43214,7,,,, +US-OH-43215,US,OH,43215,7,,,, +US-OH-43216,US,OH,43216,7,,,, +US-OH-43217,US,OH,43217,7,,,, +US-OH-43218,US,OH,43218,7,,,, +US-OH-43219,US,OH,43219,7,,,, +US-OH-43220,US,OH,43220,7,,,, +US-OH-43221,US,OH,43221,7,,,, +US-OH-43222,US,OH,43222,7,,,, +US-OH-43223,US,OH,43223,7,,,, +US-OH-43224,US,OH,43224,7,,,, +US-OH-43226,US,OH,43226,7,,,, +US-OH-43227,US,OH,43227,7,,,, +US-OH-43228,US,OH,43228,7,,,, +US-OH-43229,US,OH,43229,7,,,, +US-OH-43230,US,OH,43230,7,,,, +US-OH-43231,US,OH,43231,7,,,, +US-OH-43232,US,OH,43232,7,,,, +US-OH-43234,US,OH,43234,7,,,, +US-OH-43235,US,OH,43235,7,,,, +US-OH-43236,US,OH,43236,7,,,, +US-OH-43240,US,OH,43240,7.5,,,, +US-OH-43251,US,OH,43251,7,,,, +US-OH-43260,US,OH,43260,7,,,, +US-OH-43266,US,OH,43266,7,,,, +US-OH-43268,US,OH,43268,7,,,, +US-OH-43270,US,OH,43270,7,,,, +US-OH-43271,US,OH,43271,7,,,, +US-OH-43272,US,OH,43272,7,,,, +US-OH-43279,US,OH,43279,7,,,, +US-OH-43291,US,OH,43291,7,,,, +US-OH-43301,US,OH,43301,6.75,,,, +US-OH-43302,US,OH,43302,6.75,,,, +US-OH-43306,US,OH,43306,6.75,,,, +US-OH-43310,US,OH,43310,7.25,,,, +US-OH-43311,US,OH,43311,7.25,,,, +US-OH-43314,US,OH,43314,6.75,,,, +US-OH-43315,US,OH,43315,7.25,,,, +US-OH-43316,US,OH,43316,7.25,,,, +US-OH-43317,US,OH,43317,7.25,,,, +US-OH-43318,US,OH,43318,7.25,,,, +US-OH-43319,US,OH,43319,7.25,,,, +US-OH-43320,US,OH,43320,7.25,,,, +US-OH-43321,US,OH,43321,7.25,,,, +US-OH-43322,US,OH,43322,6.75,,,, +US-OH-43323,US,OH,43323,7.25,,,, +US-OH-43324,US,OH,43324,7.25,,,, +US-OH-43325,US,OH,43325,7.25,,,, +US-OH-43326,US,OH,43326,7.25,,,, +US-OH-43330,US,OH,43330,7.25,,,, +US-OH-43331,US,OH,43331,7.25,,,, +US-OH-43332,US,OH,43332,6.75,,,, +US-OH-43333,US,OH,43333,7.25,,,, +US-OH-43334,US,OH,43334,7.25,,,, +US-OH-43335,US,OH,43335,6.75,,,, +US-OH-43336,US,OH,43336,7.25,,,, +US-OH-43337,US,OH,43337,6.75,,,, +US-OH-43338,US,OH,43338,7.25,,,, +US-OH-43340,US,OH,43340,7.25,,,, +US-OH-43341,US,OH,43341,6.75,,,, +US-OH-43342,US,OH,43342,6.75,,,, +US-OH-43343,US,OH,43343,7.25,,,, +US-OH-43344,US,OH,43344,7,,,, +US-OH-43345,US,OH,43345,7.25,,,, +US-OH-43346,US,OH,43346,7.25,,,, +US-OH-43347,US,OH,43347,7.25,,,, +US-OH-43348,US,OH,43348,7.25,,,, +US-OH-43349,US,OH,43349,7.25,,,, +US-OH-43350,US,OH,43350,7.25,,,, +US-OH-43351,US,OH,43351,7.25,,,, +US-OH-43356,US,OH,43356,6.75,,,, +US-OH-43357,US,OH,43357,7.25,,,, +US-OH-43358,US,OH,43358,7.25,,,, +US-OH-43359,US,OH,43359,7.25,,,, +US-OH-43360,US,OH,43360,7.25,,,, +US-OH-43402,US,OH,43402,6.75,,,, +US-OH-43403,US,OH,43403,6.75,,,, +US-OH-43406,US,OH,43406,6.75,,,, +US-OH-43407,US,OH,43407,7.25,,,, +US-OH-43408,US,OH,43408,7,,,, +US-OH-43410,US,OH,43410,7.25,,,, +US-OH-43412,US,OH,43412,7,,,, +US-OH-43413,US,OH,43413,6.75,,,, +US-OH-43414,US,OH,43414,6.75,,,, +US-OH-43416,US,OH,43416,7,,,, +US-OH-43420,US,OH,43420,7.25,,,, +US-OH-43430,US,OH,43430,7,,,, +US-OH-43431,US,OH,43431,7.25,,,, +US-OH-43432,US,OH,43432,7,,,, +US-OH-43433,US,OH,43433,7,,,, +US-OH-43434,US,OH,43434,7,,,, +US-OH-43435,US,OH,43435,7.25,,,, +US-OH-43436,US,OH,43436,7,,,, +US-OH-43437,US,OH,43437,6.75,,,, +US-OH-43438,US,OH,43438,7,,,, +US-OH-43439,US,OH,43439,7,,,, +US-OH-43440,US,OH,43440,7,,,, +US-OH-43441,US,OH,43441,6.75,,,, +US-OH-43442,US,OH,43442,7.25,,,, +US-OH-43443,US,OH,43443,6.75,,,, +US-OH-43445,US,OH,43445,7,,,, +US-OH-43446,US,OH,43446,7,,,, +US-OH-43447,US,OH,43447,6.75,,,, +US-OH-43449,US,OH,43449,7,,,, +US-OH-43450,US,OH,43450,6.75,,,, +US-OH-43451,US,OH,43451,6.75,,,, +US-OH-43452,US,OH,43452,7,,,, +US-OH-43456,US,OH,43456,7,,,, +US-OH-43457,US,OH,43457,6.75,,,, +US-OH-43458,US,OH,43458,7,,,, +US-OH-43460,US,OH,43460,6.75,,,, +US-OH-43462,US,OH,43462,6.75,,,, +US-OH-43463,US,OH,43463,6.75,,,, +US-OH-43464,US,OH,43464,7.25,,,, +US-OH-43465,US,OH,43465,6.75,,,, +US-OH-43466,US,OH,43466,6.75,,,, +US-OH-43467,US,OH,43467,6.75,,,, +US-OH-43468,US,OH,43468,7,,,, +US-OH-43469,US,OH,43469,7.25,,,, +US-OH-43501,US,OH,43501,7.25,,,, +US-OH-43502,US,OH,43502,7.25,,,, +US-OH-43504,US,OH,43504,7,,,, +US-OH-43505,US,OH,43505,7.25,,,, +US-OH-43506,US,OH,43506,7.25,,,, +US-OH-43510,US,OH,43510,7.25,,,, +US-OH-43511,US,OH,43511,6.75,,,, +US-OH-43512,US,OH,43512,6.75,,,, +US-OH-43515,US,OH,43515,7.25,,,, +US-OH-43516,US,OH,43516,7.25,,,, +US-OH-43517,US,OH,43517,7.25,,,, +US-OH-43518,US,OH,43518,7.25,,,, +US-OH-43519,US,OH,43519,7.25,,,, +US-OH-43520,US,OH,43520,6.75,,,, +US-OH-43521,US,OH,43521,7.25,,,, +US-OH-43522,US,OH,43522,6.75,,,, +US-OH-43523,US,OH,43523,6.75,,,, +US-OH-43524,US,OH,43524,7.25,,,, +US-OH-43525,US,OH,43525,6.75,,,, +US-OH-43526,US,OH,43526,6.75,,,, +US-OH-43527,US,OH,43527,7.25,,,, +US-OH-43528,US,OH,43528,7,,,, +US-OH-43529,US,OH,43529,6.75,,,, +US-OH-43530,US,OH,43530,6.75,,,, +US-OH-43531,US,OH,43531,7.25,,,, +US-OH-43532,US,OH,43532,7.25,,,, +US-OH-43533,US,OH,43533,7.25,,,, +US-OH-43534,US,OH,43534,7.25,,,, +US-OH-43535,US,OH,43535,7.25,,,, +US-OH-43536,US,OH,43536,6.75,,,, +US-OH-43537,US,OH,43537,7,,,, +US-OH-43540,US,OH,43540,7.25,,,, +US-OH-43541,US,OH,43541,6.75,,,, +US-OH-43542,US,OH,43542,7,,,, +US-OH-43543,US,OH,43543,7.25,,,, +US-OH-43545,US,OH,43545,7.25,,,, +US-OH-43547,US,OH,43547,7,,,, +US-OH-43548,US,OH,43548,7.25,,,, +US-OH-43549,US,OH,43549,6.75,,,, +US-OH-43550,US,OH,43550,7.25,,,, +US-OH-43551,US,OH,43551,6.75,,,, +US-OH-43552,US,OH,43552,6.75,,,, +US-OH-43553,US,OH,43553,7.25,,,, +US-OH-43554,US,OH,43554,7.25,,,, +US-OH-43555,US,OH,43555,7.25,,,, +US-OH-43556,US,OH,43556,6.75,,,, +US-OH-43557,US,OH,43557,7.25,,,, +US-OH-43558,US,OH,43558,7.25,,,, +US-OH-43560,US,OH,43560,7,,,, +US-OH-43565,US,OH,43565,6.75,,,, +US-OH-43566,US,OH,43566,7,,,, +US-OH-43567,US,OH,43567,7.25,,,, +US-OH-43569,US,OH,43569,6.75,,,, +US-OH-43570,US,OH,43570,7.25,,,, +US-OH-43571,US,OH,43571,7,,,, +US-OH-43601,US,OH,43601,7,,,, +US-OH-43603,US,OH,43603,7,,,, +US-OH-43604,US,OH,43604,7,,,, +US-OH-43605,US,OH,43605,7,,,, +US-OH-43606,US,OH,43606,7,,,, +US-OH-43607,US,OH,43607,7,,,, +US-OH-43608,US,OH,43608,7,,,, +US-OH-43609,US,OH,43609,7,,,, +US-OH-43610,US,OH,43610,7,,,, +US-OH-43611,US,OH,43611,7,,,, +US-OH-43612,US,OH,43612,7,,,, +US-OH-43613,US,OH,43613,7,,,, +US-OH-43614,US,OH,43614,7,,,, +US-OH-43615,US,OH,43615,7,,,, +US-OH-43616,US,OH,43616,7,,,, +US-OH-43617,US,OH,43617,7,,,, +US-OH-43619,US,OH,43619,6.75,,,, +US-OH-43620,US,OH,43620,7,,,, +US-OH-43623,US,OH,43623,7,,,, +US-OH-43635,US,OH,43635,7,,,, +US-OH-43652,US,OH,43652,7,,,, +US-OH-43654,US,OH,43654,6.75,,,, +US-OH-43656,US,OH,43656,7,,,, +US-OH-43657,US,OH,43657,7,,,, +US-OH-43659,US,OH,43659,7,,,, +US-OH-43660,US,OH,43660,7,,,, +US-OH-43661,US,OH,43661,7,,,, +US-OH-43666,US,OH,43666,7,,,, +US-OH-43667,US,OH,43667,7,,,, +US-OH-43681,US,OH,43681,7,,,, +US-OH-43682,US,OH,43682,7,,,, +US-OH-43697,US,OH,43697,7,,,, +US-OH-43699,US,OH,43699,7,,,, +US-OH-43701,US,OH,43701,7.25,,,, +US-OH-43702,US,OH,43702,7.25,,,, +US-OH-43711,US,OH,43711,7.25,,,, +US-OH-43713,US,OH,43713,7.25,,,, +US-OH-43716,US,OH,43716,7.25,,,, +US-OH-43717,US,OH,43717,7.25,,,, +US-OH-43718,US,OH,43718,7.25,,,, +US-OH-43719,US,OH,43719,7.25,,,, +US-OH-43720,US,OH,43720,7.25,,,, +US-OH-43721,US,OH,43721,7.25,,,, +US-OH-43722,US,OH,43722,7.25,,,, +US-OH-43723,US,OH,43723,7.25,,,, +US-OH-43724,US,OH,43724,7.25,,,, +US-OH-43725,US,OH,43725,7.25,,,, +US-OH-43727,US,OH,43727,7.25,,,, +US-OH-43728,US,OH,43728,7.25,,,, +US-OH-43730,US,OH,43730,7.25,,,, +US-OH-43731,US,OH,43731,7.25,,,, +US-OH-43732,US,OH,43732,7.25,,,, +US-OH-43733,US,OH,43733,7.25,,,, +US-OH-43734,US,OH,43734,7.25,,,, +US-OH-43735,US,OH,43735,7.25,,,, +US-OH-43736,US,OH,43736,7.25,,,, +US-OH-43738,US,OH,43738,7.25,,,, +US-OH-43739,US,OH,43739,7.25,,,, +US-OH-43740,US,OH,43740,7.25,,,, +US-OH-43746,US,OH,43746,7.25,,,, +US-OH-43747,US,OH,43747,7.25,,,, +US-OH-43748,US,OH,43748,7.25,,,, +US-OH-43749,US,OH,43749,7.25,,,, +US-OH-43750,US,OH,43750,7.25,,,, +US-OH-43752,US,OH,43752,7.25,,,, +US-OH-43754,US,OH,43754,7.25,,,, +US-OH-43755,US,OH,43755,7.25,,,, +US-OH-43756,US,OH,43756,7.25,,,, +US-OH-43757,US,OH,43757,7.25,,,, +US-OH-43758,US,OH,43758,7.25,,,, +US-OH-43759,US,OH,43759,7.25,,,, +US-OH-43760,US,OH,43760,7.25,,,, +US-OH-43761,US,OH,43761,7.25,,,, +US-OH-43762,US,OH,43762,7.25,,,, +US-OH-43764,US,OH,43764,7.25,,,, +US-OH-43766,US,OH,43766,7.25,,,, +US-OH-43767,US,OH,43767,7.25,,,, +US-OH-43768,US,OH,43768,7.25,,,, +US-OH-43771,US,OH,43771,7.25,,,, +US-OH-43772,US,OH,43772,7.25,,,, +US-OH-43773,US,OH,43773,7.25,,,, +US-OH-43777,US,OH,43777,7.25,,,, +US-OH-43778,US,OH,43778,7.25,,,, +US-OH-43779,US,OH,43779,7.25,,,, +US-OH-43780,US,OH,43780,7.25,,,, +US-OH-43782,US,OH,43782,7.25,,,, +US-OH-43783,US,OH,43783,7.25,,,, +US-OH-43786,US,OH,43786,7.25,,,, +US-OH-43787,US,OH,43787,7.25,,,, +US-OH-43788,US,OH,43788,7.25,,,, +US-OH-43791,US,OH,43791,7.25,,,, +US-OH-43793,US,OH,43793,7.25,,,, +US-OH-43802,US,OH,43802,7.25,,,, +US-OH-43803,US,OH,43803,6.75,,,, +US-OH-43804,US,OH,43804,6.75,,,, +US-OH-43805,US,OH,43805,7.25,,,, +US-OH-43811,US,OH,43811,7.25,,,, +US-OH-43812,US,OH,43812,7.25,,,, +US-OH-43821,US,OH,43821,7.25,,,, +US-OH-43822,US,OH,43822,7.25,,,, +US-OH-43824,US,OH,43824,7.25,,,, +US-OH-43828,US,OH,43828,7.25,,,, +US-OH-43830,US,OH,43830,7.25,,,, +US-OH-43832,US,OH,43832,6.75,,,, +US-OH-43836,US,OH,43836,7.25,,,, +US-OH-43837,US,OH,43837,6.75,,,, +US-OH-43840,US,OH,43840,6.75,,,, +US-OH-43842,US,OH,43842,7.25,,,, +US-OH-43843,US,OH,43843,7.25,,,, +US-OH-43844,US,OH,43844,7.25,,,, +US-OH-43845,US,OH,43845,7.25,,,, +US-OH-43901,US,OH,43901,7.25,,,, +US-OH-43902,US,OH,43902,7.25,,,, +US-OH-43903,US,OH,43903,7.25,,,, +US-OH-43905,US,OH,43905,7.25,,,, +US-OH-43906,US,OH,43906,7.25,,,, +US-OH-43907,US,OH,43907,7.25,,,, +US-OH-43908,US,OH,43908,7.25,,,, +US-OH-43909,US,OH,43909,7.25,,,, +US-OH-43910,US,OH,43910,7.25,,,, +US-OH-43912,US,OH,43912,7.25,,,, +US-OH-43913,US,OH,43913,7.25,,,, +US-OH-43914,US,OH,43914,7.25,,,, +US-OH-43915,US,OH,43915,7.25,,,, +US-OH-43916,US,OH,43916,7.25,,,, +US-OH-43917,US,OH,43917,7.25,,,, +US-OH-43920,US,OH,43920,7.25,,,, +US-OH-43925,US,OH,43925,7.25,,,, +US-OH-43926,US,OH,43926,7.25,,,, +US-OH-43927,US,OH,43927,7.25,,,, +US-OH-43928,US,OH,43928,7.25,,,, +US-OH-43930,US,OH,43930,7.25,,,, +US-OH-43931,US,OH,43931,7.25,,,, +US-OH-43932,US,OH,43932,7.25,,,, +US-OH-43933,US,OH,43933,7.25,,,, +US-OH-43934,US,OH,43934,7.25,,,, +US-OH-43935,US,OH,43935,7.25,,,, +US-OH-43937,US,OH,43937,7.25,,,, +US-OH-43938,US,OH,43938,7.25,,,, +US-OH-43939,US,OH,43939,7.25,,,, +US-OH-43940,US,OH,43940,7.25,,,, +US-OH-43941,US,OH,43941,7.25,,,, +US-OH-43942,US,OH,43942,7.25,,,, +US-OH-43943,US,OH,43943,7.25,,,, +US-OH-43944,US,OH,43944,7.25,,,, +US-OH-43945,US,OH,43945,7.25,,,, +US-OH-43946,US,OH,43946,7.25,,,, +US-OH-43947,US,OH,43947,7.25,,,, +US-OH-43948,US,OH,43948,7.25,,,, +US-OH-43950,US,OH,43950,7.25,,,, +US-OH-43951,US,OH,43951,7.25,,,, +US-OH-43952,US,OH,43952,7.25,,,, +US-OH-43953,US,OH,43953,7.25,,,, +US-OH-43961,US,OH,43961,7.25,,,, +US-OH-43962,US,OH,43962,7.25,,,, +US-OH-43963,US,OH,43963,7.25,,,, +US-OH-43964,US,OH,43964,7.25,,,, +US-OH-43967,US,OH,43967,7.25,,,, +US-OH-43968,US,OH,43968,7.25,,,, +US-OH-43970,US,OH,43970,7.25,,,, +US-OH-43971,US,OH,43971,7.25,,,, +US-OH-43972,US,OH,43972,7.25,,,, +US-OH-43973,US,OH,43973,7.25,,,, +US-OH-43974,US,OH,43974,7.25,,,, +US-OH-43976,US,OH,43976,7.25,,,, +US-OH-43977,US,OH,43977,7.25,,,, +US-OH-43981,US,OH,43981,7.25,,,, +US-OH-43983,US,OH,43983,7.25,,,, +US-OH-43984,US,OH,43984,7.25,,,, +US-OH-43985,US,OH,43985,7.25,,,, +US-OH-43986,US,OH,43986,7.25,,,, +US-OH-43988,US,OH,43988,7.25,,,, +US-OH-44001,US,OH,44001,6.5,,,, +US-OH-44003,US,OH,44003,6.75,,,, +US-OH-44004,US,OH,44004,6.75,,,, +US-OH-44005,US,OH,44005,6.75,,,, +US-OH-44010,US,OH,44010,6.75,,,, +US-OH-44011,US,OH,44011,6.5,,,, +US-OH-44012,US,OH,44012,6.5,,,, +US-OH-44017,US,OH,44017,8,,,, +US-OH-44021,US,OH,44021,6.75,,,, +US-OH-44022,US,OH,44022,8,,,, +US-OH-44023,US,OH,44023,6.75,,,, +US-OH-44024,US,OH,44024,6.75,,,, +US-OH-44026,US,OH,44026,6.75,,,, +US-OH-44028,US,OH,44028,6.5,,,, +US-OH-44030,US,OH,44030,6.75,,,, +US-OH-44032,US,OH,44032,6.75,,,, +US-OH-44033,US,OH,44033,6.75,,,, +US-OH-44035,US,OH,44035,6.5,,,, +US-OH-44036,US,OH,44036,6.5,,,, +US-OH-44039,US,OH,44039,6.5,,,, +US-OH-44040,US,OH,44040,8,,,, +US-OH-44041,US,OH,44041,6.75,,,, +US-OH-44044,US,OH,44044,6.5,,,, +US-OH-44045,US,OH,44045,7,,,, +US-OH-44046,US,OH,44046,6.75,,,, +US-OH-44047,US,OH,44047,6.75,,,, +US-OH-44048,US,OH,44048,6.75,,,, +US-OH-44049,US,OH,44049,6.5,,,, +US-OH-44050,US,OH,44050,6.5,,,, +US-OH-44052,US,OH,44052,6.5,,,, +US-OH-44053,US,OH,44053,6.5,,,, +US-OH-44054,US,OH,44054,6.5,,,, +US-OH-44055,US,OH,44055,6.5,,,, +US-OH-44056,US,OH,44056,6.75,,,, +US-OH-44057,US,OH,44057,7,,,, +US-OH-44060,US,OH,44060,7,,,, +US-OH-44061,US,OH,44061,7,,,, +US-OH-44062,US,OH,44062,6.75,,,, +US-OH-44064,US,OH,44064,6.75,,,, +US-OH-44065,US,OH,44065,6.75,,,, +US-OH-44067,US,OH,44067,6.75,,,, +US-OH-44068,US,OH,44068,6.75,,,, +US-OH-44070,US,OH,44070,8,,,, +US-OH-44072,US,OH,44072,6.75,,,, +US-OH-44073,US,OH,44073,6.75,,,, +US-OH-44074,US,OH,44074,6.5,,,, +US-OH-44076,US,OH,44076,6.75,,,, +US-OH-44077,US,OH,44077,7,,,, +US-OH-44080,US,OH,44080,6.75,,,, +US-OH-44081,US,OH,44081,7,,,, +US-OH-44082,US,OH,44082,6.75,,,, +US-OH-44084,US,OH,44084,6.75,,,, +US-OH-44085,US,OH,44085,6.75,,,, +US-OH-44086,US,OH,44086,6.75,,,, +US-OH-44087,US,OH,44087,6.75,,,, +US-OH-44088,US,OH,44088,6.75,,,, +US-OH-44089,US,OH,44089,7.25,,,, +US-OH-44090,US,OH,44090,6.5,,,, +US-OH-44092,US,OH,44092,7,,,, +US-OH-44093,US,OH,44093,6.75,,,, +US-OH-44094,US,OH,44094,7,,,, +US-OH-44095,US,OH,44095,7,,,, +US-OH-44096,US,OH,44096,7,,,, +US-OH-44097,US,OH,44097,7,,,, +US-OH-44099,US,OH,44099,6.75,,,, +US-OH-44101,US,OH,44101,8,,,, +US-OH-44102,US,OH,44102,8,,,, +US-OH-44103,US,OH,44103,8,,,, +US-OH-44104,US,OH,44104,8,,,, +US-OH-44105,US,OH,44105,8,,,, +US-OH-44106,US,OH,44106,8,,,, +US-OH-44107,US,OH,44107,8,,,, +US-OH-44108,US,OH,44108,8,,,, +US-OH-44109,US,OH,44109,8,,,, +US-OH-44110,US,OH,44110,8,,,, +US-OH-44111,US,OH,44111,8,,,, +US-OH-44112,US,OH,44112,8,,,, +US-OH-44113,US,OH,44113,8,,,, +US-OH-44114,US,OH,44114,8,,,, +US-OH-44115,US,OH,44115,8,,,, +US-OH-44116,US,OH,44116,8,,,, +US-OH-44117,US,OH,44117,8,,,, +US-OH-44118,US,OH,44118,8,,,, +US-OH-44119,US,OH,44119,8,,,, +US-OH-44120,US,OH,44120,8,,,, +US-OH-44121,US,OH,44121,8,,,, +US-OH-44122,US,OH,44122,8,,,, +US-OH-44123,US,OH,44123,8,,,, +US-OH-44124,US,OH,44124,8,,,, +US-OH-44125,US,OH,44125,8,,,, +US-OH-44126,US,OH,44126,8,,,, +US-OH-44127,US,OH,44127,8,,,, +US-OH-44128,US,OH,44128,8,,,, +US-OH-44129,US,OH,44129,8,,,, +US-OH-44130,US,OH,44130,8,,,, +US-OH-44131,US,OH,44131,8,,,, +US-OH-44132,US,OH,44132,8,,,, +US-OH-44133,US,OH,44133,8,,,, +US-OH-44134,US,OH,44134,8,,,, +US-OH-44135,US,OH,44135,8,,,, +US-OH-44136,US,OH,44136,8,,,, +US-OH-44137,US,OH,44137,8,,,, +US-OH-44138,US,OH,44138,8,,,, +US-OH-44139,US,OH,44139,8,,,, +US-OH-44140,US,OH,44140,8,,,, +US-OH-44141,US,OH,44141,8,,,, +US-OH-44142,US,OH,44142,8,,,, +US-OH-44143,US,OH,44143,8,,,, +US-OH-44144,US,OH,44144,8,,,, +US-OH-44145,US,OH,44145,8,,,, +US-OH-44146,US,OH,44146,8,,,, +US-OH-44147,US,OH,44147,8,,,, +US-OH-44149,US,OH,44149,8,,,, +US-OH-44181,US,OH,44181,8,,,, +US-OH-44188,US,OH,44188,8,,,, +US-OH-44190,US,OH,44190,8,,,, +US-OH-44191,US,OH,44191,8,,,, +US-OH-44192,US,OH,44192,8,,,, +US-OH-44193,US,OH,44193,8,,,, +US-OH-44194,US,OH,44194,8,,,, +US-OH-44195,US,OH,44195,8,,,, +US-OH-44197,US,OH,44197,8,,,, +US-OH-44198,US,OH,44198,8,,,, +US-OH-44199,US,OH,44199,8,,,, +US-OH-44201,US,OH,44201,7,,,, +US-OH-44202,US,OH,44202,7,,,, +US-OH-44203,US,OH,44203,6.75,,,, +US-OH-44210,US,OH,44210,6.75,,,, +US-OH-44211,US,OH,44211,7,,,, +US-OH-44212,US,OH,44212,6.75,,,, +US-OH-44214,US,OH,44214,6.5,,,, +US-OH-44215,US,OH,44215,6.75,,,, +US-OH-44216,US,OH,44216,6.75,,,, +US-OH-44217,US,OH,44217,6.5,,,, +US-OH-44221,US,OH,44221,6.75,,,, +US-OH-44222,US,OH,44222,6.75,,,, +US-OH-44223,US,OH,44223,6.75,,,, +US-OH-44224,US,OH,44224,6.75,,,, +US-OH-44230,US,OH,44230,6.5,,,, +US-OH-44231,US,OH,44231,7,,,, +US-OH-44232,US,OH,44232,6.75,,,, +US-OH-44233,US,OH,44233,6.75,,,, +US-OH-44234,US,OH,44234,7,,,, +US-OH-44235,US,OH,44235,6.75,,,, +US-OH-44236,US,OH,44236,6.75,,,, +US-OH-44237,US,OH,44237,6.75,,,, +US-OH-44240,US,OH,44240,7,,,, +US-OH-44241,US,OH,44241,7,,,, +US-OH-44242,US,OH,44242,7,,,, +US-OH-44243,US,OH,44243,7,,,, +US-OH-44250,US,OH,44250,6.75,,,, +US-OH-44251,US,OH,44251,6.75,,,, +US-OH-44253,US,OH,44253,6.75,,,, +US-OH-44254,US,OH,44254,6.75,,,, +US-OH-44255,US,OH,44255,7,,,, +US-OH-44256,US,OH,44256,6.75,,,, +US-OH-44258,US,OH,44258,6.75,,,, +US-OH-44260,US,OH,44260,7,,,, +US-OH-44262,US,OH,44262,6.75,,,, +US-OH-44264,US,OH,44264,6.75,,,, +US-OH-44265,US,OH,44265,7,,,, +US-OH-44266,US,OH,44266,7,,,, +US-OH-44270,US,OH,44270,6.5,,,, +US-OH-44272,US,OH,44272,7,,,, +US-OH-44273,US,OH,44273,6.75,,,, +US-OH-44274,US,OH,44274,6.75,,,, +US-OH-44275,US,OH,44275,6.75,,,, +US-OH-44276,US,OH,44276,6.5,,,, +US-OH-44278,US,OH,44278,6.75,,,, +US-OH-44280,US,OH,44280,6.75,,,, +US-OH-44281,US,OH,44281,6.75,,,, +US-OH-44282,US,OH,44282,6.75,,,, +US-OH-44285,US,OH,44285,7,,,, +US-OH-44286,US,OH,44286,6.75,,,, +US-OH-44287,US,OH,44287,6.5,,,, +US-OH-44288,US,OH,44288,7,,,, +US-OH-44301,US,OH,44301,6.75,,,, +US-OH-44302,US,OH,44302,6.75,,,, +US-OH-44303,US,OH,44303,6.75,,,, +US-OH-44304,US,OH,44304,6.75,,,, +US-OH-44305,US,OH,44305,6.75,,,, +US-OH-44306,US,OH,44306,6.75,,,, +US-OH-44307,US,OH,44307,6.75,,,, +US-OH-44308,US,OH,44308,6.75,,,, +US-OH-44309,US,OH,44309,6.75,,,, +US-OH-44310,US,OH,44310,6.75,,,, +US-OH-44311,US,OH,44311,6.75,,,, +US-OH-44312,US,OH,44312,6.75,,,, +US-OH-44313,US,OH,44313,6.75,,,, +US-OH-44314,US,OH,44314,6.75,,,, +US-OH-44315,US,OH,44315,6.75,,,, +US-OH-44316,US,OH,44316,6.75,,,, +US-OH-44317,US,OH,44317,6.75,,,, +US-OH-44319,US,OH,44319,6.75,,,, +US-OH-44320,US,OH,44320,6.75,,,, +US-OH-44321,US,OH,44321,6.75,,,, +US-OH-44325,US,OH,44325,6.75,,,, +US-OH-44326,US,OH,44326,6.75,,,, +US-OH-44328,US,OH,44328,6.75,,,, +US-OH-44333,US,OH,44333,6.75,,,, +US-OH-44334,US,OH,44334,6.75,,,, +US-OH-44372,US,OH,44372,6.75,,,, +US-OH-44396,US,OH,44396,6.75,,,, +US-OH-44398,US,OH,44398,6.75,,,, +US-OH-44401,US,OH,44401,7,,,, +US-OH-44402,US,OH,44402,6.75,,,, +US-OH-44403,US,OH,44403,6.75,,,, +US-OH-44404,US,OH,44404,6.75,,,, +US-OH-44405,US,OH,44405,7,,,, +US-OH-44406,US,OH,44406,7,,,, +US-OH-44408,US,OH,44408,7.25,,,, +US-OH-44410,US,OH,44410,6.75,,,, +US-OH-44411,US,OH,44411,7,,,, +US-OH-44412,US,OH,44412,7,,,, +US-OH-44413,US,OH,44413,7.25,,,, +US-OH-44415,US,OH,44415,7.25,,,, +US-OH-44416,US,OH,44416,7,,,, +US-OH-44417,US,OH,44417,6.75,,,, +US-OH-44418,US,OH,44418,6.75,,,, +US-OH-44420,US,OH,44420,6.75,,,, +US-OH-44422,US,OH,44422,7,,,, +US-OH-44423,US,OH,44423,7.25,,,, +US-OH-44424,US,OH,44424,6.75,,,, +US-OH-44425,US,OH,44425,6.75,,,, +US-OH-44427,US,OH,44427,7.25,,,, +US-OH-44428,US,OH,44428,6.75,,,, +US-OH-44429,US,OH,44429,7,,,, +US-OH-44430,US,OH,44430,6.75,,,, +US-OH-44431,US,OH,44431,7.25,,,, +US-OH-44432,US,OH,44432,7.25,,,, +US-OH-44436,US,OH,44436,7,,,, +US-OH-44437,US,OH,44437,6.75,,,, +US-OH-44438,US,OH,44438,6.75,,,, +US-OH-44439,US,OH,44439,6.75,,,, +US-OH-44440,US,OH,44440,6.75,,,, +US-OH-44441,US,OH,44441,7.25,,,, +US-OH-44442,US,OH,44442,7,,,, +US-OH-44443,US,OH,44443,7,,,, +US-OH-44444,US,OH,44444,6.75,,,, +US-OH-44445,US,OH,44445,7.25,,,, +US-OH-44446,US,OH,44446,6.75,,,, +US-OH-44449,US,OH,44449,7,,,, +US-OH-44450,US,OH,44450,6.75,,,, +US-OH-44451,US,OH,44451,7,,,, +US-OH-44452,US,OH,44452,7,,,, +US-OH-44453,US,OH,44453,6.75,,,, +US-OH-44454,US,OH,44454,7,,,, +US-OH-44455,US,OH,44455,7.25,,,, +US-OH-44460,US,OH,44460,7.25,,,, +US-OH-44470,US,OH,44470,6.75,,,, +US-OH-44471,US,OH,44471,7,,,, +US-OH-44473,US,OH,44473,6.75,,,, +US-OH-44481,US,OH,44481,6.75,,,, +US-OH-44482,US,OH,44482,6.75,,,, +US-OH-44483,US,OH,44483,6.75,,,, +US-OH-44484,US,OH,44484,6.75,,,, +US-OH-44485,US,OH,44485,6.75,,,, +US-OH-44486,US,OH,44486,6.75,,,, +US-OH-44488,US,OH,44488,6.75,,,, +US-OH-44490,US,OH,44490,7.25,,,, +US-OH-44491,US,OH,44491,6.75,,,, +US-OH-44492,US,OH,44492,7.25,,,, +US-OH-44493,US,OH,44493,7.25,,,, +US-OH-44501,US,OH,44501,7,,,, +US-OH-44502,US,OH,44502,7,,,, +US-OH-44503,US,OH,44503,7,,,, +US-OH-44504,US,OH,44504,7,,,, +US-OH-44505,US,OH,44505,7,,,, +US-OH-44506,US,OH,44506,7,,,, +US-OH-44507,US,OH,44507,7,,,, +US-OH-44509,US,OH,44509,7,,,, +US-OH-44510,US,OH,44510,7,,,, +US-OH-44511,US,OH,44511,7,,,, +US-OH-44512,US,OH,44512,7,,,, +US-OH-44513,US,OH,44513,7,,,, +US-OH-44514,US,OH,44514,7,,,, +US-OH-44515,US,OH,44515,7,,,, +US-OH-44555,US,OH,44555,7,,,, +US-OH-44601,US,OH,44601,6.5,,,, +US-OH-44606,US,OH,44606,6.5,,,, +US-OH-44607,US,OH,44607,6.75,,,, +US-OH-44608,US,OH,44608,6.5,,,, +US-OH-44609,US,OH,44609,7,,,, +US-OH-44610,US,OH,44610,6.75,,,, +US-OH-44611,US,OH,44611,6.75,,,, +US-OH-44612,US,OH,44612,6.75,,,, +US-OH-44613,US,OH,44613,6.5,,,, +US-OH-44614,US,OH,44614,6.5,,,, +US-OH-44615,US,OH,44615,6.75,,,, +US-OH-44617,US,OH,44617,6.75,,,, +US-OH-44618,US,OH,44618,6.5,,,, +US-OH-44619,US,OH,44619,7,,,, +US-OH-44620,US,OH,44620,6.75,,,, +US-OH-44621,US,OH,44621,6.75,,,, +US-OH-44622,US,OH,44622,6.75,,,, +US-OH-44624,US,OH,44624,6.75,,,, +US-OH-44625,US,OH,44625,7.25,,,, +US-OH-44626,US,OH,44626,6.5,,,, +US-OH-44627,US,OH,44627,6.5,,,, +US-OH-44628,US,OH,44628,6.75,,,, +US-OH-44629,US,OH,44629,6.75,,,, +US-OH-44630,US,OH,44630,6.5,,,, +US-OH-44632,US,OH,44632,6.5,,,, +US-OH-44633,US,OH,44633,6.75,,,, +US-OH-44634,US,OH,44634,7.25,,,, +US-OH-44636,US,OH,44636,6.5,,,, +US-OH-44637,US,OH,44637,6.75,,,, +US-OH-44638,US,OH,44638,6.75,,,, +US-OH-44639,US,OH,44639,6.75,,,, +US-OH-44640,US,OH,44640,6.5,,,, +US-OH-44641,US,OH,44641,6.5,,,, +US-OH-44643,US,OH,44643,6.5,,,, +US-OH-44644,US,OH,44644,6.75,,,, +US-OH-44645,US,OH,44645,6.5,,,, +US-OH-44646,US,OH,44646,6.5,,,, +US-OH-44647,US,OH,44647,6.5,,,, +US-OH-44648,US,OH,44648,6.5,,,, +US-OH-44650,US,OH,44650,6.5,,,, +US-OH-44651,US,OH,44651,6.75,,,, +US-OH-44652,US,OH,44652,6.5,,,, +US-OH-44653,US,OH,44653,6.75,,,, +US-OH-44654,US,OH,44654,6.75,,,, +US-OH-44656,US,OH,44656,6.75,,,, +US-OH-44657,US,OH,44657,6.5,,,, +US-OH-44659,US,OH,44659,6.5,,,, +US-OH-44660,US,OH,44660,6.75,,,, +US-OH-44661,US,OH,44661,6.75,,,, +US-OH-44662,US,OH,44662,6.5,,,, +US-OH-44663,US,OH,44663,6.75,,,, +US-OH-44665,US,OH,44665,7.25,,,, +US-OH-44666,US,OH,44666,6.5,,,, +US-OH-44667,US,OH,44667,6.5,,,, +US-OH-44669,US,OH,44669,6.5,,,, +US-OH-44670,US,OH,44670,6.5,,,, +US-OH-44671,US,OH,44671,6.75,,,, +US-OH-44672,US,OH,44672,7,,,, +US-OH-44675,US,OH,44675,6.75,,,, +US-OH-44676,US,OH,44676,6.5,,,, +US-OH-44677,US,OH,44677,6.5,,,, +US-OH-44678,US,OH,44678,6.75,,,, +US-OH-44679,US,OH,44679,6.75,,,, +US-OH-44680,US,OH,44680,6.75,,,, +US-OH-44681,US,OH,44681,6.75,,,, +US-OH-44682,US,OH,44682,6.75,,,, +US-OH-44683,US,OH,44683,6.75,,,, +US-OH-44685,US,OH,44685,6.5,,,, +US-OH-44687,US,OH,44687,6.75,,,, +US-OH-44688,US,OH,44688,6.5,,,, +US-OH-44689,US,OH,44689,6.5,,,, +US-OH-44690,US,OH,44690,6.75,,,, +US-OH-44691,US,OH,44691,6.5,,,, +US-OH-44693,US,OH,44693,7.25,,,, +US-OH-44695,US,OH,44695,7.25,,,, +US-OH-44697,US,OH,44697,6.75,,,, +US-OH-44699,US,OH,44699,7.25,,,, +US-OH-44701,US,OH,44701,6.5,,,, +US-OH-44702,US,OH,44702,6.5,,,, +US-OH-44703,US,OH,44703,6.5,,,, +US-OH-44704,US,OH,44704,6.5,,,, +US-OH-44705,US,OH,44705,6.5,,,, +US-OH-44706,US,OH,44706,6.5,,,, +US-OH-44707,US,OH,44707,6.5,,,, +US-OH-44708,US,OH,44708,6.5,,,, +US-OH-44709,US,OH,44709,6.5,,,, +US-OH-44710,US,OH,44710,6.5,,,, +US-OH-44711,US,OH,44711,6.5,,,, +US-OH-44714,US,OH,44714,6.5,,,, +US-OH-44718,US,OH,44718,6.5,,,, +US-OH-44720,US,OH,44720,6.5,,,, +US-OH-44721,US,OH,44721,6.5,,,, +US-OH-44730,US,OH,44730,6.5,,,, +US-OH-44735,US,OH,44735,6.5,,,, +US-OH-44750,US,OH,44750,6.5,,,, +US-OH-44767,US,OH,44767,6.5,,,, +US-OH-44799,US,OH,44799,6.5,,,, +US-OH-44802,US,OH,44802,7.25,,,, +US-OH-44804,US,OH,44804,6.75,,,, +US-OH-44805,US,OH,44805,7,,,, +US-OH-44807,US,OH,44807,7.25,,,, +US-OH-44809,US,OH,44809,7.25,,,, +US-OH-44811,US,OH,44811,7.25,,,, +US-OH-44813,US,OH,44813,7,,,, +US-OH-44814,US,OH,44814,7.25,,,, +US-OH-44815,US,OH,44815,7.25,,,, +US-OH-44816,US,OH,44816,7.25,,,, +US-OH-44817,US,OH,44817,6.75,,,, +US-OH-44818,US,OH,44818,7.25,,,, +US-OH-44820,US,OH,44820,7.25,,,, +US-OH-44822,US,OH,44822,7,,,, +US-OH-44824,US,OH,44824,7.25,,,, +US-OH-44825,US,OH,44825,7.25,,,, +US-OH-44826,US,OH,44826,7.25,,,, +US-OH-44827,US,OH,44827,7.25,,,, +US-OH-44828,US,OH,44828,7.25,,,, +US-OH-44830,US,OH,44830,7.25,,,, +US-OH-44833,US,OH,44833,7.25,,,, +US-OH-44836,US,OH,44836,7.25,,,, +US-OH-44837,US,OH,44837,7.25,,,, +US-OH-44838,US,OH,44838,7,,,, +US-OH-44839,US,OH,44839,7.25,,,, +US-OH-44840,US,OH,44840,7,,,, +US-OH-44841,US,OH,44841,7.25,,,, +US-OH-44842,US,OH,44842,7,,,, +US-OH-44843,US,OH,44843,7,,,, +US-OH-44844,US,OH,44844,7.25,,,, +US-OH-44845,US,OH,44845,7.25,,,, +US-OH-44846,US,OH,44846,7.25,,,, +US-OH-44847,US,OH,44847,7.25,,,, +US-OH-44848,US,OH,44848,7,,,, +US-OH-44849,US,OH,44849,7.25,,,, +US-OH-44850,US,OH,44850,7.25,,,, +US-OH-44851,US,OH,44851,7.25,,,, +US-OH-44853,US,OH,44853,7.25,,,, +US-OH-44854,US,OH,44854,7.25,,,, +US-OH-44855,US,OH,44855,7.25,,,, +US-OH-44856,US,OH,44856,7.25,,,, +US-OH-44857,US,OH,44857,7.25,,,, +US-OH-44859,US,OH,44859,7,,,, +US-OH-44860,US,OH,44860,7.25,,,, +US-OH-44861,US,OH,44861,7.25,,,, +US-OH-44862,US,OH,44862,7,,,, +US-OH-44864,US,OH,44864,7,,,, +US-OH-44865,US,OH,44865,7,,,, +US-OH-44866,US,OH,44866,7,,,, +US-OH-44867,US,OH,44867,7.25,,,, +US-OH-44870,US,OH,44870,7.25,,,, +US-OH-44871,US,OH,44871,7.25,,,, +US-OH-44874,US,OH,44874,7,,,, +US-OH-44875,US,OH,44875,7,,,, +US-OH-44878,US,OH,44878,7,,,, +US-OH-44880,US,OH,44880,7,,,, +US-OH-44881,US,OH,44881,7.25,,,, +US-OH-44882,US,OH,44882,7.25,,,, +US-OH-44883,US,OH,44883,7.25,,,, +US-OH-44887,US,OH,44887,7.25,,,, +US-OH-44888,US,OH,44888,7.25,,,, +US-OH-44889,US,OH,44889,7.25,,,, +US-OH-44890,US,OH,44890,7.25,,,, +US-OH-44901,US,OH,44901,7,,,, +US-OH-44902,US,OH,44902,7,,,, +US-OH-44903,US,OH,44903,7,,,, +US-OH-44904,US,OH,44904,7,,,, +US-OH-44905,US,OH,44905,7,,,, +US-OH-44906,US,OH,44906,7,,,, +US-OH-44907,US,OH,44907,7,,,, +US-OH-45001,US,OH,45001,6.75,,,, +US-OH-45002,US,OH,45002,6.75,,,, +US-OH-45003,US,OH,45003,7.25,,,, +US-OH-45004,US,OH,45004,6.5,,,, +US-OH-45005,US,OH,45005,6.75,,,, +US-OH-45011,US,OH,45011,6.5,,,, +US-OH-45012,US,OH,45012,6.5,,,, +US-OH-45013,US,OH,45013,6.5,,,, +US-OH-45014,US,OH,45014,6.5,,,, +US-OH-45015,US,OH,45015,6.5,,,, +US-OH-45018,US,OH,45018,6.5,,,, +US-OH-45030,US,OH,45030,6.75,,,, +US-OH-45032,US,OH,45032,6.75,,,, +US-OH-45033,US,OH,45033,6.75,,,, +US-OH-45034,US,OH,45034,6.75,,,, +US-OH-45036,US,OH,45036,6.75,,,, +US-OH-45039,US,OH,45039,6.75,,,, +US-OH-45040,US,OH,45040,6.75,,,, +US-OH-45041,US,OH,45041,6.75,,,, +US-OH-45042,US,OH,45042,6.5,,,, +US-OH-45044,US,OH,45044,6.5,,,, +US-OH-45050,US,OH,45050,6.5,,,, +US-OH-45051,US,OH,45051,6.75,,,, +US-OH-45052,US,OH,45052,6.75,,,, +US-OH-45053,US,OH,45053,6.5,,,, +US-OH-45054,US,OH,45054,6.75,,,, +US-OH-45055,US,OH,45055,6.5,,,, +US-OH-45056,US,OH,45056,6.5,,,, +US-OH-45061,US,OH,45061,6.5,,,, +US-OH-45062,US,OH,45062,6.5,,,, +US-OH-45063,US,OH,45063,6.5,,,, +US-OH-45064,US,OH,45064,7.25,,,, +US-OH-45065,US,OH,45065,6.75,,,, +US-OH-45066,US,OH,45066,6.75,,,, +US-OH-45067,US,OH,45067,6.5,,,, +US-OH-45068,US,OH,45068,6.75,,,, +US-OH-45069,US,OH,45069,6.5,,,, +US-OH-45070,US,OH,45070,7.25,,,, +US-OH-45071,US,OH,45071,6.5,,,, +US-OH-45101,US,OH,45101,7.25,,,, +US-OH-45102,US,OH,45102,6.75,,,, +US-OH-45103,US,OH,45103,6.75,,,, +US-OH-45105,US,OH,45105,7.25,,,, +US-OH-45106,US,OH,45106,6.75,,,, +US-OH-45107,US,OH,45107,7.25,,,, +US-OH-45111,US,OH,45111,6.75,,,, +US-OH-45112,US,OH,45112,6.75,,,, +US-OH-45113,US,OH,45113,7.25,,,, +US-OH-45114,US,OH,45114,7.25,,,, +US-OH-45115,US,OH,45115,7.25,,,, +US-OH-45118,US,OH,45118,7.25,,,, +US-OH-45119,US,OH,45119,7.25,,,, +US-OH-45120,US,OH,45120,6.75,,,, +US-OH-45121,US,OH,45121,7.25,,,, +US-OH-45122,US,OH,45122,6.75,,,, +US-OH-45123,US,OH,45123,7.25,,,, +US-OH-45130,US,OH,45130,7.25,,,, +US-OH-45131,US,OH,45131,7.25,,,, +US-OH-45132,US,OH,45132,7.25,,,, +US-OH-45133,US,OH,45133,7.25,,,, +US-OH-45135,US,OH,45135,7.25,,,, +US-OH-45138,US,OH,45138,7.25,,,, +US-OH-45140,US,OH,45140,6.75,,,, +US-OH-45142,US,OH,45142,7.25,,,, +US-OH-45144,US,OH,45144,7.25,,,, +US-OH-45146,US,OH,45146,7.25,,,, +US-OH-45147,US,OH,45147,6.75,,,, +US-OH-45148,US,OH,45148,7.25,,,, +US-OH-45150,US,OH,45150,6.75,,,, +US-OH-45152,US,OH,45152,6.75,,,, +US-OH-45153,US,OH,45153,6.75,,,, +US-OH-45154,US,OH,45154,7.25,,,, +US-OH-45155,US,OH,45155,7.25,,,, +US-OH-45156,US,OH,45156,6.75,,,, +US-OH-45157,US,OH,45157,6.75,,,, +US-OH-45158,US,OH,45158,6.75,,,, +US-OH-45159,US,OH,45159,7.25,,,, +US-OH-45160,US,OH,45160,6.75,,,, +US-OH-45162,US,OH,45162,6.75,,,, +US-OH-45164,US,OH,45164,7.25,,,, +US-OH-45166,US,OH,45166,7.25,,,, +US-OH-45167,US,OH,45167,7.25,,,, +US-OH-45168,US,OH,45168,7.25,,,, +US-OH-45169,US,OH,45169,7.25,,,, +US-OH-45171,US,OH,45171,7.25,,,, +US-OH-45172,US,OH,45172,7.25,,,, +US-OH-45174,US,OH,45174,6.75,,,, +US-OH-45176,US,OH,45176,6.75,,,, +US-OH-45177,US,OH,45177,7.25,,,, +US-OH-45201,US,OH,45201,6.75,,,, +US-OH-45202,US,OH,45202,6.75,,,, +US-OH-45203,US,OH,45203,6.75,,,, +US-OH-45204,US,OH,45204,6.75,,,, +US-OH-45205,US,OH,45205,6.75,,,, +US-OH-45206,US,OH,45206,6.75,,,, +US-OH-45207,US,OH,45207,6.75,,,, +US-OH-45208,US,OH,45208,6.75,,,, +US-OH-45209,US,OH,45209,6.75,,,, +US-OH-45211,US,OH,45211,6.75,,,, +US-OH-45212,US,OH,45212,6.75,,,, +US-OH-45213,US,OH,45213,6.75,,,, +US-OH-45214,US,OH,45214,6.75,,,, +US-OH-45215,US,OH,45215,6.75,,,, +US-OH-45216,US,OH,45216,6.75,,,, +US-OH-45217,US,OH,45217,6.75,,,, +US-OH-45218,US,OH,45218,6.75,,,, +US-OH-45219,US,OH,45219,6.75,,,, +US-OH-45220,US,OH,45220,6.75,,,, +US-OH-45221,US,OH,45221,6.75,,,, +US-OH-45222,US,OH,45222,6.75,,,, +US-OH-45223,US,OH,45223,6.75,,,, +US-OH-45224,US,OH,45224,6.75,,,, +US-OH-45225,US,OH,45225,6.75,,,, +US-OH-45226,US,OH,45226,6.75,,,, +US-OH-45227,US,OH,45227,6.75,,,, +US-OH-45229,US,OH,45229,6.75,,,, +US-OH-45230,US,OH,45230,6.75,,,, +US-OH-45231,US,OH,45231,6.75,,,, +US-OH-45232,US,OH,45232,6.75,,,, +US-OH-45233,US,OH,45233,6.75,,,, +US-OH-45234,US,OH,45234,6.75,,,, +US-OH-45235,US,OH,45235,6.75,,,, +US-OH-45236,US,OH,45236,6.75,,,, +US-OH-45237,US,OH,45237,6.75,,,, +US-OH-45238,US,OH,45238,6.75,,,, +US-OH-45239,US,OH,45239,6.75,,,, +US-OH-45240,US,OH,45240,6.75,,,, +US-OH-45241,US,OH,45241,6.75,,,, +US-OH-45242,US,OH,45242,6.75,,,, +US-OH-45243,US,OH,45243,6.75,,,, +US-OH-45244,US,OH,45244,6.75,,,, +US-OH-45245,US,OH,45245,6.75,,,, +US-OH-45246,US,OH,45246,6.75,,,, +US-OH-45247,US,OH,45247,6.75,,,, +US-OH-45248,US,OH,45248,6.75,,,, +US-OH-45249,US,OH,45249,6.75,,,, +US-OH-45250,US,OH,45250,6.75,,,, +US-OH-45251,US,OH,45251,6.75,,,, +US-OH-45252,US,OH,45252,6.75,,,, +US-OH-45253,US,OH,45253,6.75,,,, +US-OH-45254,US,OH,45254,6.75,,,, +US-OH-45255,US,OH,45255,6.75,,,, +US-OH-45258,US,OH,45258,6.75,,,, +US-OH-45262,US,OH,45262,6.75,,,, +US-OH-45263,US,OH,45263,6.75,,,, +US-OH-45264,US,OH,45264,6.75,,,, +US-OH-45267,US,OH,45267,6.75,,,, +US-OH-45268,US,OH,45268,6.75,,,, +US-OH-45269,US,OH,45269,6.75,,,, +US-OH-45270,US,OH,45270,6.75,,,, +US-OH-45271,US,OH,45271,6.75,,,, +US-OH-45273,US,OH,45273,6.75,,,, +US-OH-45274,US,OH,45274,6.75,,,, +US-OH-45277,US,OH,45277,6.75,,,, +US-OH-45280,US,OH,45280,6.75,,,, +US-OH-45296,US,OH,45296,6.75,,,, +US-OH-45298,US,OH,45298,6.75,,,, +US-OH-45299,US,OH,45299,6.75,,,, +US-OH-45301,US,OH,45301,6.75,,,, +US-OH-45302,US,OH,45302,7.25,,,, +US-OH-45303,US,OH,45303,7.25,,,, +US-OH-45304,US,OH,45304,7.25,,,, +US-OH-45305,US,OH,45305,6.75,,,, +US-OH-45306,US,OH,45306,7.25,,,, +US-OH-45307,US,OH,45307,6.75,,,, +US-OH-45308,US,OH,45308,7.25,,,, +US-OH-45309,US,OH,45309,7.25,,,, +US-OH-45310,US,OH,45310,7.25,,,, +US-OH-45311,US,OH,45311,7.25,,,, +US-OH-45312,US,OH,45312,7,,,, +US-OH-45314,US,OH,45314,6.75,,,, +US-OH-45315,US,OH,45315,7.25,,,, +US-OH-45316,US,OH,45316,6.75,,,, +US-OH-45317,US,OH,45317,7.25,,,, +US-OH-45318,US,OH,45318,7,,,, +US-OH-45319,US,OH,45319,7.25,,,, +US-OH-45320,US,OH,45320,7.25,,,, +US-OH-45321,US,OH,45321,7.25,,,, +US-OH-45322,US,OH,45322,7.25,,,, +US-OH-45323,US,OH,45323,7.25,,,, +US-OH-45324,US,OH,45324,6.75,,,, +US-OH-45325,US,OH,45325,7.25,,,, +US-OH-45326,US,OH,45326,7,,,, +US-OH-45327,US,OH,45327,7.25,,,, +US-OH-45328,US,OH,45328,7.25,,,, +US-OH-45330,US,OH,45330,7.25,,,, +US-OH-45331,US,OH,45331,7.25,,,, +US-OH-45332,US,OH,45332,7.25,,,, +US-OH-45333,US,OH,45333,7.25,,,, +US-OH-45334,US,OH,45334,7.25,,,, +US-OH-45335,US,OH,45335,6.75,,,, +US-OH-45336,US,OH,45336,7.25,,,, +US-OH-45337,US,OH,45337,7,,,, +US-OH-45338,US,OH,45338,7.25,,,, +US-OH-45339,US,OH,45339,7,,,, +US-OH-45340,US,OH,45340,7.25,,,, +US-OH-45341,US,OH,45341,7.25,,,, +US-OH-45342,US,OH,45342,7.25,,,, +US-OH-45343,US,OH,45343,7.25,,,, +US-OH-45344,US,OH,45344,7.25,,,, +US-OH-45345,US,OH,45345,7.25,,,, +US-OH-45346,US,OH,45346,7.25,,,, +US-OH-45347,US,OH,45347,7.25,,,, +US-OH-45348,US,OH,45348,7.25,,,, +US-OH-45349,US,OH,45349,7.25,,,, +US-OH-45350,US,OH,45350,7.25,,,, +US-OH-45351,US,OH,45351,7.25,,,, +US-OH-45352,US,OH,45352,7.25,,,, +US-OH-45353,US,OH,45353,7.25,,,, +US-OH-45354,US,OH,45354,7.25,,,, +US-OH-45356,US,OH,45356,7,,,, +US-OH-45358,US,OH,45358,7.25,,,, +US-OH-45359,US,OH,45359,7,,,, +US-OH-45360,US,OH,45360,7.25,,,, +US-OH-45361,US,OH,45361,7,,,, +US-OH-45362,US,OH,45362,7.25,,,, +US-OH-45363,US,OH,45363,7.25,,,, +US-OH-45365,US,OH,45365,7.25,,,, +US-OH-45367,US,OH,45367,7.25,,,, +US-OH-45368,US,OH,45368,7.25,,,, +US-OH-45369,US,OH,45369,7.25,,,, +US-OH-45370,US,OH,45370,6.75,,,, +US-OH-45371,US,OH,45371,7,,,, +US-OH-45372,US,OH,45372,7.25,,,, +US-OH-45373,US,OH,45373,7,,,, +US-OH-45374,US,OH,45374,7,,,, +US-OH-45377,US,OH,45377,7.25,,,, +US-OH-45378,US,OH,45378,7.25,,,, +US-OH-45380,US,OH,45380,7.25,,,, +US-OH-45381,US,OH,45381,7.25,,,, +US-OH-45382,US,OH,45382,7.25,,,, +US-OH-45383,US,OH,45383,7,,,, +US-OH-45384,US,OH,45384,6.75,,,, +US-OH-45385,US,OH,45385,6.75,,,, +US-OH-45387,US,OH,45387,6.75,,,, +US-OH-45388,US,OH,45388,7.25,,,, +US-OH-45389,US,OH,45389,7.25,,,, +US-OH-45390,US,OH,45390,7.25,,,, +US-OH-45401,US,OH,45401,7.25,,,, +US-OH-45402,US,OH,45402,7.25,,,, +US-OH-45403,US,OH,45403,7.25,,,, +US-OH-45404,US,OH,45404,7.25,,,, +US-OH-45405,US,OH,45405,7.25,,,, +US-OH-45406,US,OH,45406,7.25,,,, +US-OH-45409,US,OH,45409,7.25,,,, +US-OH-45410,US,OH,45410,7.25,,,, +US-OH-45412,US,OH,45412,7.25,,,, +US-OH-45413,US,OH,45413,7.25,,,, +US-OH-45414,US,OH,45414,7.25,,,, +US-OH-45415,US,OH,45415,7.25,,,, +US-OH-45416,US,OH,45416,7.25,,,, +US-OH-45417,US,OH,45417,7.25,,,, +US-OH-45419,US,OH,45419,7.25,,,, +US-OH-45420,US,OH,45420,7.25,,,, +US-OH-45422,US,OH,45422,7.25,,,, +US-OH-45423,US,OH,45423,7.25,,,, +US-OH-45424,US,OH,45424,7.25,,,, +US-OH-45426,US,OH,45426,7.25,,,, +US-OH-45428,US,OH,45428,7.25,,,, +US-OH-45429,US,OH,45429,7.25,,,, +US-OH-45430,US,OH,45430,6.75,,,, +US-OH-45431,US,OH,45431,6.75,,,, +US-OH-45432,US,OH,45432,6.75,,,, +US-OH-45433,US,OH,45433,6.75,,,, +US-OH-45434,US,OH,45434,6.75,,,, +US-OH-45435,US,OH,45435,6.75,,,, +US-OH-45437,US,OH,45437,7.25,,,, +US-OH-45439,US,OH,45439,7.25,,,, +US-OH-45440,US,OH,45440,7.25,,,, +US-OH-45441,US,OH,45441,7.25,,,, +US-OH-45448,US,OH,45448,7.25,,,, +US-OH-45449,US,OH,45449,7.25,,,, +US-OH-45458,US,OH,45458,7.25,,,, +US-OH-45459,US,OH,45459,7.25,,,, +US-OH-45469,US,OH,45469,7.25,,,, +US-OH-45470,US,OH,45470,7.25,,,, +US-OH-45475,US,OH,45475,7.25,,,, +US-OH-45479,US,OH,45479,7.25,,,, +US-OH-45481,US,OH,45481,7.25,,,, +US-OH-45482,US,OH,45482,7.25,,,, +US-OH-45490,US,OH,45490,7.25,,,, +US-OH-45501,US,OH,45501,7.25,,,, +US-OH-45502,US,OH,45502,7.25,,,, +US-OH-45503,US,OH,45503,7.25,,,, +US-OH-45504,US,OH,45504,7.25,,,, +US-OH-45505,US,OH,45505,7.25,,,, +US-OH-45506,US,OH,45506,7.25,,,, +US-OH-45601,US,OH,45601,7.25,,,, +US-OH-45612,US,OH,45612,7.25,,,, +US-OH-45613,US,OH,45613,7.25,,,, +US-OH-45614,US,OH,45614,7,,,, +US-OH-45616,US,OH,45616,7.25,,,, +US-OH-45617,US,OH,45617,7.25,,,, +US-OH-45618,US,OH,45618,7.25,,,, +US-OH-45619,US,OH,45619,7.25,,,, +US-OH-45620,US,OH,45620,7,,,, +US-OH-45621,US,OH,45621,7.25,,,, +US-OH-45622,US,OH,45622,7.25,,,, +US-OH-45623,US,OH,45623,7,,,, +US-OH-45624,US,OH,45624,7.25,,,, +US-OH-45628,US,OH,45628,7.25,,,, +US-OH-45629,US,OH,45629,7.25,,,, +US-OH-45630,US,OH,45630,7.25,,,, +US-OH-45631,US,OH,45631,7,,,, +US-OH-45633,US,OH,45633,7.25,,,, +US-OH-45634,US,OH,45634,7.25,,,, +US-OH-45636,US,OH,45636,7.25,,,, +US-OH-45638,US,OH,45638,7.25,,,, +US-OH-45640,US,OH,45640,7.25,,,, +US-OH-45642,US,OH,45642,7.25,,,, +US-OH-45643,US,OH,45643,7,,,, +US-OH-45644,US,OH,45644,7.25,,,, +US-OH-45645,US,OH,45645,7.25,,,, +US-OH-45646,US,OH,45646,7.25,,,, +US-OH-45647,US,OH,45647,7.25,,,, +US-OH-45648,US,OH,45648,7.25,,,, +US-OH-45650,US,OH,45650,7.25,,,, +US-OH-45651,US,OH,45651,7.25,,,, +US-OH-45652,US,OH,45652,7.25,,,, +US-OH-45653,US,OH,45653,7.25,,,, +US-OH-45654,US,OH,45654,7.25,,,, +US-OH-45656,US,OH,45656,7.25,,,, +US-OH-45657,US,OH,45657,7.25,,,, +US-OH-45658,US,OH,45658,7,,,, +US-OH-45659,US,OH,45659,7.25,,,, +US-OH-45660,US,OH,45660,7.25,,,, +US-OH-45661,US,OH,45661,7.25,,,, +US-OH-45662,US,OH,45662,7.25,,,, +US-OH-45663,US,OH,45663,7.25,,,, +US-OH-45669,US,OH,45669,7.25,,,, +US-OH-45671,US,OH,45671,7.25,,,, +US-OH-45672,US,OH,45672,7.25,,,, +US-OH-45673,US,OH,45673,7.25,,,, +US-OH-45674,US,OH,45674,7,,,, +US-OH-45675,US,OH,45675,7.25,,,, +US-OH-45677,US,OH,45677,7.25,,,, +US-OH-45678,US,OH,45678,7.25,,,, +US-OH-45679,US,OH,45679,7.25,,,, +US-OH-45680,US,OH,45680,7.25,,,, +US-OH-45681,US,OH,45681,7.25,,,, +US-OH-45682,US,OH,45682,7.25,,,, +US-OH-45683,US,OH,45683,7.25,,,, +US-OH-45684,US,OH,45684,7.25,,,, +US-OH-45685,US,OH,45685,7,,,, +US-OH-45686,US,OH,45686,7,,,, +US-OH-45687,US,OH,45687,7.25,,,, +US-OH-45688,US,OH,45688,7.25,,,, +US-OH-45690,US,OH,45690,7.25,,,, +US-OH-45692,US,OH,45692,7.25,,,, +US-OH-45693,US,OH,45693,7.25,,,, +US-OH-45694,US,OH,45694,7.25,,,, +US-OH-45695,US,OH,45695,7.25,,,, +US-OH-45696,US,OH,45696,7.25,,,, +US-OH-45697,US,OH,45697,7.25,,,, +US-OH-45698,US,OH,45698,7.25,,,, +US-OH-45699,US,OH,45699,7.25,,,, +US-OH-45701,US,OH,45701,7,,,, +US-OH-45710,US,OH,45710,7,,,, +US-OH-45711,US,OH,45711,7,,,, +US-OH-45712,US,OH,45712,7.25,,,, +US-OH-45713,US,OH,45713,7.25,,,, +US-OH-45714,US,OH,45714,7.25,,,, +US-OH-45715,US,OH,45715,7.25,,,, +US-OH-45716,US,OH,45716,7,,,, +US-OH-45717,US,OH,45717,7,,,, +US-OH-45719,US,OH,45719,7,,,, +US-OH-45720,US,OH,45720,7.25,,,, +US-OH-45721,US,OH,45721,7.25,,,, +US-OH-45723,US,OH,45723,7,,,, +US-OH-45724,US,OH,45724,7.25,,,, +US-OH-45727,US,OH,45727,7.25,,,, +US-OH-45729,US,OH,45729,7.25,,,, +US-OH-45732,US,OH,45732,7,,,, +US-OH-45734,US,OH,45734,7.25,,,, +US-OH-45735,US,OH,45735,7,,,, +US-OH-45739,US,OH,45739,7,,,, +US-OH-45740,US,OH,45740,7,,,, +US-OH-45741,US,OH,45741,7.25,,,, +US-OH-45742,US,OH,45742,7.25,,,, +US-OH-45743,US,OH,45743,7.25,,,, +US-OH-45744,US,OH,45744,7.25,,,, +US-OH-45745,US,OH,45745,7.25,,,, +US-OH-45746,US,OH,45746,7.25,,,, +US-OH-45750,US,OH,45750,7.25,,,, +US-OH-45760,US,OH,45760,7.25,,,, +US-OH-45761,US,OH,45761,7,,,, +US-OH-45764,US,OH,45764,7,,,, +US-OH-45766,US,OH,45766,7,,,, +US-OH-45767,US,OH,45767,7.25,,,, +US-OH-45768,US,OH,45768,7.25,,,, +US-OH-45769,US,OH,45769,7.25,,,, +US-OH-45770,US,OH,45770,7.25,,,, +US-OH-45771,US,OH,45771,7.25,,,, +US-OH-45772,US,OH,45772,7.25,,,, +US-OH-45773,US,OH,45773,7.25,,,, +US-OH-45775,US,OH,45775,7.25,,,, +US-OH-45776,US,OH,45776,7.25,,,, +US-OH-45777,US,OH,45777,7,,,, +US-OH-45778,US,OH,45778,7,,,, +US-OH-45779,US,OH,45779,7.25,,,, +US-OH-45780,US,OH,45780,7,,,, +US-OH-45782,US,OH,45782,7,,,, +US-OH-45783,US,OH,45783,7.25,,,, +US-OH-45784,US,OH,45784,7.25,,,, +US-OH-45786,US,OH,45786,7.25,,,, +US-OH-45787,US,OH,45787,7.25,,,, +US-OH-45788,US,OH,45788,7.25,,,, +US-OH-45789,US,OH,45789,7.25,,,, +US-OH-45801,US,OH,45801,6.75,,,, +US-OH-45802,US,OH,45802,6.75,,,, +US-OH-45804,US,OH,45804,6.75,,,, +US-OH-45805,US,OH,45805,6.75,,,, +US-OH-45806,US,OH,45806,6.75,,,, +US-OH-45807,US,OH,45807,6.75,,,, +US-OH-45808,US,OH,45808,6.75,,,, +US-OH-45809,US,OH,45809,6.75,,,, +US-OH-45810,US,OH,45810,7.25,,,, +US-OH-45812,US,OH,45812,7.25,,,, +US-OH-45813,US,OH,45813,7.25,,,, +US-OH-45814,US,OH,45814,6.75,,,, +US-OH-45815,US,OH,45815,7.25,,,, +US-OH-45816,US,OH,45816,6.75,,,, +US-OH-45817,US,OH,45817,6.75,,,, +US-OH-45819,US,OH,45819,7.25,,,, +US-OH-45820,US,OH,45820,6.75,,,, +US-OH-45821,US,OH,45821,7.25,,,, +US-OH-45822,US,OH,45822,7.25,,,, +US-OH-45826,US,OH,45826,7.25,,,, +US-OH-45827,US,OH,45827,7.25,,,, +US-OH-45828,US,OH,45828,7.25,,,, +US-OH-45830,US,OH,45830,7.25,,,, +US-OH-45831,US,OH,45831,7.25,,,, +US-OH-45832,US,OH,45832,7.25,,,, +US-OH-45833,US,OH,45833,6.75,,,, +US-OH-45835,US,OH,45835,7.25,,,, +US-OH-45836,US,OH,45836,7.25,,,, +US-OH-45837,US,OH,45837,7.25,,,, +US-OH-45838,US,OH,45838,7.25,,,, +US-OH-45839,US,OH,45839,6.75,,,, +US-OH-45840,US,OH,45840,6.75,,,, +US-OH-45841,US,OH,45841,6.75,,,, +US-OH-45843,US,OH,45843,7.25,,,, +US-OH-45844,US,OH,45844,7.25,,,, +US-OH-45845,US,OH,45845,7.25,,,, +US-OH-45846,US,OH,45846,7.25,,,, +US-OH-45848,US,OH,45848,7.25,,,, +US-OH-45849,US,OH,45849,7.25,,,, +US-OH-45850,US,OH,45850,6.75,,,, +US-OH-45851,US,OH,45851,7.25,,,, +US-OH-45853,US,OH,45853,7.25,,,, +US-OH-45854,US,OH,45854,6.75,,,, +US-OH-45855,US,OH,45855,7.25,,,, +US-OH-45856,US,OH,45856,7.25,,,, +US-OH-45858,US,OH,45858,6.75,,,, +US-OH-45859,US,OH,45859,7.25,,,, +US-OH-45860,US,OH,45860,7.25,,,, +US-OH-45861,US,OH,45861,7.25,,,, +US-OH-45862,US,OH,45862,7.25,,,, +US-OH-45863,US,OH,45863,7.25,,,, +US-OH-45864,US,OH,45864,7.25,,,, +US-OH-45865,US,OH,45865,7.25,,,, +US-OH-45866,US,OH,45866,7.25,,,, +US-OH-45867,US,OH,45867,6.75,,,, +US-OH-45868,US,OH,45868,6.75,,,, +US-OH-45869,US,OH,45869,7.25,,,, +US-OH-45870,US,OH,45870,7.25,,,, +US-OH-45871,US,OH,45871,7.25,,,, +US-OH-45872,US,OH,45872,6.75,,,, +US-OH-45873,US,OH,45873,7.25,,,, +US-OH-45874,US,OH,45874,7.25,,,, +US-OH-45875,US,OH,45875,7.25,,,, +US-OH-45876,US,OH,45876,7.25,,,, +US-OH-45877,US,OH,45877,7.25,,,, +US-OH-45879,US,OH,45879,7.25,,,, +US-OH-45880,US,OH,45880,7.25,,,, +US-OH-45881,US,OH,45881,6.75,,,, +US-OH-45882,US,OH,45882,7.25,,,, +US-OH-45883,US,OH,45883,7.25,,,, +US-OH-45884,US,OH,45884,7.25,,,, +US-OH-45885,US,OH,45885,7.25,,,, +US-OH-45886,US,OH,45886,7.25,,,, +US-OH-45887,US,OH,45887,6.75,,,, +US-OH-45888,US,OH,45888,7.25,,,, +US-OH-45889,US,OH,45889,6.75,,,, +US-OH-45890,US,OH,45890,6.75,,,, +US-OH-45891,US,OH,45891,7.25,,,, +US-OH-45893,US,OH,45893,7.25,,,, +US-OH-45894,US,OH,45894,7.25,,,, +US-OH-45895,US,OH,45895,7.25,,,, +US-OH-45896,US,OH,45896,7.25,,,, +US-OH-45897,US,OH,45897,6.75,,,, +US-OH-45898,US,OH,45898,7.25,,,, +US-OH-45899,US,OH,45899,7.25,,,, +US-OK-73001,US,OK,73001,6,,,, +US-OK-73002,US,OK,73002,4.875,,,, +US-OK-73003,US,OK,73003,8.25,,,, +US-OK-73004,US,OK,73004,8.875,,,, +US-OK-73005,US,OK,73005,9.5,,,, +US-OK-73006,US,OK,73006,9.5,,,, +US-OK-73007,US,OK,73007,8.25,,,, +US-OK-73008,US,OK,73008,8.5,,,, +US-OK-73009,US,OK,73009,10,,,, +US-OK-73010,US,OK,73010,9,,,, +US-OK-73011,US,OK,73011,4.875,,,, +US-OK-73012,US,OK,73012,8.375,,,, +US-OK-73013,US,OK,73013,8.375,,,, +US-OK-73014,US,OK,73014,4.85,,,, +US-OK-73015,US,OK,73015,10,,,, +US-OK-73016,US,OK,73016,9.25,,,, +US-OK-73017,US,OK,73017,4.875,,,, +US-OK-73018,US,OK,73018,8.844,,,, +US-OK-73019,US,OK,73019,8.25,,,, +US-OK-73020,US,OK,73020,8.75,,,, +US-OK-73021,US,OK,73021,6.375,,,, +US-OK-73022,US,OK,73022,8.85,,,, +US-OK-73023,US,OK,73023,8.844,,,, +US-OK-73024,US,OK,73024,8.375,,,, +US-OK-73025,US,OK,73025,5.5,,,, +US-OK-73026,US,OK,73026,8.25,,,, +US-OK-73027,US,OK,73027,5.313,,,, +US-OK-73028,US,OK,73028,5.5,,,, +US-OK-73029,US,OK,73029,6,,,, +US-OK-73030,US,OK,73030,9.5,,,, +US-OK-73031,US,OK,73031,10,,,, +US-OK-73032,US,OK,73032,8.5,,,, +US-OK-73033,US,OK,73033,9,,,, +US-OK-73034,US,OK,73034,8.25,,,, +US-OK-73036,US,OK,73036,8.85,,,, +US-OK-73038,US,OK,73038,10,,,, +US-OK-73039,US,OK,73039,9.5,,,, +US-OK-73040,US,OK,73040,8.25,,,, +US-OK-73041,US,OK,73041,9,,,, +US-OK-73042,US,OK,73042,10,,,, +US-OK-73043,US,OK,73043,8.25,,,, +US-OK-73044,US,OK,73044,5.5,,,, +US-OK-73045,US,OK,73045,8.5,,,, +US-OK-73047,US,OK,73047,9,,,, +US-OK-73048,US,OK,73048,10,,,, +US-OK-73049,US,OK,73049,8.375,,,, +US-OK-73050,US,OK,73050,9.5,,,, +US-OK-73051,US,OK,73051,4.75,,,, +US-OK-73052,US,OK,73052,5,,,, +US-OK-73053,US,OK,73053,6,,,, +US-OK-73054,US,OK,73054,4.5,,,, +US-OK-73055,US,OK,73055,8.7,,,, +US-OK-73056,US,OK,73056,9.5,,,, +US-OK-73057,US,OK,73057,9.25,,,, +US-OK-73058,US,OK,73058,5.5,,,, +US-OK-73059,US,OK,73059,8.875,,,, +US-OK-73061,US,OK,73061,6,,,, +US-OK-73062,US,OK,73062,9,,,, +US-OK-73063,US,OK,73063,8.5,,,, +US-OK-73064,US,OK,73064,8.85,,,, +US-OK-73065,US,OK,73065,9,,,, +US-OK-73066,US,OK,73066,8.5,,,, +US-OK-73067,US,OK,73067,7.875,,,, +US-OK-73068,US,OK,73068,8.75,,,, +US-OK-73069,US,OK,73069,8.25,,,, +US-OK-73070,US,OK,73070,8.25,,,, +US-OK-73071,US,OK,73071,8.25,,,, +US-OK-73072,US,OK,73072,8.25,,,, +US-OK-73073,US,OK,73073,5.5,,,, +US-OK-73074,US,OK,73074,8.25,,,, +US-OK-73075,US,OK,73075,9.25,,,, +US-OK-73077,US,OK,73077,9.25,,,, +US-OK-73078,US,OK,73078,9.85,,,, +US-OK-73079,US,OK,73079,6.375,,,, +US-OK-73080,US,OK,73080,9,,,, +US-OK-73082,US,OK,73082,4.875,,,, +US-OK-73083,US,OK,73083,8.25,,,, +US-OK-73084,US,OK,73084,8.375,,,, +US-OK-73085,US,OK,73085,8.85,,,, +US-OK-73086,US,OK,73086,6.5,,,, +US-OK-73089,US,OK,73089,8.875,,,, +US-OK-73090,US,OK,73090,8.85,,,, +US-OK-73092,US,OK,73092,4.875,,,, +US-OK-73093,US,OK,73093,8.5,,,, +US-OK-73095,US,OK,73095,5,,,, +US-OK-73096,US,OK,73096,9.5,,,, +US-OK-73097,US,OK,73097,8.375,,,, +US-OK-73098,US,OK,73098,9.25,,,, +US-OK-73099,US,OK,73099,8.725,,,, +US-OK-73101,US,OK,73101,8.375,,,, +US-OK-73102,US,OK,73102,8.375,,,, +US-OK-73103,US,OK,73103,8.375,,,, +US-OK-73104,US,OK,73104,8.375,,,, +US-OK-73105,US,OK,73105,8.375,,,, +US-OK-73106,US,OK,73106,8.375,,,, +US-OK-73107,US,OK,73107,8.375,,,, +US-OK-73108,US,OK,73108,8.375,,,, +US-OK-73109,US,OK,73109,8.375,,,, +US-OK-73110,US,OK,73110,8.35,,,, +US-OK-73111,US,OK,73111,8.375,,,, +US-OK-73112,US,OK,73112,8.375,,,, +US-OK-73113,US,OK,73113,8.375,,,, +US-OK-73114,US,OK,73114,8.375,,,, +US-OK-73115,US,OK,73115,8,,,, +US-OK-73116,US,OK,73116,8.375,,,, +US-OK-73117,US,OK,73117,8.375,,,, +US-OK-73118,US,OK,73118,8.375,,,, +US-OK-73119,US,OK,73119,8.375,,,, +US-OK-73120,US,OK,73120,8.375,,,, +US-OK-73121,US,OK,73121,8.375,,,, +US-OK-73122,US,OK,73122,8.5,,,, +US-OK-73123,US,OK,73123,8.5,,,, +US-OK-73124,US,OK,73124,8.375,,,, +US-OK-73125,US,OK,73125,8.375,,,, +US-OK-73126,US,OK,73126,8.375,,,, +US-OK-73127,US,OK,73127,8.375,,,, +US-OK-73128,US,OK,73128,8.375,,,, +US-OK-73129,US,OK,73129,8.375,,,, +US-OK-73130,US,OK,73130,8.35,,,, +US-OK-73131,US,OK,73131,8.375,,,, +US-OK-73132,US,OK,73132,8.375,,,, +US-OK-73134,US,OK,73134,8.375,,,, +US-OK-73135,US,OK,73135,8.375,,,, +US-OK-73136,US,OK,73136,8.375,,,, +US-OK-73137,US,OK,73137,8.375,,,, +US-OK-73139,US,OK,73139,8.375,,,, +US-OK-73140,US,OK,73140,8.35,,,, +US-OK-73141,US,OK,73141,8.35,,,, +US-OK-73142,US,OK,73142,8.375,,,, +US-OK-73143,US,OK,73143,8.375,,,, +US-OK-73144,US,OK,73144,8.375,,,, +US-OK-73145,US,OK,73145,8.375,,,, +US-OK-73146,US,OK,73146,8.375,,,, +US-OK-73147,US,OK,73147,8.375,,,, +US-OK-73148,US,OK,73148,8.375,,,, +US-OK-73149,US,OK,73149,8.375,,,, +US-OK-73150,US,OK,73150,8.375,,,, +US-OK-73151,US,OK,73151,8.375,,,, +US-OK-73152,US,OK,73152,8.375,,,, +US-OK-73153,US,OK,73153,8.625,,,, +US-OK-73154,US,OK,73154,8.375,,,, +US-OK-73155,US,OK,73155,8.375,,,, +US-OK-73156,US,OK,73156,8.5,,,, +US-OK-73157,US,OK,73157,8.375,,,, +US-OK-73159,US,OK,73159,8.375,,,, +US-OK-73160,US,OK,73160,8.5,,,, +US-OK-73162,US,OK,73162,8.375,,,, +US-OK-73163,US,OK,73163,8.375,,,, +US-OK-73164,US,OK,73164,8.375,,,, +US-OK-73165,US,OK,73165,8.625,,,, +US-OK-73167,US,OK,73167,8.375,,,, +US-OK-73169,US,OK,73169,8.375,,,, +US-OK-73170,US,OK,73170,8.625,,,, +US-OK-73172,US,OK,73172,8.375,,,, +US-OK-73173,US,OK,73173,8.625,,,, +US-OK-73178,US,OK,73178,8.375,,,, +US-OK-73179,US,OK,73179,8.375,,,, +US-OK-73184,US,OK,73184,8.375,,,, +US-OK-73185,US,OK,73185,8.375,,,, +US-OK-73189,US,OK,73189,8.625,,,, +US-OK-73190,US,OK,73190,8.375,,,, +US-OK-73194,US,OK,73194,8.375,,,, +US-OK-73195,US,OK,73195,8.375,,,, +US-OK-73196,US,OK,73196,8.375,,,, +US-OK-73401,US,OK,73401,9,,,, +US-OK-73402,US,OK,73402,9,,,, +US-OK-73403,US,OK,73403,9,,,, +US-OK-73425,US,OK,73425,5.2,,,, +US-OK-73430,US,OK,73430,6.5,,,, +US-OK-73432,US,OK,73432,6,,,, +US-OK-73433,US,OK,73433,9.25,,,, +US-OK-73434,US,OK,73434,9.25,,,, +US-OK-73435,US,OK,73435,5.25,,,, +US-OK-73436,US,OK,73436,8.25,,,, +US-OK-73437,US,OK,73437,5.25,,,, +US-OK-73438,US,OK,73438,9.25,,,, +US-OK-73439,US,OK,73439,6,,,, +US-OK-73440,US,OK,73440,6,,,, +US-OK-73441,US,OK,73441,6.5,,,, +US-OK-73442,US,OK,73442,8.2,,,, +US-OK-73443,US,OK,73443,9.25,,,, +US-OK-73444,US,OK,73444,5.25,,,, +US-OK-73446,US,OK,73446,9,,,, +US-OK-73447,US,OK,73447,6,,,, +US-OK-73448,US,OK,73448,8.5,,,, +US-OK-73449,US,OK,73449,5,,,, +US-OK-73450,US,OK,73450,6,,,, +US-OK-73453,US,OK,73453,6.5,,,, +US-OK-73455,US,OK,73455,9,,,, +US-OK-73456,US,OK,73456,9,,,, +US-OK-73458,US,OK,73458,5.25,,,, +US-OK-73459,US,OK,73459,6.5,,,, +US-OK-73460,US,OK,73460,9,,,, +US-OK-73461,US,OK,73461,7.5,,,, +US-OK-73463,US,OK,73463,5.25,,,, +US-OK-73481,US,OK,73481,5.25,,,, +US-OK-73487,US,OK,73487,10.25,,,, +US-OK-73488,US,OK,73488,5.25,,,, +US-OK-73491,US,OK,73491,9.2,,,, +US-OK-73501,US,OK,73501,8.875,,,, +US-OK-73502,US,OK,73502,8.875,,,, +US-OK-73503,US,OK,73503,4.75,,,, +US-OK-73505,US,OK,73505,8.875,,,, +US-OK-73506,US,OK,73506,8.875,,,, +US-OK-73507,US,OK,73507,8.875,,,, +US-OK-73520,US,OK,73520,8.5,,,, +US-OK-73521,US,OK,73521,8.75,,,, +US-OK-73522,US,OK,73522,8.75,,,, +US-OK-73523,US,OK,73523,8.75,,,, +US-OK-73526,US,OK,73526,5,,,, +US-OK-73527,US,OK,73527,4.75,,,, +US-OK-73528,US,OK,73528,7.75,,,, +US-OK-73529,US,OK,73529,9.2,,,, +US-OK-73530,US,OK,73530,6,,,, +US-OK-73531,US,OK,73531,5.75,,,, +US-OK-73532,US,OK,73532,5,,,, +US-OK-73533,US,OK,73533,8.7,,,, +US-OK-73534,US,OK,73534,8.7,,,, +US-OK-73536,US,OK,73536,8.7,,,, +US-OK-73537,US,OK,73537,7,,,, +US-OK-73538,US,OK,73538,4.75,,,, +US-OK-73539,US,OK,73539,5,,,, +US-OK-73540,US,OK,73540,4.75,,,, +US-OK-73541,US,OK,73541,4.75,,,, +US-OK-73542,US,OK,73542,9.5,,,, +US-OK-73543,US,OK,73543,4.75,,,, +US-OK-73544,US,OK,73544,6.5,,,, +US-OK-73546,US,OK,73546,9,,,, +US-OK-73547,US,OK,73547,9,,,, +US-OK-73548,US,OK,73548,9.5,,,, +US-OK-73549,US,OK,73549,5,,,, +US-OK-73550,US,OK,73550,8.5,,,, +US-OK-73551,US,OK,73551,9,,,, +US-OK-73552,US,OK,73552,4.75,,,, +US-OK-73553,US,OK,73553,6,,,, +US-OK-73554,US,OK,73554,9,,,, +US-OK-73555,US,OK,73555,9,,,, +US-OK-73556,US,OK,73556,5,,,, +US-OK-73557,US,OK,73557,8.5,,,, +US-OK-73558,US,OK,73558,4.75,,,, +US-OK-73559,US,OK,73559,8,,,, +US-OK-73560,US,OK,73560,5,,,, +US-OK-73561,US,OK,73561,6.5,,,, +US-OK-73562,US,OK,73562,5.75,,,, +US-OK-73564,US,OK,73564,8,,,, +US-OK-73565,US,OK,73565,9.5,,,, +US-OK-73566,US,OK,73566,9,,,, +US-OK-73567,US,OK,73567,7.75,,,, +US-OK-73568,US,OK,73568,8.75,,,, +US-OK-73569,US,OK,73569,9.5,,,, +US-OK-73570,US,OK,73570,6,,,, +US-OK-73571,US,OK,73571,6.5,,,, +US-OK-73572,US,OK,73572,8.75,,,, +US-OK-73573,US,OK,73573,9.5,,,, +US-OK-73601,US,OK,73601,9.5,,,, +US-OK-73620,US,OK,73620,8.5,,,, +US-OK-73622,US,OK,73622,8.375,,,, +US-OK-73624,US,OK,73624,10.375,,,, +US-OK-73625,US,OK,73625,8.5,,,, +US-OK-73626,US,OK,73626,10.375,,,, +US-OK-73627,US,OK,73627,4.8,,,, +US-OK-73628,US,OK,73628,9,,,, +US-OK-73632,US,OK,73632,9.375,,,, +US-OK-73638,US,OK,73638,6,,,, +US-OK-73639,US,OK,73639,9.5,,,, +US-OK-73641,US,OK,73641,9.375,,,, +US-OK-73642,US,OK,73642,6,,,, +US-OK-73644,US,OK,73644,8.8,,,, +US-OK-73645,US,OK,73645,8.8,,,, +US-OK-73646,US,OK,73646,6.25,,,, +US-OK-73647,US,OK,73647,10.375,,,, +US-OK-73648,US,OK,73648,8.8,,,, +US-OK-73650,US,OK,73650,9,,,, +US-OK-73651,US,OK,73651,9,,,, +US-OK-73654,US,OK,73654,9.25,,,, +US-OK-73655,US,OK,73655,8,,,, +US-OK-73658,US,OK,73658,6.25,,,, +US-OK-73659,US,OK,73659,6.25,,,, +US-OK-73660,US,OK,73660,8,,,, +US-OK-73661,US,OK,73661,9.375,,,, +US-OK-73662,US,OK,73662,9.8,,,, +US-OK-73663,US,OK,73663,10.25,,,, +US-OK-73664,US,OK,73664,9.375,,,, +US-OK-73666,US,OK,73666,5.8,,,, +US-OK-73667,US,OK,73667,9.25,,,, +US-OK-73668,US,OK,73668,4.8,,,, +US-OK-73669,US,OK,73669,9.5,,,, +US-OK-73673,US,OK,73673,6,,,, +US-OK-73701,US,OK,73701,8.35,,,, +US-OK-73702,US,OK,73702,8.35,,,, +US-OK-73703,US,OK,73703,8.35,,,, +US-OK-73705,US,OK,73705,8.35,,,, +US-OK-73706,US,OK,73706,8.35,,,, +US-OK-73716,US,OK,73716,9.5,,,, +US-OK-73717,US,OK,73717,9.25,,,, +US-OK-73718,US,OK,73718,7.75,,,, +US-OK-73719,US,OK,73719,6.5,,,, +US-OK-73720,US,OK,73720,4.85,,,, +US-OK-73722,US,OK,73722,7.5,,,, +US-OK-73724,US,OK,73724,8.25,,,, +US-OK-73726,US,OK,73726,9.5,,,, +US-OK-73727,US,OK,73727,4.85,,,, +US-OK-73728,US,OK,73728,9.75,,,, +US-OK-73729,US,OK,73729,7.75,,,, +US-OK-73730,US,OK,73730,4.85,,,, +US-OK-73731,US,OK,73731,5,,,, +US-OK-73733,US,OK,73733,4.85,,,, +US-OK-73734,US,OK,73734,9.25,,,, +US-OK-73735,US,OK,73735,4.85,,,, +US-OK-73736,US,OK,73736,4.85,,,, +US-OK-73737,US,OK,73737,8.75,,,, +US-OK-73738,US,OK,73738,4.85,,,, +US-OK-73739,US,OK,73739,9.5,,,, +US-OK-73741,US,OK,73741,6.5,,,, +US-OK-73742,US,OK,73742,8.75,,,, +US-OK-73743,US,OK,73743,5.85,,,, +US-OK-73744,US,OK,73744,8.25,,,, +US-OK-73746,US,OK,73746,5,,,, +US-OK-73747,US,OK,73747,4.75,,,, +US-OK-73749,US,OK,73749,9.5,,,, +US-OK-73750,US,OK,73750,8.25,,,, +US-OK-73753,US,OK,73753,4.85,,,, +US-OK-73754,US,OK,73754,8.85,,,, +US-OK-73755,US,OK,73755,8.25,,,, +US-OK-73756,US,OK,73756,7.25,,,, +US-OK-73757,US,OK,73757,6,,,, +US-OK-73758,US,OK,73758,5.75,,,, +US-OK-73759,US,OK,73759,9.75,,,, +US-OK-73760,US,OK,73760,7.75,,,, +US-OK-73761,US,OK,73761,8.75,,,, +US-OK-73762,US,OK,73762,4.85,,,, +US-OK-73763,US,OK,73763,9.5,,,, +US-OK-73764,US,OK,73764,5.25,,,, +US-OK-73766,US,OK,73766,9.75,,,, +US-OK-73768,US,OK,73768,7.75,,,, +US-OK-73770,US,OK,73770,5.25,,,, +US-OK-73771,US,OK,73771,9.75,,,, +US-OK-73772,US,OK,73772,10.25,,,, +US-OK-73773,US,OK,73773,8.85,,,, +US-OK-73801,US,OK,73801,9.325,,,, +US-OK-73802,US,OK,73802,9.325,,,, +US-OK-73832,US,OK,73832,9.5,,,, +US-OK-73834,US,OK,73834,9.5,,,, +US-OK-73835,US,OK,73835,10.25,,,, +US-OK-73838,US,OK,73838,4.75,,,, +US-OK-73840,US,OK,73840,9.5,,,, +US-OK-73841,US,OK,73841,8.825,,,, +US-OK-73842,US,OK,73842,7,,,, +US-OK-73843,US,OK,73843,9.5,,,, +US-OK-73844,US,OK,73844,6.5,,,, +US-OK-73848,US,OK,73848,8.75,,,, +US-OK-73851,US,OK,73851,6.5,,,, +US-OK-73852,US,OK,73852,8.825,,,, +US-OK-73853,US,OK,73853,5.825,,,, +US-OK-73855,US,OK,73855,6.5,,,, +US-OK-73857,US,OK,73857,5.825,,,, +US-OK-73858,US,OK,73858,9.5,,,, +US-OK-73859,US,OK,73859,9.25,,,, +US-OK-73860,US,OK,73860,9,,,, +US-OK-73901,US,OK,73901,5.5,,,, +US-OK-73931,US,OK,73931,6.5,,,, +US-OK-73932,US,OK,73932,8.5,,,, +US-OK-73933,US,OK,73933,9.5,,,, +US-OK-73937,US,OK,73937,6.5,,,, +US-OK-73938,US,OK,73938,9.5,,,, +US-OK-73939,US,OK,73939,8.5,,,, +US-OK-73942,US,OK,73942,9.5,,,, +US-OK-73944,US,OK,73944,9.5,,,, +US-OK-73945,US,OK,73945,9.5,,,, +US-OK-73946,US,OK,73946,6.5,,,, +US-OK-73947,US,OK,73947,8.5,,,, +US-OK-73949,US,OK,73949,8.5,,,, +US-OK-73950,US,OK,73950,6.5,,,, +US-OK-73951,US,OK,73951,8.5,,,, +US-OK-74001,US,OK,74001,7.75,,,, +US-OK-74002,US,OK,74002,5.75,,,, +US-OK-74003,US,OK,74003,8.5,,,, +US-OK-74004,US,OK,74004,8.5,,,, +US-OK-74005,US,OK,74005,8.5,,,, +US-OK-74006,US,OK,74006,8.5,,,, +US-OK-74008,US,OK,74008,8.85,,,, +US-OK-74010,US,OK,74010,5.5,,,, +US-OK-74011,US,OK,74011,8.35,,,, +US-OK-74012,US,OK,74012,8.35,,,, +US-OK-74013,US,OK,74013,8.35,,,, +US-OK-74014,US,OK,74014,5.8,,,, +US-OK-74015,US,OK,74015,9.583,,,, +US-OK-74016,US,OK,74016,6.333,,,, +US-OK-74017,US,OK,74017,9.333,,,, +US-OK-74018,US,OK,74018,9.333,,,, +US-OK-74019,US,OK,74019,6.333,,,, +US-OK-74020,US,OK,74020,10,,,, +US-OK-74021,US,OK,74021,9.1,,,, +US-OK-74022,US,OK,74022,5.5,,,, +US-OK-74023,US,OK,74023,9.313,,,, +US-OK-74026,US,OK,74026,9.5,,,, +US-OK-74027,US,OK,74027,8.5,,,, +US-OK-74028,US,OK,74028,5.5,,,, +US-OK-74029,US,OK,74029,8.5,,,, +US-OK-74030,US,OK,74030,10,,,, +US-OK-74031,US,OK,74031,10.333,,,, +US-OK-74032,US,OK,74032,5.313,,,, +US-OK-74033,US,OK,74033,9.35,,,, +US-OK-74034,US,OK,74034,11,,,, +US-OK-74035,US,OK,74035,9.25,,,, +US-OK-74036,US,OK,74036,6.333,,,, +US-OK-74037,US,OK,74037,8.35,,,, +US-OK-74038,US,OK,74038,6.5,,,, +US-OK-74039,US,OK,74039,5.5,,,, +US-OK-74041,US,OK,74041,9.5,,,, +US-OK-74042,US,OK,74042,8.5,,,, +US-OK-74043,US,OK,74043,5.35,,,, +US-OK-74044,US,OK,74044,5.5,,,, +US-OK-74045,US,OK,74045,6.5,,,, +US-OK-74046,US,OK,74046,5.5,,,, +US-OK-74047,US,OK,74047,5.75,,,, +US-OK-74048,US,OK,74048,9.5,,,, +US-OK-74050,US,OK,74050,5.35,,,, +US-OK-74051,US,OK,74051,5.5,,,, +US-OK-74052,US,OK,74052,10.5,,,, +US-OK-74053,US,OK,74053,6.333,,,, +US-OK-74054,US,OK,74054,5.75,,,, +US-OK-74055,US,OK,74055,8.35,,,, +US-OK-74056,US,OK,74056,8.75,,,, +US-OK-74058,US,OK,74058,6.5,,,, +US-OK-74059,US,OK,74059,5.313,,,, +US-OK-74060,US,OK,74060,8.75,,,, +US-OK-74061,US,OK,74061,5.5,,,, +US-OK-74062,US,OK,74062,5.313,,,, +US-OK-74063,US,OK,74063,8.85,,,, +US-OK-74066,US,OK,74066,9.5,,,, +US-OK-74067,US,OK,74067,9.5,,,, +US-OK-74068,US,OK,74068,8.5,,,, +US-OK-74070,US,OK,74070,5.75,,,, +US-OK-74071,US,OK,74071,8.5,,,, +US-OK-74072,US,OK,74072,8.5,,,, +US-OK-74073,US,OK,74073,5.75,,,, +US-OK-74074,US,OK,74074,8.813,,,, +US-OK-74075,US,OK,74075,8.813,,,, +US-OK-74076,US,OK,74076,8.813,,,, +US-OK-74077,US,OK,74077,8.813,,,, +US-OK-74078,US,OK,74078,8.813,,,, +US-OK-74079,US,OK,74079,9.5,,,, +US-OK-74080,US,OK,74080,6.333,,,, +US-OK-74081,US,OK,74081,6.5,,,, +US-OK-74082,US,OK,74082,7.5,,,, +US-OK-74083,US,OK,74083,8.5,,,, +US-OK-74084,US,OK,74084,9.75,,,, +US-OK-74085,US,OK,74085,5.313,,,, +US-OK-74101,US,OK,74101,8.517,,,, +US-OK-74102,US,OK,74102,8.517,,,, +US-OK-74103,US,OK,74103,8.517,,,, +US-OK-74104,US,OK,74104,8.517,,,, +US-OK-74105,US,OK,74105,8.517,,,, +US-OK-74106,US,OK,74106,8.517,,,, +US-OK-74107,US,OK,74107,8.517,,,, +US-OK-74108,US,OK,74108,8.517,,,, +US-OK-74110,US,OK,74110,8.517,,,, +US-OK-74112,US,OK,74112,8.517,,,, +US-OK-74114,US,OK,74114,8.517,,,, +US-OK-74115,US,OK,74115,8.517,,,, +US-OK-74116,US,OK,74116,8.517,,,, +US-OK-74117,US,OK,74117,5.35,,,, +US-OK-74119,US,OK,74119,8.517,,,, +US-OK-74120,US,OK,74120,8.517,,,, +US-OK-74121,US,OK,74121,8.517,,,, +US-OK-74126,US,OK,74126,8.517,,,, +US-OK-74127,US,OK,74127,8.517,,,, +US-OK-74128,US,OK,74128,8.517,,,, +US-OK-74129,US,OK,74129,8.517,,,, +US-OK-74130,US,OK,74130,5.35,,,, +US-OK-74131,US,OK,74131,5.5,,,, +US-OK-74132,US,OK,74132,8.517,,,, +US-OK-74133,US,OK,74133,8.517,,,, +US-OK-74134,US,OK,74134,8.517,,,, +US-OK-74135,US,OK,74135,8.517,,,, +US-OK-74136,US,OK,74136,8.517,,,, +US-OK-74137,US,OK,74137,8.517,,,, +US-OK-74141,US,OK,74141,8.517,,,, +US-OK-74145,US,OK,74145,8.517,,,, +US-OK-74146,US,OK,74146,8.517,,,, +US-OK-74147,US,OK,74147,8.517,,,, +US-OK-74148,US,OK,74148,8.517,,,, +US-OK-74149,US,OK,74149,8.517,,,, +US-OK-74150,US,OK,74150,8.517,,,, +US-OK-74152,US,OK,74152,8.517,,,, +US-OK-74153,US,OK,74153,8.517,,,, +US-OK-74155,US,OK,74155,8.517,,,, +US-OK-74156,US,OK,74156,8.517,,,, +US-OK-74157,US,OK,74157,8.517,,,, +US-OK-74158,US,OK,74158,8.517,,,, +US-OK-74159,US,OK,74159,8.517,,,, +US-OK-74169,US,OK,74169,8.517,,,, +US-OK-74170,US,OK,74170,8.517,,,, +US-OK-74171,US,OK,74171,8.517,,,, +US-OK-74172,US,OK,74172,8.517,,,, +US-OK-74182,US,OK,74182,8.517,,,, +US-OK-74186,US,OK,74186,8.517,,,, +US-OK-74187,US,OK,74187,8.517,,,, +US-OK-74192,US,OK,74192,8.517,,,, +US-OK-74193,US,OK,74193,8.517,,,, +US-OK-74301,US,OK,74301,6.5,,,, +US-OK-74330,US,OK,74330,5.875,,,, +US-OK-74331,US,OK,74331,5.9,,,, +US-OK-74332,US,OK,74332,6.5,,,, +US-OK-74333,US,OK,74333,6.5,,,, +US-OK-74335,US,OK,74335,5.85,,,, +US-OK-74337,US,OK,74337,5.875,,,, +US-OK-74338,US,OK,74338,5.9,,,, +US-OK-74339,US,OK,74339,8.85,,,, +US-OK-74340,US,OK,74340,9.75,,,, +US-OK-74342,US,OK,74342,5.9,,,, +US-OK-74343,US,OK,74343,5.85,,,, +US-OK-74344,US,OK,74344,5.9,,,, +US-OK-74345,US,OK,74345,9.3,,,, +US-OK-74346,US,OK,74346,5.9,,,, +US-OK-74347,US,OK,74347,5.9,,,, +US-OK-74349,US,OK,74349,9.5,,,, +US-OK-74350,US,OK,74350,8.875,,,, +US-OK-74352,US,OK,74352,5.875,,,, +US-OK-74354,US,OK,74354,9.5,,,, +US-OK-74355,US,OK,74355,9.5,,,, +US-OK-74358,US,OK,74358,8.85,,,, +US-OK-74359,US,OK,74359,8.9,,,, +US-OK-74360,US,OK,74360,10.85,,,, +US-OK-74361,US,OK,74361,5.875,,,, +US-OK-74362,US,OK,74362,9.625,,,, +US-OK-74363,US,OK,74363,5.85,,,, +US-OK-74364,US,OK,74364,5.9,,,, +US-OK-74365,US,OK,74365,5.875,,,, +US-OK-74366,US,OK,74366,5.875,,,, +US-OK-74367,US,OK,74367,5.875,,,, +US-OK-74368,US,OK,74368,5.9,,,, +US-OK-74369,US,OK,74369,6.5,,,, +US-OK-74370,US,OK,74370,5.85,,,, +US-OK-74401,US,OK,74401,9.15,,,, +US-OK-74402,US,OK,74402,9.15,,,, +US-OK-74403,US,OK,74403,9.15,,,, +US-OK-74421,US,OK,74421,5.75,,,, +US-OK-74422,US,OK,74422,5.75,,,, +US-OK-74423,US,OK,74423,8.15,,,, +US-OK-74425,US,OK,74425,5.5,,,, +US-OK-74426,US,OK,74426,10.5,,,, +US-OK-74427,US,OK,74427,6.25,,,, +US-OK-74428,US,OK,74428,7.15,,,, +US-OK-74429,US,OK,74429,5.8,,,, +US-OK-74430,US,OK,74430,9.5,,,, +US-OK-74431,US,OK,74431,9.75,,,, +US-OK-74432,US,OK,74432,10,,,, +US-OK-74434,US,OK,74434,6.25,,,, +US-OK-74435,US,OK,74435,8.917,,,, +US-OK-74436,US,OK,74436,9.5,,,, +US-OK-74437,US,OK,74437,9.75,,,, +US-OK-74438,US,OK,74438,6.5,,,, +US-OK-74439,US,OK,74439,8.15,,,, +US-OK-74440,US,OK,74440,9.25,,,, +US-OK-74441,US,OK,74441,6.25,,,, +US-OK-74442,US,OK,74442,5.5,,,, +US-OK-74444,US,OK,74444,6.25,,,, +US-OK-74445,US,OK,74445,5.75,,,, +US-OK-74446,US,OK,74446,9.8,,,, +US-OK-74447,US,OK,74447,9.75,,,, +US-OK-74450,US,OK,74450,5.15,,,, +US-OK-74451,US,OK,74451,6.25,,,, +US-OK-74452,US,OK,74452,6.25,,,, +US-OK-74454,US,OK,74454,5.8,,,, +US-OK-74455,US,OK,74455,9.15,,,, +US-OK-74456,US,OK,74456,5.75,,,, +US-OK-74457,US,OK,74457,6.25,,,, +US-OK-74458,US,OK,74458,5.8,,,, +US-OK-74459,US,OK,74459,10.5,,,, +US-OK-74460,US,OK,74460,6.25,,,, +US-OK-74461,US,OK,74461,6.5,,,, +US-OK-74462,US,OK,74462,9.25,,,, +US-OK-74463,US,OK,74463,9.15,,,, +US-OK-74464,US,OK,74464,9.5,,,, +US-OK-74465,US,OK,74465,9.5,,,, +US-OK-74467,US,OK,74467,8.8,,,, +US-OK-74468,US,OK,74468,9.15,,,, +US-OK-74469,US,OK,74469,9.15,,,, +US-OK-74470,US,OK,74470,8.65,,,, +US-OK-74471,US,OK,74471,6.25,,,, +US-OK-74472,US,OK,74472,9.25,,,, +US-OK-74477,US,OK,74477,8.8,,,, +US-OK-74501,US,OK,74501,9,,,, +US-OK-74502,US,OK,74502,9.5,,,, +US-OK-74521,US,OK,74521,6.5,,,, +US-OK-74522,US,OK,74522,7.5,,,, +US-OK-74523,US,OK,74523,9.5,,,, +US-OK-74525,US,OK,74525,9.5,,,, +US-OK-74528,US,OK,74528,5.5,,,, +US-OK-74529,US,OK,74529,5.5,,,, +US-OK-74530,US,OK,74530,6,,,, +US-OK-74531,US,OK,74531,4.75,,,, +US-OK-74533,US,OK,74533,6.5,,,, +US-OK-74534,US,OK,74534,6.5,,,, +US-OK-74535,US,OK,74535,6.5,,,, +US-OK-74536,US,OK,74536,10.5,,,, +US-OK-74538,US,OK,74538,9.5,,,, +US-OK-74540,US,OK,74540,6.5,,,, +US-OK-74543,US,OK,74543,6.5,,,, +US-OK-74545,US,OK,74545,6,,,, +US-OK-74546,US,OK,74546,8.5,,,, +US-OK-74547,US,OK,74547,8.75,,,, +US-OK-74549,US,OK,74549,6,,,, +US-OK-74552,US,OK,74552,6.25,,,, +US-OK-74553,US,OK,74553,8.5,,,, +US-OK-74554,US,OK,74554,9.5,,,, +US-OK-74555,US,OK,74555,6.5,,,, +US-OK-74556,US,OK,74556,8.5,,,, +US-OK-74557,US,OK,74557,6.5,,,, +US-OK-74558,US,OK,74558,6.5,,,, +US-OK-74559,US,OK,74559,6,,,, +US-OK-74560,US,OK,74560,5.5,,,, +US-OK-74561,US,OK,74561,5.5,,,, +US-OK-74562,US,OK,74562,8.5,,,, +US-OK-74563,US,OK,74563,6,,,, +US-OK-74565,US,OK,74565,10.5,,,, +US-OK-74567,US,OK,74567,6.5,,,, +US-OK-74569,US,OK,74569,6.5,,,, +US-OK-74570,US,OK,74570,5.5,,,, +US-OK-74571,US,OK,74571,9,,,, +US-OK-74572,US,OK,74572,9.5,,,, +US-OK-74574,US,OK,74574,6,,,, +US-OK-74576,US,OK,74576,5.5,,,, +US-OK-74577,US,OK,74577,6,,,, +US-OK-74578,US,OK,74578,6,,,, +US-OK-74601,US,OK,74601,8.667,,,, +US-OK-74602,US,OK,74602,8.667,,,, +US-OK-74604,US,OK,74604,5.75,,,, +US-OK-74630,US,OK,74630,6,,,, +US-OK-74631,US,OK,74631,9.167,,,, +US-OK-74632,US,OK,74632,5.167,,,, +US-OK-74633,US,OK,74633,5.75,,,, +US-OK-74636,US,OK,74636,8.75,,,, +US-OK-74637,US,OK,74637,8.75,,,, +US-OK-74640,US,OK,74640,4.85,,,, +US-OK-74641,US,OK,74641,5.167,,,, +US-OK-74643,US,OK,74643,9.75,,,, +US-OK-74644,US,OK,74644,6,,,, +US-OK-74646,US,OK,74646,5.167,,,, +US-OK-74647,US,OK,74647,5.167,,,, +US-OK-74650,US,OK,74650,9.5,,,, +US-OK-74651,US,OK,74651,6,,,, +US-OK-74652,US,OK,74652,5.75,,,, +US-OK-74653,US,OK,74653,9.667,,,, +US-OK-74701,US,OK,74701,9.375,,,, +US-OK-74702,US,OK,74702,9.375,,,, +US-OK-74720,US,OK,74720,8,,,, +US-OK-74721,US,OK,74721,5,,,, +US-OK-74722,US,OK,74722,6,,,, +US-OK-74723,US,OK,74723,5,,,, +US-OK-74724,US,OK,74724,9.5,,,, +US-OK-74726,US,OK,74726,5,,,, +US-OK-74727,US,OK,74727,9.5,,,, +US-OK-74728,US,OK,74728,8.25,,,, +US-OK-74729,US,OK,74729,5,,,, +US-OK-74730,US,OK,74730,5,,,, +US-OK-74731,US,OK,74731,5,,,, +US-OK-74733,US,OK,74733,5,,,, +US-OK-74734,US,OK,74734,6,,,, +US-OK-74735,US,OK,74735,10,,,, +US-OK-74736,US,OK,74736,6,,,, +US-OK-74737,US,OK,74737,6,,,, +US-OK-74738,US,OK,74738,6.5,,,, +US-OK-74740,US,OK,74740,9.5,,,, +US-OK-74741,US,OK,74741,5,,,, +US-OK-74743,US,OK,74743,10,,,, +US-OK-74745,US,OK,74745,9,,,, +US-OK-74747,US,OK,74747,5,,,, +US-OK-74748,US,OK,74748,6,,,, +US-OK-74750,US,OK,74750,9,,,, +US-OK-74752,US,OK,74752,6,,,, +US-OK-74753,US,OK,74753,5,,,, +US-OK-74754,US,OK,74754,6,,,, +US-OK-74755,US,OK,74755,6,,,, +US-OK-74756,US,OK,74756,7.5,,,, +US-OK-74759,US,OK,74759,8.5,,,, +US-OK-74760,US,OK,74760,6.5,,,, +US-OK-74761,US,OK,74761,6.5,,,, +US-OK-74764,US,OK,74764,9,,,, +US-OK-74766,US,OK,74766,9,,,, +US-OK-74801,US,OK,74801,8.5,,,, +US-OK-74802,US,OK,74802,8.5,,,, +US-OK-74804,US,OK,74804,8.5,,,, +US-OK-74818,US,OK,74818,9.75,,,, +US-OK-74820,US,OK,74820,9.375,,,, +US-OK-74821,US,OK,74821,9.375,,,, +US-OK-74824,US,OK,74824,5.5,,,, +US-OK-74825,US,OK,74825,8.375,,,, +US-OK-74826,US,OK,74826,5.5,,,, +US-OK-74827,US,OK,74827,4.75,,,, +US-OK-74829,US,OK,74829,8.75,,,, +US-OK-74830,US,OK,74830,8.75,,,, +US-OK-74831,US,OK,74831,5,,,, +US-OK-74832,US,OK,74832,9.5,,,, +US-OK-74833,US,OK,74833,7.75,,,, +US-OK-74834,US,OK,74834,5.5,,,, +US-OK-74836,US,OK,74836,6,,,, +US-OK-74837,US,OK,74837,8.75,,,, +US-OK-74839,US,OK,74839,4.75,,,, +US-OK-74840,US,OK,74840,5.5,,,, +US-OK-74842,US,OK,74842,5.375,,,, +US-OK-74843,US,OK,74843,5.375,,,, +US-OK-74844,US,OK,74844,8.375,,,, +US-OK-74845,US,OK,74845,10.5,,,, +US-OK-74848,US,OK,74848,9.75,,,, +US-OK-74849,US,OK,74849,9.75,,,, +US-OK-74850,US,OK,74850,7.75,,,, +US-OK-74851,US,OK,74851,9.5,,,, +US-OK-74852,US,OK,74852,5.5,,,, +US-OK-74854,US,OK,74854,9.5,,,, +US-OK-74855,US,OK,74855,5.5,,,, +US-OK-74856,US,OK,74856,6,,,, +US-OK-74857,US,OK,74857,8.625,,,, +US-OK-74859,US,OK,74859,9.25,,,, +US-OK-74860,US,OK,74860,5.75,,,, +US-OK-74864,US,OK,74864,9.5,,,, +US-OK-74865,US,OK,74865,5.375,,,, +US-OK-74866,US,OK,74866,5.5,,,, +US-OK-74867,US,OK,74867,5.75,,,, +US-OK-74868,US,OK,74868,9.75,,,, +US-OK-74869,US,OK,74869,5.5,,,, +US-OK-74871,US,OK,74871,5.375,,,, +US-OK-74872,US,OK,74872,9.25,,,, +US-OK-74873,US,OK,74873,8.5,,,, +US-OK-74875,US,OK,74875,5.5,,,, +US-OK-74878,US,OK,74878,5.5,,,, +US-OK-74880,US,OK,74880,5.75,,,, +US-OK-74881,US,OK,74881,5.5,,,, +US-OK-74883,US,OK,74883,9.75,,,, +US-OK-74884,US,OK,74884,9.75,,,, +US-OK-74901,US,OK,74901,9,,,, +US-OK-74902,US,OK,74902,9,,,, +US-OK-74930,US,OK,74930,6,,,, +US-OK-74931,US,OK,74931,6.25,,,, +US-OK-74932,US,OK,74932,6,,,, +US-OK-74935,US,OK,74935,9,,,, +US-OK-74936,US,OK,74936,7.917,,,, +US-OK-74937,US,OK,74937,6,,,, +US-OK-74939,US,OK,74939,6,,,, +US-OK-74940,US,OK,74940,6,,,, +US-OK-74941,US,OK,74941,6.25,,,, +US-OK-74942,US,OK,74942,7,,,, +US-OK-74943,US,OK,74943,6.25,,,, +US-OK-74944,US,OK,74944,6.25,,,, +US-OK-74945,US,OK,74945,8.917,,,, +US-OK-74946,US,OK,74946,7.917,,,, +US-OK-74947,US,OK,74947,6,,,, +US-OK-74948,US,OK,74948,5.917,,,, +US-OK-74949,US,OK,74949,6,,,, +US-OK-74951,US,OK,74951,9,,,, +US-OK-74953,US,OK,74953,9,,,, +US-OK-74954,US,OK,74954,9.917,,,, +US-OK-74955,US,OK,74955,9.917,,,, +US-OK-74956,US,OK,74956,9.5,,,, +US-OK-74957,US,OK,74957,6,,,, +US-OK-74959,US,OK,74959,6,,,, +US-OK-74960,US,OK,74960,8.75,,,, +US-OK-74962,US,OK,74962,9.917,,,, +US-OK-74963,US,OK,74963,6,,,, +US-OK-74964,US,OK,74964,9.25,,,, +US-OK-74965,US,OK,74965,9,,,, +US-OK-74966,US,OK,74966,6,,,, +US-PA-15001,US,PA,15001,6,,,, +US-PA-15003,US,PA,15003,6,,,, +US-PA-15004,US,PA,15004,6,,,, +US-PA-15005,US,PA,15005,6,,,, +US-PA-15006,US,PA,15006,7,,,, +US-PA-15007,US,PA,15007,7,,,, +US-PA-15009,US,PA,15009,6,,,, +US-PA-15010,US,PA,15010,6,,,, +US-PA-15012,US,PA,15012,6,,,, +US-PA-15014,US,PA,15014,7,,,, +US-PA-15015,US,PA,15015,7,,,, +US-PA-15017,US,PA,15017,7,,,, +US-PA-15018,US,PA,15018,7,,,, +US-PA-15019,US,PA,15019,6,,,, +US-PA-15020,US,PA,15020,7,,,, +US-PA-15021,US,PA,15021,6,,,, +US-PA-15022,US,PA,15022,6,,,, +US-PA-15024,US,PA,15024,7,,,, +US-PA-15025,US,PA,15025,7,,,, +US-PA-15026,US,PA,15026,6,,,, +US-PA-15027,US,PA,15027,6,,,, +US-PA-15028,US,PA,15028,7,,,, +US-PA-15030,US,PA,15030,7,,,, +US-PA-15031,US,PA,15031,7,,,, +US-PA-15032,US,PA,15032,7,,,, +US-PA-15033,US,PA,15033,6,,,, +US-PA-15034,US,PA,15034,7,,,, +US-PA-15035,US,PA,15035,7,,,, +US-PA-15037,US,PA,15037,7,,,, +US-PA-15038,US,PA,15038,6,,,, +US-PA-15042,US,PA,15042,6,,,, +US-PA-15043,US,PA,15043,6,,,, +US-PA-15044,US,PA,15044,7,,,, +US-PA-15045,US,PA,15045,7,,,, +US-PA-15046,US,PA,15046,7,,,, +US-PA-15047,US,PA,15047,7,,,, +US-PA-15049,US,PA,15049,7,,,, +US-PA-15050,US,PA,15050,6,,,, +US-PA-15051,US,PA,15051,7,,,, +US-PA-15052,US,PA,15052,6,,,, +US-PA-15053,US,PA,15053,6,,,, +US-PA-15054,US,PA,15054,6,,,, +US-PA-15055,US,PA,15055,6,,,, +US-PA-15056,US,PA,15056,7,,,, +US-PA-15057,US,PA,15057,6,,,, +US-PA-15059,US,PA,15059,6,,,, +US-PA-15060,US,PA,15060,6,,,, +US-PA-15061,US,PA,15061,6,,,, +US-PA-15062,US,PA,15062,6,,,, +US-PA-15063,US,PA,15063,6,,,, +US-PA-15064,US,PA,15064,7,,,, +US-PA-15065,US,PA,15065,7,,,, +US-PA-15066,US,PA,15066,6,,,, +US-PA-15067,US,PA,15067,6,,,, +US-PA-15068,US,PA,15068,6,,,, +US-PA-15069,US,PA,15069,6,,,, +US-PA-15071,US,PA,15071,7,,,, +US-PA-15074,US,PA,15074,6,,,, +US-PA-15075,US,PA,15075,7,,,, +US-PA-15076,US,PA,15076,7,,,, +US-PA-15077,US,PA,15077,6,,,, +US-PA-15078,US,PA,15078,6,,,, +US-PA-15081,US,PA,15081,6,,,, +US-PA-15082,US,PA,15082,7,,,, +US-PA-15083,US,PA,15083,6,,,, +US-PA-15084,US,PA,15084,7,,,, +US-PA-15085,US,PA,15085,6,,,, +US-PA-15086,US,PA,15086,7,,,, +US-PA-15087,US,PA,15087,6,,,, +US-PA-15088,US,PA,15088,7,,,, +US-PA-15089,US,PA,15089,6,,,, +US-PA-15090,US,PA,15090,7,,,, +US-PA-15091,US,PA,15091,7,,,, +US-PA-15095,US,PA,15095,7,,,, +US-PA-15096,US,PA,15096,7,,,, +US-PA-15101,US,PA,15101,7,,,, +US-PA-15102,US,PA,15102,7,,,, +US-PA-15104,US,PA,15104,7,,,, +US-PA-15106,US,PA,15106,7,,,, +US-PA-15108,US,PA,15108,7,,,, +US-PA-15110,US,PA,15110,7,,,, +US-PA-15112,US,PA,15112,7,,,, +US-PA-15116,US,PA,15116,7,,,, +US-PA-15120,US,PA,15120,7,,,, +US-PA-15122,US,PA,15122,7,,,, +US-PA-15123,US,PA,15123,7,,,, +US-PA-15126,US,PA,15126,7,,,, +US-PA-15127,US,PA,15127,7,,,, +US-PA-15129,US,PA,15129,7,,,, +US-PA-15131,US,PA,15131,7,,,, +US-PA-15132,US,PA,15132,7,,,, +US-PA-15133,US,PA,15133,7,,,, +US-PA-15134,US,PA,15134,7,,,, +US-PA-15135,US,PA,15135,7,,,, +US-PA-15136,US,PA,15136,7,,,, +US-PA-15137,US,PA,15137,7,,,, +US-PA-15139,US,PA,15139,7,,,, +US-PA-15140,US,PA,15140,7,,,, +US-PA-15142,US,PA,15142,7,,,, +US-PA-15143,US,PA,15143,7,,,, +US-PA-15144,US,PA,15144,7,,,, +US-PA-15145,US,PA,15145,7,,,, +US-PA-15146,US,PA,15146,7,,,, +US-PA-15147,US,PA,15147,7,,,, +US-PA-15148,US,PA,15148,7,,,, +US-PA-15201,US,PA,15201,7,,,, +US-PA-15202,US,PA,15202,7,,,, +US-PA-15203,US,PA,15203,7,,,, +US-PA-15204,US,PA,15204,7,,,, +US-PA-15205,US,PA,15205,7,,,, +US-PA-15206,US,PA,15206,7,,,, +US-PA-15207,US,PA,15207,7,,,, +US-PA-15208,US,PA,15208,7,,,, +US-PA-15209,US,PA,15209,7,,,, +US-PA-15210,US,PA,15210,7,,,, +US-PA-15211,US,PA,15211,7,,,, +US-PA-15212,US,PA,15212,7,,,, +US-PA-15213,US,PA,15213,7,,,, +US-PA-15214,US,PA,15214,7,,,, +US-PA-15215,US,PA,15215,7,,,, +US-PA-15216,US,PA,15216,7,,,, +US-PA-15217,US,PA,15217,7,,,, +US-PA-15218,US,PA,15218,7,,,, +US-PA-15219,US,PA,15219,7,,,, +US-PA-15220,US,PA,15220,7,,,, +US-PA-15221,US,PA,15221,7,,,, +US-PA-15222,US,PA,15222,7,,,, +US-PA-15223,US,PA,15223,7,,,, +US-PA-15224,US,PA,15224,7,,,, +US-PA-15225,US,PA,15225,7,,,, +US-PA-15226,US,PA,15226,7,,,, +US-PA-15227,US,PA,15227,7,,,, +US-PA-15228,US,PA,15228,7,,,, +US-PA-15229,US,PA,15229,7,,,, +US-PA-15230,US,PA,15230,7,,,, +US-PA-15231,US,PA,15231,7,,,, +US-PA-15232,US,PA,15232,7,,,, +US-PA-15233,US,PA,15233,7,,,, +US-PA-15234,US,PA,15234,7,,,, +US-PA-15235,US,PA,15235,7,,,, +US-PA-15236,US,PA,15236,7,,,, +US-PA-15237,US,PA,15237,7,,,, +US-PA-15238,US,PA,15238,7,,,, +US-PA-15239,US,PA,15239,7,,,, +US-PA-15240,US,PA,15240,7,,,, +US-PA-15241,US,PA,15241,7,,,, +US-PA-15242,US,PA,15242,7,,,, +US-PA-15243,US,PA,15243,7,,,, +US-PA-15244,US,PA,15244,7,,,, +US-PA-15250,US,PA,15250,7,,,, +US-PA-15251,US,PA,15251,7,,,, +US-PA-15252,US,PA,15252,7,,,, +US-PA-15253,US,PA,15253,7,,,, +US-PA-15254,US,PA,15254,7,,,, +US-PA-15255,US,PA,15255,7,,,, +US-PA-15257,US,PA,15257,7,,,, +US-PA-15258,US,PA,15258,7,,,, +US-PA-15259,US,PA,15259,7,,,, +US-PA-15260,US,PA,15260,7,,,, +US-PA-15261,US,PA,15261,7,,,, +US-PA-15262,US,PA,15262,7,,,, +US-PA-15264,US,PA,15264,7,,,, +US-PA-15265,US,PA,15265,7,,,, +US-PA-15267,US,PA,15267,7,,,, +US-PA-15268,US,PA,15268,7,,,, +US-PA-15270,US,PA,15270,7,,,, +US-PA-15272,US,PA,15272,7,,,, +US-PA-15274,US,PA,15274,7,,,, +US-PA-15275,US,PA,15275,7,,,, +US-PA-15276,US,PA,15276,7,,,, +US-PA-15277,US,PA,15277,7,,,, +US-PA-15278,US,PA,15278,7,,,, +US-PA-15279,US,PA,15279,7,,,, +US-PA-15281,US,PA,15281,7,,,, +US-PA-15282,US,PA,15282,7,,,, +US-PA-15283,US,PA,15283,7,,,, +US-PA-15286,US,PA,15286,7,,,, +US-PA-15289,US,PA,15289,7,,,, +US-PA-15290,US,PA,15290,7,,,, +US-PA-15295,US,PA,15295,7,,,, +US-PA-15301,US,PA,15301,6,,,, +US-PA-15310,US,PA,15310,6,,,, +US-PA-15311,US,PA,15311,6,,,, +US-PA-15312,US,PA,15312,6,,,, +US-PA-15313,US,PA,15313,6,,,, +US-PA-15314,US,PA,15314,6,,,, +US-PA-15315,US,PA,15315,6,,,, +US-PA-15316,US,PA,15316,6,,,, +US-PA-15317,US,PA,15317,6,,,, +US-PA-15320,US,PA,15320,6,,,, +US-PA-15321,US,PA,15321,6,,,, +US-PA-15322,US,PA,15322,6,,,, +US-PA-15323,US,PA,15323,6,,,, +US-PA-15324,US,PA,15324,6,,,, +US-PA-15325,US,PA,15325,6,,,, +US-PA-15327,US,PA,15327,6,,,, +US-PA-15329,US,PA,15329,6,,,, +US-PA-15330,US,PA,15330,6,,,, +US-PA-15331,US,PA,15331,6,,,, +US-PA-15332,US,PA,15332,6,,,, +US-PA-15333,US,PA,15333,6,,,, +US-PA-15334,US,PA,15334,6,,,, +US-PA-15336,US,PA,15336,6,,,, +US-PA-15337,US,PA,15337,6,,,, +US-PA-15338,US,PA,15338,6,,,, +US-PA-15339,US,PA,15339,6,,,, +US-PA-15340,US,PA,15340,6,,,, +US-PA-15341,US,PA,15341,6,,,, +US-PA-15342,US,PA,15342,6,,,, +US-PA-15344,US,PA,15344,6,,,, +US-PA-15345,US,PA,15345,6,,,, +US-PA-15346,US,PA,15346,6,,,, +US-PA-15347,US,PA,15347,6,,,, +US-PA-15348,US,PA,15348,6,,,, +US-PA-15349,US,PA,15349,6,,,, +US-PA-15350,US,PA,15350,6,,,, +US-PA-15351,US,PA,15351,6,,,, +US-PA-15352,US,PA,15352,6,,,, +US-PA-15353,US,PA,15353,6,,,, +US-PA-15357,US,PA,15357,6,,,, +US-PA-15358,US,PA,15358,6,,,, +US-PA-15359,US,PA,15359,6,,,, +US-PA-15360,US,PA,15360,6,,,, +US-PA-15361,US,PA,15361,6,,,, +US-PA-15362,US,PA,15362,6,,,, +US-PA-15363,US,PA,15363,6,,,, +US-PA-15364,US,PA,15364,6,,,, +US-PA-15365,US,PA,15365,6,,,, +US-PA-15366,US,PA,15366,6,,,, +US-PA-15367,US,PA,15367,6,,,, +US-PA-15368,US,PA,15368,6,,,, +US-PA-15370,US,PA,15370,6,,,, +US-PA-15376,US,PA,15376,6,,,, +US-PA-15377,US,PA,15377,6,,,, +US-PA-15378,US,PA,15378,6,,,, +US-PA-15379,US,PA,15379,6,,,, +US-PA-15380,US,PA,15380,6,,,, +US-PA-15401,US,PA,15401,6,,,, +US-PA-15410,US,PA,15410,6,,,, +US-PA-15411,US,PA,15411,6,,,, +US-PA-15412,US,PA,15412,6,,,, +US-PA-15413,US,PA,15413,6,,,, +US-PA-15415,US,PA,15415,6,,,, +US-PA-15416,US,PA,15416,6,,,, +US-PA-15417,US,PA,15417,6,,,, +US-PA-15419,US,PA,15419,6,,,, +US-PA-15420,US,PA,15420,6,,,, +US-PA-15421,US,PA,15421,6,,,, +US-PA-15422,US,PA,15422,6,,,, +US-PA-15423,US,PA,15423,6,,,, +US-PA-15424,US,PA,15424,6,,,, +US-PA-15425,US,PA,15425,6,,,, +US-PA-15427,US,PA,15427,6,,,, +US-PA-15428,US,PA,15428,6,,,, +US-PA-15429,US,PA,15429,6,,,, +US-PA-15430,US,PA,15430,6,,,, +US-PA-15431,US,PA,15431,6,,,, +US-PA-15432,US,PA,15432,6,,,, +US-PA-15433,US,PA,15433,6,,,, +US-PA-15434,US,PA,15434,6,,,, +US-PA-15435,US,PA,15435,6,,,, +US-PA-15436,US,PA,15436,6,,,, +US-PA-15437,US,PA,15437,6,,,, +US-PA-15438,US,PA,15438,6,,,, +US-PA-15439,US,PA,15439,6,,,, +US-PA-15440,US,PA,15440,6,,,, +US-PA-15442,US,PA,15442,6,,,, +US-PA-15443,US,PA,15443,6,,,, +US-PA-15444,US,PA,15444,6,,,, +US-PA-15445,US,PA,15445,6,,,, +US-PA-15446,US,PA,15446,6,,,, +US-PA-15447,US,PA,15447,6,,,, +US-PA-15448,US,PA,15448,6,,,, +US-PA-15449,US,PA,15449,6,,,, +US-PA-15450,US,PA,15450,6,,,, +US-PA-15451,US,PA,15451,6,,,, +US-PA-15454,US,PA,15454,6,,,, +US-PA-15455,US,PA,15455,6,,,, +US-PA-15456,US,PA,15456,6,,,, +US-PA-15458,US,PA,15458,6,,,, +US-PA-15459,US,PA,15459,6,,,, +US-PA-15460,US,PA,15460,6,,,, +US-PA-15461,US,PA,15461,6,,,, +US-PA-15462,US,PA,15462,6,,,, +US-PA-15463,US,PA,15463,6,,,, +US-PA-15464,US,PA,15464,6,,,, +US-PA-15465,US,PA,15465,6,,,, +US-PA-15466,US,PA,15466,6,,,, +US-PA-15467,US,PA,15467,6,,,, +US-PA-15468,US,PA,15468,6,,,, +US-PA-15469,US,PA,15469,6,,,, +US-PA-15470,US,PA,15470,6,,,, +US-PA-15472,US,PA,15472,6,,,, +US-PA-15473,US,PA,15473,6,,,, +US-PA-15474,US,PA,15474,6,,,, +US-PA-15475,US,PA,15475,6,,,, +US-PA-15476,US,PA,15476,6,,,, +US-PA-15477,US,PA,15477,6,,,, +US-PA-15478,US,PA,15478,6,,,, +US-PA-15479,US,PA,15479,6,,,, +US-PA-15480,US,PA,15480,6,,,, +US-PA-15482,US,PA,15482,6,,,, +US-PA-15483,US,PA,15483,6,,,, +US-PA-15484,US,PA,15484,6,,,, +US-PA-15485,US,PA,15485,6,,,, +US-PA-15486,US,PA,15486,6,,,, +US-PA-15488,US,PA,15488,6,,,, +US-PA-15489,US,PA,15489,6,,,, +US-PA-15490,US,PA,15490,6,,,, +US-PA-15492,US,PA,15492,6,,,, +US-PA-15501,US,PA,15501,6,,,, +US-PA-15502,US,PA,15502,6,,,, +US-PA-15510,US,PA,15510,6,,,, +US-PA-15520,US,PA,15520,6,,,, +US-PA-15521,US,PA,15521,6,,,, +US-PA-15522,US,PA,15522,6,,,, +US-PA-15530,US,PA,15530,6,,,, +US-PA-15531,US,PA,15531,6,,,, +US-PA-15532,US,PA,15532,6,,,, +US-PA-15533,US,PA,15533,6,,,, +US-PA-15534,US,PA,15534,6,,,, +US-PA-15535,US,PA,15535,6,,,, +US-PA-15536,US,PA,15536,6,,,, +US-PA-15537,US,PA,15537,6,,,, +US-PA-15538,US,PA,15538,6,,,, +US-PA-15539,US,PA,15539,6,,,, +US-PA-15540,US,PA,15540,6,,,, +US-PA-15541,US,PA,15541,6,,,, +US-PA-15542,US,PA,15542,6,,,, +US-PA-15544,US,PA,15544,6,,,, +US-PA-15545,US,PA,15545,6,,,, +US-PA-15546,US,PA,15546,6,,,, +US-PA-15547,US,PA,15547,6,,,, +US-PA-15548,US,PA,15548,6,,,, +US-PA-15549,US,PA,15549,6,,,, +US-PA-15550,US,PA,15550,6,,,, +US-PA-15551,US,PA,15551,6,,,, +US-PA-15552,US,PA,15552,6,,,, +US-PA-15553,US,PA,15553,6,,,, +US-PA-15554,US,PA,15554,6,,,, +US-PA-15555,US,PA,15555,6,,,, +US-PA-15557,US,PA,15557,6,,,, +US-PA-15558,US,PA,15558,6,,,, +US-PA-15559,US,PA,15559,6,,,, +US-PA-15560,US,PA,15560,6,,,, +US-PA-15561,US,PA,15561,6,,,, +US-PA-15562,US,PA,15562,6,,,, +US-PA-15563,US,PA,15563,6,,,, +US-PA-15564,US,PA,15564,6,,,, +US-PA-15565,US,PA,15565,6,,,, +US-PA-15601,US,PA,15601,6,,,, +US-PA-15605,US,PA,15605,6,,,, +US-PA-15606,US,PA,15606,6,,,, +US-PA-15610,US,PA,15610,6,,,, +US-PA-15611,US,PA,15611,6,,,, +US-PA-15612,US,PA,15612,6,,,, +US-PA-15613,US,PA,15613,6,,,, +US-PA-15615,US,PA,15615,6,,,, +US-PA-15616,US,PA,15616,6,,,, +US-PA-15617,US,PA,15617,6,,,, +US-PA-15618,US,PA,15618,6,,,, +US-PA-15619,US,PA,15619,6,,,, +US-PA-15620,US,PA,15620,6,,,, +US-PA-15621,US,PA,15621,6,,,, +US-PA-15622,US,PA,15622,6,,,, +US-PA-15623,US,PA,15623,6,,,, +US-PA-15624,US,PA,15624,6,,,, +US-PA-15625,US,PA,15625,6,,,, +US-PA-15626,US,PA,15626,6,,,, +US-PA-15627,US,PA,15627,6,,,, +US-PA-15628,US,PA,15628,6,,,, +US-PA-15629,US,PA,15629,6,,,, +US-PA-15631,US,PA,15631,6,,,, +US-PA-15632,US,PA,15632,6,,,, +US-PA-15633,US,PA,15633,6,,,, +US-PA-15634,US,PA,15634,6,,,, +US-PA-15635,US,PA,15635,6,,,, +US-PA-15636,US,PA,15636,6,,,, +US-PA-15637,US,PA,15637,6,,,, +US-PA-15638,US,PA,15638,6,,,, +US-PA-15639,US,PA,15639,6,,,, +US-PA-15640,US,PA,15640,6,,,, +US-PA-15641,US,PA,15641,6,,,, +US-PA-15642,US,PA,15642,6,,,, +US-PA-15644,US,PA,15644,6,,,, +US-PA-15646,US,PA,15646,6,,,, +US-PA-15647,US,PA,15647,6,,,, +US-PA-15650,US,PA,15650,6,,,, +US-PA-15655,US,PA,15655,6,,,, +US-PA-15656,US,PA,15656,6,,,, +US-PA-15658,US,PA,15658,6,,,, +US-PA-15660,US,PA,15660,6,,,, +US-PA-15661,US,PA,15661,6,,,, +US-PA-15662,US,PA,15662,6,,,, +US-PA-15663,US,PA,15663,6,,,, +US-PA-15664,US,PA,15664,6,,,, +US-PA-15665,US,PA,15665,6,,,, +US-PA-15666,US,PA,15666,6,,,, +US-PA-15668,US,PA,15668,6,,,, +US-PA-15670,US,PA,15670,6,,,, +US-PA-15671,US,PA,15671,6,,,, +US-PA-15672,US,PA,15672,6,,,, +US-PA-15673,US,PA,15673,6,,,, +US-PA-15674,US,PA,15674,6,,,, +US-PA-15675,US,PA,15675,6,,,, +US-PA-15676,US,PA,15676,6,,,, +US-PA-15677,US,PA,15677,6,,,, +US-PA-15678,US,PA,15678,6,,,, +US-PA-15679,US,PA,15679,6,,,, +US-PA-15680,US,PA,15680,6,,,, +US-PA-15681,US,PA,15681,6,,,, +US-PA-15682,US,PA,15682,6,,,, +US-PA-15683,US,PA,15683,6,,,, +US-PA-15684,US,PA,15684,6,,,, +US-PA-15685,US,PA,15685,6,,,, +US-PA-15686,US,PA,15686,6,,,, +US-PA-15687,US,PA,15687,6,,,, +US-PA-15688,US,PA,15688,6,,,, +US-PA-15689,US,PA,15689,6,,,, +US-PA-15690,US,PA,15690,6,,,, +US-PA-15691,US,PA,15691,6,,,, +US-PA-15692,US,PA,15692,6,,,, +US-PA-15693,US,PA,15693,6,,,, +US-PA-15695,US,PA,15695,6,,,, +US-PA-15696,US,PA,15696,6,,,, +US-PA-15697,US,PA,15697,6,,,, +US-PA-15698,US,PA,15698,6,,,, +US-PA-15701,US,PA,15701,6,,,, +US-PA-15705,US,PA,15705,6,,,, +US-PA-15710,US,PA,15710,6,,,, +US-PA-15711,US,PA,15711,6,,,, +US-PA-15712,US,PA,15712,6,,,, +US-PA-15713,US,PA,15713,6,,,, +US-PA-15714,US,PA,15714,6,,,, +US-PA-15715,US,PA,15715,6,,,, +US-PA-15716,US,PA,15716,6,,,, +US-PA-15717,US,PA,15717,6,,,, +US-PA-15720,US,PA,15720,6,,,, +US-PA-15721,US,PA,15721,6,,,, +US-PA-15722,US,PA,15722,6,,,, +US-PA-15723,US,PA,15723,6,,,, +US-PA-15724,US,PA,15724,6,,,, +US-PA-15725,US,PA,15725,6,,,, +US-PA-15727,US,PA,15727,6,,,, +US-PA-15728,US,PA,15728,6,,,, +US-PA-15729,US,PA,15729,6,,,, +US-PA-15730,US,PA,15730,6,,,, +US-PA-15731,US,PA,15731,6,,,, +US-PA-15732,US,PA,15732,6,,,, +US-PA-15733,US,PA,15733,6,,,, +US-PA-15734,US,PA,15734,6,,,, +US-PA-15736,US,PA,15736,6,,,, +US-PA-15737,US,PA,15737,6,,,, +US-PA-15738,US,PA,15738,6,,,, +US-PA-15739,US,PA,15739,6,,,, +US-PA-15741,US,PA,15741,6,,,, +US-PA-15742,US,PA,15742,6,,,, +US-PA-15744,US,PA,15744,6,,,, +US-PA-15745,US,PA,15745,6,,,, +US-PA-15746,US,PA,15746,6,,,, +US-PA-15747,US,PA,15747,6,,,, +US-PA-15748,US,PA,15748,6,,,, +US-PA-15750,US,PA,15750,6,,,, +US-PA-15752,US,PA,15752,6,,,, +US-PA-15753,US,PA,15753,6,,,, +US-PA-15754,US,PA,15754,6,,,, +US-PA-15756,US,PA,15756,6,,,, +US-PA-15757,US,PA,15757,6,,,, +US-PA-15758,US,PA,15758,6,,,, +US-PA-15759,US,PA,15759,6,,,, +US-PA-15760,US,PA,15760,6,,,, +US-PA-15761,US,PA,15761,6,,,, +US-PA-15762,US,PA,15762,6,,,, +US-PA-15763,US,PA,15763,6,,,, +US-PA-15764,US,PA,15764,6,,,, +US-PA-15765,US,PA,15765,6,,,, +US-PA-15767,US,PA,15767,6,,,, +US-PA-15770,US,PA,15770,6,,,, +US-PA-15771,US,PA,15771,6,,,, +US-PA-15772,US,PA,15772,6,,,, +US-PA-15773,US,PA,15773,6,,,, +US-PA-15774,US,PA,15774,6,,,, +US-PA-15775,US,PA,15775,6,,,, +US-PA-15776,US,PA,15776,6,,,, +US-PA-15777,US,PA,15777,6,,,, +US-PA-15778,US,PA,15778,6,,,, +US-PA-15779,US,PA,15779,6,,,, +US-PA-15780,US,PA,15780,6,,,, +US-PA-15781,US,PA,15781,6,,,, +US-PA-15783,US,PA,15783,6,,,, +US-PA-15784,US,PA,15784,6,,,, +US-PA-15801,US,PA,15801,6,,,, +US-PA-15821,US,PA,15821,6,,,, +US-PA-15822,US,PA,15822,6,,,, +US-PA-15823,US,PA,15823,6,,,, +US-PA-15824,US,PA,15824,6,,,, +US-PA-15825,US,PA,15825,6,,,, +US-PA-15827,US,PA,15827,6,,,, +US-PA-15828,US,PA,15828,6,,,, +US-PA-15829,US,PA,15829,6,,,, +US-PA-15831,US,PA,15831,6,,,, +US-PA-15832,US,PA,15832,6,,,, +US-PA-15834,US,PA,15834,6,,,, +US-PA-15840,US,PA,15840,6,,,, +US-PA-15841,US,PA,15841,6,,,, +US-PA-15845,US,PA,15845,6,,,, +US-PA-15846,US,PA,15846,6,,,, +US-PA-15847,US,PA,15847,6,,,, +US-PA-15848,US,PA,15848,6,,,, +US-PA-15849,US,PA,15849,6,,,, +US-PA-15851,US,PA,15851,6,,,, +US-PA-15853,US,PA,15853,6,,,, +US-PA-15856,US,PA,15856,6,,,, +US-PA-15857,US,PA,15857,6,,,, +US-PA-15860,US,PA,15860,6,,,, +US-PA-15861,US,PA,15861,6,,,, +US-PA-15863,US,PA,15863,6,,,, +US-PA-15864,US,PA,15864,6,,,, +US-PA-15865,US,PA,15865,6,,,, +US-PA-15866,US,PA,15866,6,,,, +US-PA-15868,US,PA,15868,6,,,, +US-PA-15870,US,PA,15870,6,,,, +US-PA-15901,US,PA,15901,6,,,, +US-PA-15902,US,PA,15902,6,,,, +US-PA-15904,US,PA,15904,6,,,, +US-PA-15905,US,PA,15905,6,,,, +US-PA-15906,US,PA,15906,6,,,, +US-PA-15907,US,PA,15907,6,,,, +US-PA-15909,US,PA,15909,6,,,, +US-PA-15915,US,PA,15915,6,,,, +US-PA-15920,US,PA,15920,6,,,, +US-PA-15921,US,PA,15921,6,,,, +US-PA-15922,US,PA,15922,6,,,, +US-PA-15923,US,PA,15923,6,,,, +US-PA-15924,US,PA,15924,6,,,, +US-PA-15925,US,PA,15925,6,,,, +US-PA-15926,US,PA,15926,6,,,, +US-PA-15927,US,PA,15927,6,,,, +US-PA-15928,US,PA,15928,6,,,, +US-PA-15929,US,PA,15929,6,,,, +US-PA-15930,US,PA,15930,6,,,, +US-PA-15931,US,PA,15931,6,,,, +US-PA-15934,US,PA,15934,6,,,, +US-PA-15935,US,PA,15935,6,,,, +US-PA-15936,US,PA,15936,6,,,, +US-PA-15937,US,PA,15937,6,,,, +US-PA-15938,US,PA,15938,6,,,, +US-PA-15940,US,PA,15940,6,,,, +US-PA-15942,US,PA,15942,6,,,, +US-PA-15943,US,PA,15943,6,,,, +US-PA-15944,US,PA,15944,6,,,, +US-PA-15945,US,PA,15945,6,,,, +US-PA-15946,US,PA,15946,6,,,, +US-PA-15948,US,PA,15948,6,,,, +US-PA-15949,US,PA,15949,6,,,, +US-PA-15951,US,PA,15951,6,,,, +US-PA-15952,US,PA,15952,6,,,, +US-PA-15953,US,PA,15953,6,,,, +US-PA-15954,US,PA,15954,6,,,, +US-PA-15955,US,PA,15955,6,,,, +US-PA-15956,US,PA,15956,6,,,, +US-PA-15957,US,PA,15957,6,,,, +US-PA-15958,US,PA,15958,6,,,, +US-PA-15959,US,PA,15959,6,,,, +US-PA-15960,US,PA,15960,6,,,, +US-PA-15961,US,PA,15961,6,,,, +US-PA-15962,US,PA,15962,6,,,, +US-PA-15963,US,PA,15963,6,,,, +US-PA-16001,US,PA,16001,6,,,, +US-PA-16002,US,PA,16002,6,,,, +US-PA-16003,US,PA,16003,6,,,, +US-PA-16016,US,PA,16016,6,,,, +US-PA-16017,US,PA,16017,6,,,, +US-PA-16018,US,PA,16018,6,,,, +US-PA-16020,US,PA,16020,6,,,, +US-PA-16021,US,PA,16021,6,,,, +US-PA-16022,US,PA,16022,6,,,, +US-PA-16023,US,PA,16023,6,,,, +US-PA-16024,US,PA,16024,6,,,, +US-PA-16025,US,PA,16025,6,,,, +US-PA-16027,US,PA,16027,6,,,, +US-PA-16028,US,PA,16028,6,,,, +US-PA-16029,US,PA,16029,6,,,, +US-PA-16030,US,PA,16030,6,,,, +US-PA-16033,US,PA,16033,6,,,, +US-PA-16034,US,PA,16034,6,,,, +US-PA-16035,US,PA,16035,6,,,, +US-PA-16036,US,PA,16036,6,,,, +US-PA-16037,US,PA,16037,6,,,, +US-PA-16038,US,PA,16038,6,,,, +US-PA-16039,US,PA,16039,6,,,, +US-PA-16040,US,PA,16040,6,,,, +US-PA-16041,US,PA,16041,6,,,, +US-PA-16045,US,PA,16045,6,,,, +US-PA-16046,US,PA,16046,6,,,, +US-PA-16048,US,PA,16048,6,,,, +US-PA-16049,US,PA,16049,6,,,, +US-PA-16050,US,PA,16050,6,,,, +US-PA-16051,US,PA,16051,6,,,, +US-PA-16052,US,PA,16052,6,,,, +US-PA-16053,US,PA,16053,6,,,, +US-PA-16054,US,PA,16054,6,,,, +US-PA-16055,US,PA,16055,6,,,, +US-PA-16056,US,PA,16056,6,,,, +US-PA-16057,US,PA,16057,6,,,, +US-PA-16058,US,PA,16058,6,,,, +US-PA-16059,US,PA,16059,6,,,, +US-PA-16061,US,PA,16061,6,,,, +US-PA-16063,US,PA,16063,6,,,, +US-PA-16066,US,PA,16066,6,,,, +US-PA-16101,US,PA,16101,6,,,, +US-PA-16102,US,PA,16102,6,,,, +US-PA-16103,US,PA,16103,6,,,, +US-PA-16105,US,PA,16105,6,,,, +US-PA-16107,US,PA,16107,6,,,, +US-PA-16108,US,PA,16108,6,,,, +US-PA-16110,US,PA,16110,6,,,, +US-PA-16111,US,PA,16111,6,,,, +US-PA-16112,US,PA,16112,6,,,, +US-PA-16113,US,PA,16113,6,,,, +US-PA-16114,US,PA,16114,6,,,, +US-PA-16115,US,PA,16115,6,,,, +US-PA-16116,US,PA,16116,6,,,, +US-PA-16117,US,PA,16117,6,,,, +US-PA-16120,US,PA,16120,6,,,, +US-PA-16121,US,PA,16121,6,,,, +US-PA-16123,US,PA,16123,6,,,, +US-PA-16124,US,PA,16124,6,,,, +US-PA-16125,US,PA,16125,6,,,, +US-PA-16127,US,PA,16127,6,,,, +US-PA-16130,US,PA,16130,6,,,, +US-PA-16131,US,PA,16131,6,,,, +US-PA-16132,US,PA,16132,6,,,, +US-PA-16133,US,PA,16133,6,,,, +US-PA-16134,US,PA,16134,6,,,, +US-PA-16136,US,PA,16136,6,,,, +US-PA-16137,US,PA,16137,6,,,, +US-PA-16140,US,PA,16140,6,,,, +US-PA-16141,US,PA,16141,6,,,, +US-PA-16142,US,PA,16142,6,,,, +US-PA-16143,US,PA,16143,6,,,, +US-PA-16145,US,PA,16145,6,,,, +US-PA-16146,US,PA,16146,6,,,, +US-PA-16148,US,PA,16148,6,,,, +US-PA-16150,US,PA,16150,6,,,, +US-PA-16151,US,PA,16151,6,,,, +US-PA-16153,US,PA,16153,6,,,, +US-PA-16154,US,PA,16154,6,,,, +US-PA-16155,US,PA,16155,6,,,, +US-PA-16156,US,PA,16156,6,,,, +US-PA-16157,US,PA,16157,6,,,, +US-PA-16159,US,PA,16159,6,,,, +US-PA-16160,US,PA,16160,6,,,, +US-PA-16161,US,PA,16161,6,,,, +US-PA-16172,US,PA,16172,6,,,, +US-PA-16201,US,PA,16201,6,,,, +US-PA-16210,US,PA,16210,6,,,, +US-PA-16211,US,PA,16211,6,,,, +US-PA-16212,US,PA,16212,6,,,, +US-PA-16213,US,PA,16213,6,,,, +US-PA-16214,US,PA,16214,6,,,, +US-PA-16217,US,PA,16217,6,,,, +US-PA-16218,US,PA,16218,6,,,, +US-PA-16220,US,PA,16220,6,,,, +US-PA-16221,US,PA,16221,6,,,, +US-PA-16222,US,PA,16222,6,,,, +US-PA-16223,US,PA,16223,6,,,, +US-PA-16224,US,PA,16224,6,,,, +US-PA-16225,US,PA,16225,6,,,, +US-PA-16226,US,PA,16226,6,,,, +US-PA-16228,US,PA,16228,6,,,, +US-PA-16229,US,PA,16229,6,,,, +US-PA-16230,US,PA,16230,6,,,, +US-PA-16232,US,PA,16232,6,,,, +US-PA-16233,US,PA,16233,6,,,, +US-PA-16234,US,PA,16234,6,,,, +US-PA-16235,US,PA,16235,6,,,, +US-PA-16236,US,PA,16236,6,,,, +US-PA-16238,US,PA,16238,6,,,, +US-PA-16239,US,PA,16239,6,,,, +US-PA-16240,US,PA,16240,6,,,, +US-PA-16242,US,PA,16242,6,,,, +US-PA-16244,US,PA,16244,6,,,, +US-PA-16245,US,PA,16245,6,,,, +US-PA-16246,US,PA,16246,6,,,, +US-PA-16248,US,PA,16248,6,,,, +US-PA-16249,US,PA,16249,6,,,, +US-PA-16250,US,PA,16250,6,,,, +US-PA-16253,US,PA,16253,6,,,, +US-PA-16254,US,PA,16254,6,,,, +US-PA-16255,US,PA,16255,6,,,, +US-PA-16256,US,PA,16256,6,,,, +US-PA-16257,US,PA,16257,6,,,, +US-PA-16258,US,PA,16258,6,,,, +US-PA-16259,US,PA,16259,6,,,, +US-PA-16260,US,PA,16260,6,,,, +US-PA-16261,US,PA,16261,6,,,, +US-PA-16262,US,PA,16262,6,,,, +US-PA-16263,US,PA,16263,6,,,, +US-PA-16301,US,PA,16301,6,,,, +US-PA-16311,US,PA,16311,6,,,, +US-PA-16312,US,PA,16312,6,,,, +US-PA-16313,US,PA,16313,6,,,, +US-PA-16314,US,PA,16314,6,,,, +US-PA-16316,US,PA,16316,6,,,, +US-PA-16317,US,PA,16317,6,,,, +US-PA-16319,US,PA,16319,6,,,, +US-PA-16321,US,PA,16321,6,,,, +US-PA-16322,US,PA,16322,6,,,, +US-PA-16323,US,PA,16323,6,,,, +US-PA-16326,US,PA,16326,6,,,, +US-PA-16327,US,PA,16327,6,,,, +US-PA-16328,US,PA,16328,6,,,, +US-PA-16329,US,PA,16329,6,,,, +US-PA-16331,US,PA,16331,6,,,, +US-PA-16332,US,PA,16332,6,,,, +US-PA-16333,US,PA,16333,6,,,, +US-PA-16334,US,PA,16334,6,,,, +US-PA-16335,US,PA,16335,6,,,, +US-PA-16340,US,PA,16340,6,,,, +US-PA-16341,US,PA,16341,6,,,, +US-PA-16342,US,PA,16342,6,,,, +US-PA-16343,US,PA,16343,6,,,, +US-PA-16344,US,PA,16344,6,,,, +US-PA-16345,US,PA,16345,6,,,, +US-PA-16346,US,PA,16346,6,,,, +US-PA-16347,US,PA,16347,6,,,, +US-PA-16350,US,PA,16350,6,,,, +US-PA-16351,US,PA,16351,6,,,, +US-PA-16352,US,PA,16352,6,,,, +US-PA-16353,US,PA,16353,6,,,, +US-PA-16354,US,PA,16354,6,,,, +US-PA-16360,US,PA,16360,6,,,, +US-PA-16361,US,PA,16361,6,,,, +US-PA-16362,US,PA,16362,6,,,, +US-PA-16364,US,PA,16364,6,,,, +US-PA-16365,US,PA,16365,6,,,, +US-PA-16366,US,PA,16366,6,,,, +US-PA-16367,US,PA,16367,6,,,, +US-PA-16368,US,PA,16368,6,,,, +US-PA-16369,US,PA,16369,6,,,, +US-PA-16370,US,PA,16370,6,,,, +US-PA-16371,US,PA,16371,6,,,, +US-PA-16372,US,PA,16372,6,,,, +US-PA-16373,US,PA,16373,6,,,, +US-PA-16374,US,PA,16374,6,,,, +US-PA-16375,US,PA,16375,6,,,, +US-PA-16388,US,PA,16388,6,,,, +US-PA-16401,US,PA,16401,6,,,, +US-PA-16402,US,PA,16402,6,,,, +US-PA-16403,US,PA,16403,6,,,, +US-PA-16404,US,PA,16404,6,,,, +US-PA-16405,US,PA,16405,6,,,, +US-PA-16406,US,PA,16406,6,,,, +US-PA-16407,US,PA,16407,6,,,, +US-PA-16410,US,PA,16410,6,,,, +US-PA-16411,US,PA,16411,6,,,, +US-PA-16412,US,PA,16412,6,,,, +US-PA-16413,US,PA,16413,6,,,, +US-PA-16415,US,PA,16415,6,,,, +US-PA-16416,US,PA,16416,6,,,, +US-PA-16417,US,PA,16417,6,,,, +US-PA-16420,US,PA,16420,6,,,, +US-PA-16421,US,PA,16421,6,,,, +US-PA-16422,US,PA,16422,6,,,, +US-PA-16423,US,PA,16423,6,,,, +US-PA-16424,US,PA,16424,6,,,, +US-PA-16426,US,PA,16426,6,,,, +US-PA-16427,US,PA,16427,6,,,, +US-PA-16428,US,PA,16428,6,,,, +US-PA-16430,US,PA,16430,6,,,, +US-PA-16432,US,PA,16432,6,,,, +US-PA-16433,US,PA,16433,6,,,, +US-PA-16434,US,PA,16434,6,,,, +US-PA-16435,US,PA,16435,6,,,, +US-PA-16436,US,PA,16436,6,,,, +US-PA-16438,US,PA,16438,6,,,, +US-PA-16440,US,PA,16440,6,,,, +US-PA-16441,US,PA,16441,6,,,, +US-PA-16442,US,PA,16442,6,,,, +US-PA-16443,US,PA,16443,6,,,, +US-PA-16444,US,PA,16444,6,,,, +US-PA-16475,US,PA,16475,6,,,, +US-PA-16501,US,PA,16501,6,,,, +US-PA-16502,US,PA,16502,6,,,, +US-PA-16503,US,PA,16503,6,,,, +US-PA-16504,US,PA,16504,6,,,, +US-PA-16505,US,PA,16505,6,,,, +US-PA-16506,US,PA,16506,6,,,, +US-PA-16507,US,PA,16507,6,,,, +US-PA-16508,US,PA,16508,6,,,, +US-PA-16509,US,PA,16509,6,,,, +US-PA-16510,US,PA,16510,6,,,, +US-PA-16511,US,PA,16511,6,,,, +US-PA-16512,US,PA,16512,6,,,, +US-PA-16514,US,PA,16514,6,,,, +US-PA-16515,US,PA,16515,6,,,, +US-PA-16522,US,PA,16522,6,,,, +US-PA-16530,US,PA,16530,6,,,, +US-PA-16531,US,PA,16531,6,,,, +US-PA-16534,US,PA,16534,6,,,, +US-PA-16538,US,PA,16538,6,,,, +US-PA-16541,US,PA,16541,6,,,, +US-PA-16544,US,PA,16544,6,,,, +US-PA-16546,US,PA,16546,6,,,, +US-PA-16550,US,PA,16550,6,,,, +US-PA-16553,US,PA,16553,6,,,, +US-PA-16563,US,PA,16563,6,,,, +US-PA-16565,US,PA,16565,6,,,, +US-PA-16601,US,PA,16601,6,,,, +US-PA-16602,US,PA,16602,6,,,, +US-PA-16603,US,PA,16603,6,,,, +US-PA-16611,US,PA,16611,6,,,, +US-PA-16613,US,PA,16613,6,,,, +US-PA-16616,US,PA,16616,6,,,, +US-PA-16617,US,PA,16617,6,,,, +US-PA-16619,US,PA,16619,6,,,, +US-PA-16620,US,PA,16620,6,,,, +US-PA-16621,US,PA,16621,6,,,, +US-PA-16622,US,PA,16622,6,,,, +US-PA-16623,US,PA,16623,6,,,, +US-PA-16624,US,PA,16624,6,,,, +US-PA-16625,US,PA,16625,6,,,, +US-PA-16627,US,PA,16627,6,,,, +US-PA-16629,US,PA,16629,6,,,, +US-PA-16630,US,PA,16630,6,,,, +US-PA-16631,US,PA,16631,6,,,, +US-PA-16633,US,PA,16633,6,,,, +US-PA-16634,US,PA,16634,6,,,, +US-PA-16635,US,PA,16635,6,,,, +US-PA-16636,US,PA,16636,6,,,, +US-PA-16637,US,PA,16637,6,,,, +US-PA-16638,US,PA,16638,6,,,, +US-PA-16639,US,PA,16639,6,,,, +US-PA-16640,US,PA,16640,6,,,, +US-PA-16641,US,PA,16641,6,,,, +US-PA-16644,US,PA,16644,6,,,, +US-PA-16645,US,PA,16645,6,,,, +US-PA-16646,US,PA,16646,6,,,, +US-PA-16647,US,PA,16647,6,,,, +US-PA-16648,US,PA,16648,6,,,, +US-PA-16650,US,PA,16650,6,,,, +US-PA-16651,US,PA,16651,6,,,, +US-PA-16652,US,PA,16652,6,,,, +US-PA-16654,US,PA,16654,6,,,, +US-PA-16655,US,PA,16655,6,,,, +US-PA-16656,US,PA,16656,6,,,, +US-PA-16657,US,PA,16657,6,,,, +US-PA-16659,US,PA,16659,6,,,, +US-PA-16660,US,PA,16660,6,,,, +US-PA-16661,US,PA,16661,6,,,, +US-PA-16662,US,PA,16662,6,,,, +US-PA-16663,US,PA,16663,6,,,, +US-PA-16664,US,PA,16664,6,,,, +US-PA-16665,US,PA,16665,6,,,, +US-PA-16666,US,PA,16666,6,,,, +US-PA-16667,US,PA,16667,6,,,, +US-PA-16668,US,PA,16668,6,,,, +US-PA-16669,US,PA,16669,6,,,, +US-PA-16670,US,PA,16670,6,,,, +US-PA-16671,US,PA,16671,6,,,, +US-PA-16672,US,PA,16672,6,,,, +US-PA-16673,US,PA,16673,6,,,, +US-PA-16674,US,PA,16674,6,,,, +US-PA-16675,US,PA,16675,6,,,, +US-PA-16677,US,PA,16677,6,,,, +US-PA-16678,US,PA,16678,6,,,, +US-PA-16679,US,PA,16679,6,,,, +US-PA-16680,US,PA,16680,6,,,, +US-PA-16681,US,PA,16681,6,,,, +US-PA-16682,US,PA,16682,6,,,, +US-PA-16683,US,PA,16683,6,,,, +US-PA-16684,US,PA,16684,6,,,, +US-PA-16685,US,PA,16685,6,,,, +US-PA-16686,US,PA,16686,6,,,, +US-PA-16689,US,PA,16689,6,,,, +US-PA-16691,US,PA,16691,6,,,, +US-PA-16692,US,PA,16692,6,,,, +US-PA-16693,US,PA,16693,6,,,, +US-PA-16694,US,PA,16694,6,,,, +US-PA-16695,US,PA,16695,6,,,, +US-PA-16698,US,PA,16698,6,,,, +US-PA-16699,US,PA,16699,6,,,, +US-PA-16701,US,PA,16701,6,,,, +US-PA-16720,US,PA,16720,6,,,, +US-PA-16724,US,PA,16724,6,,,, +US-PA-16725,US,PA,16725,6,,,, +US-PA-16726,US,PA,16726,6,,,, +US-PA-16727,US,PA,16727,6,,,, +US-PA-16728,US,PA,16728,6,,,, +US-PA-16729,US,PA,16729,6,,,, +US-PA-16730,US,PA,16730,6,,,, +US-PA-16731,US,PA,16731,6,,,, +US-PA-16732,US,PA,16732,6,,,, +US-PA-16733,US,PA,16733,6,,,, +US-PA-16734,US,PA,16734,6,,,, +US-PA-16735,US,PA,16735,6,,,, +US-PA-16738,US,PA,16738,6,,,, +US-PA-16740,US,PA,16740,6,,,, +US-PA-16743,US,PA,16743,6,,,, +US-PA-16744,US,PA,16744,6,,,, +US-PA-16745,US,PA,16745,6,,,, +US-PA-16746,US,PA,16746,6,,,, +US-PA-16748,US,PA,16748,6,,,, +US-PA-16749,US,PA,16749,6,,,, +US-PA-16750,US,PA,16750,6,,,, +US-PA-16801,US,PA,16801,6,,,, +US-PA-16802,US,PA,16802,6,,,, +US-PA-16803,US,PA,16803,6,,,, +US-PA-16804,US,PA,16804,6,,,, +US-PA-16805,US,PA,16805,6,,,, +US-PA-16820,US,PA,16820,6,,,, +US-PA-16821,US,PA,16821,6,,,, +US-PA-16822,US,PA,16822,6,,,, +US-PA-16823,US,PA,16823,6,,,, +US-PA-16825,US,PA,16825,6,,,, +US-PA-16826,US,PA,16826,6,,,, +US-PA-16827,US,PA,16827,6,,,, +US-PA-16828,US,PA,16828,6,,,, +US-PA-16829,US,PA,16829,6,,,, +US-PA-16830,US,PA,16830,6,,,, +US-PA-16832,US,PA,16832,6,,,, +US-PA-16833,US,PA,16833,6,,,, +US-PA-16834,US,PA,16834,6,,,, +US-PA-16835,US,PA,16835,6,,,, +US-PA-16836,US,PA,16836,6,,,, +US-PA-16837,US,PA,16837,6,,,, +US-PA-16838,US,PA,16838,6,,,, +US-PA-16839,US,PA,16839,6,,,, +US-PA-16840,US,PA,16840,6,,,, +US-PA-16841,US,PA,16841,6,,,, +US-PA-16843,US,PA,16843,6,,,, +US-PA-16844,US,PA,16844,6,,,, +US-PA-16845,US,PA,16845,6,,,, +US-PA-16847,US,PA,16847,6,,,, +US-PA-16848,US,PA,16848,6,,,, +US-PA-16849,US,PA,16849,6,,,, +US-PA-16850,US,PA,16850,6,,,, +US-PA-16851,US,PA,16851,6,,,, +US-PA-16852,US,PA,16852,6,,,, +US-PA-16853,US,PA,16853,6,,,, +US-PA-16854,US,PA,16854,6,,,, +US-PA-16855,US,PA,16855,6,,,, +US-PA-16856,US,PA,16856,6,,,, +US-PA-16858,US,PA,16858,6,,,, +US-PA-16859,US,PA,16859,6,,,, +US-PA-16860,US,PA,16860,6,,,, +US-PA-16861,US,PA,16861,6,,,, +US-PA-16863,US,PA,16863,6,,,, +US-PA-16864,US,PA,16864,6,,,, +US-PA-16865,US,PA,16865,6,,,, +US-PA-16866,US,PA,16866,6,,,, +US-PA-16868,US,PA,16868,6,,,, +US-PA-16870,US,PA,16870,6,,,, +US-PA-16871,US,PA,16871,6,,,, +US-PA-16872,US,PA,16872,6,,,, +US-PA-16873,US,PA,16873,6,,,, +US-PA-16874,US,PA,16874,6,,,, +US-PA-16875,US,PA,16875,6,,,, +US-PA-16876,US,PA,16876,6,,,, +US-PA-16877,US,PA,16877,6,,,, +US-PA-16878,US,PA,16878,6,,,, +US-PA-16879,US,PA,16879,6,,,, +US-PA-16881,US,PA,16881,6,,,, +US-PA-16882,US,PA,16882,6,,,, +US-PA-16901,US,PA,16901,6,,,, +US-PA-16910,US,PA,16910,6,,,, +US-PA-16911,US,PA,16911,6,,,, +US-PA-16912,US,PA,16912,6,,,, +US-PA-16914,US,PA,16914,6,,,, +US-PA-16915,US,PA,16915,6,,,, +US-PA-16917,US,PA,16917,6,,,, +US-PA-16920,US,PA,16920,6,,,, +US-PA-16921,US,PA,16921,6,,,, +US-PA-16922,US,PA,16922,6,,,, +US-PA-16923,US,PA,16923,6,,,, +US-PA-16925,US,PA,16925,6,,,, +US-PA-16926,US,PA,16926,6,,,, +US-PA-16927,US,PA,16927,6,,,, +US-PA-16928,US,PA,16928,6,,,, +US-PA-16929,US,PA,16929,6,,,, +US-PA-16930,US,PA,16930,6,,,, +US-PA-16932,US,PA,16932,6,,,, +US-PA-16933,US,PA,16933,6,,,, +US-PA-16935,US,PA,16935,6,,,, +US-PA-16936,US,PA,16936,6,,,, +US-PA-16937,US,PA,16937,6,,,, +US-PA-16938,US,PA,16938,6,,,, +US-PA-16939,US,PA,16939,6,,,, +US-PA-16940,US,PA,16940,6,,,, +US-PA-16941,US,PA,16941,6,,,, +US-PA-16942,US,PA,16942,6,,,, +US-PA-16943,US,PA,16943,6,,,, +US-PA-16945,US,PA,16945,6,,,, +US-PA-16946,US,PA,16946,6,,,, +US-PA-16947,US,PA,16947,6,,,, +US-PA-16948,US,PA,16948,6,,,, +US-PA-16950,US,PA,16950,6,,,, +US-PA-17001,US,PA,17001,6,,,, +US-PA-17002,US,PA,17002,6,,,, +US-PA-17003,US,PA,17003,6,,,, +US-PA-17004,US,PA,17004,6,,,, +US-PA-17005,US,PA,17005,6,,,, +US-PA-17006,US,PA,17006,6,,,, +US-PA-17007,US,PA,17007,6,,,, +US-PA-17009,US,PA,17009,6,,,, +US-PA-17010,US,PA,17010,6,,,, +US-PA-17011,US,PA,17011,6,,,, +US-PA-17012,US,PA,17012,6,,,, +US-PA-17013,US,PA,17013,6,,,, +US-PA-17014,US,PA,17014,6,,,, +US-PA-17015,US,PA,17015,6,,,, +US-PA-17016,US,PA,17016,6,,,, +US-PA-17017,US,PA,17017,6,,,, +US-PA-17018,US,PA,17018,6,,,, +US-PA-17019,US,PA,17019,6,,,, +US-PA-17020,US,PA,17020,6,,,, +US-PA-17021,US,PA,17021,6,,,, +US-PA-17022,US,PA,17022,6,,,, +US-PA-17023,US,PA,17023,6,,,, +US-PA-17024,US,PA,17024,6,,,, +US-PA-17025,US,PA,17025,6,,,, +US-PA-17026,US,PA,17026,6,,,, +US-PA-17027,US,PA,17027,6,,,, +US-PA-17028,US,PA,17028,6,,,, +US-PA-17029,US,PA,17029,6,,,, +US-PA-17030,US,PA,17030,6,,,, +US-PA-17032,US,PA,17032,6,,,, +US-PA-17033,US,PA,17033,6,,,, +US-PA-17034,US,PA,17034,6,,,, +US-PA-17035,US,PA,17035,6,,,, +US-PA-17036,US,PA,17036,6,,,, +US-PA-17037,US,PA,17037,6,,,, +US-PA-17038,US,PA,17038,6,,,, +US-PA-17039,US,PA,17039,6,,,, +US-PA-17040,US,PA,17040,6,,,, +US-PA-17041,US,PA,17041,6,,,, +US-PA-17042,US,PA,17042,6,,,, +US-PA-17043,US,PA,17043,6,,,, +US-PA-17044,US,PA,17044,6,,,, +US-PA-17045,US,PA,17045,6,,,, +US-PA-17046,US,PA,17046,6,,,, +US-PA-17047,US,PA,17047,6,,,, +US-PA-17048,US,PA,17048,6,,,, +US-PA-17049,US,PA,17049,6,,,, +US-PA-17050,US,PA,17050,6,,,, +US-PA-17051,US,PA,17051,6,,,, +US-PA-17052,US,PA,17052,6,,,, +US-PA-17053,US,PA,17053,6,,,, +US-PA-17054,US,PA,17054,6,,,, +US-PA-17055,US,PA,17055,6,,,, +US-PA-17056,US,PA,17056,6,,,, +US-PA-17057,US,PA,17057,6,,,, +US-PA-17058,US,PA,17058,6,,,, +US-PA-17059,US,PA,17059,6,,,, +US-PA-17060,US,PA,17060,6,,,, +US-PA-17061,US,PA,17061,6,,,, +US-PA-17062,US,PA,17062,6,,,, +US-PA-17063,US,PA,17063,6,,,, +US-PA-17064,US,PA,17064,6,,,, +US-PA-17065,US,PA,17065,6,,,, +US-PA-17066,US,PA,17066,6,,,, +US-PA-17067,US,PA,17067,6,,,, +US-PA-17068,US,PA,17068,6,,,, +US-PA-17069,US,PA,17069,6,,,, +US-PA-17070,US,PA,17070,6,,,, +US-PA-17071,US,PA,17071,6,,,, +US-PA-17072,US,PA,17072,6,,,, +US-PA-17073,US,PA,17073,6,,,, +US-PA-17074,US,PA,17074,6,,,, +US-PA-17075,US,PA,17075,6,,,, +US-PA-17076,US,PA,17076,6,,,, +US-PA-17077,US,PA,17077,6,,,, +US-PA-17078,US,PA,17078,6,,,, +US-PA-17080,US,PA,17080,6,,,, +US-PA-17081,US,PA,17081,6,,,, +US-PA-17082,US,PA,17082,6,,,, +US-PA-17083,US,PA,17083,6,,,, +US-PA-17084,US,PA,17084,6,,,, +US-PA-17085,US,PA,17085,6,,,, +US-PA-17086,US,PA,17086,6,,,, +US-PA-17087,US,PA,17087,6,,,, +US-PA-17088,US,PA,17088,6,,,, +US-PA-17089,US,PA,17089,6,,,, +US-PA-17090,US,PA,17090,6,,,, +US-PA-17093,US,PA,17093,6,,,, +US-PA-17094,US,PA,17094,6,,,, +US-PA-17097,US,PA,17097,6,,,, +US-PA-17098,US,PA,17098,6,,,, +US-PA-17099,US,PA,17099,6,,,, +US-PA-17101,US,PA,17101,6,,,, +US-PA-17102,US,PA,17102,6,,,, +US-PA-17103,US,PA,17103,6,,,, +US-PA-17104,US,PA,17104,6,,,, +US-PA-17105,US,PA,17105,6,,,, +US-PA-17106,US,PA,17106,6,,,, +US-PA-17107,US,PA,17107,6,,,, +US-PA-17108,US,PA,17108,6,,,, +US-PA-17109,US,PA,17109,6,,,, +US-PA-17110,US,PA,17110,6,,,, +US-PA-17111,US,PA,17111,6,,,, +US-PA-17112,US,PA,17112,6,,,, +US-PA-17113,US,PA,17113,6,,,, +US-PA-17120,US,PA,17120,6,,,, +US-PA-17121,US,PA,17121,6,,,, +US-PA-17122,US,PA,17122,6,,,, +US-PA-17123,US,PA,17123,6,,,, +US-PA-17124,US,PA,17124,6,,,, +US-PA-17125,US,PA,17125,6,,,, +US-PA-17126,US,PA,17126,6,,,, +US-PA-17127,US,PA,17127,6,,,, +US-PA-17128,US,PA,17128,6,,,, +US-PA-17129,US,PA,17129,6,,,, +US-PA-17130,US,PA,17130,6,,,, +US-PA-17140,US,PA,17140,6,,,, +US-PA-17177,US,PA,17177,6,,,, +US-PA-17201,US,PA,17201,6,,,, +US-PA-17202,US,PA,17202,6,,,, +US-PA-17210,US,PA,17210,6,,,, +US-PA-17211,US,PA,17211,6,,,, +US-PA-17212,US,PA,17212,6,,,, +US-PA-17213,US,PA,17213,6,,,, +US-PA-17214,US,PA,17214,6,,,, +US-PA-17215,US,PA,17215,6,,,, +US-PA-17217,US,PA,17217,6,,,, +US-PA-17219,US,PA,17219,6,,,, +US-PA-17220,US,PA,17220,6,,,, +US-PA-17221,US,PA,17221,6,,,, +US-PA-17222,US,PA,17222,6,,,, +US-PA-17223,US,PA,17223,6,,,, +US-PA-17224,US,PA,17224,6,,,, +US-PA-17225,US,PA,17225,6,,,, +US-PA-17228,US,PA,17228,6,,,, +US-PA-17229,US,PA,17229,6,,,, +US-PA-17231,US,PA,17231,6,,,, +US-PA-17232,US,PA,17232,6,,,, +US-PA-17233,US,PA,17233,6,,,, +US-PA-17235,US,PA,17235,6,,,, +US-PA-17236,US,PA,17236,6,,,, +US-PA-17237,US,PA,17237,6,,,, +US-PA-17238,US,PA,17238,6,,,, +US-PA-17239,US,PA,17239,6,,,, +US-PA-17240,US,PA,17240,6,,,, +US-PA-17241,US,PA,17241,6,,,, +US-PA-17243,US,PA,17243,6,,,, +US-PA-17244,US,PA,17244,6,,,, +US-PA-17246,US,PA,17246,6,,,, +US-PA-17247,US,PA,17247,6,,,, +US-PA-17249,US,PA,17249,6,,,, +US-PA-17250,US,PA,17250,6,,,, +US-PA-17251,US,PA,17251,6,,,, +US-PA-17252,US,PA,17252,6,,,, +US-PA-17253,US,PA,17253,6,,,, +US-PA-17254,US,PA,17254,6,,,, +US-PA-17255,US,PA,17255,6,,,, +US-PA-17256,US,PA,17256,6,,,, +US-PA-17257,US,PA,17257,6,,,, +US-PA-17260,US,PA,17260,6,,,, +US-PA-17261,US,PA,17261,6,,,, +US-PA-17262,US,PA,17262,6,,,, +US-PA-17263,US,PA,17263,6,,,, +US-PA-17264,US,PA,17264,6,,,, +US-PA-17265,US,PA,17265,6,,,, +US-PA-17266,US,PA,17266,6,,,, +US-PA-17267,US,PA,17267,6,,,, +US-PA-17268,US,PA,17268,6,,,, +US-PA-17271,US,PA,17271,6,,,, +US-PA-17272,US,PA,17272,6,,,, +US-PA-17301,US,PA,17301,6,,,, +US-PA-17302,US,PA,17302,6,,,, +US-PA-17303,US,PA,17303,6,,,, +US-PA-17304,US,PA,17304,6,,,, +US-PA-17306,US,PA,17306,6,,,, +US-PA-17307,US,PA,17307,6,,,, +US-PA-17309,US,PA,17309,6,,,, +US-PA-17310,US,PA,17310,6,,,, +US-PA-17311,US,PA,17311,6,,,, +US-PA-17312,US,PA,17312,6,,,, +US-PA-17313,US,PA,17313,6,,,, +US-PA-17314,US,PA,17314,6,,,, +US-PA-17315,US,PA,17315,6,,,, +US-PA-17316,US,PA,17316,6,,,, +US-PA-17317,US,PA,17317,6,,,, +US-PA-17318,US,PA,17318,6,,,, +US-PA-17319,US,PA,17319,6,,,, +US-PA-17320,US,PA,17320,6,,,, +US-PA-17321,US,PA,17321,6,,,, +US-PA-17322,US,PA,17322,6,,,, +US-PA-17323,US,PA,17323,6,,,, +US-PA-17324,US,PA,17324,6,,,, +US-PA-17325,US,PA,17325,6,,,, +US-PA-17327,US,PA,17327,6,,,, +US-PA-17329,US,PA,17329,6,,,, +US-PA-17331,US,PA,17331,6,,,, +US-PA-17332,US,PA,17332,6,,,, +US-PA-17333,US,PA,17333,6,,,, +US-PA-17334,US,PA,17334,6,,,, +US-PA-17335,US,PA,17335,6,,,, +US-PA-17337,US,PA,17337,6,,,, +US-PA-17339,US,PA,17339,6,,,, +US-PA-17340,US,PA,17340,6,,,, +US-PA-17342,US,PA,17342,6,,,, +US-PA-17343,US,PA,17343,6,,,, +US-PA-17344,US,PA,17344,6,,,, +US-PA-17345,US,PA,17345,6,,,, +US-PA-17347,US,PA,17347,6,,,, +US-PA-17349,US,PA,17349,6,,,, +US-PA-17350,US,PA,17350,6,,,, +US-PA-17352,US,PA,17352,6,,,, +US-PA-17353,US,PA,17353,6,,,, +US-PA-17354,US,PA,17354,6,,,, +US-PA-17355,US,PA,17355,6,,,, +US-PA-17356,US,PA,17356,6,,,, +US-PA-17358,US,PA,17358,6,,,, +US-PA-17360,US,PA,17360,6,,,, +US-PA-17361,US,PA,17361,6,,,, +US-PA-17362,US,PA,17362,6,,,, +US-PA-17363,US,PA,17363,6,,,, +US-PA-17364,US,PA,17364,6,,,, +US-PA-17365,US,PA,17365,6,,,, +US-PA-17366,US,PA,17366,6,,,, +US-PA-17368,US,PA,17368,6,,,, +US-PA-17370,US,PA,17370,6,,,, +US-PA-17371,US,PA,17371,6,,,, +US-PA-17372,US,PA,17372,6,,,, +US-PA-17375,US,PA,17375,6,,,, +US-PA-17401,US,PA,17401,6,,,, +US-PA-17402,US,PA,17402,6,,,, +US-PA-17403,US,PA,17403,6,,,, +US-PA-17404,US,PA,17404,6,,,, +US-PA-17405,US,PA,17405,6,,,, +US-PA-17406,US,PA,17406,6,,,, +US-PA-17407,US,PA,17407,6,,,, +US-PA-17408,US,PA,17408,6,,,, +US-PA-17501,US,PA,17501,6,,,, +US-PA-17502,US,PA,17502,6,,,, +US-PA-17503,US,PA,17503,6,,,, +US-PA-17504,US,PA,17504,6,,,, +US-PA-17505,US,PA,17505,6,,,, +US-PA-17506,US,PA,17506,6,,,, +US-PA-17507,US,PA,17507,6,,,, +US-PA-17508,US,PA,17508,6,,,, +US-PA-17509,US,PA,17509,6,,,, +US-PA-17512,US,PA,17512,6,,,, +US-PA-17516,US,PA,17516,6,,,, +US-PA-17517,US,PA,17517,6,,,, +US-PA-17518,US,PA,17518,6,,,, +US-PA-17519,US,PA,17519,6,,,, +US-PA-17520,US,PA,17520,6,,,, +US-PA-17521,US,PA,17521,6,,,, +US-PA-17522,US,PA,17522,6,,,, +US-PA-17527,US,PA,17527,6,,,, +US-PA-17528,US,PA,17528,6,,,, +US-PA-17529,US,PA,17529,6,,,, +US-PA-17532,US,PA,17532,6,,,, +US-PA-17533,US,PA,17533,6,,,, +US-PA-17534,US,PA,17534,6,,,, +US-PA-17535,US,PA,17535,6,,,, +US-PA-17536,US,PA,17536,6,,,, +US-PA-17537,US,PA,17537,6,,,, +US-PA-17538,US,PA,17538,6,,,, +US-PA-17540,US,PA,17540,6,,,, +US-PA-17543,US,PA,17543,6,,,, +US-PA-17545,US,PA,17545,6,,,, +US-PA-17547,US,PA,17547,6,,,, +US-PA-17549,US,PA,17549,6,,,, +US-PA-17550,US,PA,17550,6,,,, +US-PA-17551,US,PA,17551,6,,,, +US-PA-17552,US,PA,17552,6,,,, +US-PA-17554,US,PA,17554,6,,,, +US-PA-17555,US,PA,17555,6,,,, +US-PA-17557,US,PA,17557,6,,,, +US-PA-17560,US,PA,17560,6,,,, +US-PA-17562,US,PA,17562,6,,,, +US-PA-17563,US,PA,17563,6,,,, +US-PA-17564,US,PA,17564,6,,,, +US-PA-17565,US,PA,17565,6,,,, +US-PA-17566,US,PA,17566,6,,,, +US-PA-17567,US,PA,17567,6,,,, +US-PA-17568,US,PA,17568,6,,,, +US-PA-17569,US,PA,17569,6,,,, +US-PA-17570,US,PA,17570,6,,,, +US-PA-17572,US,PA,17572,6,,,, +US-PA-17573,US,PA,17573,6,,,, +US-PA-17575,US,PA,17575,6,,,, +US-PA-17576,US,PA,17576,6,,,, +US-PA-17578,US,PA,17578,6,,,, +US-PA-17579,US,PA,17579,6,,,, +US-PA-17580,US,PA,17580,6,,,, +US-PA-17581,US,PA,17581,6,,,, +US-PA-17582,US,PA,17582,6,,,, +US-PA-17583,US,PA,17583,6,,,, +US-PA-17584,US,PA,17584,6,,,, +US-PA-17585,US,PA,17585,6,,,, +US-PA-17601,US,PA,17601,6,,,, +US-PA-17602,US,PA,17602,6,,,, +US-PA-17603,US,PA,17603,6,,,, +US-PA-17604,US,PA,17604,6,,,, +US-PA-17605,US,PA,17605,6,,,, +US-PA-17606,US,PA,17606,6,,,, +US-PA-17607,US,PA,17607,6,,,, +US-PA-17608,US,PA,17608,6,,,, +US-PA-17611,US,PA,17611,6,,,, +US-PA-17622,US,PA,17622,6,,,, +US-PA-17699,US,PA,17699,6,,,, +US-PA-17701,US,PA,17701,6,,,, +US-PA-17702,US,PA,17702,6,,,, +US-PA-17703,US,PA,17703,6,,,, +US-PA-17705,US,PA,17705,6,,,, +US-PA-17720,US,PA,17720,6,,,, +US-PA-17721,US,PA,17721,6,,,, +US-PA-17723,US,PA,17723,6,,,, +US-PA-17724,US,PA,17724,6,,,, +US-PA-17726,US,PA,17726,6,,,, +US-PA-17727,US,PA,17727,6,,,, +US-PA-17728,US,PA,17728,6,,,, +US-PA-17729,US,PA,17729,6,,,, +US-PA-17730,US,PA,17730,6,,,, +US-PA-17731,US,PA,17731,6,,,, +US-PA-17735,US,PA,17735,6,,,, +US-PA-17737,US,PA,17737,6,,,, +US-PA-17739,US,PA,17739,6,,,, +US-PA-17740,US,PA,17740,6,,,, +US-PA-17742,US,PA,17742,6,,,, +US-PA-17744,US,PA,17744,6,,,, +US-PA-17745,US,PA,17745,6,,,, +US-PA-17747,US,PA,17747,6,,,, +US-PA-17748,US,PA,17748,6,,,, +US-PA-17749,US,PA,17749,6,,,, +US-PA-17750,US,PA,17750,6,,,, +US-PA-17751,US,PA,17751,6,,,, +US-PA-17752,US,PA,17752,6,,,, +US-PA-17754,US,PA,17754,6,,,, +US-PA-17756,US,PA,17756,6,,,, +US-PA-17758,US,PA,17758,6,,,, +US-PA-17760,US,PA,17760,6,,,, +US-PA-17762,US,PA,17762,6,,,, +US-PA-17763,US,PA,17763,6,,,, +US-PA-17764,US,PA,17764,6,,,, +US-PA-17765,US,PA,17765,6,,,, +US-PA-17767,US,PA,17767,6,,,, +US-PA-17768,US,PA,17768,6,,,, +US-PA-17769,US,PA,17769,6,,,, +US-PA-17771,US,PA,17771,6,,,, +US-PA-17772,US,PA,17772,6,,,, +US-PA-17774,US,PA,17774,6,,,, +US-PA-17776,US,PA,17776,6,,,, +US-PA-17777,US,PA,17777,6,,,, +US-PA-17778,US,PA,17778,6,,,, +US-PA-17779,US,PA,17779,6,,,, +US-PA-17801,US,PA,17801,6,,,, +US-PA-17810,US,PA,17810,6,,,, +US-PA-17812,US,PA,17812,6,,,, +US-PA-17813,US,PA,17813,6,,,, +US-PA-17814,US,PA,17814,6,,,, +US-PA-17815,US,PA,17815,6,,,, +US-PA-17820,US,PA,17820,6,,,, +US-PA-17821,US,PA,17821,6,,,, +US-PA-17822,US,PA,17822,6,,,, +US-PA-17823,US,PA,17823,6,,,, +US-PA-17824,US,PA,17824,6,,,, +US-PA-17827,US,PA,17827,6,,,, +US-PA-17829,US,PA,17829,6,,,, +US-PA-17830,US,PA,17830,6,,,, +US-PA-17831,US,PA,17831,6,,,, +US-PA-17832,US,PA,17832,6,,,, +US-PA-17833,US,PA,17833,6,,,, +US-PA-17834,US,PA,17834,6,,,, +US-PA-17835,US,PA,17835,6,,,, +US-PA-17836,US,PA,17836,6,,,, +US-PA-17837,US,PA,17837,6,,,, +US-PA-17839,US,PA,17839,6,,,, +US-PA-17840,US,PA,17840,6,,,, +US-PA-17841,US,PA,17841,6,,,, +US-PA-17842,US,PA,17842,6,,,, +US-PA-17843,US,PA,17843,6,,,, +US-PA-17844,US,PA,17844,6,,,, +US-PA-17845,US,PA,17845,6,,,, +US-PA-17846,US,PA,17846,6,,,, +US-PA-17847,US,PA,17847,6,,,, +US-PA-17850,US,PA,17850,6,,,, +US-PA-17851,US,PA,17851,6,,,, +US-PA-17853,US,PA,17853,6,,,, +US-PA-17855,US,PA,17855,6,,,, +US-PA-17856,US,PA,17856,6,,,, +US-PA-17857,US,PA,17857,6,,,, +US-PA-17858,US,PA,17858,6,,,, +US-PA-17859,US,PA,17859,6,,,, +US-PA-17860,US,PA,17860,6,,,, +US-PA-17861,US,PA,17861,6,,,, +US-PA-17862,US,PA,17862,6,,,, +US-PA-17864,US,PA,17864,6,,,, +US-PA-17865,US,PA,17865,6,,,, +US-PA-17866,US,PA,17866,6,,,, +US-PA-17867,US,PA,17867,6,,,, +US-PA-17868,US,PA,17868,6,,,, +US-PA-17870,US,PA,17870,6,,,, +US-PA-17872,US,PA,17872,6,,,, +US-PA-17876,US,PA,17876,6,,,, +US-PA-17877,US,PA,17877,6,,,, +US-PA-17878,US,PA,17878,6,,,, +US-PA-17880,US,PA,17880,6,,,, +US-PA-17881,US,PA,17881,6,,,, +US-PA-17882,US,PA,17882,6,,,, +US-PA-17883,US,PA,17883,6,,,, +US-PA-17884,US,PA,17884,6,,,, +US-PA-17885,US,PA,17885,6,,,, +US-PA-17886,US,PA,17886,6,,,, +US-PA-17887,US,PA,17887,6,,,, +US-PA-17888,US,PA,17888,6,,,, +US-PA-17889,US,PA,17889,6,,,, +US-PA-17901,US,PA,17901,6,,,, +US-PA-17920,US,PA,17920,6,,,, +US-PA-17921,US,PA,17921,6,,,, +US-PA-17922,US,PA,17922,6,,,, +US-PA-17923,US,PA,17923,6,,,, +US-PA-17925,US,PA,17925,6,,,, +US-PA-17929,US,PA,17929,6,,,, +US-PA-17930,US,PA,17930,6,,,, +US-PA-17931,US,PA,17931,6,,,, +US-PA-17932,US,PA,17932,6,,,, +US-PA-17933,US,PA,17933,6,,,, +US-PA-17934,US,PA,17934,6,,,, +US-PA-17935,US,PA,17935,6,,,, +US-PA-17936,US,PA,17936,6,,,, +US-PA-17938,US,PA,17938,6,,,, +US-PA-17941,US,PA,17941,6,,,, +US-PA-17943,US,PA,17943,6,,,, +US-PA-17944,US,PA,17944,6,,,, +US-PA-17945,US,PA,17945,6,,,, +US-PA-17946,US,PA,17946,6,,,, +US-PA-17948,US,PA,17948,6,,,, +US-PA-17949,US,PA,17949,6,,,, +US-PA-17951,US,PA,17951,6,,,, +US-PA-17952,US,PA,17952,6,,,, +US-PA-17953,US,PA,17953,6,,,, +US-PA-17954,US,PA,17954,6,,,, +US-PA-17957,US,PA,17957,6,,,, +US-PA-17959,US,PA,17959,6,,,, +US-PA-17960,US,PA,17960,6,,,, +US-PA-17961,US,PA,17961,6,,,, +US-PA-17963,US,PA,17963,6,,,, +US-PA-17964,US,PA,17964,6,,,, +US-PA-17965,US,PA,17965,6,,,, +US-PA-17966,US,PA,17966,6,,,, +US-PA-17967,US,PA,17967,6,,,, +US-PA-17968,US,PA,17968,6,,,, +US-PA-17970,US,PA,17970,6,,,, +US-PA-17972,US,PA,17972,6,,,, +US-PA-17974,US,PA,17974,6,,,, +US-PA-17976,US,PA,17976,6,,,, +US-PA-17978,US,PA,17978,6,,,, +US-PA-17979,US,PA,17979,6,,,, +US-PA-17980,US,PA,17980,6,,,, +US-PA-17981,US,PA,17981,6,,,, +US-PA-17982,US,PA,17982,6,,,, +US-PA-17983,US,PA,17983,6,,,, +US-PA-17985,US,PA,17985,6,,,, +US-PA-18001,US,PA,18001,6,,,, +US-PA-18002,US,PA,18002,6,,,, +US-PA-18003,US,PA,18003,6,,,, +US-PA-18010,US,PA,18010,6,,,, +US-PA-18011,US,PA,18011,6,,,, +US-PA-18012,US,PA,18012,6,,,, +US-PA-18013,US,PA,18013,6,,,, +US-PA-18014,US,PA,18014,6,,,, +US-PA-18015,US,PA,18015,6,,,, +US-PA-18016,US,PA,18016,6,,,, +US-PA-18017,US,PA,18017,6,,,, +US-PA-18018,US,PA,18018,6,,,, +US-PA-18020,US,PA,18020,6,,,, +US-PA-18025,US,PA,18025,6,,,, +US-PA-18030,US,PA,18030,6,,,, +US-PA-18031,US,PA,18031,6,,,, +US-PA-18032,US,PA,18032,6,,,, +US-PA-18034,US,PA,18034,6,,,, +US-PA-18035,US,PA,18035,6,,,, +US-PA-18036,US,PA,18036,6,,,, +US-PA-18037,US,PA,18037,6,,,, +US-PA-18038,US,PA,18038,6,,,, +US-PA-18039,US,PA,18039,6,,,, +US-PA-18040,US,PA,18040,6,,,, +US-PA-18041,US,PA,18041,6,,,, +US-PA-18042,US,PA,18042,6,,,, +US-PA-18043,US,PA,18043,6,,,, +US-PA-18044,US,PA,18044,6,,,, +US-PA-18045,US,PA,18045,6,,,, +US-PA-18046,US,PA,18046,6,,,, +US-PA-18049,US,PA,18049,6,,,, +US-PA-18050,US,PA,18050,6,,,, +US-PA-18051,US,PA,18051,6,,,, +US-PA-18052,US,PA,18052,6,,,, +US-PA-18053,US,PA,18053,6,,,, +US-PA-18054,US,PA,18054,6,,,, +US-PA-18055,US,PA,18055,6,,,, +US-PA-18056,US,PA,18056,6,,,, +US-PA-18058,US,PA,18058,6,,,, +US-PA-18059,US,PA,18059,6,,,, +US-PA-18060,US,PA,18060,6,,,, +US-PA-18062,US,PA,18062,6,,,, +US-PA-18063,US,PA,18063,6,,,, +US-PA-18064,US,PA,18064,6,,,, +US-PA-18065,US,PA,18065,6,,,, +US-PA-18066,US,PA,18066,6,,,, +US-PA-18067,US,PA,18067,6,,,, +US-PA-18068,US,PA,18068,6,,,, +US-PA-18069,US,PA,18069,6,,,, +US-PA-18070,US,PA,18070,6,,,, +US-PA-18071,US,PA,18071,6,,,, +US-PA-18072,US,PA,18072,6,,,, +US-PA-18073,US,PA,18073,6,,,, +US-PA-18074,US,PA,18074,6,,,, +US-PA-18076,US,PA,18076,6,,,, +US-PA-18077,US,PA,18077,6,,,, +US-PA-18078,US,PA,18078,6,,,, +US-PA-18079,US,PA,18079,6,,,, +US-PA-18080,US,PA,18080,6,,,, +US-PA-18081,US,PA,18081,6,,,, +US-PA-18083,US,PA,18083,6,,,, +US-PA-18084,US,PA,18084,6,,,, +US-PA-18085,US,PA,18085,6,,,, +US-PA-18086,US,PA,18086,6,,,, +US-PA-18087,US,PA,18087,6,,,, +US-PA-18088,US,PA,18088,6,,,, +US-PA-18091,US,PA,18091,6,,,, +US-PA-18092,US,PA,18092,6,,,, +US-PA-18098,US,PA,18098,6,,,, +US-PA-18099,US,PA,18099,6,,,, +US-PA-18101,US,PA,18101,6,,,, +US-PA-18102,US,PA,18102,6,,,, +US-PA-18103,US,PA,18103,6,,,, +US-PA-18104,US,PA,18104,6,,,, +US-PA-18105,US,PA,18105,6,,,, +US-PA-18106,US,PA,18106,6,,,, +US-PA-18109,US,PA,18109,6,,,, +US-PA-18195,US,PA,18195,6,,,, +US-PA-18201,US,PA,18201,6,,,, +US-PA-18202,US,PA,18202,6,,,, +US-PA-18210,US,PA,18210,6,,,, +US-PA-18211,US,PA,18211,6,,,, +US-PA-18212,US,PA,18212,6,,,, +US-PA-18214,US,PA,18214,6,,,, +US-PA-18216,US,PA,18216,6,,,, +US-PA-18218,US,PA,18218,6,,,, +US-PA-18219,US,PA,18219,6,,,, +US-PA-18220,US,PA,18220,6,,,, +US-PA-18221,US,PA,18221,6,,,, +US-PA-18222,US,PA,18222,6,,,, +US-PA-18223,US,PA,18223,6,,,, +US-PA-18224,US,PA,18224,6,,,, +US-PA-18225,US,PA,18225,6,,,, +US-PA-18229,US,PA,18229,6,,,, +US-PA-18230,US,PA,18230,6,,,, +US-PA-18231,US,PA,18231,6,,,, +US-PA-18232,US,PA,18232,6,,,, +US-PA-18234,US,PA,18234,6,,,, +US-PA-18235,US,PA,18235,6,,,, +US-PA-18237,US,PA,18237,6,,,, +US-PA-18239,US,PA,18239,6,,,, +US-PA-18240,US,PA,18240,6,,,, +US-PA-18241,US,PA,18241,6,,,, +US-PA-18242,US,PA,18242,6,,,, +US-PA-18244,US,PA,18244,6,,,, +US-PA-18245,US,PA,18245,6,,,, +US-PA-18246,US,PA,18246,6,,,, +US-PA-18247,US,PA,18247,6,,,, +US-PA-18248,US,PA,18248,6,,,, +US-PA-18249,US,PA,18249,6,,,, +US-PA-18250,US,PA,18250,6,,,, +US-PA-18251,US,PA,18251,6,,,, +US-PA-18252,US,PA,18252,6,,,, +US-PA-18254,US,PA,18254,6,,,, +US-PA-18255,US,PA,18255,6,,,, +US-PA-18256,US,PA,18256,6,,,, +US-PA-18301,US,PA,18301,6,,,, +US-PA-18302,US,PA,18302,6,,,, +US-PA-18320,US,PA,18320,6,,,, +US-PA-18321,US,PA,18321,6,,,, +US-PA-18322,US,PA,18322,6,,,, +US-PA-18323,US,PA,18323,6,,,, +US-PA-18324,US,PA,18324,6,,,, +US-PA-18325,US,PA,18325,6,,,, +US-PA-18326,US,PA,18326,6,,,, +US-PA-18327,US,PA,18327,6,,,, +US-PA-18328,US,PA,18328,6,,,, +US-PA-18330,US,PA,18330,6,,,, +US-PA-18331,US,PA,18331,6,,,, +US-PA-18332,US,PA,18332,6,,,, +US-PA-18333,US,PA,18333,6,,,, +US-PA-18334,US,PA,18334,6,,,, +US-PA-18335,US,PA,18335,6,,,, +US-PA-18336,US,PA,18336,6,,,, +US-PA-18337,US,PA,18337,6,,,, +US-PA-18340,US,PA,18340,6,,,, +US-PA-18341,US,PA,18341,6,,,, +US-PA-18342,US,PA,18342,6,,,, +US-PA-18343,US,PA,18343,6,,,, +US-PA-18344,US,PA,18344,6,,,, +US-PA-18346,US,PA,18346,6,,,, +US-PA-18347,US,PA,18347,6,,,, +US-PA-18348,US,PA,18348,6,,,, +US-PA-18349,US,PA,18349,6,,,, +US-PA-18350,US,PA,18350,6,,,, +US-PA-18351,US,PA,18351,6,,,, +US-PA-18352,US,PA,18352,6,,,, +US-PA-18353,US,PA,18353,6,,,, +US-PA-18354,US,PA,18354,6,,,, +US-PA-18355,US,PA,18355,6,,,, +US-PA-18356,US,PA,18356,6,,,, +US-PA-18357,US,PA,18357,6,,,, +US-PA-18360,US,PA,18360,6,,,, +US-PA-18370,US,PA,18370,6,,,, +US-PA-18371,US,PA,18371,6,,,, +US-PA-18372,US,PA,18372,6,,,, +US-PA-18373,US,PA,18373,6,,,, +US-PA-18403,US,PA,18403,6,,,, +US-PA-18405,US,PA,18405,6,,,, +US-PA-18407,US,PA,18407,6,,,, +US-PA-18410,US,PA,18410,6,,,, +US-PA-18411,US,PA,18411,6,,,, +US-PA-18413,US,PA,18413,6,,,, +US-PA-18414,US,PA,18414,6,,,, +US-PA-18415,US,PA,18415,6,,,, +US-PA-18416,US,PA,18416,6,,,, +US-PA-18417,US,PA,18417,6,,,, +US-PA-18419,US,PA,18419,6,,,, +US-PA-18420,US,PA,18420,6,,,, +US-PA-18421,US,PA,18421,6,,,, +US-PA-18424,US,PA,18424,6,,,, +US-PA-18425,US,PA,18425,6,,,, +US-PA-18426,US,PA,18426,6,,,, +US-PA-18427,US,PA,18427,6,,,, +US-PA-18428,US,PA,18428,6,,,, +US-PA-18430,US,PA,18430,6,,,, +US-PA-18431,US,PA,18431,6,,,, +US-PA-18433,US,PA,18433,6,,,, +US-PA-18434,US,PA,18434,6,,,, +US-PA-18435,US,PA,18435,6,,,, +US-PA-18436,US,PA,18436,6,,,, +US-PA-18437,US,PA,18437,6,,,, +US-PA-18438,US,PA,18438,6,,,, +US-PA-18439,US,PA,18439,6,,,, +US-PA-18440,US,PA,18440,6,,,, +US-PA-18441,US,PA,18441,6,,,, +US-PA-18443,US,PA,18443,6,,,, +US-PA-18444,US,PA,18444,6,,,, +US-PA-18445,US,PA,18445,6,,,, +US-PA-18446,US,PA,18446,6,,,, +US-PA-18447,US,PA,18447,6,,,, +US-PA-18448,US,PA,18448,6,,,, +US-PA-18449,US,PA,18449,6,,,, +US-PA-18451,US,PA,18451,6,,,, +US-PA-18452,US,PA,18452,6,,,, +US-PA-18453,US,PA,18453,6,,,, +US-PA-18454,US,PA,18454,6,,,, +US-PA-18455,US,PA,18455,6,,,, +US-PA-18456,US,PA,18456,6,,,, +US-PA-18457,US,PA,18457,6,,,, +US-PA-18458,US,PA,18458,6,,,, +US-PA-18459,US,PA,18459,6,,,, +US-PA-18460,US,PA,18460,6,,,, +US-PA-18461,US,PA,18461,6,,,, +US-PA-18462,US,PA,18462,6,,,, +US-PA-18463,US,PA,18463,6,,,, +US-PA-18464,US,PA,18464,6,,,, +US-PA-18465,US,PA,18465,6,,,, +US-PA-18466,US,PA,18466,6,,,, +US-PA-18469,US,PA,18469,6,,,, +US-PA-18470,US,PA,18470,6,,,, +US-PA-18471,US,PA,18471,6,,,, +US-PA-18472,US,PA,18472,6,,,, +US-PA-18473,US,PA,18473,6,,,, +US-PA-18501,US,PA,18501,6,,,, +US-PA-18502,US,PA,18502,6,,,, +US-PA-18503,US,PA,18503,6,,,, +US-PA-18504,US,PA,18504,6,,,, +US-PA-18505,US,PA,18505,6,,,, +US-PA-18507,US,PA,18507,6,,,, +US-PA-18508,US,PA,18508,6,,,, +US-PA-18509,US,PA,18509,6,,,, +US-PA-18510,US,PA,18510,6,,,, +US-PA-18512,US,PA,18512,6,,,, +US-PA-18515,US,PA,18515,6,,,, +US-PA-18517,US,PA,18517,6,,,, +US-PA-18518,US,PA,18518,6,,,, +US-PA-18519,US,PA,18519,6,,,, +US-PA-18540,US,PA,18540,6,,,, +US-PA-18577,US,PA,18577,6,,,, +US-PA-18601,US,PA,18601,6,,,, +US-PA-18602,US,PA,18602,6,,,, +US-PA-18603,US,PA,18603,6,,,, +US-PA-18610,US,PA,18610,6,,,, +US-PA-18611,US,PA,18611,6,,,, +US-PA-18612,US,PA,18612,6,,,, +US-PA-18614,US,PA,18614,6,,,, +US-PA-18615,US,PA,18615,6,,,, +US-PA-18616,US,PA,18616,6,,,, +US-PA-18617,US,PA,18617,6,,,, +US-PA-18618,US,PA,18618,6,,,, +US-PA-18619,US,PA,18619,6,,,, +US-PA-18621,US,PA,18621,6,,,, +US-PA-18622,US,PA,18622,6,,,, +US-PA-18623,US,PA,18623,6,,,, +US-PA-18624,US,PA,18624,6,,,, +US-PA-18625,US,PA,18625,6,,,, +US-PA-18626,US,PA,18626,6,,,, +US-PA-18627,US,PA,18627,6,,,, +US-PA-18628,US,PA,18628,6,,,, +US-PA-18629,US,PA,18629,6,,,, +US-PA-18630,US,PA,18630,6,,,, +US-PA-18631,US,PA,18631,6,,,, +US-PA-18632,US,PA,18632,6,,,, +US-PA-18634,US,PA,18634,6,,,, +US-PA-18635,US,PA,18635,6,,,, +US-PA-18636,US,PA,18636,6,,,, +US-PA-18640,US,PA,18640,6,,,, +US-PA-18641,US,PA,18641,6,,,, +US-PA-18642,US,PA,18642,6,,,, +US-PA-18643,US,PA,18643,6,,,, +US-PA-18644,US,PA,18644,6,,,, +US-PA-18651,US,PA,18651,6,,,, +US-PA-18653,US,PA,18653,6,,,, +US-PA-18654,US,PA,18654,6,,,, +US-PA-18655,US,PA,18655,6,,,, +US-PA-18656,US,PA,18656,6,,,, +US-PA-18657,US,PA,18657,6,,,, +US-PA-18660,US,PA,18660,6,,,, +US-PA-18661,US,PA,18661,6,,,, +US-PA-18690,US,PA,18690,6,,,, +US-PA-18701,US,PA,18701,6,,,, +US-PA-18702,US,PA,18702,6,,,, +US-PA-18703,US,PA,18703,6,,,, +US-PA-18704,US,PA,18704,6,,,, +US-PA-18705,US,PA,18705,6,,,, +US-PA-18706,US,PA,18706,6,,,, +US-PA-18707,US,PA,18707,6,,,, +US-PA-18708,US,PA,18708,6,,,, +US-PA-18709,US,PA,18709,6,,,, +US-PA-18710,US,PA,18710,6,,,, +US-PA-18711,US,PA,18711,6,,,, +US-PA-18762,US,PA,18762,6,,,, +US-PA-18764,US,PA,18764,6,,,, +US-PA-18765,US,PA,18765,6,,,, +US-PA-18766,US,PA,18766,6,,,, +US-PA-18767,US,PA,18767,6,,,, +US-PA-18769,US,PA,18769,6,,,, +US-PA-18773,US,PA,18773,6,,,, +US-PA-18801,US,PA,18801,6,,,, +US-PA-18810,US,PA,18810,6,,,, +US-PA-18812,US,PA,18812,6,,,, +US-PA-18813,US,PA,18813,6,,,, +US-PA-18814,US,PA,18814,6,,,, +US-PA-18815,US,PA,18815,6,,,, +US-PA-18816,US,PA,18816,6,,,, +US-PA-18817,US,PA,18817,6,,,, +US-PA-18818,US,PA,18818,6,,,, +US-PA-18820,US,PA,18820,6,,,, +US-PA-18821,US,PA,18821,6,,,, +US-PA-18822,US,PA,18822,6,,,, +US-PA-18823,US,PA,18823,6,,,, +US-PA-18824,US,PA,18824,6,,,, +US-PA-18825,US,PA,18825,6,,,, +US-PA-18826,US,PA,18826,6,,,, +US-PA-18827,US,PA,18827,6,,,, +US-PA-18828,US,PA,18828,6,,,, +US-PA-18829,US,PA,18829,6,,,, +US-PA-18830,US,PA,18830,6,,,, +US-PA-18831,US,PA,18831,6,,,, +US-PA-18832,US,PA,18832,6,,,, +US-PA-18833,US,PA,18833,6,,,, +US-PA-18834,US,PA,18834,6,,,, +US-PA-18837,US,PA,18837,6,,,, +US-PA-18840,US,PA,18840,6,,,, +US-PA-18842,US,PA,18842,6,,,, +US-PA-18843,US,PA,18843,6,,,, +US-PA-18844,US,PA,18844,6,,,, +US-PA-18845,US,PA,18845,6,,,, +US-PA-18846,US,PA,18846,6,,,, +US-PA-18847,US,PA,18847,6,,,, +US-PA-18848,US,PA,18848,6,,,, +US-PA-18850,US,PA,18850,6,,,, +US-PA-18851,US,PA,18851,6,,,, +US-PA-18853,US,PA,18853,6,,,, +US-PA-18854,US,PA,18854,6,,,, +US-PA-18901,US,PA,18901,6,,,, +US-PA-18902,US,PA,18902,6,,,, +US-PA-18910,US,PA,18910,6,,,, +US-PA-18911,US,PA,18911,6,,,, +US-PA-18912,US,PA,18912,6,,,, +US-PA-18913,US,PA,18913,6,,,, +US-PA-18914,US,PA,18914,6,,,, +US-PA-18915,US,PA,18915,6,,,, +US-PA-18916,US,PA,18916,6,,,, +US-PA-18917,US,PA,18917,6,,,, +US-PA-18918,US,PA,18918,6,,,, +US-PA-18920,US,PA,18920,6,,,, +US-PA-18921,US,PA,18921,6,,,, +US-PA-18922,US,PA,18922,6,,,, +US-PA-18923,US,PA,18923,6,,,, +US-PA-18924,US,PA,18924,6,,,, +US-PA-18925,US,PA,18925,6,,,, +US-PA-18926,US,PA,18926,6,,,, +US-PA-18927,US,PA,18927,6,,,, +US-PA-18928,US,PA,18928,6,,,, +US-PA-18929,US,PA,18929,6,,,, +US-PA-18930,US,PA,18930,6,,,, +US-PA-18931,US,PA,18931,6,,,, +US-PA-18932,US,PA,18932,6,,,, +US-PA-18933,US,PA,18933,6,,,, +US-PA-18934,US,PA,18934,6,,,, +US-PA-18935,US,PA,18935,6,,,, +US-PA-18936,US,PA,18936,6,,,, +US-PA-18938,US,PA,18938,6,,,, +US-PA-18940,US,PA,18940,6,,,, +US-PA-18942,US,PA,18942,6,,,, +US-PA-18943,US,PA,18943,6,,,, +US-PA-18944,US,PA,18944,6,,,, +US-PA-18946,US,PA,18946,6,,,, +US-PA-18947,US,PA,18947,6,,,, +US-PA-18949,US,PA,18949,6,,,, +US-PA-18950,US,PA,18950,6,,,, +US-PA-18951,US,PA,18951,6,,,, +US-PA-18953,US,PA,18953,6,,,, +US-PA-18954,US,PA,18954,6,,,, +US-PA-18955,US,PA,18955,6,,,, +US-PA-18956,US,PA,18956,6,,,, +US-PA-18957,US,PA,18957,6,,,, +US-PA-18958,US,PA,18958,6,,,, +US-PA-18960,US,PA,18960,6,,,, +US-PA-18962,US,PA,18962,6,,,, +US-PA-18963,US,PA,18963,6,,,, +US-PA-18964,US,PA,18964,6,,,, +US-PA-18966,US,PA,18966,6,,,, +US-PA-18968,US,PA,18968,6,,,, +US-PA-18969,US,PA,18969,6,,,, +US-PA-18970,US,PA,18970,6,,,, +US-PA-18971,US,PA,18971,6,,,, +US-PA-18972,US,PA,18972,6,,,, +US-PA-18974,US,PA,18974,6,,,, +US-PA-18976,US,PA,18976,6,,,, +US-PA-18977,US,PA,18977,6,,,, +US-PA-18979,US,PA,18979,6,,,, +US-PA-18980,US,PA,18980,6,,,, +US-PA-18981,US,PA,18981,6,,,, +US-PA-18991,US,PA,18991,6,,,, +US-PA-19001,US,PA,19001,6,,,, +US-PA-19002,US,PA,19002,6,,,, +US-PA-19003,US,PA,19003,6,,,, +US-PA-19004,US,PA,19004,6,,,, +US-PA-19006,US,PA,19006,6,,,, +US-PA-19007,US,PA,19007,6,,,, +US-PA-19008,US,PA,19008,6,,,, +US-PA-19009,US,PA,19009,6,,,, +US-PA-19010,US,PA,19010,6,,,, +US-PA-19012,US,PA,19012,6,,,, +US-PA-19013,US,PA,19013,6,,,, +US-PA-19014,US,PA,19014,6,,,, +US-PA-19015,US,PA,19015,6,,,, +US-PA-19016,US,PA,19016,6,,,, +US-PA-19017,US,PA,19017,6,,,, +US-PA-19018,US,PA,19018,6,,,, +US-PA-19019,US,PA,19019,8,,,, +US-PA-19020,US,PA,19020,6,,,, +US-PA-19021,US,PA,19021,6,,,, +US-PA-19022,US,PA,19022,6,,,, +US-PA-19023,US,PA,19023,6,,,, +US-PA-19025,US,PA,19025,6,,,, +US-PA-19026,US,PA,19026,6,,,, +US-PA-19027,US,PA,19027,6,,,, +US-PA-19028,US,PA,19028,6,,,, +US-PA-19029,US,PA,19029,6,,,, +US-PA-19030,US,PA,19030,6,,,, +US-PA-19031,US,PA,19031,6,,,, +US-PA-19032,US,PA,19032,6,,,, +US-PA-19033,US,PA,19033,6,,,, +US-PA-19034,US,PA,19034,6,,,, +US-PA-19035,US,PA,19035,6,,,, +US-PA-19036,US,PA,19036,6,,,, +US-PA-19037,US,PA,19037,6,,,, +US-PA-19038,US,PA,19038,6,,,, +US-PA-19039,US,PA,19039,6,,,, +US-PA-19040,US,PA,19040,6,,,, +US-PA-19041,US,PA,19041,6,,,, +US-PA-19043,US,PA,19043,6,,,, +US-PA-19044,US,PA,19044,6,,,, +US-PA-19046,US,PA,19046,6,,,, +US-PA-19047,US,PA,19047,6,,,, +US-PA-19048,US,PA,19048,6,,,, +US-PA-19049,US,PA,19049,6,,,, +US-PA-19050,US,PA,19050,6,,,, +US-PA-19052,US,PA,19052,6,,,, +US-PA-19053,US,PA,19053,6,,,, +US-PA-19054,US,PA,19054,6,,,, +US-PA-19055,US,PA,19055,6,,,, +US-PA-19056,US,PA,19056,6,,,, +US-PA-19057,US,PA,19057,6,,,, +US-PA-19058,US,PA,19058,6,,,, +US-PA-19060,US,PA,19060,6,,,, +US-PA-19061,US,PA,19061,6,,,, +US-PA-19063,US,PA,19063,6,,,, +US-PA-19064,US,PA,19064,6,,,, +US-PA-19065,US,PA,19065,6,,,, +US-PA-19066,US,PA,19066,6,,,, +US-PA-19067,US,PA,19067,6,,,, +US-PA-19070,US,PA,19070,6,,,, +US-PA-19072,US,PA,19072,6,,,, +US-PA-19073,US,PA,19073,6,,,, +US-PA-19074,US,PA,19074,6,,,, +US-PA-19075,US,PA,19075,6,,,, +US-PA-19076,US,PA,19076,6,,,, +US-PA-19078,US,PA,19078,6,,,, +US-PA-19079,US,PA,19079,6,,,, +US-PA-19080,US,PA,19080,6,,,, +US-PA-19081,US,PA,19081,6,,,, +US-PA-19082,US,PA,19082,6,,,, +US-PA-19083,US,PA,19083,6,,,, +US-PA-19085,US,PA,19085,6,,,, +US-PA-19086,US,PA,19086,6,,,, +US-PA-19087,US,PA,19087,6,,,, +US-PA-19088,US,PA,19088,6,,,, +US-PA-19089,US,PA,19089,6,,,, +US-PA-19090,US,PA,19090,6,,,, +US-PA-19091,US,PA,19091,6,,,, +US-PA-19092,US,PA,19092,8,,,, +US-PA-19093,US,PA,19093,8,,,, +US-PA-19094,US,PA,19094,6,,,, +US-PA-19095,US,PA,19095,6,,,, +US-PA-19096,US,PA,19096,6,,,, +US-PA-19098,US,PA,19098,6,,,, +US-PA-19099,US,PA,19099,8,,,, +US-PA-19101,US,PA,19101,8,,,, +US-PA-19102,US,PA,19102,8,,,, +US-PA-19103,US,PA,19103,8,,,, +US-PA-19104,US,PA,19104,8,,,, +US-PA-19105,US,PA,19105,8,,,, +US-PA-19106,US,PA,19106,8,,,, +US-PA-19107,US,PA,19107,8,,,, +US-PA-19108,US,PA,19108,8,,,, +US-PA-19109,US,PA,19109,8,,,, +US-PA-19110,US,PA,19110,8,,,, +US-PA-19111,US,PA,19111,8,,,, +US-PA-19112,US,PA,19112,8,,,, +US-PA-19113,US,PA,19113,6,,,, +US-PA-19114,US,PA,19114,8,,,, +US-PA-19115,US,PA,19115,8,,,, +US-PA-19116,US,PA,19116,8,,,, +US-PA-19118,US,PA,19118,8,,,, +US-PA-19119,US,PA,19119,8,,,, +US-PA-19120,US,PA,19120,8,,,, +US-PA-19121,US,PA,19121,8,,,, +US-PA-19122,US,PA,19122,8,,,, +US-PA-19123,US,PA,19123,8,,,, +US-PA-19124,US,PA,19124,8,,,, +US-PA-19125,US,PA,19125,8,,,, +US-PA-19126,US,PA,19126,8,,,, +US-PA-19127,US,PA,19127,8,,,, +US-PA-19128,US,PA,19128,8,,,, +US-PA-19129,US,PA,19129,8,,,, +US-PA-19130,US,PA,19130,8,,,, +US-PA-19131,US,PA,19131,8,,,, +US-PA-19132,US,PA,19132,8,,,, +US-PA-19133,US,PA,19133,8,,,, +US-PA-19134,US,PA,19134,8,,,, +US-PA-19135,US,PA,19135,8,,,, +US-PA-19136,US,PA,19136,8,,,, +US-PA-19137,US,PA,19137,8,,,, +US-PA-19138,US,PA,19138,8,,,, +US-PA-19139,US,PA,19139,8,,,, +US-PA-19140,US,PA,19140,8,,,, +US-PA-19141,US,PA,19141,8,,,, +US-PA-19142,US,PA,19142,8,,,, +US-PA-19143,US,PA,19143,8,,,, +US-PA-19144,US,PA,19144,8,,,, +US-PA-19145,US,PA,19145,8,,,, +US-PA-19146,US,PA,19146,8,,,, +US-PA-19147,US,PA,19147,8,,,, +US-PA-19148,US,PA,19148,8,,,, +US-PA-19149,US,PA,19149,8,,,, +US-PA-19150,US,PA,19150,8,,,, +US-PA-19151,US,PA,19151,8,,,, +US-PA-19152,US,PA,19152,8,,,, +US-PA-19153,US,PA,19153,8,,,, +US-PA-19154,US,PA,19154,8,,,, +US-PA-19155,US,PA,19155,8,,,, +US-PA-19160,US,PA,19160,8,,,, +US-PA-19161,US,PA,19161,8,,,, +US-PA-19162,US,PA,19162,8,,,, +US-PA-19170,US,PA,19170,8,,,, +US-PA-19171,US,PA,19171,8,,,, +US-PA-19172,US,PA,19172,8,,,, +US-PA-19173,US,PA,19173,8,,,, +US-PA-19175,US,PA,19175,8,,,, +US-PA-19176,US,PA,19176,8,,,, +US-PA-19177,US,PA,19177,8,,,, +US-PA-19178,US,PA,19178,8,,,, +US-PA-19179,US,PA,19179,8,,,, +US-PA-19181,US,PA,19181,8,,,, +US-PA-19182,US,PA,19182,8,,,, +US-PA-19183,US,PA,19183,8,,,, +US-PA-19184,US,PA,19184,8,,,, +US-PA-19185,US,PA,19185,8,,,, +US-PA-19187,US,PA,19187,8,,,, +US-PA-19188,US,PA,19188,8,,,, +US-PA-19190,US,PA,19190,8,,,, +US-PA-19191,US,PA,19191,8,,,, +US-PA-19192,US,PA,19192,8,,,, +US-PA-19193,US,PA,19193,8,,,, +US-PA-19194,US,PA,19194,8,,,, +US-PA-19195,US,PA,19195,8,,,, +US-PA-19196,US,PA,19196,8,,,, +US-PA-19197,US,PA,19197,8,,,, +US-PA-19244,US,PA,19244,8,,,, +US-PA-19255,US,PA,19255,8,,,, +US-PA-19301,US,PA,19301,6,,,, +US-PA-19310,US,PA,19310,6,,,, +US-PA-19311,US,PA,19311,6,,,, +US-PA-19312,US,PA,19312,6,,,, +US-PA-19316,US,PA,19316,6,,,, +US-PA-19317,US,PA,19317,6,,,, +US-PA-19318,US,PA,19318,6,,,, +US-PA-19319,US,PA,19319,6,,,, +US-PA-19320,US,PA,19320,6,,,, +US-PA-19330,US,PA,19330,6,,,, +US-PA-19331,US,PA,19331,6,,,, +US-PA-19333,US,PA,19333,6,,,, +US-PA-19335,US,PA,19335,6,,,, +US-PA-19339,US,PA,19339,6,,,, +US-PA-19340,US,PA,19340,6,,,, +US-PA-19341,US,PA,19341,6,,,, +US-PA-19342,US,PA,19342,6,,,, +US-PA-19343,US,PA,19343,6,,,, +US-PA-19344,US,PA,19344,6,,,, +US-PA-19345,US,PA,19345,6,,,, +US-PA-19346,US,PA,19346,6,,,, +US-PA-19347,US,PA,19347,6,,,, +US-PA-19348,US,PA,19348,6,,,, +US-PA-19350,US,PA,19350,6,,,, +US-PA-19351,US,PA,19351,6,,,, +US-PA-19352,US,PA,19352,6,,,, +US-PA-19353,US,PA,19353,6,,,, +US-PA-19354,US,PA,19354,6,,,, +US-PA-19355,US,PA,19355,6,,,, +US-PA-19357,US,PA,19357,6,,,, +US-PA-19358,US,PA,19358,6,,,, +US-PA-19360,US,PA,19360,6,,,, +US-PA-19362,US,PA,19362,6,,,, +US-PA-19363,US,PA,19363,6,,,, +US-PA-19365,US,PA,19365,6,,,, +US-PA-19366,US,PA,19366,6,,,, +US-PA-19367,US,PA,19367,6,,,, +US-PA-19369,US,PA,19369,6,,,, +US-PA-19371,US,PA,19371,6,,,, +US-PA-19372,US,PA,19372,6,,,, +US-PA-19373,US,PA,19373,6,,,, +US-PA-19374,US,PA,19374,6,,,, +US-PA-19375,US,PA,19375,6,,,, +US-PA-19376,US,PA,19376,6,,,, +US-PA-19380,US,PA,19380,6,,,, +US-PA-19381,US,PA,19381,6,,,, +US-PA-19382,US,PA,19382,6,,,, +US-PA-19383,US,PA,19383,6,,,, +US-PA-19390,US,PA,19390,6,,,, +US-PA-19395,US,PA,19395,6,,,, +US-PA-19397,US,PA,19397,6,,,, +US-PA-19398,US,PA,19398,6,,,, +US-PA-19399,US,PA,19399,6,,,, +US-PA-19401,US,PA,19401,6,,,, +US-PA-19403,US,PA,19403,6,,,, +US-PA-19404,US,PA,19404,6,,,, +US-PA-19405,US,PA,19405,6,,,, +US-PA-19406,US,PA,19406,6,,,, +US-PA-19407,US,PA,19407,6,,,, +US-PA-19408,US,PA,19408,6,,,, +US-PA-19415,US,PA,19415,6,,,, +US-PA-19420,US,PA,19420,6,,,, +US-PA-19421,US,PA,19421,6,,,, +US-PA-19422,US,PA,19422,6,,,, +US-PA-19423,US,PA,19423,6,,,, +US-PA-19424,US,PA,19424,6,,,, +US-PA-19425,US,PA,19425,6,,,, +US-PA-19426,US,PA,19426,6,,,, +US-PA-19428,US,PA,19428,6,,,, +US-PA-19429,US,PA,19429,6,,,, +US-PA-19430,US,PA,19430,6,,,, +US-PA-19432,US,PA,19432,6,,,, +US-PA-19435,US,PA,19435,6,,,, +US-PA-19436,US,PA,19436,6,,,, +US-PA-19437,US,PA,19437,6,,,, +US-PA-19438,US,PA,19438,6,,,, +US-PA-19440,US,PA,19440,6,,,, +US-PA-19441,US,PA,19441,6,,,, +US-PA-19442,US,PA,19442,6,,,, +US-PA-19443,US,PA,19443,6,,,, +US-PA-19444,US,PA,19444,6,,,, +US-PA-19446,US,PA,19446,6,,,, +US-PA-19450,US,PA,19450,6,,,, +US-PA-19451,US,PA,19451,6,,,, +US-PA-19453,US,PA,19453,6,,,, +US-PA-19454,US,PA,19454,6,,,, +US-PA-19455,US,PA,19455,6,,,, +US-PA-19456,US,PA,19456,6,,,, +US-PA-19457,US,PA,19457,6,,,, +US-PA-19460,US,PA,19460,6,,,, +US-PA-19462,US,PA,19462,6,,,, +US-PA-19464,US,PA,19464,6,,,, +US-PA-19465,US,PA,19465,6,,,, +US-PA-19468,US,PA,19468,6,,,, +US-PA-19470,US,PA,19470,6,,,, +US-PA-19472,US,PA,19472,6,,,, +US-PA-19473,US,PA,19473,6,,,, +US-PA-19474,US,PA,19474,6,,,, +US-PA-19475,US,PA,19475,6,,,, +US-PA-19477,US,PA,19477,6,,,, +US-PA-19478,US,PA,19478,6,,,, +US-PA-19480,US,PA,19480,6,,,, +US-PA-19481,US,PA,19481,6,,,, +US-PA-19482,US,PA,19482,6,,,, +US-PA-19484,US,PA,19484,6,,,, +US-PA-19486,US,PA,19486,6,,,, +US-PA-19490,US,PA,19490,6,,,, +US-PA-19492,US,PA,19492,6,,,, +US-PA-19493,US,PA,19493,6,,,, +US-PA-19494,US,PA,19494,6,,,, +US-PA-19495,US,PA,19495,6,,,, +US-PA-19496,US,PA,19496,6,,,, +US-PA-19501,US,PA,19501,6,,,, +US-PA-19503,US,PA,19503,6,,,, +US-PA-19504,US,PA,19504,6,,,, +US-PA-19505,US,PA,19505,6,,,, +US-PA-19506,US,PA,19506,6,,,, +US-PA-19507,US,PA,19507,6,,,, +US-PA-19508,US,PA,19508,6,,,, +US-PA-19510,US,PA,19510,6,,,, +US-PA-19511,US,PA,19511,6,,,, +US-PA-19512,US,PA,19512,6,,,, +US-PA-19516,US,PA,19516,6,,,, +US-PA-19518,US,PA,19518,6,,,, +US-PA-19519,US,PA,19519,6,,,, +US-PA-19520,US,PA,19520,6,,,, +US-PA-19522,US,PA,19522,6,,,, +US-PA-19523,US,PA,19523,6,,,, +US-PA-19525,US,PA,19525,6,,,, +US-PA-19526,US,PA,19526,6,,,, +US-PA-19529,US,PA,19529,6,,,, +US-PA-19530,US,PA,19530,6,,,, +US-PA-19533,US,PA,19533,6,,,, +US-PA-19534,US,PA,19534,6,,,, +US-PA-19535,US,PA,19535,6,,,, +US-PA-19536,US,PA,19536,6,,,, +US-PA-19538,US,PA,19538,6,,,, +US-PA-19539,US,PA,19539,6,,,, +US-PA-19540,US,PA,19540,6,,,, +US-PA-19541,US,PA,19541,6,,,, +US-PA-19542,US,PA,19542,6,,,, +US-PA-19543,US,PA,19543,6,,,, +US-PA-19544,US,PA,19544,6,,,, +US-PA-19545,US,PA,19545,6,,,, +US-PA-19547,US,PA,19547,6,,,, +US-PA-19548,US,PA,19548,6,,,, +US-PA-19549,US,PA,19549,6,,,, +US-PA-19550,US,PA,19550,6,,,, +US-PA-19551,US,PA,19551,6,,,, +US-PA-19554,US,PA,19554,6,,,, +US-PA-19555,US,PA,19555,6,,,, +US-PA-19559,US,PA,19559,6,,,, +US-PA-19560,US,PA,19560,6,,,, +US-PA-19562,US,PA,19562,6,,,, +US-PA-19564,US,PA,19564,6,,,, +US-PA-19565,US,PA,19565,6,,,, +US-PA-19567,US,PA,19567,6,,,, +US-PA-19601,US,PA,19601,6,,,, +US-PA-19602,US,PA,19602,6,,,, +US-PA-19603,US,PA,19603,6,,,, +US-PA-19604,US,PA,19604,6,,,, +US-PA-19605,US,PA,19605,6,,,, +US-PA-19606,US,PA,19606,6,,,, +US-PA-19607,US,PA,19607,6,,,, +US-PA-19608,US,PA,19608,6,,,, +US-PA-19609,US,PA,19609,6,,,, +US-PA-19610,US,PA,19610,6,,,, +US-PA-19611,US,PA,19611,6,,,, +US-PA-19612,US,PA,19612,6,,,, +US-PR-00601,US,PR,00601,7,,,, +US-PR-00602,US,PR,00602,7,,,, +US-PR-00603,US,PR,00603,7,,,, +US-PR-00604,US,PR,00604,7,,,, +US-PR-00605,US,PR,00605,7,,,, +US-PR-00606,US,PR,00606,7,,,, +US-PR-00610,US,PR,00610,7,,,, +US-PR-00611,US,PR,00611,7,,,, +US-PR-00612,US,PR,00612,7,,,, +US-PR-00613,US,PR,00613,7,,,, +US-PR-00614,US,PR,00614,7,,,, +US-PR-00616,US,PR,00616,7,,,, +US-PR-00617,US,PR,00617,7,,,, +US-PR-00622,US,PR,00622,7,,,, +US-PR-00623,US,PR,00623,7,,,, +US-PR-00624,US,PR,00624,7,,,, +US-PR-00627,US,PR,00627,7,,,, +US-PR-00631,US,PR,00631,7,,,, +US-PR-00636,US,PR,00636,7,,,, +US-PR-00637,US,PR,00637,7,,,, +US-PR-00638,US,PR,00638,7,,,, +US-PR-00641,US,PR,00641,7,,,, +US-PR-00646,US,PR,00646,7,,,, +US-PR-00647,US,PR,00647,7,,,, +US-PR-00650,US,PR,00650,7,,,, +US-PR-00652,US,PR,00652,7,,,, +US-PR-00653,US,PR,00653,7,,,, +US-PR-00656,US,PR,00656,7,,,, +US-PR-00659,US,PR,00659,7,,,, +US-PR-00660,US,PR,00660,7,,,, +US-PR-00662,US,PR,00662,7,,,, +US-PR-00664,US,PR,00664,7,,,, +US-PR-00667,US,PR,00667,7,,,, +US-PR-00669,US,PR,00669,7,,,, +US-PR-00670,US,PR,00670,7,,,, +US-PR-00674,US,PR,00674,7,,,, +US-PR-00676,US,PR,00676,7,,,, +US-PR-00677,US,PR,00677,7,,,, +US-PR-00678,US,PR,00678,7,,,, +US-PR-00680,US,PR,00680,7,,,, +US-PR-00681,US,PR,00681,7,,,, +US-PR-00682,US,PR,00682,7,,,, +US-PR-00683,US,PR,00683,7,,,, +US-PR-00685,US,PR,00685,7,,,, +US-PR-00687,US,PR,00687,7,,,, +US-PR-00688,US,PR,00688,7,,,, +US-PR-00690,US,PR,00690,7,,,, +US-PR-00692,US,PR,00692,7,,,, +US-PR-00693,US,PR,00693,7,,,, +US-PR-00694,US,PR,00694,7,,,, +US-PR-00698,US,PR,00698,7,,,, +US-PR-00703,US,PR,00703,7,,,, +US-PR-00704,US,PR,00704,7,,,, +US-PR-00705,US,PR,00705,7,,,, +US-PR-00707,US,PR,00707,7,,,, +US-PR-00714,US,PR,00714,7,,,, +US-PR-00715,US,PR,00715,7,,,, +US-PR-00716,US,PR,00716,7,,,, +US-PR-00717,US,PR,00717,7,,,, +US-PR-00718,US,PR,00718,7,,,, +US-PR-00719,US,PR,00719,7,,,, +US-PR-00720,US,PR,00720,7,,,, +US-PR-00721,US,PR,00721,7,,,, +US-PR-00723,US,PR,00723,7,,,, +US-PR-00725,US,PR,00725,7,,,, +US-PR-00726,US,PR,00726,7,,,, +US-PR-00727,US,PR,00727,7,,,, +US-PR-00728,US,PR,00728,7,,,, +US-PR-00729,US,PR,00729,7,,,, +US-PR-00730,US,PR,00730,7,,,, +US-PR-00731,US,PR,00731,7,,,, +US-PR-00732,US,PR,00732,7,,,, +US-PR-00733,US,PR,00733,7,,,, +US-PR-00734,US,PR,00734,7,,,, +US-PR-00735,US,PR,00735,7,,,, +US-PR-00736,US,PR,00736,7,,,, +US-PR-00737,US,PR,00737,7,,,, +US-PR-00738,US,PR,00738,7,,,, +US-PR-00739,US,PR,00739,7,,,, +US-PR-00740,US,PR,00740,7,,,, +US-PR-00741,US,PR,00741,7,,,, +US-PR-00742,US,PR,00742,7,,,, +US-PR-00744,US,PR,00744,7,,,, +US-PR-00745,US,PR,00745,7,,,, +US-PR-00751,US,PR,00751,7,,,, +US-PR-00754,US,PR,00754,7,,,, +US-PR-00757,US,PR,00757,7,,,, +US-PR-00765,US,PR,00765,7,,,, +US-PR-00766,US,PR,00766,7,,,, +US-PR-00767,US,PR,00767,7,,,, +US-PR-00769,US,PR,00769,7,,,, +US-PR-00771,US,PR,00771,7,,,, +US-PR-00772,US,PR,00772,7,,,, +US-PR-00773,US,PR,00773,7,,,, +US-PR-00775,US,PR,00775,7,,,, +US-PR-00777,US,PR,00777,7,,,, +US-PR-00778,US,PR,00778,7,,,, +US-PR-00780,US,PR,00780,7,,,, +US-PR-00782,US,PR,00782,7,,,, +US-PR-00783,US,PR,00783,7,,,, +US-PR-00784,US,PR,00784,7,,,, +US-PR-00785,US,PR,00785,7,,,, +US-PR-00786,US,PR,00786,7,,,, +US-PR-00791,US,PR,00791,7,,,, +US-PR-00792,US,PR,00792,7,,,, +US-PR-00794,US,PR,00794,7,,,, +US-PR-00795,US,PR,00795,7,,,, +US-PR-00901,US,PR,00901,7,,,, +US-PR-00902,US,PR,00902,7,,,, +US-PR-00906,US,PR,00906,7,,,, +US-PR-00907,US,PR,00907,7,,,, +US-PR-00908,US,PR,00908,7,,,, +US-PR-00909,US,PR,00909,7,,,, +US-PR-00910,US,PR,00910,7,,,, +US-PR-00911,US,PR,00911,7,,,, +US-PR-00912,US,PR,00912,7,,,, +US-PR-00913,US,PR,00913,7,,,, +US-PR-00914,US,PR,00914,7,,,, +US-PR-00915,US,PR,00915,7,,,, +US-PR-00916,US,PR,00916,7,,,, +US-PR-00917,US,PR,00917,7,,,, +US-PR-00918,US,PR,00918,7,,,, +US-PR-00919,US,PR,00919,7,,,, +US-PR-00920,US,PR,00920,7,,,, +US-PR-00921,US,PR,00921,7,,,, +US-PR-00922,US,PR,00922,7,,,, +US-PR-00923,US,PR,00923,7,,,, +US-PR-00924,US,PR,00924,7,,,, +US-PR-00925,US,PR,00925,7,,,, +US-PR-00926,US,PR,00926,7,,,, +US-PR-00927,US,PR,00927,7,,,, +US-PR-00928,US,PR,00928,7,,,, +US-PR-00929,US,PR,00929,7,,,, +US-PR-00930,US,PR,00930,7,,,, +US-PR-00931,US,PR,00931,7,,,, +US-PR-00933,US,PR,00933,7,,,, +US-PR-00934,US,PR,00934,7,,,, +US-PR-00935,US,PR,00935,7,,,, +US-PR-00936,US,PR,00936,7,,,, +US-PR-00937,US,PR,00937,7,,,, +US-PR-00939,US,PR,00939,7,,,, +US-PR-00940,US,PR,00940,7,,,, +US-PR-00949,US,PR,00949,7,,,, +US-PR-00950,US,PR,00950,7,,,, +US-PR-00951,US,PR,00951,7,,,, +US-PR-00952,US,PR,00952,7,,,, +US-PR-00953,US,PR,00953,7,,,, +US-PR-00954,US,PR,00954,7,,,, +US-PR-00955,US,PR,00955,7,,,, +US-PR-00956,US,PR,00956,7,,,, +US-PR-00957,US,PR,00957,7,,,, +US-PR-00958,US,PR,00958,7,,,, +US-PR-00959,US,PR,00959,7,,,, +US-PR-00960,US,PR,00960,7,,,, +US-PR-00961,US,PR,00961,7,,,, +US-PR-00962,US,PR,00962,7,,,, +US-PR-00963,US,PR,00963,7,,,, +US-PR-00965,US,PR,00965,7,,,, +US-PR-00966,US,PR,00966,7,,,, +US-PR-00968,US,PR,00968,7,,,, +US-PR-00969,US,PR,00969,7,,,, +US-PR-00970,US,PR,00970,7,,,, +US-PR-00971,US,PR,00971,7,,,, +US-PR-00975,US,PR,00975,7,,,, +US-PR-00976,US,PR,00976,7,,,, +US-PR-00977,US,PR,00977,7,,,, +US-PR-00978,US,PR,00978,7,,,, +US-PR-00979,US,PR,00979,7,,,, +US-PR-00981,US,PR,00981,7,,,, +US-PR-00982,US,PR,00982,7,,,, +US-PR-00983,US,PR,00983,7,,,, +US-PR-00984,US,PR,00984,7,,,, +US-PR-00985,US,PR,00985,7,,,, +US-PR-00986,US,PR,00986,7,,,, +US-PR-00987,US,PR,00987,7,,,, +US-PR-00988,US,PR,00988,7,,,, +US-RI-02801,US,RI,02801,7,,,, +US-RI-02802,US,RI,02802,7,,,, +US-RI-02804,US,RI,02804,7,,,, +US-RI-02806,US,RI,02806,7,,,, +US-RI-02807,US,RI,02807,7,,,, +US-RI-02808,US,RI,02808,7,,,, +US-RI-02809,US,RI,02809,7,,,, +US-RI-02812,US,RI,02812,7,,,, +US-RI-02813,US,RI,02813,7,,,, +US-RI-02814,US,RI,02814,7,,,, +US-RI-02815,US,RI,02815,7,,,, +US-RI-02816,US,RI,02816,7,,,, +US-RI-02817,US,RI,02817,7,,,, +US-RI-02818,US,RI,02818,7,,,, +US-RI-02822,US,RI,02822,7,,,, +US-RI-02823,US,RI,02823,7,,,, +US-RI-02824,US,RI,02824,7,,,, +US-RI-02825,US,RI,02825,7,,,, +US-RI-02826,US,RI,02826,7,,,, +US-RI-02827,US,RI,02827,7,,,, +US-RI-02828,US,RI,02828,7,,,, +US-RI-02829,US,RI,02829,7,,,, +US-RI-02830,US,RI,02830,7,,,, +US-RI-02831,US,RI,02831,7,,,, +US-RI-02832,US,RI,02832,7,,,, +US-RI-02833,US,RI,02833,7,,,, +US-RI-02835,US,RI,02835,7,,,, +US-RI-02836,US,RI,02836,7,,,, +US-RI-02837,US,RI,02837,7,,,, +US-RI-02838,US,RI,02838,7,,,, +US-RI-02839,US,RI,02839,7,,,, +US-RI-02840,US,RI,02840,7,,,, +US-RI-02841,US,RI,02841,7,,,, +US-RI-02842,US,RI,02842,7,,,, +US-RI-02852,US,RI,02852,7,,,, +US-RI-02857,US,RI,02857,7,,,, +US-RI-02858,US,RI,02858,7,,,, +US-RI-02859,US,RI,02859,7,,,, +US-RI-02860,US,RI,02860,7,,,, +US-RI-02861,US,RI,02861,7,,,, +US-RI-02862,US,RI,02862,7,,,, +US-RI-02863,US,RI,02863,7,,,, +US-RI-02864,US,RI,02864,7,,,, +US-RI-02865,US,RI,02865,7,,,, +US-RI-02871,US,RI,02871,7,,,, +US-RI-02872,US,RI,02872,7,,,, +US-RI-02873,US,RI,02873,7,,,, +US-RI-02874,US,RI,02874,7,,,, +US-RI-02875,US,RI,02875,7,,,, +US-RI-02876,US,RI,02876,7,,,, +US-RI-02877,US,RI,02877,7,,,, +US-RI-02878,US,RI,02878,7,,,, +US-RI-02879,US,RI,02879,7,,,, +US-RI-02880,US,RI,02880,7,,,, +US-RI-02881,US,RI,02881,7,,,, +US-RI-02882,US,RI,02882,7,,,, +US-RI-02883,US,RI,02883,7,,,, +US-RI-02885,US,RI,02885,7,,,, +US-RI-02886,US,RI,02886,7,,,, +US-RI-02887,US,RI,02887,7,,,, +US-RI-02888,US,RI,02888,7,,,, +US-RI-02889,US,RI,02889,7,,,, +US-RI-02891,US,RI,02891,7,,,, +US-RI-02892,US,RI,02892,7,,,, +US-RI-02893,US,RI,02893,7,,,, +US-RI-02894,US,RI,02894,7,,,, +US-RI-02895,US,RI,02895,7,,,, +US-RI-02896,US,RI,02896,7,,,, +US-RI-02898,US,RI,02898,7,,,, +US-RI-02901,US,RI,02901,7,,,, +US-RI-02902,US,RI,02902,7,,,, +US-RI-02903,US,RI,02903,7,,,, +US-RI-02904,US,RI,02904,7,,,, +US-RI-02905,US,RI,02905,7,,,, +US-RI-02906,US,RI,02906,7,,,, +US-RI-02907,US,RI,02907,7,,,, +US-RI-02908,US,RI,02908,7,,,, +US-RI-02909,US,RI,02909,7,,,, +US-RI-02910,US,RI,02910,7,,,, +US-RI-02911,US,RI,02911,7,,,, +US-RI-02912,US,RI,02912,7,,,, +US-RI-02914,US,RI,02914,7,,,, +US-RI-02915,US,RI,02915,7,,,, +US-RI-02916,US,RI,02916,7,,,, +US-RI-02917,US,RI,02917,7,,,, +US-RI-02918,US,RI,02918,7,,,, +US-RI-02919,US,RI,02919,7,,,, +US-RI-02920,US,RI,02920,7,,,, +US-RI-02921,US,RI,02921,7,,,, +US-RI-02940,US,RI,02940,7,,,, +US-SC-29001,US,SC,29001,8,,,, +US-SC-29002,US,SC,29002,8,,,, +US-SC-29003,US,SC,29003,8,,,, +US-SC-29006,US,SC,29006,7,,,, +US-SC-29009,US,SC,29009,7,,,, +US-SC-29010,US,SC,29010,8,,,, +US-SC-29014,US,SC,29014,8,,,, +US-SC-29015,US,SC,29015,7,,,, +US-SC-29016,US,SC,29016,8,,,, +US-SC-29018,US,SC,29018,7,,,, +US-SC-29020,US,SC,29020,7,,,, +US-SC-29021,US,SC,29021,7,,,, +US-SC-29030,US,SC,29030,7,,,, +US-SC-29031,US,SC,29031,6,,,, +US-SC-29032,US,SC,29032,7,,,, +US-SC-29033,US,SC,29033,7,,,, +US-SC-29036,US,SC,29036,7,,,, +US-SC-29037,US,SC,29037,7,,,, +US-SC-29038,US,SC,29038,7,,,, +US-SC-29039,US,SC,29039,7,,,, +US-SC-29040,US,SC,29040,8,,,, +US-SC-29041,US,SC,29041,8,,,, +US-SC-29042,US,SC,29042,8,,,, +US-SC-29044,US,SC,29044,8,,,, +US-SC-29045,US,SC,29045,7,,,, +US-SC-29046,US,SC,29046,8,,,, +US-SC-29047,US,SC,29047,7,,,, +US-SC-29048,US,SC,29048,7,,,, +US-SC-29051,US,SC,29051,8,,,, +US-SC-29052,US,SC,29052,8,,,, +US-SC-29053,US,SC,29053,7,,,, +US-SC-29054,US,SC,29054,7,,,, +US-SC-29055,US,SC,29055,8,,,, +US-SC-29056,US,SC,29056,7,,,, +US-SC-29058,US,SC,29058,8,,,, +US-SC-29059,US,SC,29059,7,,,, +US-SC-29061,US,SC,29061,8,,,, +US-SC-29062,US,SC,29062,8,,,, +US-SC-29063,US,SC,29063,8,,,, +US-SC-29065,US,SC,29065,7,,,, +US-SC-29067,US,SC,29067,8,,,, +US-SC-29069,US,SC,29069,8,,,, +US-SC-29070,US,SC,29070,7,,,, +US-SC-29071,US,SC,29071,7,,,, +US-SC-29072,US,SC,29072,7,,,, +US-SC-29073,US,SC,29073,7,,,, +US-SC-29074,US,SC,29074,7,,,, +US-SC-29075,US,SC,29075,7,,,, +US-SC-29078,US,SC,29078,7,,,, +US-SC-29079,US,SC,29079,8,,,, +US-SC-29080,US,SC,29080,8,,,, +US-SC-29081,US,SC,29081,8,,,, +US-SC-29082,US,SC,29082,7,,,, +US-SC-29101,US,SC,29101,8,,,, +US-SC-29102,US,SC,29102,8,,,, +US-SC-29104,US,SC,29104,8,,,, +US-SC-29105,US,SC,29105,7,,,, +US-SC-29107,US,SC,29107,7,,,, +US-SC-29108,US,SC,29108,7,,,, +US-SC-29111,US,SC,29111,8,,,, +US-SC-29112,US,SC,29112,7,,,, +US-SC-29113,US,SC,29113,7,,,, +US-SC-29114,US,SC,29114,8,,,, +US-SC-29115,US,SC,29115,7,,,, +US-SC-29116,US,SC,29116,7,,,, +US-SC-29117,US,SC,29117,7,,,, +US-SC-29118,US,SC,29118,7,,,, +US-SC-29122,US,SC,29122,7,,,, +US-SC-29123,US,SC,29123,7,,,, +US-SC-29125,US,SC,29125,8,,,, +US-SC-29126,US,SC,29126,7,,,, +US-SC-29127,US,SC,29127,7,,,, +US-SC-29128,US,SC,29128,8,,,, +US-SC-29129,US,SC,29129,7,,,, +US-SC-29130,US,SC,29130,7,,,, +US-SC-29132,US,SC,29132,7,,,, +US-SC-29133,US,SC,29133,7,,,, +US-SC-29135,US,SC,29135,7,,,, +US-SC-29137,US,SC,29137,7,,,, +US-SC-29138,US,SC,29138,7,,,, +US-SC-29142,US,SC,29142,7,,,, +US-SC-29143,US,SC,29143,8,,,, +US-SC-29145,US,SC,29145,7,,,, +US-SC-29146,US,SC,29146,7,,,, +US-SC-29147,US,SC,29147,8,,,, +US-SC-29148,US,SC,29148,8,,,, +US-SC-29150,US,SC,29150,8,,,, +US-SC-29151,US,SC,29151,8,,,, +US-SC-29152,US,SC,29152,8,,,, +US-SC-29153,US,SC,29153,8,,,, +US-SC-29154,US,SC,29154,8,,,, +US-SC-29160,US,SC,29160,7,,,, +US-SC-29161,US,SC,29161,8,,,, +US-SC-29162,US,SC,29162,8,,,, +US-SC-29163,US,SC,29163,7,,,, +US-SC-29164,US,SC,29164,7,,,, +US-SC-29166,US,SC,29166,7,,,, +US-SC-29168,US,SC,29168,8,,,, +US-SC-29169,US,SC,29169,7,,,, +US-SC-29170,US,SC,29170,7,,,, +US-SC-29171,US,SC,29171,7,,,, +US-SC-29172,US,SC,29172,7,,,, +US-SC-29175,US,SC,29175,7,,,, +US-SC-29177,US,SC,29177,8,,,, +US-SC-29178,US,SC,29178,7,,,, +US-SC-29180,US,SC,29180,7,,,, +US-SC-29201,US,SC,29201,8,,,, +US-SC-29202,US,SC,29202,8,,,, +US-SC-29203,US,SC,29203,8,,,, +US-SC-29204,US,SC,29204,8,,,, +US-SC-29205,US,SC,29205,8,,,, +US-SC-29206,US,SC,29206,8,,,, +US-SC-29207,US,SC,29207,8,,,, +US-SC-29208,US,SC,29208,8,,,, +US-SC-29209,US,SC,29209,8,,,, +US-SC-29210,US,SC,29210,8,,,, +US-SC-29211,US,SC,29211,8,,,, +US-SC-29212,US,SC,29212,7,,,, +US-SC-29214,US,SC,29214,8,,,, +US-SC-29215,US,SC,29215,8,,,, +US-SC-29216,US,SC,29216,8,,,, +US-SC-29217,US,SC,29217,8,,,, +US-SC-29218,US,SC,29218,8,,,, +US-SC-29219,US,SC,29219,8,,,, +US-SC-29220,US,SC,29220,8,,,, +US-SC-29221,US,SC,29221,8,,,, +US-SC-29222,US,SC,29222,8,,,, +US-SC-29223,US,SC,29223,8,,,, +US-SC-29224,US,SC,29224,8,,,, +US-SC-29225,US,SC,29225,8,,,, +US-SC-29226,US,SC,29226,8,,,, +US-SC-29227,US,SC,29227,8,,,, +US-SC-29228,US,SC,29228,7,,,, +US-SC-29229,US,SC,29229,8,,,, +US-SC-29230,US,SC,29230,8,,,, +US-SC-29240,US,SC,29240,8,,,, +US-SC-29250,US,SC,29250,8,,,, +US-SC-29260,US,SC,29260,8,,,, +US-SC-29290,US,SC,29290,8,,,, +US-SC-29292,US,SC,29292,8,,,, +US-SC-29301,US,SC,29301,6,,,, +US-SC-29302,US,SC,29302,6,,,, +US-SC-29303,US,SC,29303,6,,,, +US-SC-29304,US,SC,29304,6,,,, +US-SC-29305,US,SC,29305,6,,,, +US-SC-29306,US,SC,29306,6,,,, +US-SC-29307,US,SC,29307,6,,,, +US-SC-29316,US,SC,29316,6,,,, +US-SC-29319,US,SC,29319,6,,,, +US-SC-29320,US,SC,29320,6,,,, +US-SC-29321,US,SC,29321,6,,,, +US-SC-29322,US,SC,29322,6,,,, +US-SC-29323,US,SC,29323,6,,,, +US-SC-29324,US,SC,29324,6,,,, +US-SC-29325,US,SC,29325,7,,,, +US-SC-29329,US,SC,29329,6,,,, +US-SC-29330,US,SC,29330,6,,,, +US-SC-29331,US,SC,29331,6,,,, +US-SC-29332,US,SC,29332,7,,,, +US-SC-29333,US,SC,29333,6,,,, +US-SC-29334,US,SC,29334,6,,,, +US-SC-29335,US,SC,29335,6,,,, +US-SC-29336,US,SC,29336,6,,,, +US-SC-29338,US,SC,29338,6,,,, +US-SC-29340,US,SC,29340,8,,,, +US-SC-29341,US,SC,29341,8,,,, +US-SC-29342,US,SC,29342,8,,,, +US-SC-29346,US,SC,29346,6,,,, +US-SC-29348,US,SC,29348,6,,,, +US-SC-29349,US,SC,29349,6,,,, +US-SC-29351,US,SC,29351,7,,,, +US-SC-29353,US,SC,29353,6,,,, +US-SC-29355,US,SC,29355,7,,,, +US-SC-29356,US,SC,29356,6,,,, +US-SC-29360,US,SC,29360,7,,,, +US-SC-29364,US,SC,29364,6,,,, +US-SC-29365,US,SC,29365,6,,,, +US-SC-29368,US,SC,29368,6,,,, +US-SC-29369,US,SC,29369,6,,,, +US-SC-29370,US,SC,29370,7,,,, +US-SC-29372,US,SC,29372,6,,,, +US-SC-29373,US,SC,29373,6,,,, +US-SC-29374,US,SC,29374,6,,,, +US-SC-29375,US,SC,29375,6,,,, +US-SC-29376,US,SC,29376,6,,,, +US-SC-29377,US,SC,29377,6,,,, +US-SC-29378,US,SC,29378,6,,,, +US-SC-29379,US,SC,29379,6,,,, +US-SC-29384,US,SC,29384,7,,,, +US-SC-29385,US,SC,29385,6,,,, +US-SC-29386,US,SC,29386,6,,,, +US-SC-29388,US,SC,29388,6,,,, +US-SC-29395,US,SC,29395,6,,,, +US-SC-29401,US,SC,29401,8.5,,,, +US-SC-29402,US,SC,29402,8.5,,,, +US-SC-29403,US,SC,29403,8.5,,,, +US-SC-29404,US,SC,29404,8.5,,,, +US-SC-29405,US,SC,29405,8.5,,,, +US-SC-29406,US,SC,29406,8.5,,,, +US-SC-29407,US,SC,29407,8.5,,,, +US-SC-29409,US,SC,29409,8.5,,,, +US-SC-29410,US,SC,29410,8,,,, +US-SC-29412,US,SC,29412,8.5,,,, +US-SC-29413,US,SC,29413,8.5,,,, +US-SC-29414,US,SC,29414,8.5,,,, +US-SC-29415,US,SC,29415,8.5,,,, +US-SC-29416,US,SC,29416,8.5,,,, +US-SC-29417,US,SC,29417,8.5,,,, +US-SC-29418,US,SC,29418,8.5,,,, +US-SC-29419,US,SC,29419,8.5,,,, +US-SC-29420,US,SC,29420,7,,,, +US-SC-29422,US,SC,29422,8.5,,,, +US-SC-29423,US,SC,29423,8.5,,,, +US-SC-29424,US,SC,29424,8.5,,,, +US-SC-29425,US,SC,29425,8.5,,,, +US-SC-29426,US,SC,29426,8.5,,,, +US-SC-29429,US,SC,29429,8.5,,,, +US-SC-29430,US,SC,29430,8,,,, +US-SC-29431,US,SC,29431,8,,,, +US-SC-29432,US,SC,29432,7,,,, +US-SC-29433,US,SC,29433,7,,,, +US-SC-29434,US,SC,29434,8,,,, +US-SC-29435,US,SC,29435,7,,,, +US-SC-29436,US,SC,29436,8,,,, +US-SC-29437,US,SC,29437,7,,,, +US-SC-29438,US,SC,29438,8.5,,,, +US-SC-29439,US,SC,29439,8.5,,,, +US-SC-29440,US,SC,29440,6,,,, +US-SC-29442,US,SC,29442,6,,,, +US-SC-29445,US,SC,29445,8,,,, +US-SC-29446,US,SC,29446,7,,,, +US-SC-29447,US,SC,29447,7,,,, +US-SC-29448,US,SC,29448,7,,,, +US-SC-29449,US,SC,29449,8.5,,,, +US-SC-29450,US,SC,29450,8,,,, +US-SC-29451,US,SC,29451,8.5,,,, +US-SC-29452,US,SC,29452,7,,,, +US-SC-29453,US,SC,29453,8,,,, +US-SC-29455,US,SC,29455,8.5,,,, +US-SC-29456,US,SC,29456,7,,,, +US-SC-29457,US,SC,29457,8.5,,,, +US-SC-29458,US,SC,29458,8.5,,,, +US-SC-29461,US,SC,29461,8,,,, +US-SC-29464,US,SC,29464,8.5,,,, +US-SC-29465,US,SC,29465,8.5,,,, +US-SC-29466,US,SC,29466,8.5,,,, +US-SC-29468,US,SC,29468,8,,,, +US-SC-29469,US,SC,29469,8,,,, +US-SC-29470,US,SC,29470,8.5,,,, +US-SC-29471,US,SC,29471,7,,,, +US-SC-29472,US,SC,29472,7,,,, +US-SC-29474,US,SC,29474,7,,,, +US-SC-29475,US,SC,29475,7,,,, +US-SC-29476,US,SC,29476,8,,,, +US-SC-29477,US,SC,29477,7,,,, +US-SC-29479,US,SC,29479,8,,,, +US-SC-29481,US,SC,29481,7,,,, +US-SC-29482,US,SC,29482,8.5,,,, +US-SC-29483,US,SC,29483,7,,,, +US-SC-29484,US,SC,29484,7,,,, +US-SC-29485,US,SC,29485,7,,,, +US-SC-29487,US,SC,29487,8.5,,,, +US-SC-29488,US,SC,29488,7,,,, +US-SC-29492,US,SC,29492,8,,,, +US-SC-29493,US,SC,29493,7,,,, +US-SC-29501,US,SC,29501,8,,,, +US-SC-29502,US,SC,29502,8,,,, +US-SC-29503,US,SC,29503,8,,,, +US-SC-29504,US,SC,29504,8,,,, +US-SC-29505,US,SC,29505,8,,,, +US-SC-29506,US,SC,29506,8,,,, +US-SC-29510,US,SC,29510,6,,,, +US-SC-29511,US,SC,29511,8,,,, +US-SC-29512,US,SC,29512,8,,,, +US-SC-29516,US,SC,29516,8,,,, +US-SC-29518,US,SC,29518,7,,,, +US-SC-29519,US,SC,29519,8,,,, +US-SC-29520,US,SC,29520,8,,,, +US-SC-29525,US,SC,29525,8,,,, +US-SC-29526,US,SC,29526,8,,,, +US-SC-29527,US,SC,29527,8,,,, +US-SC-29528,US,SC,29528,8,,,, +US-SC-29530,US,SC,29530,8,,,, +US-SC-29532,US,SC,29532,8,,,, +US-SC-29536,US,SC,29536,8,,,, +US-SC-29540,US,SC,29540,8,,,, +US-SC-29541,US,SC,29541,8,,,, +US-SC-29543,US,SC,29543,8,,,, +US-SC-29544,US,SC,29544,8,,,, +US-SC-29545,US,SC,29545,8,,,, +US-SC-29546,US,SC,29546,8,,,, +US-SC-29547,US,SC,29547,8,,,, +US-SC-29550,US,SC,29550,8,,,, +US-SC-29551,US,SC,29551,8,,,, +US-SC-29554,US,SC,29554,6,,,, +US-SC-29555,US,SC,29555,8,,,, +US-SC-29556,US,SC,29556,7,,,, +US-SC-29560,US,SC,29560,8,,,, +US-SC-29563,US,SC,29563,8,,,, +US-SC-29564,US,SC,29564,7,,,, +US-SC-29565,US,SC,29565,8,,,, +US-SC-29566,US,SC,29566,8,,,, +US-SC-29567,US,SC,29567,8,,,, +US-SC-29568,US,SC,29568,8,,,, +US-SC-29569,US,SC,29569,8,,,, +US-SC-29570,US,SC,29570,8,,,, +US-SC-29571,US,SC,29571,8,,,, +US-SC-29572,US,SC,29572,9,,,, +US-SC-29574,US,SC,29574,8,,,, +US-SC-29575,US,SC,29575,8,,,, +US-SC-29576,US,SC,29576,8,,,, +US-SC-29577,US,SC,29577,9,,,, +US-SC-29578,US,SC,29578,9,,,, +US-SC-29579,US,SC,29579,8,,,, +US-SC-29580,US,SC,29580,7,,,, +US-SC-29581,US,SC,29581,8,,,, +US-SC-29582,US,SC,29582,8,,,, +US-SC-29583,US,SC,29583,8,,,, +US-SC-29584,US,SC,29584,8,,,, +US-SC-29585,US,SC,29585,6,,,, +US-SC-29587,US,SC,29587,8,,,, +US-SC-29588,US,SC,29588,8,,,, +US-SC-29589,US,SC,29589,8,,,, +US-SC-29590,US,SC,29590,7,,,, +US-SC-29591,US,SC,29591,8,,,, +US-SC-29592,US,SC,29592,8,,,, +US-SC-29593,US,SC,29593,8,,,, +US-SC-29594,US,SC,29594,8,,,, +US-SC-29596,US,SC,29596,8,,,, +US-SC-29597,US,SC,29597,8,,,, +US-SC-29598,US,SC,29598,8,,,, +US-SC-29601,US,SC,29601,6,,,, +US-SC-29602,US,SC,29602,6,,,, +US-SC-29603,US,SC,29603,6,,,, +US-SC-29604,US,SC,29604,6,,,, +US-SC-29605,US,SC,29605,6,,,, +US-SC-29606,US,SC,29606,6,,,, +US-SC-29607,US,SC,29607,6,,,, +US-SC-29608,US,SC,29608,6,,,, +US-SC-29609,US,SC,29609,6,,,, +US-SC-29610,US,SC,29610,6,,,, +US-SC-29611,US,SC,29611,6,,,, +US-SC-29612,US,SC,29612,6,,,, +US-SC-29613,US,SC,29613,6,,,, +US-SC-29614,US,SC,29614,6,,,, +US-SC-29615,US,SC,29615,6,,,, +US-SC-29616,US,SC,29616,6,,,, +US-SC-29617,US,SC,29617,6,,,, +US-SC-29620,US,SC,29620,7,,,, +US-SC-29621,US,SC,29621,6,,,, +US-SC-29622,US,SC,29622,6,,,, +US-SC-29623,US,SC,29623,6,,,, +US-SC-29624,US,SC,29624,6,,,, +US-SC-29625,US,SC,29625,6,,,, +US-SC-29626,US,SC,29626,6,,,, +US-SC-29627,US,SC,29627,6,,,, +US-SC-29628,US,SC,29628,7,,,, +US-SC-29630,US,SC,29630,7,,,, +US-SC-29631,US,SC,29631,7,,,, +US-SC-29632,US,SC,29632,7,,,, +US-SC-29633,US,SC,29633,7,,,, +US-SC-29634,US,SC,29634,7,,,, +US-SC-29635,US,SC,29635,6,,,, +US-SC-29636,US,SC,29636,6,,,, +US-SC-29638,US,SC,29638,7,,,, +US-SC-29639,US,SC,29639,7,,,, +US-SC-29640,US,SC,29640,7,,,, +US-SC-29641,US,SC,29641,7,,,, +US-SC-29642,US,SC,29642,7,,,, +US-SC-29643,US,SC,29643,6,,,, +US-SC-29644,US,SC,29644,7,,,, +US-SC-29645,US,SC,29645,7,,,, +US-SC-29646,US,SC,29646,6,,,, +US-SC-29647,US,SC,29647,6,,,, +US-SC-29648,US,SC,29648,6,,,, +US-SC-29649,US,SC,29649,6,,,, +US-SC-29650,US,SC,29650,6,,,, +US-SC-29651,US,SC,29651,6,,,, +US-SC-29652,US,SC,29652,6,,,, +US-SC-29653,US,SC,29653,6,,,, +US-SC-29654,US,SC,29654,6,,,, +US-SC-29655,US,SC,29655,6,,,, +US-SC-29656,US,SC,29656,6,,,, +US-SC-29657,US,SC,29657,7,,,, +US-SC-29658,US,SC,29658,6,,,, +US-SC-29659,US,SC,29659,7,,,, +US-SC-29661,US,SC,29661,6,,,, +US-SC-29662,US,SC,29662,6,,,, +US-SC-29664,US,SC,29664,6,,,, +US-SC-29665,US,SC,29665,6,,,, +US-SC-29666,US,SC,29666,6,,,, +US-SC-29667,US,SC,29667,7,,,, +US-SC-29669,US,SC,29669,6,,,, +US-SC-29670,US,SC,29670,6,,,, +US-SC-29671,US,SC,29671,7,,,, +US-SC-29672,US,SC,29672,6,,,, +US-SC-29673,US,SC,29673,6,,,, +US-SC-29675,US,SC,29675,6,,,, +US-SC-29676,US,SC,29676,6,,,, +US-SC-29677,US,SC,29677,6,,,, +US-SC-29678,US,SC,29678,6,,,, +US-SC-29679,US,SC,29679,6,,,, +US-SC-29680,US,SC,29680,6,,,, +US-SC-29681,US,SC,29681,6,,,, +US-SC-29682,US,SC,29682,7,,,, +US-SC-29683,US,SC,29683,6,,,, +US-SC-29684,US,SC,29684,6,,,, +US-SC-29685,US,SC,29685,7,,,, +US-SC-29686,US,SC,29686,6,,,, +US-SC-29687,US,SC,29687,6,,,, +US-SC-29688,US,SC,29688,6,,,, +US-SC-29689,US,SC,29689,6,,,, +US-SC-29690,US,SC,29690,6,,,, +US-SC-29691,US,SC,29691,6,,,, +US-SC-29692,US,SC,29692,7,,,, +US-SC-29693,US,SC,29693,6,,,, +US-SC-29696,US,SC,29696,6,,,, +US-SC-29697,US,SC,29697,6,,,, +US-SC-29702,US,SC,29702,8,,,, +US-SC-29703,US,SC,29703,7,,,, +US-SC-29704,US,SC,29704,7,,,, +US-SC-29706,US,SC,29706,8,,,, +US-SC-29707,US,SC,29707,8,,,, +US-SC-29708,US,SC,29708,7,,,, +US-SC-29709,US,SC,29709,8,,,, +US-SC-29710,US,SC,29710,7,,,, +US-SC-29712,US,SC,29712,8,,,, +US-SC-29714,US,SC,29714,8,,,, +US-SC-29715,US,SC,29715,7,,,, +US-SC-29716,US,SC,29716,7,,,, +US-SC-29717,US,SC,29717,7,,,, +US-SC-29718,US,SC,29718,8,,,, +US-SC-29720,US,SC,29720,8,,,, +US-SC-29721,US,SC,29721,8,,,, +US-SC-29722,US,SC,29722,8,,,, +US-SC-29724,US,SC,29724,8,,,, +US-SC-29726,US,SC,29726,7,,,, +US-SC-29727,US,SC,29727,8,,,, +US-SC-29728,US,SC,29728,8,,,, +US-SC-29729,US,SC,29729,8,,,, +US-SC-29730,US,SC,29730,7,,,, +US-SC-29731,US,SC,29731,7,,,, +US-SC-29732,US,SC,29732,7,,,, +US-SC-29733,US,SC,29733,7,,,, +US-SC-29734,US,SC,29734,7,,,, +US-SC-29741,US,SC,29741,8,,,, +US-SC-29742,US,SC,29742,7,,,, +US-SC-29743,US,SC,29743,7,,,, +US-SC-29744,US,SC,29744,8,,,, +US-SC-29745,US,SC,29745,7,,,, +US-SC-29801,US,SC,29801,7,,,, +US-SC-29802,US,SC,29802,7,,,, +US-SC-29803,US,SC,29803,7,,,, +US-SC-29804,US,SC,29804,7,,,, +US-SC-29805,US,SC,29805,7,,,, +US-SC-29808,US,SC,29808,7,,,, +US-SC-29809,US,SC,29809,7,,,, +US-SC-29810,US,SC,29810,8,,,, +US-SC-29812,US,SC,29812,7,,,, +US-SC-29813,US,SC,29813,7,,,, +US-SC-29816,US,SC,29816,7,,,, +US-SC-29817,US,SC,29817,7,,,, +US-SC-29819,US,SC,29819,6,,,, +US-SC-29821,US,SC,29821,7,,,, +US-SC-29822,US,SC,29822,7,,,, +US-SC-29824,US,SC,29824,7,,,, +US-SC-29826,US,SC,29826,7,,,, +US-SC-29827,US,SC,29827,8,,,, +US-SC-29828,US,SC,29828,7,,,, +US-SC-29829,US,SC,29829,7,,,, +US-SC-29831,US,SC,29831,7,,,, +US-SC-29832,US,SC,29832,7,,,, +US-SC-29834,US,SC,29834,7,,,, +US-SC-29835,US,SC,29835,7,,,, +US-SC-29836,US,SC,29836,8,,,, +US-SC-29838,US,SC,29838,7,,,, +US-SC-29839,US,SC,29839,7,,,, +US-SC-29840,US,SC,29840,7,,,, +US-SC-29841,US,SC,29841,7,,,, +US-SC-29842,US,SC,29842,7,,,, +US-SC-29843,US,SC,29843,8,,,, +US-SC-29844,US,SC,29844,8,,,, +US-SC-29845,US,SC,29845,7,,,, +US-SC-29846,US,SC,29846,8,,,, +US-SC-29847,US,SC,29847,7,,,, +US-SC-29848,US,SC,29848,7,,,, +US-SC-29849,US,SC,29849,8,,,, +US-SC-29850,US,SC,29850,7,,,, +US-SC-29851,US,SC,29851,7,,,, +US-SC-29853,US,SC,29853,7,,,, +US-SC-29856,US,SC,29856,7,,,, +US-SC-29860,US,SC,29860,7,,,, +US-SC-29861,US,SC,29861,7,,,, +US-SC-29899,US,SC,29899,8,,,, +US-SC-29901,US,SC,29901,6,,,, +US-SC-29902,US,SC,29902,6,,,, +US-SC-29903,US,SC,29903,6,,,, +US-SC-29904,US,SC,29904,6,,,, +US-SC-29905,US,SC,29905,6,,,, +US-SC-29906,US,SC,29906,6,,,, +US-SC-29907,US,SC,29907,6,,,, +US-SC-29909,US,SC,29909,6,,,, +US-SC-29910,US,SC,29910,6,,,, +US-SC-29911,US,SC,29911,8,,,, +US-SC-29912,US,SC,29912,8,,,, +US-SC-29913,US,SC,29913,8,,,, +US-SC-29914,US,SC,29914,6,,,, +US-SC-29915,US,SC,29915,6,,,, +US-SC-29916,US,SC,29916,8,,,, +US-SC-29918,US,SC,29918,8,,,, +US-SC-29920,US,SC,29920,6,,,, +US-SC-29921,US,SC,29921,8,,,, +US-SC-29922,US,SC,29922,8,,,, +US-SC-29923,US,SC,29923,8,,,, +US-SC-29924,US,SC,29924,8,,,, +US-SC-29925,US,SC,29925,6,,,, +US-SC-29926,US,SC,29926,6,,,, +US-SC-29927,US,SC,29927,8,,,, +US-SC-29928,US,SC,29928,6,,,, +US-SC-29929,US,SC,29929,7,,,, +US-SC-29931,US,SC,29931,6,,,, +US-SC-29932,US,SC,29932,8,,,, +US-SC-29933,US,SC,29933,8,,,, +US-SC-29934,US,SC,29934,8,,,, +US-SC-29935,US,SC,29935,6,,,, +US-SC-29936,US,SC,29936,8,,,, +US-SC-29938,US,SC,29938,6,,,, +US-SC-29939,US,SC,29939,8,,,, +US-SC-29940,US,SC,29940,6,,,, +US-SC-29941,US,SC,29941,6,,,, +US-SC-29943,US,SC,29943,8,,,, +US-SC-29944,US,SC,29944,8,,,, +US-SC-29945,US,SC,29945,7,,,, +US-SD-57001,US,SD,57001,4,,,, +US-SD-57002,US,SD,57002,4,,,, +US-SD-57003,US,SD,57003,4,,,, +US-SD-57004,US,SD,57004,6,,,, +US-SD-57005,US,SD,57005,6,,,, +US-SD-57006,US,SD,57006,6,,,, +US-SD-57007,US,SD,57007,6,,,, +US-SD-57010,US,SD,57010,4,,,, +US-SD-57012,US,SD,57012,4,,,, +US-SD-57013,US,SD,57013,6,,,, +US-SD-57014,US,SD,57014,4,,,, +US-SD-57015,US,SD,57015,4,,,, +US-SD-57016,US,SD,57016,4,,,, +US-SD-57017,US,SD,57017,4,,,, +US-SD-57018,US,SD,57018,4,,,, +US-SD-57020,US,SD,57020,6,,,, +US-SD-57021,US,SD,57021,4,,,, +US-SD-57022,US,SD,57022,6,,,, +US-SD-57024,US,SD,57024,6,,,, +US-SD-57025,US,SD,57025,6,,,, +US-SD-57026,US,SD,57026,4,,,, +US-SD-57027,US,SD,57027,4,,,, +US-SD-57028,US,SD,57028,6,,,, +US-SD-57029,US,SD,57029,6,,,, +US-SD-57030,US,SD,57030,4,,,, +US-SD-57031,US,SD,57031,4,,,, +US-SD-57032,US,SD,57032,6,,,, +US-SD-57033,US,SD,57033,6,,,, +US-SD-57034,US,SD,57034,4,,,, +US-SD-57035,US,SD,57035,6,,,, +US-SD-57036,US,SD,57036,4,,,, +US-SD-57037,US,SD,57037,4,,,, +US-SD-57038,US,SD,57038,4,,,, +US-SD-57039,US,SD,57039,6,,,, +US-SD-57040,US,SD,57040,4,,,, +US-SD-57041,US,SD,57041,4,,,, +US-SD-57042,US,SD,57042,6,,,, +US-SD-57043,US,SD,57043,4,,,, +US-SD-57045,US,SD,57045,4,,,, +US-SD-57046,US,SD,57046,4,,,, +US-SD-57047,US,SD,57047,6,,,, +US-SD-57048,US,SD,57048,4,,,, +US-SD-57049,US,SD,57049,6,,,, +US-SD-57050,US,SD,57050,4,,,, +US-SD-57051,US,SD,57051,4,,,, +US-SD-57052,US,SD,57052,4,,,, +US-SD-57053,US,SD,57053,4,,,, +US-SD-57054,US,SD,57054,4,,,, +US-SD-57055,US,SD,57055,4,,,, +US-SD-57057,US,SD,57057,4,,,, +US-SD-57058,US,SD,57058,6,,,, +US-SD-57059,US,SD,57059,6,,,, +US-SD-57061,US,SD,57061,4,,,, +US-SD-57062,US,SD,57062,6,,,, +US-SD-57063,US,SD,57063,4,,,, +US-SD-57064,US,SD,57064,6,,,, +US-SD-57065,US,SD,57065,4,,,, +US-SD-57066,US,SD,57066,6,,,, +US-SD-57067,US,SD,57067,4,,,, +US-SD-57068,US,SD,57068,6,,,, +US-SD-57069,US,SD,57069,6,,,, +US-SD-57070,US,SD,57070,4,,,, +US-SD-57071,US,SD,57071,6,,,, +US-SD-57072,US,SD,57072,4,,,, +US-SD-57073,US,SD,57073,4,,,, +US-SD-57075,US,SD,57075,4,,,, +US-SD-57076,US,SD,57076,4,,,, +US-SD-57077,US,SD,57077,4,,,, +US-SD-57078,US,SD,57078,6,,,, +US-SD-57101,US,SD,57101,6,,,, +US-SD-57103,US,SD,57103,6,,,, +US-SD-57104,US,SD,57104,6,,,, +US-SD-57105,US,SD,57105,6,,,, +US-SD-57106,US,SD,57106,6,,,, +US-SD-57107,US,SD,57107,6,,,, +US-SD-57108,US,SD,57108,6,,,, +US-SD-57109,US,SD,57109,6,,,, +US-SD-57110,US,SD,57110,6,,,, +US-SD-57117,US,SD,57117,6,,,, +US-SD-57118,US,SD,57118,6,,,, +US-SD-57186,US,SD,57186,6,,,, +US-SD-57193,US,SD,57193,6,,,, +US-SD-57197,US,SD,57197,6,,,, +US-SD-57198,US,SD,57198,6,,,, +US-SD-57201,US,SD,57201,6,,,, +US-SD-57212,US,SD,57212,4,,,, +US-SD-57213,US,SD,57213,4,,,, +US-SD-57214,US,SD,57214,6,,,, +US-SD-57216,US,SD,57216,6,,,, +US-SD-57217,US,SD,57217,4,,,, +US-SD-57218,US,SD,57218,4,,,, +US-SD-57219,US,SD,57219,4,,,, +US-SD-57220,US,SD,57220,4,,,, +US-SD-57221,US,SD,57221,4,,,, +US-SD-57223,US,SD,57223,4,,,, +US-SD-57224,US,SD,57224,4,,,, +US-SD-57225,US,SD,57225,6,,,, +US-SD-57226,US,SD,57226,4,,,, +US-SD-57227,US,SD,57227,4,,,, +US-SD-57231,US,SD,57231,6,,,, +US-SD-57232,US,SD,57232,4,,,, +US-SD-57233,US,SD,57233,4,,,, +US-SD-57234,US,SD,57234,6,,,, +US-SD-57235,US,SD,57235,4,,,, +US-SD-57236,US,SD,57236,4,,,, +US-SD-57237,US,SD,57237,4,,,, +US-SD-57238,US,SD,57238,4,,,, +US-SD-57239,US,SD,57239,4,,,, +US-SD-57241,US,SD,57241,4,,,, +US-SD-57242,US,SD,57242,4,,,, +US-SD-57243,US,SD,57243,4,,,, +US-SD-57245,US,SD,57245,6,,,, +US-SD-57246,US,SD,57246,4,,,, +US-SD-57247,US,SD,57247,4,,,, +US-SD-57248,US,SD,57248,4,,,, +US-SD-57249,US,SD,57249,6,,,, +US-SD-57251,US,SD,57251,4,,,, +US-SD-57252,US,SD,57252,6,,,, +US-SD-57255,US,SD,57255,4,,,, +US-SD-57256,US,SD,57256,4,,,, +US-SD-57257,US,SD,57257,4,,,, +US-SD-57258,US,SD,57258,4,,,, +US-SD-57259,US,SD,57259,5,,,, +US-SD-57260,US,SD,57260,4,,,, +US-SD-57261,US,SD,57261,4,,,, +US-SD-57262,US,SD,57262,6,,,, +US-SD-57263,US,SD,57263,4,,,, +US-SD-57264,US,SD,57264,4,,,, +US-SD-57265,US,SD,57265,4,,,, +US-SD-57266,US,SD,57266,4,,,, +US-SD-57268,US,SD,57268,4,,,, +US-SD-57269,US,SD,57269,4,,,, +US-SD-57270,US,SD,57270,4,,,, +US-SD-57271,US,SD,57271,4,,,, +US-SD-57272,US,SD,57272,4,,,, +US-SD-57273,US,SD,57273,4,,,, +US-SD-57274,US,SD,57274,6,,,, +US-SD-57276,US,SD,57276,4,,,, +US-SD-57278,US,SD,57278,4,,,, +US-SD-57279,US,SD,57279,4,,,, +US-SD-57301,US,SD,57301,6,,,, +US-SD-57311,US,SD,57311,4,,,, +US-SD-57312,US,SD,57312,4,,,, +US-SD-57313,US,SD,57313,4,,,, +US-SD-57314,US,SD,57314,4,,,, +US-SD-57315,US,SD,57315,4,,,, +US-SD-57317,US,SD,57317,4,,,, +US-SD-57319,US,SD,57319,4,,,, +US-SD-57321,US,SD,57321,4,,,, +US-SD-57322,US,SD,57322,4,,,, +US-SD-57323,US,SD,57323,6,,,, +US-SD-57324,US,SD,57324,4,,,, +US-SD-57325,US,SD,57325,6,,,, +US-SD-57326,US,SD,57326,6,,,, +US-SD-57328,US,SD,57328,4,,,, +US-SD-57329,US,SD,57329,4,,,, +US-SD-57330,US,SD,57330,4,,,, +US-SD-57331,US,SD,57331,4,,,, +US-SD-57332,US,SD,57332,4,,,, +US-SD-57334,US,SD,57334,4,,,, +US-SD-57335,US,SD,57335,4,,,, +US-SD-57337,US,SD,57337,4,,,, +US-SD-57339,US,SD,57339,4,,,, +US-SD-57340,US,SD,57340,4,,,, +US-SD-57341,US,SD,57341,4,,,, +US-SD-57342,US,SD,57342,4,,,, +US-SD-57344,US,SD,57344,4,,,, +US-SD-57345,US,SD,57345,4,,,, +US-SD-57346,US,SD,57346,6,,,, +US-SD-57348,US,SD,57348,4,,,, +US-SD-57349,US,SD,57349,4,,,, +US-SD-57350,US,SD,57350,6,,,, +US-SD-57353,US,SD,57353,4,,,, +US-SD-57354,US,SD,57354,4,,,, +US-SD-57355,US,SD,57355,4,,,, +US-SD-57356,US,SD,57356,4,,,, +US-SD-57358,US,SD,57358,6,,,, +US-SD-57359,US,SD,57359,4,,,, +US-SD-57361,US,SD,57361,6,,,, +US-SD-57362,US,SD,57362,6,,,, +US-SD-57363,US,SD,57363,4,,,, +US-SD-57364,US,SD,57364,4,,,, +US-SD-57365,US,SD,57365,6,,,, +US-SD-57366,US,SD,57366,6,,,, +US-SD-57367,US,SD,57367,6,,,, +US-SD-57368,US,SD,57368,4,,,, +US-SD-57369,US,SD,57369,4,,,, +US-SD-57370,US,SD,57370,4,,,, +US-SD-57371,US,SD,57371,4,,,, +US-SD-57373,US,SD,57373,4,,,, +US-SD-57374,US,SD,57374,4,,,, +US-SD-57375,US,SD,57375,4,,,, +US-SD-57376,US,SD,57376,4,,,, +US-SD-57379,US,SD,57379,4,,,, +US-SD-57380,US,SD,57380,4,,,, +US-SD-57381,US,SD,57381,4,,,, +US-SD-57382,US,SD,57382,6,,,, +US-SD-57383,US,SD,57383,4,,,, +US-SD-57384,US,SD,57384,4,,,, +US-SD-57385,US,SD,57385,4,,,, +US-SD-57386,US,SD,57386,5,,,, +US-SD-57399,US,SD,57399,6,,,, +US-SD-57401,US,SD,57401,6,,,, +US-SD-57402,US,SD,57402,6,,,, +US-SD-57420,US,SD,57420,6,,,, +US-SD-57421,US,SD,57421,4,,,, +US-SD-57422,US,SD,57422,4,,,, +US-SD-57424,US,SD,57424,4,,,, +US-SD-57426,US,SD,57426,4,,,, +US-SD-57427,US,SD,57427,4,,,, +US-SD-57428,US,SD,57428,4,,,, +US-SD-57429,US,SD,57429,4,,,, +US-SD-57430,US,SD,57430,4,,,, +US-SD-57432,US,SD,57432,4,,,, +US-SD-57433,US,SD,57433,4,,,, +US-SD-57434,US,SD,57434,4,,,, +US-SD-57435,US,SD,57435,4,,,, +US-SD-57436,US,SD,57436,4,,,, +US-SD-57437,US,SD,57437,4,,,, +US-SD-57438,US,SD,57438,6,,,, +US-SD-57439,US,SD,57439,6,,,, +US-SD-57440,US,SD,57440,4,,,, +US-SD-57441,US,SD,57441,4,,,, +US-SD-57442,US,SD,57442,6,,,, +US-SD-57445,US,SD,57445,6,,,, +US-SD-57446,US,SD,57446,4,,,, +US-SD-57448,US,SD,57448,6,,,, +US-SD-57449,US,SD,57449,4,,,, +US-SD-57450,US,SD,57450,4,,,, +US-SD-57451,US,SD,57451,4,,,, +US-SD-57452,US,SD,57452,4,,,, +US-SD-57454,US,SD,57454,4,,,, +US-SD-57455,US,SD,57455,4,,,, +US-SD-57456,US,SD,57456,4,,,, +US-SD-57457,US,SD,57457,4,,,, +US-SD-57460,US,SD,57460,4,,,, +US-SD-57461,US,SD,57461,4,,,, +US-SD-57465,US,SD,57465,4,,,, +US-SD-57466,US,SD,57466,4,,,, +US-SD-57467,US,SD,57467,4,,,, +US-SD-57468,US,SD,57468,4,,,, +US-SD-57469,US,SD,57469,6,,,, +US-SD-57470,US,SD,57470,4,,,, +US-SD-57471,US,SD,57471,4,,,, +US-SD-57472,US,SD,57472,4,,,, +US-SD-57473,US,SD,57473,4,,,, +US-SD-57474,US,SD,57474,4,,,, +US-SD-57475,US,SD,57475,4,,,, +US-SD-57476,US,SD,57476,4,,,, +US-SD-57477,US,SD,57477,4,,,, +US-SD-57479,US,SD,57479,4,,,, +US-SD-57481,US,SD,57481,4,,,, +US-SD-57501,US,SD,57501,6,,,, +US-SD-57520,US,SD,57520,4,,,, +US-SD-57521,US,SD,57521,6,,,, +US-SD-57522,US,SD,57522,5,,,, +US-SD-57523,US,SD,57523,6,,,, +US-SD-57528,US,SD,57528,4,,,, +US-SD-57529,US,SD,57529,4,,,, +US-SD-57531,US,SD,57531,4,,,, +US-SD-57532,US,SD,57532,6,,,, +US-SD-57533,US,SD,57533,6,,,, +US-SD-57534,US,SD,57534,4,,,, +US-SD-57536,US,SD,57536,4,,,, +US-SD-57537,US,SD,57537,4,,,, +US-SD-57538,US,SD,57538,4,,,, +US-SD-57540,US,SD,57540,4,,,, +US-SD-57541,US,SD,57541,4,,,, +US-SD-57543,US,SD,57543,6,,,, +US-SD-57544,US,SD,57544,6,,,, +US-SD-57547,US,SD,57547,4,,,, +US-SD-57548,US,SD,57548,4,,,, +US-SD-57551,US,SD,57551,4,,,, +US-SD-57552,US,SD,57552,4,,,, +US-SD-57553,US,SD,57553,4,,,, +US-SD-57555,US,SD,57555,6,,,, +US-SD-57559,US,SD,57559,6,,,, +US-SD-57560,US,SD,57560,4,,,, +US-SD-57562,US,SD,57562,4,,,, +US-SD-57563,US,SD,57563,4,,,, +US-SD-57564,US,SD,57564,4,,,, +US-SD-57566,US,SD,57566,4,,,, +US-SD-57567,US,SD,57567,4,,,, +US-SD-57568,US,SD,57568,4,,,, +US-SD-57569,US,SD,57569,4,,,, +US-SD-57570,US,SD,57570,4,,,, +US-SD-57571,US,SD,57571,4,,,, +US-SD-57572,US,SD,57572,4,,,, +US-SD-57574,US,SD,57574,4,,,, +US-SD-57576,US,SD,57576,4,,,, +US-SD-57577,US,SD,57577,4,,,, +US-SD-57579,US,SD,57579,6,,,, +US-SD-57580,US,SD,57580,6,,,, +US-SD-57584,US,SD,57584,4,,,, +US-SD-57585,US,SD,57585,4,,,, +US-SD-57601,US,SD,57601,6,,,, +US-SD-57620,US,SD,57620,4,,,, +US-SD-57621,US,SD,57621,4,,,, +US-SD-57622,US,SD,57622,4,,,, +US-SD-57623,US,SD,57623,5,,,, +US-SD-57625,US,SD,57625,6,,,, +US-SD-57626,US,SD,57626,4,,,, +US-SD-57630,US,SD,57630,4,,,, +US-SD-57631,US,SD,57631,4,,,, +US-SD-57632,US,SD,57632,4,,,, +US-SD-57633,US,SD,57633,6,,,, +US-SD-57634,US,SD,57634,4,,,, +US-SD-57636,US,SD,57636,4,,,, +US-SD-57638,US,SD,57638,6,,,, +US-SD-57639,US,SD,57639,4,,,, +US-SD-57640,US,SD,57640,4,,,, +US-SD-57641,US,SD,57641,4,,,, +US-SD-57642,US,SD,57642,5,,,, +US-SD-57644,US,SD,57644,4,,,, +US-SD-57645,US,SD,57645,4,,,, +US-SD-57646,US,SD,57646,4,,,, +US-SD-57648,US,SD,57648,4,,,, +US-SD-57649,US,SD,57649,4,,,, +US-SD-57650,US,SD,57650,4,,,, +US-SD-57651,US,SD,57651,4,,,, +US-SD-57652,US,SD,57652,4,,,, +US-SD-57656,US,SD,57656,6,,,, +US-SD-57657,US,SD,57657,4,,,, +US-SD-57658,US,SD,57658,4,,,, +US-SD-57659,US,SD,57659,4,,,, +US-SD-57660,US,SD,57660,4,,,, +US-SD-57661,US,SD,57661,4,,,, +US-SD-57701,US,SD,57701,6,,,, +US-SD-57702,US,SD,57702,6,,,, +US-SD-57703,US,SD,57703,4,,,, +US-SD-57706,US,SD,57706,4,,,, +US-SD-57709,US,SD,57709,6,,,, +US-SD-57714,US,SD,57714,4,,,, +US-SD-57716,US,SD,57716,4,,,, +US-SD-57717,US,SD,57717,6,,,, +US-SD-57718,US,SD,57718,4,,,, +US-SD-57719,US,SD,57719,6,,,, +US-SD-57720,US,SD,57720,4,,,, +US-SD-57722,US,SD,57722,4,,,, +US-SD-57724,US,SD,57724,5,,,, +US-SD-57725,US,SD,57725,4,,,, +US-SD-57730,US,SD,57730,6,,,, +US-SD-57732,US,SD,57732,6,,,, +US-SD-57735,US,SD,57735,4,,,, +US-SD-57737,US,SD,57737,4,,,, +US-SD-57738,US,SD,57738,4,,,, +US-SD-57741,US,SD,57741,4,,,, +US-SD-57744,US,SD,57744,4,,,, +US-SD-57745,US,SD,57745,4,,,, +US-SD-57747,US,SD,57747,6,,,, +US-SD-57748,US,SD,57748,4,,,, +US-SD-57750,US,SD,57750,4,,,, +US-SD-57751,US,SD,57751,6,,,, +US-SD-57752,US,SD,57752,4,,,, +US-SD-57754,US,SD,57754,6,,,, +US-SD-57755,US,SD,57755,4,,,, +US-SD-57756,US,SD,57756,6,,,, +US-SD-57758,US,SD,57758,4,,,, +US-SD-57759,US,SD,57759,4,,,, +US-SD-57760,US,SD,57760,4,,,, +US-SD-57761,US,SD,57761,4,,,, +US-SD-57762,US,SD,57762,4,,,, +US-SD-57763,US,SD,57763,4,,,, +US-SD-57764,US,SD,57764,4,,,, +US-SD-57766,US,SD,57766,4,,,, +US-SD-57767,US,SD,57767,4,,,, +US-SD-57769,US,SD,57769,4,,,, +US-SD-57770,US,SD,57770,4,,,, +US-SD-57772,US,SD,57772,4,,,, +US-SD-57773,US,SD,57773,6,,,, +US-SD-57775,US,SD,57775,4,,,, +US-SD-57776,US,SD,57776,4,,,, +US-SD-57779,US,SD,57779,4,,,, +US-SD-57780,US,SD,57780,4,,,, +US-SD-57782,US,SD,57782,4,,,, +US-SD-57783,US,SD,57783,6,,,, +US-SD-57785,US,SD,57785,6,,,, +US-SD-57787,US,SD,57787,4,,,, +US-SD-57788,US,SD,57788,4,,,, +US-SD-57790,US,SD,57790,4,,,, +US-SD-57791,US,SD,57791,4,,,, +US-SD-57792,US,SD,57792,4,,,, +US-SD-57793,US,SD,57793,6,,,, +US-SD-57794,US,SD,57794,4,,,, +US-SD-57799,US,SD,57799,6,,,, +US-TN-37010,US,TN,37010,9.75,,,, +US-TN-37011,US,TN,37011,9.25,,,, +US-TN-37012,US,TN,37012,9.75,,,, +US-TN-37013,US,TN,37013,9.25,,,, +US-TN-37014,US,TN,37014,9.25,,,, +US-TN-37015,US,TN,37015,9.25,,,, +US-TN-37016,US,TN,37016,8.75,,,, +US-TN-37018,US,TN,37018,9.75,,,, +US-TN-37019,US,TN,37019,9.25,,,, +US-TN-37020,US,TN,37020,9.75,,,, +US-TN-37022,US,TN,37022,9.25,,,, +US-TN-37023,US,TN,37023,9.25,,,, +US-TN-37024,US,TN,37024,9.25,,,, +US-TN-37025,US,TN,37025,9.75,,,, +US-TN-37026,US,TN,37026,8.75,,,, +US-TN-37027,US,TN,37027,9.25,,,, +US-TN-37028,US,TN,37028,9.25,,,, +US-TN-37029,US,TN,37029,9.75,,,, +US-TN-37030,US,TN,37030,9.75,,,, +US-TN-37031,US,TN,37031,9.25,,,, +US-TN-37032,US,TN,37032,9.75,,,, +US-TN-37033,US,TN,37033,9.75,,,, +US-TN-37034,US,TN,37034,9.25,,,, +US-TN-37035,US,TN,37035,9.25,,,, +US-TN-37036,US,TN,37036,9.75,,,, +US-TN-37037,US,TN,37037,9.75,,,, +US-TN-37040,US,TN,37040,9.5,,,, +US-TN-37041,US,TN,37041,9.5,,,, +US-TN-37042,US,TN,37042,9.5,,,, +US-TN-37043,US,TN,37043,9.5,,,, +US-TN-37044,US,TN,37044,9.5,,,, +US-TN-37046,US,TN,37046,9.25,,,, +US-TN-37047,US,TN,37047,9.25,,,, +US-TN-37048,US,TN,37048,9.25,,,, +US-TN-37049,US,TN,37049,9.75,,,, +US-TN-37050,US,TN,37050,9.25,,,, +US-TN-37051,US,TN,37051,9.75,,,, +US-TN-37052,US,TN,37052,9.5,,,, +US-TN-37055,US,TN,37055,9.75,,,, +US-TN-37056,US,TN,37056,9.75,,,, +US-TN-37057,US,TN,37057,9.25,,,, +US-TN-37058,US,TN,37058,9.25,,,, +US-TN-37059,US,TN,37059,9.75,,,, +US-TN-37060,US,TN,37060,9.75,,,, +US-TN-37061,US,TN,37061,9.75,,,, +US-TN-37062,US,TN,37062,9.75,,,, +US-TN-37063,US,TN,37063,9.75,,,, +US-TN-37064,US,TN,37064,9.25,,,, +US-TN-37065,US,TN,37065,9.25,,,, +US-TN-37066,US,TN,37066,9.25,,,, +US-TN-37067,US,TN,37067,9.25,,,, +US-TN-37068,US,TN,37068,9.25,,,, +US-TN-37069,US,TN,37069,9.25,,,, +US-TN-37070,US,TN,37070,9.25,,,, +US-TN-37071,US,TN,37071,9.25,,,, +US-TN-37072,US,TN,37072,9.25,,,, +US-TN-37073,US,TN,37073,9.75,,,, +US-TN-37074,US,TN,37074,9.25,,,, +US-TN-37075,US,TN,37075,9.25,,,, +US-TN-37076,US,TN,37076,9.25,,,, +US-TN-37077,US,TN,37077,9.25,,,, +US-TN-37078,US,TN,37078,9.75,,,, +US-TN-37079,US,TN,37079,9.25,,,, +US-TN-37080,US,TN,37080,9.25,,,, +US-TN-37082,US,TN,37082,9.25,,,, +US-TN-37083,US,TN,37083,9.25,,,, +US-TN-37085,US,TN,37085,9.75,,,, +US-TN-37086,US,TN,37086,9.75,,,, +US-TN-37087,US,TN,37087,9.25,,,, +US-TN-37088,US,TN,37088,9.25,,,, +US-TN-37089,US,TN,37089,9.75,,,, +US-TN-37090,US,TN,37090,9.25,,,, +US-TN-37091,US,TN,37091,9.25,,,, +US-TN-37095,US,TN,37095,9.75,,,, +US-TN-37096,US,TN,37096,9.5,,,, +US-TN-37097,US,TN,37097,9.5,,,, +US-TN-37098,US,TN,37098,9.75,,,, +US-TN-37101,US,TN,37101,9.75,,,, +US-TN-37110,US,TN,37110,9.75,,,, +US-TN-37111,US,TN,37111,9.75,,,, +US-TN-37115,US,TN,37115,9.25,,,, +US-TN-37116,US,TN,37116,9.25,,,, +US-TN-37118,US,TN,37118,9.75,,,, +US-TN-37119,US,TN,37119,9.25,,,, +US-TN-37121,US,TN,37121,9.25,,,, +US-TN-37122,US,TN,37122,9.25,,,, +US-TN-37127,US,TN,37127,9.75,,,, +US-TN-37128,US,TN,37128,9.75,,,, +US-TN-37129,US,TN,37129,9.75,,,, +US-TN-37130,US,TN,37130,9.75,,,, +US-TN-37131,US,TN,37131,9.75,,,, +US-TN-37132,US,TN,37132,9.75,,,, +US-TN-37133,US,TN,37133,9.75,,,, +US-TN-37134,US,TN,37134,9.75,,,, +US-TN-37135,US,TN,37135,9.25,,,, +US-TN-37136,US,TN,37136,9.25,,,, +US-TN-37137,US,TN,37137,9.75,,,, +US-TN-37138,US,TN,37138,9.25,,,, +US-TN-37140,US,TN,37140,9.75,,,, +US-TN-37141,US,TN,37141,9.75,,,, +US-TN-37142,US,TN,37142,9.5,,,, +US-TN-37143,US,TN,37143,9.75,,,, +US-TN-37144,US,TN,37144,9.5,,,, +US-TN-37145,US,TN,37145,9.75,,,, +US-TN-37146,US,TN,37146,9.25,,,, +US-TN-37148,US,TN,37148,9.25,,,, +US-TN-37149,US,TN,37149,9.75,,,, +US-TN-37150,US,TN,37150,9.25,,,, +US-TN-37151,US,TN,37151,9.75,,,, +US-TN-37152,US,TN,37152,9.75,,,, +US-TN-37153,US,TN,37153,9.75,,,, +US-TN-37160,US,TN,37160,9.75,,,, +US-TN-37161,US,TN,37161,9.75,,,, +US-TN-37162,US,TN,37162,9.75,,,, +US-TN-37165,US,TN,37165,9.75,,,, +US-TN-37166,US,TN,37166,9.75,,,, +US-TN-37167,US,TN,37167,9.75,,,, +US-TN-37171,US,TN,37171,9.5,,,, +US-TN-37172,US,TN,37172,9.75,,,, +US-TN-37174,US,TN,37174,9.25,,,, +US-TN-37175,US,TN,37175,9.75,,,, +US-TN-37178,US,TN,37178,9.75,,,, +US-TN-37179,US,TN,37179,9.25,,,, +US-TN-37180,US,TN,37180,9.75,,,, +US-TN-37181,US,TN,37181,9.75,,,, +US-TN-37183,US,TN,37183,9.75,,,, +US-TN-37184,US,TN,37184,9.25,,,, +US-TN-37185,US,TN,37185,9.75,,,, +US-TN-37186,US,TN,37186,9.25,,,, +US-TN-37187,US,TN,37187,9.75,,,, +US-TN-37188,US,TN,37188,9.75,,,, +US-TN-37189,US,TN,37189,9.25,,,, +US-TN-37190,US,TN,37190,8.75,,,, +US-TN-37191,US,TN,37191,9.5,,,, +US-TN-37201,US,TN,37201,9.25,,,, +US-TN-37202,US,TN,37202,9.25,,,, +US-TN-37203,US,TN,37203,9.25,,,, +US-TN-37204,US,TN,37204,9.25,,,, +US-TN-37205,US,TN,37205,9.25,,,, +US-TN-37206,US,TN,37206,9.25,,,, +US-TN-37207,US,TN,37207,9.25,,,, +US-TN-37208,US,TN,37208,9.25,,,, +US-TN-37209,US,TN,37209,9.25,,,, +US-TN-37210,US,TN,37210,9.25,,,, +US-TN-37211,US,TN,37211,9.25,,,, +US-TN-37212,US,TN,37212,9.25,,,, +US-TN-37213,US,TN,37213,9.25,,,, +US-TN-37214,US,TN,37214,9.25,,,, +US-TN-37215,US,TN,37215,9.25,,,, +US-TN-37216,US,TN,37216,9.25,,,, +US-TN-37217,US,TN,37217,9.25,,,, +US-TN-37218,US,TN,37218,9.25,,,, +US-TN-37219,US,TN,37219,9.25,,,, +US-TN-37220,US,TN,37220,9.25,,,, +US-TN-37221,US,TN,37221,9.25,,,, +US-TN-37222,US,TN,37222,9.25,,,, +US-TN-37224,US,TN,37224,9.25,,,, +US-TN-37227,US,TN,37227,9.25,,,, +US-TN-37228,US,TN,37228,9.25,,,, +US-TN-37229,US,TN,37229,9.25,,,, +US-TN-37230,US,TN,37230,9.25,,,, +US-TN-37232,US,TN,37232,9.25,,,, +US-TN-37234,US,TN,37234,9.25,,,, +US-TN-37235,US,TN,37235,9.25,,,, +US-TN-37236,US,TN,37236,9.25,,,, +US-TN-37238,US,TN,37238,9.25,,,, +US-TN-37240,US,TN,37240,9.25,,,, +US-TN-37241,US,TN,37241,9.25,,,, +US-TN-37242,US,TN,37242,9.25,,,, +US-TN-37243,US,TN,37243,9.25,,,, +US-TN-37244,US,TN,37244,9.25,,,, +US-TN-37246,US,TN,37246,9.25,,,, +US-TN-37250,US,TN,37250,9.25,,,, +US-TN-37301,US,TN,37301,9.25,,,, +US-TN-37302,US,TN,37302,9.25,,,, +US-TN-37303,US,TN,37303,9,,,, +US-TN-37304,US,TN,37304,9.25,,,, +US-TN-37305,US,TN,37305,9.25,,,, +US-TN-37306,US,TN,37306,9.25,,,, +US-TN-37307,US,TN,37307,9.25,,,, +US-TN-37308,US,TN,37308,9.25,,,, +US-TN-37309,US,TN,37309,9,,,, +US-TN-37310,US,TN,37310,9.75,,,, +US-TN-37311,US,TN,37311,9.75,,,, +US-TN-37312,US,TN,37312,9.75,,,, +US-TN-37313,US,TN,37313,9.25,,,, +US-TN-37314,US,TN,37314,9.25,,,, +US-TN-37315,US,TN,37315,9.25,,,, +US-TN-37317,US,TN,37317,9.25,,,, +US-TN-37318,US,TN,37318,9.25,,,, +US-TN-37320,US,TN,37320,9.75,,,, +US-TN-37321,US,TN,37321,9.75,,,, +US-TN-37322,US,TN,37322,9,,,, +US-TN-37323,US,TN,37323,9.75,,,, +US-TN-37324,US,TN,37324,9.25,,,, +US-TN-37325,US,TN,37325,9.25,,,, +US-TN-37326,US,TN,37326,9.25,,,, +US-TN-37327,US,TN,37327,9.25,,,, +US-TN-37328,US,TN,37328,9.5,,,, +US-TN-37329,US,TN,37329,9,,,, +US-TN-37330,US,TN,37330,9.25,,,, +US-TN-37331,US,TN,37331,9,,,, +US-TN-37332,US,TN,37332,9.75,,,, +US-TN-37333,US,TN,37333,9.25,,,, +US-TN-37334,US,TN,37334,9.5,,,, +US-TN-37335,US,TN,37335,9.5,,,, +US-TN-37336,US,TN,37336,9.75,,,, +US-TN-37337,US,TN,37337,9.75,,,, +US-TN-37338,US,TN,37338,9.75,,,, +US-TN-37339,US,TN,37339,9.25,,,, +US-TN-37340,US,TN,37340,9.75,,,, +US-TN-37341,US,TN,37341,9.25,,,, +US-TN-37342,US,TN,37342,9.75,,,, +US-TN-37343,US,TN,37343,9.25,,,, +US-TN-37345,US,TN,37345,9.25,,,, +US-TN-37347,US,TN,37347,9.75,,,, +US-TN-37348,US,TN,37348,9.5,,,, +US-TN-37349,US,TN,37349,9.75,,,, +US-TN-37350,US,TN,37350,9.25,,,, +US-TN-37351,US,TN,37351,9.25,,,, +US-TN-37352,US,TN,37352,9.5,,,, +US-TN-37353,US,TN,37353,9.75,,,, +US-TN-37354,US,TN,37354,9.25,,,, +US-TN-37355,US,TN,37355,9.75,,,, +US-TN-37356,US,TN,37356,9.75,,,, +US-TN-37357,US,TN,37357,9.75,,,, +US-TN-37359,US,TN,37359,9.5,,,, +US-TN-37360,US,TN,37360,9.75,,,, +US-TN-37361,US,TN,37361,9.25,,,, +US-TN-37362,US,TN,37362,9.25,,,, +US-TN-37363,US,TN,37363,9.25,,,, +US-TN-37364,US,TN,37364,9.75,,,, +US-TN-37365,US,TN,37365,9.25,,,, +US-TN-37366,US,TN,37366,9.25,,,, +US-TN-37367,US,TN,37367,9.25,,,, +US-TN-37369,US,TN,37369,9.25,,,, +US-TN-37370,US,TN,37370,9,,,, +US-TN-37371,US,TN,37371,9,,,, +US-TN-37373,US,TN,37373,9.25,,,, +US-TN-37374,US,TN,37374,9.75,,,, +US-TN-37375,US,TN,37375,9.25,,,, +US-TN-37376,US,TN,37376,9.25,,,, +US-TN-37377,US,TN,37377,9.25,,,, +US-TN-37378,US,TN,37378,9.75,,,, +US-TN-37379,US,TN,37379,9.25,,,, +US-TN-37380,US,TN,37380,9.75,,,, +US-TN-37381,US,TN,37381,9.75,,,, +US-TN-37382,US,TN,37382,9.75,,,, +US-TN-37383,US,TN,37383,9.25,,,, +US-TN-37384,US,TN,37384,9.25,,,, +US-TN-37385,US,TN,37385,9.25,,,, +US-TN-37387,US,TN,37387,9.25,,,, +US-TN-37388,US,TN,37388,9.75,,,, +US-TN-37389,US,TN,37389,9.75,,,, +US-TN-37391,US,TN,37391,9.25,,,, +US-TN-37394,US,TN,37394,9.75,,,, +US-TN-37396,US,TN,37396,9.75,,,, +US-TN-37397,US,TN,37397,9.75,,,, +US-TN-37398,US,TN,37398,9.25,,,, +US-TN-37401,US,TN,37401,9.25,,,, +US-TN-37402,US,TN,37402,9.25,,,, +US-TN-37403,US,TN,37403,9.25,,,, +US-TN-37404,US,TN,37404,9.25,,,, +US-TN-37405,US,TN,37405,9.25,,,, +US-TN-37406,US,TN,37406,9.25,,,, +US-TN-37407,US,TN,37407,9.25,,,, +US-TN-37408,US,TN,37408,9.25,,,, +US-TN-37409,US,TN,37409,9.25,,,, +US-TN-37410,US,TN,37410,9.25,,,, +US-TN-37411,US,TN,37411,9.25,,,, +US-TN-37412,US,TN,37412,9.25,,,, +US-TN-37414,US,TN,37414,9.25,,,, +US-TN-37415,US,TN,37415,9.25,,,, +US-TN-37416,US,TN,37416,9.25,,,, +US-TN-37419,US,TN,37419,9.25,,,, +US-TN-37421,US,TN,37421,9.25,,,, +US-TN-37422,US,TN,37422,9.25,,,, +US-TN-37424,US,TN,37424,9.25,,,, +US-TN-37450,US,TN,37450,9.25,,,, +US-TN-37501,US,TN,37501,9.25,,,, +US-TN-37544,US,TN,37544,9.25,,,, +US-TN-37601,US,TN,37601,9.5,,,, +US-TN-37602,US,TN,37602,9.5,,,, +US-TN-37604,US,TN,37604,9.5,,,, +US-TN-37605,US,TN,37605,9.5,,,, +US-TN-37614,US,TN,37614,9.5,,,, +US-TN-37615,US,TN,37615,9.5,,,, +US-TN-37616,US,TN,37616,9.75,,,, +US-TN-37617,US,TN,37617,9.25,,,, +US-TN-37618,US,TN,37618,9.25,,,, +US-TN-37620,US,TN,37620,9.25,,,, +US-TN-37621,US,TN,37621,9.25,,,, +US-TN-37625,US,TN,37625,9.25,,,, +US-TN-37640,US,TN,37640,8.5,,,, +US-TN-37641,US,TN,37641,9.75,,,, +US-TN-37642,US,TN,37642,9.75,,,, +US-TN-37643,US,TN,37643,9.75,,,, +US-TN-37644,US,TN,37644,9.75,,,, +US-TN-37645,US,TN,37645,9.75,,,, +US-TN-37650,US,TN,37650,9.75,,,, +US-TN-37656,US,TN,37656,9.75,,,, +US-TN-37657,US,TN,37657,9.75,,,, +US-TN-37658,US,TN,37658,9.75,,,, +US-TN-37659,US,TN,37659,9.5,,,, +US-TN-37660,US,TN,37660,9.5,,,, +US-TN-37662,US,TN,37662,9.25,,,, +US-TN-37663,US,TN,37663,9.25,,,, +US-TN-37664,US,TN,37664,9.5,,,, +US-TN-37665,US,TN,37665,9.5,,,, +US-TN-37669,US,TN,37669,9.5,,,, +US-TN-37680,US,TN,37680,8.5,,,, +US-TN-37681,US,TN,37681,9.75,,,, +US-TN-37682,US,TN,37682,9.75,,,, +US-TN-37683,US,TN,37683,8.5,,,, +US-TN-37684,US,TN,37684,9.5,,,, +US-TN-37686,US,TN,37686,9.25,,,, +US-TN-37687,US,TN,37687,9.75,,,, +US-TN-37688,US,TN,37688,8.5,,,, +US-TN-37690,US,TN,37690,9.5,,,, +US-TN-37691,US,TN,37691,8.5,,,, +US-TN-37692,US,TN,37692,9.75,,,, +US-TN-37694,US,TN,37694,9.75,,,, +US-TN-37699,US,TN,37699,9.25,,,, +US-TN-37701,US,TN,37701,9.75,,,, +US-TN-37705,US,TN,37705,9.75,,,, +US-TN-37707,US,TN,37707,9.25,,,, +US-TN-37708,US,TN,37708,9.75,,,, +US-TN-37709,US,TN,37709,9.75,,,, +US-TN-37710,US,TN,37710,9.75,,,, +US-TN-37711,US,TN,37711,9.75,,,, +US-TN-37713,US,TN,37713,9.75,,,, +US-TN-37714,US,TN,37714,9.25,,,, +US-TN-37715,US,TN,37715,9.25,,,, +US-TN-37716,US,TN,37716,9.75,,,, +US-TN-37717,US,TN,37717,9.75,,,, +US-TN-37719,US,TN,37719,9,,,, +US-TN-37721,US,TN,37721,9.25,,,, +US-TN-37722,US,TN,37722,9.75,,,, +US-TN-37723,US,TN,37723,9.75,,,, +US-TN-37724,US,TN,37724,9.25,,,, +US-TN-37725,US,TN,37725,9.75,,,, +US-TN-37726,US,TN,37726,9,,,, +US-TN-37727,US,TN,37727,9.75,,,, +US-TN-37729,US,TN,37729,9.25,,,, +US-TN-37730,US,TN,37730,9.25,,,, +US-TN-37731,US,TN,37731,9.75,,,, +US-TN-37732,US,TN,37732,9.25,,,, +US-TN-37733,US,TN,37733,9.25,,,, +US-TN-37737,US,TN,37737,9.25,,,, +US-TN-37738,US,TN,37738,9.75,,,, +US-TN-37742,US,TN,37742,9,,,, +US-TN-37743,US,TN,37743,9.75,,,, +US-TN-37744,US,TN,37744,9.75,,,, +US-TN-37745,US,TN,37745,9.75,,,, +US-TN-37748,US,TN,37748,9.5,,,, +US-TN-37752,US,TN,37752,9.25,,,, +US-TN-37753,US,TN,37753,9.75,,,, +US-TN-37754,US,TN,37754,9.75,,,, +US-TN-37755,US,TN,37755,9.25,,,, +US-TN-37756,US,TN,37756,9.25,,,, +US-TN-37757,US,TN,37757,9.25,,,, +US-TN-37760,US,TN,37760,9.75,,,, +US-TN-37762,US,TN,37762,9.25,,,, +US-TN-37763,US,TN,37763,9.5,,,, +US-TN-37764,US,TN,37764,9.75,,,, +US-TN-37765,US,TN,37765,9,,,, +US-TN-37766,US,TN,37766,9.25,,,, +US-TN-37769,US,TN,37769,9.75,,,, +US-TN-37770,US,TN,37770,9,,,, +US-TN-37771,US,TN,37771,9,,,, +US-TN-37772,US,TN,37772,9,,,, +US-TN-37773,US,TN,37773,9.25,,,, +US-TN-37774,US,TN,37774,9,,,, +US-TN-37777,US,TN,37777,9.25,,,, +US-TN-37778,US,TN,37778,9.75,,,, +US-TN-37779,US,TN,37779,9.25,,,, +US-TN-37801,US,TN,37801,9.25,,,, +US-TN-37802,US,TN,37802,9.25,,,, +US-TN-37803,US,TN,37803,9.25,,,, +US-TN-37804,US,TN,37804,9.25,,,, +US-TN-37806,US,TN,37806,9.25,,,, +US-TN-37807,US,TN,37807,9.25,,,, +US-TN-37809,US,TN,37809,9.75,,,, +US-TN-37810,US,TN,37810,9.75,,,, +US-TN-37811,US,TN,37811,9.75,,,, +US-TN-37813,US,TN,37813,9.75,,,, +US-TN-37814,US,TN,37814,9.75,,,, +US-TN-37815,US,TN,37815,9.75,,,, +US-TN-37816,US,TN,37816,9.75,,,, +US-TN-37818,US,TN,37818,9.75,,,, +US-TN-37819,US,TN,37819,9.25,,,, +US-TN-37820,US,TN,37820,9.75,,,, +US-TN-37821,US,TN,37821,9.75,,,, +US-TN-37822,US,TN,37822,9.75,,,, +US-TN-37824,US,TN,37824,9.25,,,, +US-TN-37825,US,TN,37825,9.25,,,, +US-TN-37826,US,TN,37826,9,,,, +US-TN-37828,US,TN,37828,9.75,,,, +US-TN-37829,US,TN,37829,9,,,, +US-TN-37830,US,TN,37830,9.75,,,, +US-TN-37831,US,TN,37831,9.75,,,, +US-TN-37840,US,TN,37840,9.75,,,, +US-TN-37841,US,TN,37841,9.25,,,, +US-TN-37843,US,TN,37843,9.75,,,, +US-TN-37845,US,TN,37845,9,,,, +US-TN-37846,US,TN,37846,9,,,, +US-TN-37847,US,TN,37847,9.25,,,, +US-TN-37848,US,TN,37848,9.75,,,, +US-TN-37849,US,TN,37849,9.25,,,, +US-TN-37851,US,TN,37851,9.25,,,, +US-TN-37852,US,TN,37852,9.25,,,, +US-TN-37853,US,TN,37853,9.25,,,, +US-TN-37854,US,TN,37854,9.5,,,, +US-TN-37857,US,TN,37857,9.75,,,, +US-TN-37860,US,TN,37860,9.75,,,, +US-TN-37861,US,TN,37861,9.75,,,, +US-TN-37862,US,TN,37862,9.75,,,, +US-TN-37863,US,TN,37863,9.75,,,, +US-TN-37864,US,TN,37864,9.75,,,, +US-TN-37865,US,TN,37865,9.75,,,, +US-TN-37866,US,TN,37866,9.25,,,, +US-TN-37867,US,TN,37867,9.25,,,, +US-TN-37868,US,TN,37868,9.75,,,, +US-TN-37869,US,TN,37869,9,,,, +US-TN-37870,US,TN,37870,9.25,,,, +US-TN-37871,US,TN,37871,9.25,,,, +US-TN-37872,US,TN,37872,9,,,, +US-TN-37873,US,TN,37873,9.75,,,, +US-TN-37874,US,TN,37874,9.25,,,, +US-TN-37876,US,TN,37876,9.75,,,, +US-TN-37877,US,TN,37877,9.75,,,, +US-TN-37878,US,TN,37878,9.25,,,, +US-TN-37879,US,TN,37879,9.25,,,, +US-TN-37880,US,TN,37880,9.5,,,, +US-TN-37881,US,TN,37881,9.75,,,, +US-TN-37882,US,TN,37882,9.25,,,, +US-TN-37885,US,TN,37885,9.25,,,, +US-TN-37886,US,TN,37886,9.25,,,, +US-TN-37887,US,TN,37887,9,,,, +US-TN-37888,US,TN,37888,9.75,,,, +US-TN-37890,US,TN,37890,9.75,,,, +US-TN-37891,US,TN,37891,9.75,,,, +US-TN-37892,US,TN,37892,9.25,,,, +US-TN-37901,US,TN,37901,9.25,,,, +US-TN-37902,US,TN,37902,9.25,,,, +US-TN-37909,US,TN,37909,9.25,,,, +US-TN-37912,US,TN,37912,9.25,,,, +US-TN-37914,US,TN,37914,9.25,,,, +US-TN-37915,US,TN,37915,9.25,,,, +US-TN-37916,US,TN,37916,9.25,,,, +US-TN-37917,US,TN,37917,9.25,,,, +US-TN-37918,US,TN,37918,9.25,,,, +US-TN-37919,US,TN,37919,9.25,,,, +US-TN-37920,US,TN,37920,9.25,,,, +US-TN-37921,US,TN,37921,9.25,,,, +US-TN-37922,US,TN,37922,9.25,,,, +US-TN-37923,US,TN,37923,9.25,,,, +US-TN-37924,US,TN,37924,9.25,,,, +US-TN-37927,US,TN,37927,9.25,,,, +US-TN-37928,US,TN,37928,9.25,,,, +US-TN-37929,US,TN,37929,9.25,,,, +US-TN-37930,US,TN,37930,9.25,,,, +US-TN-37931,US,TN,37931,9.25,,,, +US-TN-37932,US,TN,37932,9.25,,,, +US-TN-37933,US,TN,37933,9.25,,,, +US-TN-37934,US,TN,37934,9.25,,,, +US-TN-37938,US,TN,37938,9.25,,,, +US-TN-37939,US,TN,37939,9.25,,,, +US-TN-37940,US,TN,37940,9.25,,,, +US-TN-37950,US,TN,37950,9.25,,,, +US-TN-37995,US,TN,37995,9.25,,,, +US-TN-37996,US,TN,37996,9.25,,,, +US-TN-37997,US,TN,37997,9.25,,,, +US-TN-37998,US,TN,37998,9.25,,,, +US-TN-38001,US,TN,38001,9.75,,,, +US-TN-38002,US,TN,38002,9.75,,,, +US-TN-38004,US,TN,38004,9.25,,,, +US-TN-38006,US,TN,38006,9.75,,,, +US-TN-38007,US,TN,38007,9.75,,,, +US-TN-38008,US,TN,38008,9.75,,,, +US-TN-38010,US,TN,38010,9.25,,,, +US-TN-38011,US,TN,38011,9.25,,,, +US-TN-38012,US,TN,38012,9.75,,,, +US-TN-38014,US,TN,38014,9.25,,,, +US-TN-38015,US,TN,38015,9.25,,,, +US-TN-38016,US,TN,38016,9.25,,,, +US-TN-38017,US,TN,38017,9.75,,,, +US-TN-38018,US,TN,38018,9.25,,,, +US-TN-38019,US,TN,38019,9.25,,,, +US-TN-38021,US,TN,38021,9.75,,,, +US-TN-38023,US,TN,38023,9.25,,,, +US-TN-38024,US,TN,38024,9.75,,,, +US-TN-38025,US,TN,38025,9.75,,,, +US-TN-38027,US,TN,38027,9.75,,,, +US-TN-38028,US,TN,38028,9.25,,,, +US-TN-38029,US,TN,38029,9.75,,,, +US-TN-38030,US,TN,38030,9.75,,,, +US-TN-38034,US,TN,38034,9.75,,,, +US-TN-38036,US,TN,38036,9.25,,,, +US-TN-38037,US,TN,38037,9.75,,,, +US-TN-38039,US,TN,38039,9.75,,,, +US-TN-38040,US,TN,38040,9.75,,,, +US-TN-38041,US,TN,38041,9.75,,,, +US-TN-38042,US,TN,38042,9.75,,,, +US-TN-38044,US,TN,38044,9.75,,,, +US-TN-38045,US,TN,38045,9.25,,,, +US-TN-38046,US,TN,38046,9.25,,,, +US-TN-38047,US,TN,38047,9.75,,,, +US-TN-38048,US,TN,38048,9.25,,,, +US-TN-38049,US,TN,38049,9.25,,,, +US-TN-38050,US,TN,38050,9.75,,,, +US-TN-38052,US,TN,38052,9.75,,,, +US-TN-38053,US,TN,38053,9.25,,,, +US-TN-38054,US,TN,38054,9.75,,,, +US-TN-38055,US,TN,38055,9.75,,,, +US-TN-38057,US,TN,38057,9.25,,,, +US-TN-38058,US,TN,38058,9.25,,,, +US-TN-38059,US,TN,38059,9.75,,,, +US-TN-38060,US,TN,38060,9.25,,,, +US-TN-38061,US,TN,38061,9.75,,,, +US-TN-38063,US,TN,38063,9.75,,,, +US-TN-38066,US,TN,38066,9.25,,,, +US-TN-38067,US,TN,38067,9.75,,,, +US-TN-38068,US,TN,38068,9.25,,,, +US-TN-38069,US,TN,38069,9.75,,,, +US-TN-38070,US,TN,38070,9.75,,,, +US-TN-38071,US,TN,38071,9.25,,,, +US-TN-38075,US,TN,38075,9.75,,,, +US-TN-38076,US,TN,38076,9.25,,,, +US-TN-38077,US,TN,38077,9.75,,,, +US-TN-38079,US,TN,38079,9.75,,,, +US-TN-38080,US,TN,38080,9.75,,,, +US-TN-38083,US,TN,38083,9.75,,,, +US-TN-38088,US,TN,38088,9.25,,,, +US-TN-38101,US,TN,38101,9.25,,,, +US-TN-38103,US,TN,38103,9.25,,,, +US-TN-38104,US,TN,38104,9.25,,,, +US-TN-38105,US,TN,38105,9.25,,,, +US-TN-38106,US,TN,38106,9.25,,,, +US-TN-38107,US,TN,38107,9.25,,,, +US-TN-38108,US,TN,38108,9.25,,,, +US-TN-38109,US,TN,38109,9.25,,,, +US-TN-38111,US,TN,38111,9.25,,,, +US-TN-38112,US,TN,38112,9.25,,,, +US-TN-38114,US,TN,38114,9.25,,,, +US-TN-38115,US,TN,38115,9.25,,,, +US-TN-38116,US,TN,38116,9.25,,,, +US-TN-38117,US,TN,38117,9.25,,,, +US-TN-38118,US,TN,38118,9.25,,,, +US-TN-38119,US,TN,38119,9.25,,,, +US-TN-38120,US,TN,38120,9.25,,,, +US-TN-38122,US,TN,38122,9.25,,,, +US-TN-38124,US,TN,38124,9.25,,,, +US-TN-38125,US,TN,38125,9.25,,,, +US-TN-38126,US,TN,38126,9.25,,,, +US-TN-38127,US,TN,38127,9.25,,,, +US-TN-38128,US,TN,38128,9.25,,,, +US-TN-38130,US,TN,38130,9.25,,,, +US-TN-38131,US,TN,38131,9.25,,,, +US-TN-38132,US,TN,38132,9.25,,,, +US-TN-38133,US,TN,38133,9.75,,,, +US-TN-38134,US,TN,38134,9.25,,,, +US-TN-38135,US,TN,38135,9.75,,,, +US-TN-38136,US,TN,38136,9.25,,,, +US-TN-38137,US,TN,38137,9.25,,,, +US-TN-38138,US,TN,38138,9.75,,,, +US-TN-38139,US,TN,38139,9.75,,,, +US-TN-38141,US,TN,38141,9.25,,,, +US-TN-38148,US,TN,38148,9.25,,,, +US-TN-38152,US,TN,38152,9.25,,,, +US-TN-38157,US,TN,38157,9.25,,,, +US-TN-38161,US,TN,38161,9.25,,,, +US-TN-38163,US,TN,38163,9.25,,,, +US-TN-38166,US,TN,38166,9.25,,,, +US-TN-38167,US,TN,38167,9.25,,,, +US-TN-38168,US,TN,38168,9.25,,,, +US-TN-38173,US,TN,38173,9.25,,,, +US-TN-38174,US,TN,38174,9.25,,,, +US-TN-38175,US,TN,38175,9.25,,,, +US-TN-38177,US,TN,38177,9.25,,,, +US-TN-38181,US,TN,38181,9.25,,,, +US-TN-38182,US,TN,38182,9.25,,,, +US-TN-38183,US,TN,38183,9.75,,,, +US-TN-38184,US,TN,38184,9.75,,,, +US-TN-38186,US,TN,38186,9.25,,,, +US-TN-38187,US,TN,38187,9.25,,,, +US-TN-38188,US,TN,38188,9.25,,,, +US-TN-38190,US,TN,38190,9.25,,,, +US-TN-38193,US,TN,38193,9.25,,,, +US-TN-38194,US,TN,38194,9.25,,,, +US-TN-38197,US,TN,38197,9.25,,,, +US-TN-38201,US,TN,38201,9.75,,,, +US-TN-38220,US,TN,38220,9.75,,,, +US-TN-38221,US,TN,38221,9.75,,,, +US-TN-38222,US,TN,38222,9.25,,,, +US-TN-38223,US,TN,38223,9.25,,,, +US-TN-38224,US,TN,38224,9.25,,,, +US-TN-38225,US,TN,38225,9.75,,,, +US-TN-38226,US,TN,38226,9.75,,,, +US-TN-38229,US,TN,38229,9.75,,,, +US-TN-38230,US,TN,38230,9.75,,,, +US-TN-38231,US,TN,38231,9.25,,,, +US-TN-38232,US,TN,38232,9.75,,,, +US-TN-38233,US,TN,38233,9.75,,,, +US-TN-38235,US,TN,38235,9.75,,,, +US-TN-38236,US,TN,38236,9.25,,,, +US-TN-38237,US,TN,38237,9.75,,,, +US-TN-38238,US,TN,38238,9.75,,,, +US-TN-38240,US,TN,38240,9.75,,,, +US-TN-38241,US,TN,38241,9.75,,,, +US-TN-38242,US,TN,38242,9.25,,,, +US-TN-38251,US,TN,38251,9.25,,,, +US-TN-38253,US,TN,38253,9.75,,,, +US-TN-38254,US,TN,38254,9.75,,,, +US-TN-38255,US,TN,38255,9.75,,,, +US-TN-38256,US,TN,38256,9.25,,,, +US-TN-38257,US,TN,38257,9.75,,,, +US-TN-38258,US,TN,38258,9.75,,,, +US-TN-38259,US,TN,38259,9.75,,,, +US-TN-38260,US,TN,38260,9.75,,,, +US-TN-38261,US,TN,38261,9.75,,,, +US-TN-38271,US,TN,38271,9.75,,,, +US-TN-38281,US,TN,38281,9.75,,,, +US-TN-38301,US,TN,38301,9.75,,,, +US-TN-38302,US,TN,38302,9.75,,,, +US-TN-38303,US,TN,38303,9.75,,,, +US-TN-38305,US,TN,38305,9.75,,,, +US-TN-38308,US,TN,38308,9.75,,,, +US-TN-38310,US,TN,38310,9.25,,,, +US-TN-38311,US,TN,38311,9.5,,,, +US-TN-38313,US,TN,38313,9.75,,,, +US-TN-38314,US,TN,38314,9.75,,,, +US-TN-38315,US,TN,38315,9.25,,,, +US-TN-38316,US,TN,38316,9.75,,,, +US-TN-38317,US,TN,38317,9.75,,,, +US-TN-38318,US,TN,38318,9.75,,,, +US-TN-38320,US,TN,38320,9.75,,,, +US-TN-38321,US,TN,38321,9.75,,,, +US-TN-38324,US,TN,38324,9.75,,,, +US-TN-38326,US,TN,38326,9.5,,,, +US-TN-38327,US,TN,38327,9.5,,,, +US-TN-38328,US,TN,38328,9.75,,,, +US-TN-38329,US,TN,38329,9.5,,,, +US-TN-38330,US,TN,38330,9.75,,,, +US-TN-38331,US,TN,38331,9.75,,,, +US-TN-38332,US,TN,38332,9.75,,,, +US-TN-38333,US,TN,38333,9.75,,,, +US-TN-38334,US,TN,38334,9.25,,,, +US-TN-38336,US,TN,38336,9.75,,,, +US-TN-38337,US,TN,38337,9.75,,,, +US-TN-38338,US,TN,38338,9.75,,,, +US-TN-38339,US,TN,38339,9.25,,,, +US-TN-38340,US,TN,38340,9.75,,,, +US-TN-38341,US,TN,38341,9.75,,,, +US-TN-38342,US,TN,38342,9.75,,,, +US-TN-38343,US,TN,38343,9.75,,,, +US-TN-38344,US,TN,38344,9.75,,,, +US-TN-38345,US,TN,38345,9.75,,,, +US-TN-38346,US,TN,38346,9.75,,,, +US-TN-38347,US,TN,38347,9.75,,,, +US-TN-38348,US,TN,38348,9.75,,,, +US-TN-38351,US,TN,38351,9.75,,,, +US-TN-38352,US,TN,38352,9.75,,,, +US-TN-38355,US,TN,38355,9.75,,,, +US-TN-38356,US,TN,38356,9.75,,,, +US-TN-38357,US,TN,38357,9.25,,,, +US-TN-38358,US,TN,38358,9.75,,,, +US-TN-38359,US,TN,38359,9.25,,,, +US-TN-38361,US,TN,38361,9.5,,,, +US-TN-38362,US,TN,38362,9.75,,,, +US-TN-38363,US,TN,38363,9.5,,,, +US-TN-38365,US,TN,38365,9.5,,,, +US-TN-38366,US,TN,38366,9.75,,,, +US-TN-38367,US,TN,38367,9.25,,,, +US-TN-38368,US,TN,38368,9.75,,,, +US-TN-38369,US,TN,38369,9.75,,,, +US-TN-38370,US,TN,38370,9.5,,,, +US-TN-38371,US,TN,38371,9.75,,,, +US-TN-38372,US,TN,38372,9.5,,,, +US-TN-38374,US,TN,38374,9.75,,,, +US-TN-38375,US,TN,38375,9.25,,,, +US-TN-38376,US,TN,38376,9.5,,,, +US-TN-38377,US,TN,38377,9.75,,,, +US-TN-38378,US,TN,38378,9.75,,,, +US-TN-38379,US,TN,38379,9.25,,,, +US-TN-38380,US,TN,38380,9.5,,,, +US-TN-38381,US,TN,38381,9.75,,,, +US-TN-38382,US,TN,38382,9.75,,,, +US-TN-38387,US,TN,38387,9.75,,,, +US-TN-38388,US,TN,38388,9.75,,,, +US-TN-38389,US,TN,38389,9.75,,,, +US-TN-38390,US,TN,38390,9.75,,,, +US-TN-38391,US,TN,38391,9.75,,,, +US-TN-38392,US,TN,38392,9.75,,,, +US-TN-38393,US,TN,38393,9.25,,,, +US-TN-38401,US,TN,38401,9.25,,,, +US-TN-38402,US,TN,38402,9.25,,,, +US-TN-38425,US,TN,38425,9.75,,,, +US-TN-38449,US,TN,38449,9.5,,,, +US-TN-38450,US,TN,38450,9.75,,,, +US-TN-38451,US,TN,38451,9.25,,,, +US-TN-38452,US,TN,38452,9.75,,,, +US-TN-38453,US,TN,38453,9.5,,,, +US-TN-38454,US,TN,38454,9.75,,,, +US-TN-38455,US,TN,38455,9.5,,,, +US-TN-38456,US,TN,38456,9.75,,,, +US-TN-38457,US,TN,38457,9.75,,,, +US-TN-38459,US,TN,38459,9.5,,,, +US-TN-38460,US,TN,38460,9.5,,,, +US-TN-38461,US,TN,38461,9.25,,,, +US-TN-38462,US,TN,38462,9.5,,,, +US-TN-38463,US,TN,38463,9.75,,,, +US-TN-38464,US,TN,38464,9.75,,,, +US-TN-38468,US,TN,38468,9.75,,,, +US-TN-38469,US,TN,38469,9.75,,,, +US-TN-38471,US,TN,38471,9.75,,,, +US-TN-38472,US,TN,38472,9.5,,,, +US-TN-38473,US,TN,38473,9.5,,,, +US-TN-38474,US,TN,38474,9.25,,,, +US-TN-38475,US,TN,38475,9.5,,,, +US-TN-38476,US,TN,38476,9.75,,,, +US-TN-38477,US,TN,38477,9.5,,,, +US-TN-38478,US,TN,38478,9.5,,,, +US-TN-38481,US,TN,38481,9.75,,,, +US-TN-38482,US,TN,38482,9.25,,,, +US-TN-38483,US,TN,38483,9.75,,,, +US-TN-38485,US,TN,38485,9.75,,,, +US-TN-38486,US,TN,38486,9.75,,,, +US-TN-38487,US,TN,38487,9.25,,,, +US-TN-38488,US,TN,38488,9.5,,,, +US-TN-38501,US,TN,38501,9.75,,,, +US-TN-38502,US,TN,38502,9.75,,,, +US-TN-38503,US,TN,38503,9.75,,,, +US-TN-38504,US,TN,38504,9.5,,,, +US-TN-38505,US,TN,38505,9.75,,,, +US-TN-38506,US,TN,38506,9.75,,,, +US-TN-38541,US,TN,38541,9.5,,,, +US-TN-38542,US,TN,38542,9.5,,,, +US-TN-38543,US,TN,38543,9.5,,,, +US-TN-38544,US,TN,38544,9.75,,,, +US-TN-38545,US,TN,38545,9.75,,,, +US-TN-38547,US,TN,38547,9.75,,,, +US-TN-38548,US,TN,38548,9.75,,,, +US-TN-38549,US,TN,38549,9.75,,,, +US-TN-38550,US,TN,38550,9.75,,,, +US-TN-38551,US,TN,38551,9.75,,,, +US-TN-38552,US,TN,38552,9.75,,,, +US-TN-38553,US,TN,38553,9.5,,,, +US-TN-38554,US,TN,38554,9.5,,,, +US-TN-38555,US,TN,38555,9.75,,,, +US-TN-38556,US,TN,38556,9.5,,,, +US-TN-38557,US,TN,38557,9.75,,,, +US-TN-38558,US,TN,38558,9.75,,,, +US-TN-38559,US,TN,38559,9.25,,,, +US-TN-38560,US,TN,38560,9.75,,,, +US-TN-38562,US,TN,38562,9.75,,,, +US-TN-38563,US,TN,38563,9.75,,,, +US-TN-38564,US,TN,38564,9.75,,,, +US-TN-38565,US,TN,38565,9.5,,,, +US-TN-38567,US,TN,38567,9.75,,,, +US-TN-38568,US,TN,38568,9.5,,,, +US-TN-38569,US,TN,38569,9.75,,,, +US-TN-38570,US,TN,38570,9.5,,,, +US-TN-38571,US,TN,38571,9.75,,,, +US-TN-38572,US,TN,38572,9.75,,,, +US-TN-38573,US,TN,38573,9.5,,,, +US-TN-38574,US,TN,38574,9.75,,,, +US-TN-38575,US,TN,38575,9.75,,,, +US-TN-38577,US,TN,38577,9.75,,,, +US-TN-38578,US,TN,38578,9.75,,,, +US-TN-38579,US,TN,38579,9.25,,,, +US-TN-38580,US,TN,38580,9.5,,,, +US-TN-38581,US,TN,38581,9.75,,,, +US-TN-38582,US,TN,38582,9.75,,,, +US-TN-38583,US,TN,38583,9.25,,,, +US-TN-38585,US,TN,38585,9.75,,,, +US-TN-38587,US,TN,38587,9.25,,,, +US-TN-38588,US,TN,38588,9.75,,,, +US-TN-38589,US,TN,38589,9.5,,,, +US-TX-73301,US,TX,73301,8.25,,,, +US-TX-73344,US,TX,73344,8.25,,,, +US-TX-73960,US,TX,73960,6.25,,,, +US-TX-75001,US,TX,75001,8.25,,,, +US-TX-75002,US,TX,75002,8.25,,,, +US-TX-75006,US,TX,75006,8.25,,,, +US-TX-75007,US,TX,75007,8.25,,,, +US-TX-75009,US,TX,75009,8.25,,,, +US-TX-75010,US,TX,75010,8.25,,,, +US-TX-75011,US,TX,75011,8.25,,,, +US-TX-75013,US,TX,75013,8.25,,,, +US-TX-75014,US,TX,75014,8.25,,,, +US-TX-75015,US,TX,75015,8.25,,,, +US-TX-75016,US,TX,75016,8.25,,,, +US-TX-75017,US,TX,75017,8.25,,,, +US-TX-75019,US,TX,75019,8.25,,,, +US-TX-75020,US,TX,75020,8.25,,,, +US-TX-75021,US,TX,75021,6.25,,,, +US-TX-75022,US,TX,75022,8.25,,,, +US-TX-75023,US,TX,75023,8.25,,,, +US-TX-75024,US,TX,75024,8.25,,,, +US-TX-75025,US,TX,75025,8.25,,,, +US-TX-75026,US,TX,75026,8.25,,,, +US-TX-75027,US,TX,75027,8.25,,,, +US-TX-75028,US,TX,75028,8.25,,,, +US-TX-75029,US,TX,75029,8.25,,,, +US-TX-75030,US,TX,75030,8.25,,,, +US-TX-75032,US,TX,75032,8.25,,,, +US-TX-75033,US,TX,75033,8.25,,,, +US-TX-75034,US,TX,75034,8.25,,,, +US-TX-75035,US,TX,75035,8.25,,,, +US-TX-75038,US,TX,75038,8.25,,,, +US-TX-75039,US,TX,75039,8.25,,,, +US-TX-75040,US,TX,75040,8.25,,,, +US-TX-75041,US,TX,75041,8.25,,,, +US-TX-75042,US,TX,75042,8.25,,,, +US-TX-75043,US,TX,75043,8.25,,,, +US-TX-75044,US,TX,75044,8.25,,,, +US-TX-75045,US,TX,75045,8.25,,,, +US-TX-75046,US,TX,75046,8.25,,,, +US-TX-75047,US,TX,75047,8.25,,,, +US-TX-75048,US,TX,75048,8,,,, +US-TX-75049,US,TX,75049,8.25,,,, +US-TX-75050,US,TX,75050,8.25,,,, +US-TX-75051,US,TX,75051,8.25,,,, +US-TX-75052,US,TX,75052,8.25,,,, +US-TX-75053,US,TX,75053,8.25,,,, +US-TX-75054,US,TX,75054,8.25,,,, +US-TX-75056,US,TX,75056,8.25,,,, +US-TX-75057,US,TX,75057,8.25,,,, +US-TX-75058,US,TX,75058,6.25,,,, +US-TX-75060,US,TX,75060,8.25,,,, +US-TX-75061,US,TX,75061,8.25,,,, +US-TX-75062,US,TX,75062,8.25,,,, +US-TX-75063,US,TX,75063,8.25,,,, +US-TX-75065,US,TX,75065,8.25,,,, +US-TX-75067,US,TX,75067,8.25,,,, +US-TX-75068,US,TX,75068,8.25,,,, +US-TX-75069,US,TX,75069,8.25,,,, +US-TX-75070,US,TX,75070,8.25,,,, +US-TX-75071,US,TX,75071,8.25,,,, +US-TX-75074,US,TX,75074,8.25,,,, +US-TX-75075,US,TX,75075,8.25,,,, +US-TX-75076,US,TX,75076,6.25,,,, +US-TX-75077,US,TX,75077,8.25,,,, +US-TX-75078,US,TX,75078,8.25,,,, +US-TX-75080,US,TX,75080,8.25,,,, +US-TX-75081,US,TX,75081,8.25,,,, +US-TX-75082,US,TX,75082,8.25,,,, +US-TX-75083,US,TX,75083,8.25,,,, +US-TX-75085,US,TX,75085,8.25,,,, +US-TX-75086,US,TX,75086,8.25,,,, +US-TX-75087,US,TX,75087,8.25,,,, +US-TX-75088,US,TX,75088,8.25,,,, +US-TX-75089,US,TX,75089,8.25,,,, +US-TX-75090,US,TX,75090,8.25,,,, +US-TX-75091,US,TX,75091,8.25,,,, +US-TX-75092,US,TX,75092,8.25,,,, +US-TX-75093,US,TX,75093,8.25,,,, +US-TX-75094,US,TX,75094,8.25,,,, +US-TX-75097,US,TX,75097,7.25,,,, +US-TX-75098,US,TX,75098,8.25,,,, +US-TX-75099,US,TX,75099,8.25,,,, +US-TX-75101,US,TX,75101,7.25,,,, +US-TX-75102,US,TX,75102,6.75,,,, +US-TX-75103,US,TX,75103,6.25,,,, +US-TX-75104,US,TX,75104,8.25,,,, +US-TX-75105,US,TX,75105,6.75,,,, +US-TX-75106,US,TX,75106,8.25,,,, +US-TX-75109,US,TX,75109,6.75,,,, +US-TX-75110,US,TX,75110,8.25,,,, +US-TX-75114,US,TX,75114,8.25,,,, +US-TX-75115,US,TX,75115,8.25,,,, +US-TX-75116,US,TX,75116,8.25,,,, +US-TX-75117,US,TX,75117,6.25,,,, +US-TX-75118,US,TX,75118,6.25,,,, +US-TX-75119,US,TX,75119,7.75,,,, +US-TX-75120,US,TX,75120,7.75,,,, +US-TX-75121,US,TX,75121,6.25,,,, +US-TX-75123,US,TX,75123,8.25,,,, +US-TX-75124,US,TX,75124,6.25,,,, +US-TX-75125,US,TX,75125,6.25,,,, +US-TX-75126,US,TX,75126,6.25,,,, +US-TX-75127,US,TX,75127,6.25,,,, +US-TX-75132,US,TX,75132,8.25,,,, +US-TX-75134,US,TX,75134,8.25,,,, +US-TX-75135,US,TX,75135,6.75,,,, +US-TX-75137,US,TX,75137,8.25,,,, +US-TX-75138,US,TX,75138,8.25,,,, +US-TX-75140,US,TX,75140,6.25,,,, +US-TX-75141,US,TX,75141,8.25,,,, +US-TX-75142,US,TX,75142,6.25,,,, +US-TX-75143,US,TX,75143,6.25,,,, +US-TX-75144,US,TX,75144,6.75,,,, +US-TX-75146,US,TX,75146,8.25,,,, +US-TX-75147,US,TX,75147,6.25,,,, +US-TX-75148,US,TX,75148,6.25,,,, +US-TX-75149,US,TX,75149,8.25,,,, +US-TX-75150,US,TX,75150,8.25,,,, +US-TX-75151,US,TX,75151,8.25,,,, +US-TX-75152,US,TX,75152,6.25,,,, +US-TX-75153,US,TX,75153,6.75,,,, +US-TX-75154,US,TX,75154,8.25,,,, +US-TX-75155,US,TX,75155,6.75,,,, +US-TX-75156,US,TX,75156,6.25,,,, +US-TX-75157,US,TX,75157,7.25,,,, +US-TX-75158,US,TX,75158,6.25,,,, +US-TX-75159,US,TX,75159,8.25,,,, +US-TX-75160,US,TX,75160,8.25,,,, +US-TX-75161,US,TX,75161,6.25,,,, +US-TX-75163,US,TX,75163,6.25,,,, +US-TX-75164,US,TX,75164,7.25,,,, +US-TX-75165,US,TX,75165,8.25,,,, +US-TX-75166,US,TX,75166,8,,,, +US-TX-75167,US,TX,75167,6.25,,,, +US-TX-75168,US,TX,75168,8.25,,,, +US-TX-75169,US,TX,75169,6.25,,,, +US-TX-75172,US,TX,75172,8.25,,,, +US-TX-75173,US,TX,75173,6.25,,,, +US-TX-75180,US,TX,75180,8.25,,,, +US-TX-75181,US,TX,75181,8.25,,,, +US-TX-75182,US,TX,75182,8.25,,,, +US-TX-75185,US,TX,75185,8.25,,,, +US-TX-75187,US,TX,75187,8.25,,,, +US-TX-75189,US,TX,75189,8.25,,,, +US-TX-75201,US,TX,75201,8.25,,,, +US-TX-75202,US,TX,75202,8.25,,,, +US-TX-75203,US,TX,75203,8.25,,,, +US-TX-75204,US,TX,75204,8.25,,,, +US-TX-75205,US,TX,75205,8.25,,,, +US-TX-75206,US,TX,75206,8.25,,,, +US-TX-75207,US,TX,75207,8.25,,,, +US-TX-75208,US,TX,75208,8.25,,,, +US-TX-75209,US,TX,75209,8.25,,,, +US-TX-75210,US,TX,75210,8.25,,,, +US-TX-75211,US,TX,75211,8.25,,,, +US-TX-75212,US,TX,75212,8.25,,,, +US-TX-75214,US,TX,75214,8.25,,,, +US-TX-75215,US,TX,75215,8.25,,,, +US-TX-75216,US,TX,75216,8.25,,,, +US-TX-75217,US,TX,75217,8.25,,,, +US-TX-75218,US,TX,75218,8.25,,,, +US-TX-75219,US,TX,75219,8.25,,,, +US-TX-75220,US,TX,75220,8.25,,,, +US-TX-75221,US,TX,75221,8.25,,,, +US-TX-75222,US,TX,75222,8.25,,,, +US-TX-75223,US,TX,75223,8.25,,,, +US-TX-75224,US,TX,75224,8.25,,,, +US-TX-75225,US,TX,75225,8.25,,,, +US-TX-75226,US,TX,75226,8.25,,,, +US-TX-75227,US,TX,75227,8.25,,,, +US-TX-75228,US,TX,75228,8.25,,,, +US-TX-75229,US,TX,75229,8.25,,,, +US-TX-75230,US,TX,75230,8.25,,,, +US-TX-75231,US,TX,75231,8.25,,,, +US-TX-75232,US,TX,75232,8.25,,,, +US-TX-75233,US,TX,75233,8.25,,,, +US-TX-75234,US,TX,75234,8.25,,,, +US-TX-75235,US,TX,75235,8.25,,,, +US-TX-75236,US,TX,75236,8.25,,,, +US-TX-75237,US,TX,75237,8.25,,,, +US-TX-75238,US,TX,75238,8.25,,,, +US-TX-75240,US,TX,75240,8.25,,,, +US-TX-75241,US,TX,75241,8.25,,,, +US-TX-75242,US,TX,75242,8.25,,,, +US-TX-75243,US,TX,75243,8.25,,,, +US-TX-75244,US,TX,75244,8.25,,,, +US-TX-75246,US,TX,75246,8.25,,,, +US-TX-75247,US,TX,75247,8.25,,,, +US-TX-75248,US,TX,75248,8.25,,,, +US-TX-75249,US,TX,75249,8.25,,,, +US-TX-75250,US,TX,75250,8.25,,,, +US-TX-75251,US,TX,75251,8.25,,,, +US-TX-75252,US,TX,75252,8.25,,,, +US-TX-75253,US,TX,75253,8.25,,,, +US-TX-75254,US,TX,75254,8.25,,,, +US-TX-75261,US,TX,75261,8.25,,,, +US-TX-75270,US,TX,75270,8.25,,,, +US-TX-75287,US,TX,75287,8.25,,,, +US-TX-75313,US,TX,75313,8.25,,,, +US-TX-75315,US,TX,75315,8.25,,,, +US-TX-75336,US,TX,75336,8.25,,,, +US-TX-75339,US,TX,75339,8.25,,,, +US-TX-75342,US,TX,75342,8.25,,,, +US-TX-75354,US,TX,75354,8.25,,,, +US-TX-75355,US,TX,75355,8.25,,,, +US-TX-75356,US,TX,75356,8.25,,,, +US-TX-75357,US,TX,75357,8.25,,,, +US-TX-75359,US,TX,75359,8.25,,,, +US-TX-75360,US,TX,75360,8.25,,,, +US-TX-75367,US,TX,75367,8.25,,,, +US-TX-75370,US,TX,75370,8.25,,,, +US-TX-75371,US,TX,75371,8.25,,,, +US-TX-75372,US,TX,75372,8.25,,,, +US-TX-75374,US,TX,75374,8.25,,,, +US-TX-75376,US,TX,75376,8.25,,,, +US-TX-75378,US,TX,75378,8.25,,,, +US-TX-75379,US,TX,75379,8.25,,,, +US-TX-75380,US,TX,75380,8.25,,,, +US-TX-75381,US,TX,75381,8.25,,,, +US-TX-75382,US,TX,75382,8.25,,,, +US-TX-75390,US,TX,75390,8.25,,,, +US-TX-75393,US,TX,75393,8.25,,,, +US-TX-75394,US,TX,75394,8.25,,,, +US-TX-75398,US,TX,75398,8.25,,,, +US-TX-75401,US,TX,75401,8.25,,,, +US-TX-75402,US,TX,75402,8.25,,,, +US-TX-75403,US,TX,75403,8.25,,,, +US-TX-75404,US,TX,75404,8.25,,,, +US-TX-75407,US,TX,75407,6.25,,,, +US-TX-75409,US,TX,75409,8.25,,,, +US-TX-75410,US,TX,75410,6.75,,,, +US-TX-75411,US,TX,75411,6.75,,,, +US-TX-75412,US,TX,75412,6.75,,,, +US-TX-75413,US,TX,75413,7.75,,,, +US-TX-75414,US,TX,75414,6.25,,,, +US-TX-75415,US,TX,75415,7.25,,,, +US-TX-75416,US,TX,75416,6.75,,,, +US-TX-75417,US,TX,75417,6.75,,,, +US-TX-75418,US,TX,75418,8.25,,,, +US-TX-75420,US,TX,75420,6.75,,,, +US-TX-75421,US,TX,75421,6.75,,,, +US-TX-75422,US,TX,75422,6.75,,,, +US-TX-75423,US,TX,75423,6.75,,,, +US-TX-75424,US,TX,75424,6.25,,,, +US-TX-75425,US,TX,75425,6.75,,,, +US-TX-75426,US,TX,75426,8.25,,,, +US-TX-75428,US,TX,75428,8.25,,,, +US-TX-75429,US,TX,75429,8.25,,,, +US-TX-75431,US,TX,75431,6.75,,,, +US-TX-75432,US,TX,75432,8.25,,,, +US-TX-75433,US,TX,75433,6.75,,,, +US-TX-75434,US,TX,75434,6.75,,,, +US-TX-75435,US,TX,75435,7.75,,,, +US-TX-75436,US,TX,75436,7.75,,,, +US-TX-75437,US,TX,75437,6.75,,,, +US-TX-75438,US,TX,75438,6.75,,,, +US-TX-75439,US,TX,75439,7.75,,,, +US-TX-75440,US,TX,75440,6.75,,,, +US-TX-75441,US,TX,75441,7.25,,,, +US-TX-75442,US,TX,75442,6.25,,,, +US-TX-75443,US,TX,75443,6.75,,,, +US-TX-75444,US,TX,75444,6.75,,,, +US-TX-75446,US,TX,75446,8.25,,,, +US-TX-75447,US,TX,75447,6.75,,,, +US-TX-75448,US,TX,75448,7.25,,,, +US-TX-75449,US,TX,75449,7.75,,,, +US-TX-75450,US,TX,75450,7.25,,,, +US-TX-75451,US,TX,75451,6.75,,,, +US-TX-75452,US,TX,75452,8.25,,,, +US-TX-75453,US,TX,75453,6.75,,,, +US-TX-75454,US,TX,75454,8.25,,,, +US-TX-75455,US,TX,75455,6.75,,,, +US-TX-75456,US,TX,75456,8.25,,,, +US-TX-75457,US,TX,75457,6.75,,,, +US-TX-75458,US,TX,75458,6.75,,,, +US-TX-75459,US,TX,75459,6.25,,,, +US-TX-75460,US,TX,75460,8.25,,,, +US-TX-75461,US,TX,75461,8.25,,,, +US-TX-75462,US,TX,75462,6.75,,,, +US-TX-75468,US,TX,75468,6.75,,,, +US-TX-75469,US,TX,75469,7.25,,,, +US-TX-75470,US,TX,75470,6.75,,,, +US-TX-75471,US,TX,75471,6.75,,,, +US-TX-75472,US,TX,75472,6.75,,,, +US-TX-75473,US,TX,75473,6.75,,,, +US-TX-75474,US,TX,75474,6.75,,,, +US-TX-75475,US,TX,75475,6.75,,,, +US-TX-75476,US,TX,75476,6.75,,,, +US-TX-75477,US,TX,75477,6.75,,,, +US-TX-75478,US,TX,75478,6.75,,,, +US-TX-75479,US,TX,75479,6.75,,,, +US-TX-75480,US,TX,75480,6.75,,,, +US-TX-75481,US,TX,75481,6.75,,,, +US-TX-75482,US,TX,75482,6.75,,,, +US-TX-75483,US,TX,75483,8.25,,,, +US-TX-75485,US,TX,75485,6.25,,,, +US-TX-75486,US,TX,75486,6.75,,,, +US-TX-75487,US,TX,75487,6.75,,,, +US-TX-75488,US,TX,75488,6.75,,,, +US-TX-75489,US,TX,75489,8.25,,,, +US-TX-75490,US,TX,75490,6.75,,,, +US-TX-75491,US,TX,75491,6.25,,,, +US-TX-75492,US,TX,75492,6.75,,,, +US-TX-75493,US,TX,75493,8,,,, +US-TX-75494,US,TX,75494,6.75,,,, +US-TX-75495,US,TX,75495,6.25,,,, +US-TX-75496,US,TX,75496,6.75,,,, +US-TX-75497,US,TX,75497,6.75,,,, +US-TX-75501,US,TX,75501,8.25,,,, +US-TX-75503,US,TX,75503,8.25,,,, +US-TX-75505,US,TX,75505,8.25,,,, +US-TX-75507,US,TX,75507,8.25,,,, +US-TX-75550,US,TX,75550,6.75,,,, +US-TX-75551,US,TX,75551,6.25,,,, +US-TX-75554,US,TX,75554,7.75,,,, +US-TX-75555,US,TX,75555,6.25,,,, +US-TX-75556,US,TX,75556,6.25,,,, +US-TX-75558,US,TX,75558,6.75,,,, +US-TX-75559,US,TX,75559,6.75,,,, +US-TX-75560,US,TX,75560,6.25,,,, +US-TX-75561,US,TX,75561,6.75,,,, +US-TX-75562,US,TX,75562,6.25,,,, +US-TX-75563,US,TX,75563,6.25,,,, +US-TX-75564,US,TX,75564,6.75,,,, +US-TX-75565,US,TX,75565,6.25,,,, +US-TX-75566,US,TX,75566,6.25,,,, +US-TX-75567,US,TX,75567,6.75,,,, +US-TX-75568,US,TX,75568,6.25,,,, +US-TX-75569,US,TX,75569,8.25,,,, +US-TX-75570,US,TX,75570,6.75,,,, +US-TX-75571,US,TX,75571,6.75,,,, +US-TX-75572,US,TX,75572,6.25,,,, +US-TX-75573,US,TX,75573,8.25,,,, +US-TX-75574,US,TX,75574,6.75,,,, +US-TX-75599,US,TX,75599,8.25,,,, +US-TX-75601,US,TX,75601,8.25,,,, +US-TX-75602,US,TX,75602,8.25,,,, +US-TX-75603,US,TX,75603,6.75,,,, +US-TX-75604,US,TX,75604,8.25,,,, +US-TX-75605,US,TX,75605,8.25,,,, +US-TX-75606,US,TX,75606,8.25,,,, +US-TX-75607,US,TX,75607,8.25,,,, +US-TX-75608,US,TX,75608,8.25,,,, +US-TX-75615,US,TX,75615,8.25,,,, +US-TX-75630,US,TX,75630,6.75,,,, +US-TX-75631,US,TX,75631,6.25,,,, +US-TX-75633,US,TX,75633,6.25,,,, +US-TX-75636,US,TX,75636,6.75,,,, +US-TX-75637,US,TX,75637,6.25,,,, +US-TX-75638,US,TX,75638,6.75,,,, +US-TX-75639,US,TX,75639,6.25,,,, +US-TX-75640,US,TX,75640,6.75,,,, +US-TX-75641,US,TX,75641,7.75,,,, +US-TX-75642,US,TX,75642,6.25,,,, +US-TX-75643,US,TX,75643,6.25,,,, +US-TX-75644,US,TX,75644,6.75,,,, +US-TX-75645,US,TX,75645,6.75,,,, +US-TX-75647,US,TX,75647,8.25,,,, +US-TX-75650,US,TX,75650,6.25,,,, +US-TX-75651,US,TX,75651,6.25,,,, +US-TX-75652,US,TX,75652,6.25,,,, +US-TX-75653,US,TX,75653,8.25,,,, +US-TX-75654,US,TX,75654,6.25,,,, +US-TX-75656,US,TX,75656,6.25,,,, +US-TX-75657,US,TX,75657,6.75,,,, +US-TX-75658,US,TX,75658,6.25,,,, +US-TX-75659,US,TX,75659,6.25,,,, +US-TX-75660,US,TX,75660,6.75,,,, +US-TX-75661,US,TX,75661,6.25,,,, +US-TX-75662,US,TX,75662,8.25,,,, +US-TX-75663,US,TX,75663,8.25,,,, +US-TX-75666,US,TX,75666,6.25,,,, +US-TX-75667,US,TX,75667,6.25,,,, +US-TX-75668,US,TX,75668,7.75,,,, +US-TX-75669,US,TX,75669,6.25,,,, +US-TX-75670,US,TX,75670,8.25,,,, +US-TX-75671,US,TX,75671,8.25,,,, +US-TX-75672,US,TX,75672,6.25,,,, +US-TX-75680,US,TX,75680,8.25,,,, +US-TX-75681,US,TX,75681,6.25,,,, +US-TX-75682,US,TX,75682,6.25,,,, +US-TX-75683,US,TX,75683,6.75,,,, +US-TX-75684,US,TX,75684,6.25,,,, +US-TX-75685,US,TX,75685,6.25,,,, +US-TX-75686,US,TX,75686,6.75,,,, +US-TX-75687,US,TX,75687,6.25,,,, +US-TX-75688,US,TX,75688,6.25,,,, +US-TX-75689,US,TX,75689,6.25,,,, +US-TX-75691,US,TX,75691,6.25,,,, +US-TX-75692,US,TX,75692,6.25,,,, +US-TX-75693,US,TX,75693,8.25,,,, +US-TX-75694,US,TX,75694,6.25,,,, +US-TX-75701,US,TX,75701,8.25,,,, +US-TX-75702,US,TX,75702,8.25,,,, +US-TX-75703,US,TX,75703,8.25,,,, +US-TX-75704,US,TX,75704,6.75,,,, +US-TX-75705,US,TX,75705,6.75,,,, +US-TX-75706,US,TX,75706,6.75,,,, +US-TX-75707,US,TX,75707,6.75,,,, +US-TX-75708,US,TX,75708,6.75,,,, +US-TX-75709,US,TX,75709,6.75,,,, +US-TX-75710,US,TX,75710,8.25,,,, +US-TX-75711,US,TX,75711,8.25,,,, +US-TX-75712,US,TX,75712,8.25,,,, +US-TX-75713,US,TX,75713,8.25,,,, +US-TX-75750,US,TX,75750,6.75,,,, +US-TX-75751,US,TX,75751,8.25,,,, +US-TX-75752,US,TX,75752,6.25,,,, +US-TX-75754,US,TX,75754,6.25,,,, +US-TX-75755,US,TX,75755,6.75,,,, +US-TX-75756,US,TX,75756,6.25,,,, +US-TX-75757,US,TX,75757,6.75,,,, +US-TX-75758,US,TX,75758,6.25,,,, +US-TX-75759,US,TX,75759,8.25,,,, +US-TX-75760,US,TX,75760,7.25,,,, +US-TX-75762,US,TX,75762,6.75,,,, +US-TX-75763,US,TX,75763,6.75,,,, +US-TX-75764,US,TX,75764,6.75,,,, +US-TX-75765,US,TX,75765,6.75,,,, +US-TX-75766,US,TX,75766,6.75,,,, +US-TX-75770,US,TX,75770,6.25,,,, +US-TX-75771,US,TX,75771,6.75,,,, +US-TX-75772,US,TX,75772,6.75,,,, +US-TX-75773,US,TX,75773,6.75,,,, +US-TX-75778,US,TX,75778,6.25,,,, +US-TX-75779,US,TX,75779,6.75,,,, +US-TX-75780,US,TX,75780,7.75,,,, +US-TX-75782,US,TX,75782,7.25,,,, +US-TX-75783,US,TX,75783,6.75,,,, +US-TX-75784,US,TX,75784,7.75,,,, +US-TX-75785,US,TX,75785,6.75,,,, +US-TX-75788,US,TX,75788,7.25,,,, +US-TX-75789,US,TX,75789,6.75,,,, +US-TX-75790,US,TX,75790,8.25,,,, +US-TX-75791,US,TX,75791,8.25,,,, +US-TX-75792,US,TX,75792,6.75,,,, +US-TX-75797,US,TX,75797,8.25,,,, +US-TX-75798,US,TX,75798,8.25,,,, +US-TX-75799,US,TX,75799,8.25,,,, +US-TX-75801,US,TX,75801,8.25,,,, +US-TX-75802,US,TX,75802,8.25,,,, +US-TX-75803,US,TX,75803,6.75,,,, +US-TX-75831,US,TX,75831,6.75,,,, +US-TX-75832,US,TX,75832,6.75,,,, +US-TX-75833,US,TX,75833,6.75,,,, +US-TX-75834,US,TX,75834,6.25,,,, +US-TX-75835,US,TX,75835,8.25,,,, +US-TX-75838,US,TX,75838,6.25,,,, +US-TX-75839,US,TX,75839,6.75,,,, +US-TX-75840,US,TX,75840,8.25,,,, +US-TX-75844,US,TX,75844,6.75,,,, +US-TX-75845,US,TX,75845,6.25,,,, +US-TX-75846,US,TX,75846,6.75,,,, +US-TX-75847,US,TX,75847,6.75,,,, +US-TX-75848,US,TX,75848,7.75,,,, +US-TX-75849,US,TX,75849,7.75,,,, +US-TX-75850,US,TX,75850,6.75,,,, +US-TX-75851,US,TX,75851,6.75,,,, +US-TX-75852,US,TX,75852,6.75,,,, +US-TX-75853,US,TX,75853,6.75,,,, +US-TX-75855,US,TX,75855,6.75,,,, +US-TX-75856,US,TX,75856,6.25,,,, +US-TX-75858,US,TX,75858,6.75,,,, +US-TX-75859,US,TX,75859,6.25,,,, +US-TX-75860,US,TX,75860,8.25,,,, +US-TX-75861,US,TX,75861,6.75,,,, +US-TX-75862,US,TX,75862,6.25,,,, +US-TX-75865,US,TX,75865,6.25,,,, +US-TX-75880,US,TX,75880,6.75,,,, +US-TX-75882,US,TX,75882,6.75,,,, +US-TX-75884,US,TX,75884,6.75,,,, +US-TX-75886,US,TX,75886,6.75,,,, +US-TX-75901,US,TX,75901,8.25,,,, +US-TX-75902,US,TX,75902,8.25,,,, +US-TX-75903,US,TX,75903,8.25,,,, +US-TX-75904,US,TX,75904,8.25,,,, +US-TX-75915,US,TX,75915,8.25,,,, +US-TX-75925,US,TX,75925,6.75,,,, +US-TX-75926,US,TX,75926,6.25,,,, +US-TX-75928,US,TX,75928,6.25,,,, +US-TX-75929,US,TX,75929,6.75,,,, +US-TX-75930,US,TX,75930,6.75,,,, +US-TX-75931,US,TX,75931,6.25,,,, +US-TX-75932,US,TX,75932,6.25,,,, +US-TX-75933,US,TX,75933,6.25,,,, +US-TX-75934,US,TX,75934,6.75,,,, +US-TX-75935,US,TX,75935,6.25,,,, +US-TX-75936,US,TX,75936,6.75,,,, +US-TX-75937,US,TX,75937,7.25,,,, +US-TX-75938,US,TX,75938,6.75,,,, +US-TX-75939,US,TX,75939,6.75,,,, +US-TX-75941,US,TX,75941,8.25,,,, +US-TX-75942,US,TX,75942,6.75,,,, +US-TX-75943,US,TX,75943,7.25,,,, +US-TX-75944,US,TX,75944,7.25,,,, +US-TX-75946,US,TX,75946,7.25,,,, +US-TX-75948,US,TX,75948,6.75,,,, +US-TX-75949,US,TX,75949,6.75,,,, +US-TX-75951,US,TX,75951,8.25,,,, +US-TX-75954,US,TX,75954,6.25,,,, +US-TX-75956,US,TX,75956,6.25,,,, +US-TX-75958,US,TX,75958,7.25,,,, +US-TX-75959,US,TX,75959,6.75,,,, +US-TX-75960,US,TX,75960,6.75,,,, +US-TX-75961,US,TX,75961,8.25,,,, +US-TX-75962,US,TX,75962,8.25,,,, +US-TX-75963,US,TX,75963,8.25,,,, +US-TX-75964,US,TX,75964,7.25,,,, +US-TX-75965,US,TX,75965,8.25,,,, +US-TX-75966,US,TX,75966,6.25,,,, +US-TX-75968,US,TX,75968,6.75,,,, +US-TX-75969,US,TX,75969,6.75,,,, +US-TX-75972,US,TX,75972,8.25,,,, +US-TX-75973,US,TX,75973,6.25,,,, +US-TX-75974,US,TX,75974,6.25,,,, +US-TX-75975,US,TX,75975,6.75,,,, +US-TX-75976,US,TX,75976,7.75,,,, +US-TX-75977,US,TX,75977,6.25,,,, +US-TX-75978,US,TX,75978,7.25,,,, +US-TX-75979,US,TX,75979,6.75,,,, +US-TX-75980,US,TX,75980,6.75,,,, +US-TX-75990,US,TX,75990,8.25,,,, +US-TX-76001,US,TX,76001,8,,,, +US-TX-76002,US,TX,76002,8,,,, +US-TX-76003,US,TX,76003,8,,,, +US-TX-76004,US,TX,76004,8,,,, +US-TX-76005,US,TX,76005,8,,,, +US-TX-76006,US,TX,76006,8,,,, +US-TX-76007,US,TX,76007,8,,,, +US-TX-76008,US,TX,76008,6.75,,,, +US-TX-76009,US,TX,76009,6.25,,,, +US-TX-76010,US,TX,76010,8,,,, +US-TX-76011,US,TX,76011,8,,,, +US-TX-76012,US,TX,76012,8,,,, +US-TX-76013,US,TX,76013,8,,,, +US-TX-76014,US,TX,76014,8,,,, +US-TX-76015,US,TX,76015,8,,,, +US-TX-76016,US,TX,76016,8,,,, +US-TX-76017,US,TX,76017,8,,,, +US-TX-76018,US,TX,76018,8,,,, +US-TX-76019,US,TX,76019,8,,,, +US-TX-76020,US,TX,76020,6.75,,,, +US-TX-76021,US,TX,76021,8.25,,,, +US-TX-76022,US,TX,76022,8.25,,,, +US-TX-76023,US,TX,76023,6.75,,,, +US-TX-76028,US,TX,76028,8.25,,,, +US-TX-76031,US,TX,76031,6.25,,,, +US-TX-76033,US,TX,76033,7.75,,,, +US-TX-76034,US,TX,76034,8.25,,,, +US-TX-76035,US,TX,76035,8,,,, +US-TX-76036,US,TX,76036,8.25,,,, +US-TX-76039,US,TX,76039,8.25,,,, +US-TX-76040,US,TX,76040,8.25,,,, +US-TX-76041,US,TX,76041,6.25,,,, +US-TX-76043,US,TX,76043,6.25,,,, +US-TX-76044,US,TX,76044,6.25,,,, +US-TX-76048,US,TX,76048,6.75,,,, +US-TX-76049,US,TX,76049,6.75,,,, +US-TX-76050,US,TX,76050,6.25,,,, +US-TX-76051,US,TX,76051,8.25,,,, +US-TX-76052,US,TX,76052,8.25,,,, +US-TX-76053,US,TX,76053,8.25,,,, +US-TX-76054,US,TX,76054,8.25,,,, +US-TX-76055,US,TX,76055,6.75,,,, +US-TX-76058,US,TX,76058,6.25,,,, +US-TX-76059,US,TX,76059,8.25,,,, +US-TX-76060,US,TX,76060,8.25,,,, +US-TX-76061,US,TX,76061,6.25,,,, +US-TX-76063,US,TX,76063,8.25,,,, +US-TX-76064,US,TX,76064,6.25,,,, +US-TX-76065,US,TX,76065,8.25,,,, +US-TX-76066,US,TX,76066,6.75,,,, +US-TX-76067,US,TX,76067,8.25,,,, +US-TX-76068,US,TX,76068,8.25,,,, +US-TX-76070,US,TX,76070,6.25,,,, +US-TX-76071,US,TX,76071,6.75,,,, +US-TX-76073,US,TX,76073,6.75,,,, +US-TX-76077,US,TX,76077,6.25,,,, +US-TX-76078,US,TX,76078,6.75,,,, +US-TX-76082,US,TX,76082,6.75,,,, +US-TX-76084,US,TX,76084,6.25,,,, +US-TX-76085,US,TX,76085,6.75,,,, +US-TX-76086,US,TX,76086,8.25,,,, +US-TX-76087,US,TX,76087,6.75,,,, +US-TX-76088,US,TX,76088,6.75,,,, +US-TX-76092,US,TX,76092,8.25,,,, +US-TX-76093,US,TX,76093,6.25,,,, +US-TX-76094,US,TX,76094,8,,,, +US-TX-76095,US,TX,76095,8.25,,,, +US-TX-76096,US,TX,76096,8,,,, +US-TX-76097,US,TX,76097,8.25,,,, +US-TX-76098,US,TX,76098,8.25,,,, +US-TX-76099,US,TX,76099,8.25,,,, +US-TX-76101,US,TX,76101,8.25,,,, +US-TX-76102,US,TX,76102,8.25,,,, +US-TX-76103,US,TX,76103,8.25,,,, +US-TX-76104,US,TX,76104,8.25,,,, +US-TX-76105,US,TX,76105,8.25,,,, +US-TX-76106,US,TX,76106,8.25,,,, +US-TX-76107,US,TX,76107,8.25,,,, +US-TX-76108,US,TX,76108,8.25,,,, +US-TX-76109,US,TX,76109,8.25,,,, +US-TX-76110,US,TX,76110,8.25,,,, +US-TX-76111,US,TX,76111,8.25,,,, +US-TX-76112,US,TX,76112,8.25,,,, +US-TX-76113,US,TX,76113,8.25,,,, +US-TX-76114,US,TX,76114,8.25,,,, +US-TX-76115,US,TX,76115,8.25,,,, +US-TX-76116,US,TX,76116,8.25,,,, +US-TX-76117,US,TX,76117,8.25,,,, +US-TX-76118,US,TX,76118,8.25,,,, +US-TX-76119,US,TX,76119,8.25,,,, +US-TX-76120,US,TX,76120,8.25,,,, +US-TX-76121,US,TX,76121,8.25,,,, +US-TX-76122,US,TX,76122,8.25,,,, +US-TX-76123,US,TX,76123,8.25,,,, +US-TX-76124,US,TX,76124,8.25,,,, +US-TX-76126,US,TX,76126,8.25,,,, +US-TX-76127,US,TX,76127,8.25,,,, +US-TX-76129,US,TX,76129,8.25,,,, +US-TX-76130,US,TX,76130,8.25,,,, +US-TX-76131,US,TX,76131,8.25,,,, +US-TX-76132,US,TX,76132,8.25,,,, +US-TX-76133,US,TX,76133,8.25,,,, +US-TX-76134,US,TX,76134,8.25,,,, +US-TX-76135,US,TX,76135,8.25,,,, +US-TX-76136,US,TX,76136,8.25,,,, +US-TX-76137,US,TX,76137,8.25,,,, +US-TX-76140,US,TX,76140,8.25,,,, +US-TX-76147,US,TX,76147,8.25,,,, +US-TX-76148,US,TX,76148,8.25,,,, +US-TX-76150,US,TX,76150,8.25,,,, +US-TX-76155,US,TX,76155,8.25,,,, +US-TX-76161,US,TX,76161,8.25,,,, +US-TX-76162,US,TX,76162,8.25,,,, +US-TX-76163,US,TX,76163,8.25,,,, +US-TX-76164,US,TX,76164,8.25,,,, +US-TX-76166,US,TX,76166,8.25,,,, +US-TX-76177,US,TX,76177,8.25,,,, +US-TX-76179,US,TX,76179,8.25,,,, +US-TX-76180,US,TX,76180,8.25,,,, +US-TX-76181,US,TX,76181,8.25,,,, +US-TX-76182,US,TX,76182,8.25,,,, +US-TX-76185,US,TX,76185,8.25,,,, +US-TX-76190,US,TX,76190,8.25,,,, +US-TX-76191,US,TX,76191,8.25,,,, +US-TX-76192,US,TX,76192,8.25,,,, +US-TX-76193,US,TX,76193,8.25,,,, +US-TX-76195,US,TX,76195,8.25,,,, +US-TX-76196,US,TX,76196,8.25,,,, +US-TX-76197,US,TX,76197,8.25,,,, +US-TX-76198,US,TX,76198,8.25,,,, +US-TX-76199,US,TX,76199,8.25,,,, +US-TX-76201,US,TX,76201,8.25,,,, +US-TX-76202,US,TX,76202,8.25,,,, +US-TX-76203,US,TX,76203,8.25,,,, +US-TX-76204,US,TX,76204,8.25,,,, +US-TX-76205,US,TX,76205,8.25,,,, +US-TX-76206,US,TX,76206,8.25,,,, +US-TX-76207,US,TX,76207,8.25,,,, +US-TX-76208,US,TX,76208,8.25,,,, +US-TX-76209,US,TX,76209,8.25,,,, +US-TX-76210,US,TX,76210,8.25,,,, +US-TX-76225,US,TX,76225,6.75,,,, +US-TX-76226,US,TX,76226,8.25,,,, +US-TX-76227,US,TX,76227,6.25,,,, +US-TX-76228,US,TX,76228,6.25,,,, +US-TX-76230,US,TX,76230,8.25,,,, +US-TX-76233,US,TX,76233,6.25,,,, +US-TX-76234,US,TX,76234,6.75,,,, +US-TX-76238,US,TX,76238,6.75,,,, +US-TX-76239,US,TX,76239,6.25,,,, +US-TX-76240,US,TX,76240,6.75,,,, +US-TX-76241,US,TX,76241,8.25,,,, +US-TX-76244,US,TX,76244,8.25,,,, +US-TX-76245,US,TX,76245,6.25,,,, +US-TX-76247,US,TX,76247,6.25,,,, +US-TX-76248,US,TX,76248,8.25,,,, +US-TX-76249,US,TX,76249,6.25,,,, +US-TX-76250,US,TX,76250,8.25,,,, +US-TX-76251,US,TX,76251,6.25,,,, +US-TX-76252,US,TX,76252,6.75,,,, +US-TX-76253,US,TX,76253,6.75,,,, +US-TX-76255,US,TX,76255,6.25,,,, +US-TX-76258,US,TX,76258,6.25,,,, +US-TX-76259,US,TX,76259,6.25,,,, +US-TX-76261,US,TX,76261,6.25,,,, +US-TX-76262,US,TX,76262,8.25,,,, +US-TX-76263,US,TX,76263,6.75,,,, +US-TX-76264,US,TX,76264,6.25,,,, +US-TX-76265,US,TX,76265,8.25,,,, +US-TX-76266,US,TX,76266,6.25,,,, +US-TX-76267,US,TX,76267,6.75,,,, +US-TX-76268,US,TX,76268,8.25,,,, +US-TX-76270,US,TX,76270,6.25,,,, +US-TX-76271,US,TX,76271,6.25,,,, +US-TX-76272,US,TX,76272,6.75,,,, +US-TX-76273,US,TX,76273,6.25,,,, +US-TX-76301,US,TX,76301,8.25,,,, +US-TX-76302,US,TX,76302,8.25,,,, +US-TX-76305,US,TX,76305,6.25,,,, +US-TX-76306,US,TX,76306,8.25,,,, +US-TX-76307,US,TX,76307,8.25,,,, +US-TX-76308,US,TX,76308,8.25,,,, +US-TX-76309,US,TX,76309,8.25,,,, +US-TX-76310,US,TX,76310,8.25,,,, +US-TX-76311,US,TX,76311,8.25,,,, +US-TX-76351,US,TX,76351,8.25,,,, +US-TX-76352,US,TX,76352,6.25,,,, +US-TX-76354,US,TX,76354,8.25,,,, +US-TX-76357,US,TX,76357,6.25,,,, +US-TX-76360,US,TX,76360,6.25,,,, +US-TX-76363,US,TX,76363,8.25,,,, +US-TX-76364,US,TX,76364,6.75,,,, +US-TX-76365,US,TX,76365,8.25,,,, +US-TX-76366,US,TX,76366,6.75,,,, +US-TX-76367,US,TX,76367,6.25,,,, +US-TX-76369,US,TX,76369,6.25,,,, +US-TX-76370,US,TX,76370,7.75,,,, +US-TX-76371,US,TX,76371,6.25,,,, +US-TX-76372,US,TX,76372,7.75,,,, +US-TX-76373,US,TX,76373,6.75,,,, +US-TX-76374,US,TX,76374,8.25,,,, +US-TX-76377,US,TX,76377,6.25,,,, +US-TX-76379,US,TX,76379,8.25,,,, +US-TX-76380,US,TX,76380,8.25,,,, +US-TX-76384,US,TX,76384,8.25,,,, +US-TX-76385,US,TX,76385,8.25,,,, +US-TX-76388,US,TX,76388,6.25,,,, +US-TX-76389,US,TX,76389,6.75,,,, +US-TX-76401,US,TX,76401,6.75,,,, +US-TX-76402,US,TX,76402,8.25,,,, +US-TX-76424,US,TX,76424,8.25,,,, +US-TX-76426,US,TX,76426,8.25,,,, +US-TX-76427,US,TX,76427,6.25,,,, +US-TX-76429,US,TX,76429,6.25,,,, +US-TX-76430,US,TX,76430,8.25,,,, +US-TX-76431,US,TX,76431,6.75,,,, +US-TX-76432,US,TX,76432,6.25,,,, +US-TX-76433,US,TX,76433,6.75,,,, +US-TX-76435,US,TX,76435,7.25,,,, +US-TX-76436,US,TX,76436,6.75,,,, +US-TX-76437,US,TX,76437,8.25,,,, +US-TX-76439,US,TX,76439,6.75,,,, +US-TX-76442,US,TX,76442,8.25,,,, +US-TX-76443,US,TX,76443,6.25,,,, +US-TX-76444,US,TX,76444,8.25,,,, +US-TX-76445,US,TX,76445,6.25,,,, +US-TX-76446,US,TX,76446,6.75,,,, +US-TX-76448,US,TX,76448,8.25,,,, +US-TX-76449,US,TX,76449,6.75,,,, +US-TX-76450,US,TX,76450,8.25,,,, +US-TX-76452,US,TX,76452,6.75,,,, +US-TX-76453,US,TX,76453,6.75,,,, +US-TX-76454,US,TX,76454,8.25,,,, +US-TX-76455,US,TX,76455,6.75,,,, +US-TX-76457,US,TX,76457,8.25,,,, +US-TX-76458,US,TX,76458,8.25,,,, +US-TX-76459,US,TX,76459,6.25,,,, +US-TX-76460,US,TX,76460,6.75,,,, +US-TX-76461,US,TX,76461,6.75,,,, +US-TX-76462,US,TX,76462,6.75,,,, +US-TX-76463,US,TX,76463,6.75,,,, +US-TX-76464,US,TX,76464,6.25,,,, +US-TX-76465,US,TX,76465,6.75,,,, +US-TX-76466,US,TX,76466,6.75,,,, +US-TX-76467,US,TX,76467,8.25,,,, +US-TX-76468,US,TX,76468,6.75,,,, +US-TX-76469,US,TX,76469,7.25,,,, +US-TX-76470,US,TX,76470,8.25,,,, +US-TX-76471,US,TX,76471,6.25,,,, +US-TX-76472,US,TX,76472,6.75,,,, +US-TX-76474,US,TX,76474,6.75,,,, +US-TX-76475,US,TX,76475,6.75,,,, +US-TX-76476,US,TX,76476,6.75,,,, +US-TX-76481,US,TX,76481,6.75,,,, +US-TX-76483,US,TX,76483,8.25,,,, +US-TX-76484,US,TX,76484,6.75,,,, +US-TX-76485,US,TX,76485,6.75,,,, +US-TX-76486,US,TX,76486,6.25,,,, +US-TX-76487,US,TX,76487,6.75,,,, +US-TX-76490,US,TX,76490,6.75,,,, +US-TX-76491,US,TX,76491,6.25,,,, +US-TX-76501,US,TX,76501,8.25,,,, +US-TX-76502,US,TX,76502,8.25,,,, +US-TX-76503,US,TX,76503,8.25,,,, +US-TX-76504,US,TX,76504,8.25,,,, +US-TX-76505,US,TX,76505,8.25,,,, +US-TX-76508,US,TX,76508,8.25,,,, +US-TX-76511,US,TX,76511,7.75,,,, +US-TX-76513,US,TX,76513,8.25,,,, +US-TX-76518,US,TX,76518,6.75,,,, +US-TX-76519,US,TX,76519,6.75,,,, +US-TX-76520,US,TX,76520,8.25,,,, +US-TX-76522,US,TX,76522,8.25,,,, +US-TX-76523,US,TX,76523,6.75,,,, +US-TX-76524,US,TX,76524,6.75,,,, +US-TX-76525,US,TX,76525,8.25,,,, +US-TX-76526,US,TX,76526,6.75,,,, +US-TX-76527,US,TX,76527,6.5,,,, +US-TX-76528,US,TX,76528,6.75,,,, +US-TX-76530,US,TX,76530,6.25,,,, +US-TX-76531,US,TX,76531,8.25,,,, +US-TX-76533,US,TX,76533,6.75,,,, +US-TX-76534,US,TX,76534,6.75,,,, +US-TX-76537,US,TX,76537,6.25,,,, +US-TX-76538,US,TX,76538,6.75,,,, +US-TX-76539,US,TX,76539,6.75,,,, +US-TX-76540,US,TX,76540,8.25,,,, +US-TX-76541,US,TX,76541,8.25,,,, +US-TX-76542,US,TX,76542,8.25,,,, +US-TX-76543,US,TX,76543,8.25,,,, +US-TX-76544,US,TX,76544,6.75,,,, +US-TX-76547,US,TX,76547,8.25,,,, +US-TX-76548,US,TX,76548,8.25,,,, +US-TX-76549,US,TX,76549,8.25,,,, +US-TX-76550,US,TX,76550,8.25,,,, +US-TX-76554,US,TX,76554,7.75,,,, +US-TX-76556,US,TX,76556,6.75,,,, +US-TX-76557,US,TX,76557,6.75,,,, +US-TX-76558,US,TX,76558,6.75,,,, +US-TX-76559,US,TX,76559,8.25,,,, +US-TX-76561,US,TX,76561,6.75,,,, +US-TX-76564,US,TX,76564,6.75,,,, +US-TX-76565,US,TX,76565,6.75,,,, +US-TX-76566,US,TX,76566,6.75,,,, +US-TX-76567,US,TX,76567,8.25,,,, +US-TX-76569,US,TX,76569,6.75,,,, +US-TX-76570,US,TX,76570,8.25,,,, +US-TX-76571,US,TX,76571,7.25,,,, +US-TX-76573,US,TX,76573,6.25,,,, +US-TX-76574,US,TX,76574,8.25,,,, +US-TX-76577,US,TX,76577,6.75,,,, +US-TX-76578,US,TX,76578,6.25,,,, +US-TX-76579,US,TX,76579,8.25,,,, +US-TX-76596,US,TX,76596,8.25,,,, +US-TX-76597,US,TX,76597,6.75,,,, +US-TX-76598,US,TX,76598,8.25,,,, +US-TX-76599,US,TX,76599,8.25,,,, +US-TX-76621,US,TX,76621,6.75,,,, +US-TX-76622,US,TX,76622,6.75,,,, +US-TX-76623,US,TX,76623,6.25,,,, +US-TX-76624,US,TX,76624,6.75,,,, +US-TX-76626,US,TX,76626,7.75,,,, +US-TX-76627,US,TX,76627,6.75,,,, +US-TX-76628,US,TX,76628,6.75,,,, +US-TX-76629,US,TX,76629,8.25,,,, +US-TX-76630,US,TX,76630,6.75,,,, +US-TX-76631,US,TX,76631,7.75,,,, +US-TX-76632,US,TX,76632,6.75,,,, +US-TX-76633,US,TX,76633,6.75,,,, +US-TX-76634,US,TX,76634,8.25,,,, +US-TX-76635,US,TX,76635,7.25,,,, +US-TX-76636,US,TX,76636,6.75,,,, +US-TX-76637,US,TX,76637,7.75,,,, +US-TX-76638,US,TX,76638,6.75,,,, +US-TX-76639,US,TX,76639,6.75,,,, +US-TX-76640,US,TX,76640,6.75,,,, +US-TX-76641,US,TX,76641,6.75,,,, +US-TX-76642,US,TX,76642,8.25,,,, +US-TX-76643,US,TX,76643,8.25,,,, +US-TX-76644,US,TX,76644,8.25,,,, +US-TX-76645,US,TX,76645,8.25,,,, +US-TX-76648,US,TX,76648,8.25,,,, +US-TX-76649,US,TX,76649,6.75,,,, +US-TX-76650,US,TX,76650,6.75,,,, +US-TX-76651,US,TX,76651,6.25,,,, +US-TX-76652,US,TX,76652,6.75,,,, +US-TX-76653,US,TX,76653,7.25,,,, +US-TX-76654,US,TX,76654,7.75,,,, +US-TX-76655,US,TX,76655,6.75,,,, +US-TX-76656,US,TX,76656,8.25,,,, +US-TX-76657,US,TX,76657,8.25,,,, +US-TX-76660,US,TX,76660,8.25,,,, +US-TX-76661,US,TX,76661,8.25,,,, +US-TX-76664,US,TX,76664,8,,,, +US-TX-76665,US,TX,76665,8.25,,,, +US-TX-76666,US,TX,76666,7.75,,,, +US-TX-76667,US,TX,76667,8.25,,,, +US-TX-76670,US,TX,76670,7.25,,,, +US-TX-76671,US,TX,76671,6.75,,,, +US-TX-76673,US,TX,76673,6.75,,,, +US-TX-76676,US,TX,76676,7.75,,,, +US-TX-76678,US,TX,76678,6.25,,,, +US-TX-76679,US,TX,76679,6.75,,,, +US-TX-76680,US,TX,76680,6.75,,,, +US-TX-76681,US,TX,76681,7.75,,,, +US-TX-76682,US,TX,76682,6.75,,,, +US-TX-76684,US,TX,76684,7.75,,,, +US-TX-76685,US,TX,76685,6.75,,,, +US-TX-76686,US,TX,76686,6.25,,,, +US-TX-76687,US,TX,76687,6.25,,,, +US-TX-76689,US,TX,76689,6.75,,,, +US-TX-76690,US,TX,76690,7.75,,,, +US-TX-76691,US,TX,76691,8.25,,,, +US-TX-76692,US,TX,76692,6.75,,,, +US-TX-76693,US,TX,76693,8.25,,,, +US-TX-76701,US,TX,76701,8.25,,,, +US-TX-76702,US,TX,76702,8.25,,,, +US-TX-76703,US,TX,76703,8.25,,,, +US-TX-76704,US,TX,76704,8.25,,,, +US-TX-76705,US,TX,76705,8.25,,,, +US-TX-76706,US,TX,76706,8.25,,,, +US-TX-76707,US,TX,76707,8.25,,,, +US-TX-76708,US,TX,76708,8.25,,,, +US-TX-76710,US,TX,76710,8.25,,,, +US-TX-76711,US,TX,76711,8.25,,,, +US-TX-76712,US,TX,76712,8.25,,,, +US-TX-76714,US,TX,76714,8.25,,,, +US-TX-76715,US,TX,76715,8.25,,,, +US-TX-76716,US,TX,76716,8.25,,,, +US-TX-76797,US,TX,76797,8.25,,,, +US-TX-76798,US,TX,76798,8.25,,,, +US-TX-76799,US,TX,76799,8.25,,,, +US-TX-76801,US,TX,76801,8.25,,,, +US-TX-76802,US,TX,76802,6.25,,,, +US-TX-76803,US,TX,76803,8.25,,,, +US-TX-76804,US,TX,76804,8.25,,,, +US-TX-76820,US,TX,76820,7.25,,,, +US-TX-76821,US,TX,76821,8.25,,,, +US-TX-76823,US,TX,76823,8.25,,,, +US-TX-76824,US,TX,76824,6.75,,,, +US-TX-76825,US,TX,76825,8.25,,,, +US-TX-76827,US,TX,76827,6.25,,,, +US-TX-76828,US,TX,76828,6.25,,,, +US-TX-76831,US,TX,76831,6.25,,,, +US-TX-76832,US,TX,76832,6.75,,,, +US-TX-76834,US,TX,76834,8.25,,,, +US-TX-76836,US,TX,76836,8.25,,,, +US-TX-76837,US,TX,76837,6.75,,,, +US-TX-76841,US,TX,76841,6.75,,,, +US-TX-76842,US,TX,76842,7.25,,,, +US-TX-76844,US,TX,76844,8.25,,,, +US-TX-76845,US,TX,76845,6.25,,,, +US-TX-76848,US,TX,76848,6.75,,,, +US-TX-76849,US,TX,76849,8.25,,,, +US-TX-76852,US,TX,76852,7,,,, +US-TX-76853,US,TX,76853,6.75,,,, +US-TX-76854,US,TX,76854,6.75,,,, +US-TX-76855,US,TX,76855,6.75,,,, +US-TX-76856,US,TX,76856,7.25,,,, +US-TX-76857,US,TX,76857,6.25,,,, +US-TX-76858,US,TX,76858,8,,,, +US-TX-76859,US,TX,76859,6.75,,,, +US-TX-76861,US,TX,76861,6.75,,,, +US-TX-76862,US,TX,76862,6.75,,,, +US-TX-76864,US,TX,76864,6.25,,,, +US-TX-76865,US,TX,76865,6.75,,,, +US-TX-76866,US,TX,76866,6.75,,,, +US-TX-76869,US,TX,76869,6.25,,,, +US-TX-76870,US,TX,76870,6.25,,,, +US-TX-76871,US,TX,76871,6.75,,,, +US-TX-76872,US,TX,76872,7,,,, +US-TX-76873,US,TX,76873,6.25,,,, +US-TX-76874,US,TX,76874,6.25,,,, +US-TX-76875,US,TX,76875,6.75,,,, +US-TX-76877,US,TX,76877,8.25,,,, +US-TX-76878,US,TX,76878,8.25,,,, +US-TX-76882,US,TX,76882,6.25,,,, +US-TX-76883,US,TX,76883,6.75,,,, +US-TX-76884,US,TX,76884,6.25,,,, +US-TX-76885,US,TX,76885,6.25,,,, +US-TX-76886,US,TX,76886,6.75,,,, +US-TX-76887,US,TX,76887,7,,,, +US-TX-76888,US,TX,76888,6.25,,,, +US-TX-76890,US,TX,76890,6.25,,,, +US-TX-76901,US,TX,76901,8.25,,,, +US-TX-76902,US,TX,76902,8.25,,,, +US-TX-76903,US,TX,76903,8.25,,,, +US-TX-76904,US,TX,76904,8.25,,,, +US-TX-76905,US,TX,76905,6.75,,,, +US-TX-76906,US,TX,76906,8.25,,,, +US-TX-76908,US,TX,76908,8.25,,,, +US-TX-76909,US,TX,76909,8.25,,,, +US-TX-76930,US,TX,76930,6.25,,,, +US-TX-76932,US,TX,76932,8.25,,,, +US-TX-76933,US,TX,76933,8.25,,,, +US-TX-76934,US,TX,76934,6.75,,,, +US-TX-76935,US,TX,76935,6.75,,,, +US-TX-76936,US,TX,76936,8.25,,,, +US-TX-76937,US,TX,76937,6.75,,,, +US-TX-76939,US,TX,76939,6.75,,,, +US-TX-76940,US,TX,76940,6.75,,,, +US-TX-76941,US,TX,76941,6.25,,,, +US-TX-76943,US,TX,76943,6.25,,,, +US-TX-76945,US,TX,76945,6.25,,,, +US-TX-76950,US,TX,76950,8,,,, +US-TX-76951,US,TX,76951,7.75,,,, +US-TX-76953,US,TX,76953,6.25,,,, +US-TX-76955,US,TX,76955,6.75,,,, +US-TX-76957,US,TX,76957,6.75,,,, +US-TX-76958,US,TX,76958,6.75,,,, +US-TX-77001,US,TX,77001,8.25,,,, +US-TX-77002,US,TX,77002,8.25,,,, +US-TX-77003,US,TX,77003,8.25,,,, +US-TX-77004,US,TX,77004,8.25,,,, +US-TX-77005,US,TX,77005,8.25,,,, +US-TX-77006,US,TX,77006,8.25,,,, +US-TX-77007,US,TX,77007,8.25,,,, +US-TX-77008,US,TX,77008,8.25,,,, +US-TX-77009,US,TX,77009,8.25,,,, +US-TX-77010,US,TX,77010,8.25,,,, +US-TX-77011,US,TX,77011,8.25,,,, +US-TX-77012,US,TX,77012,8.25,,,, +US-TX-77013,US,TX,77013,8.25,,,, +US-TX-77014,US,TX,77014,8.25,,,, +US-TX-77015,US,TX,77015,7.25,,,, +US-TX-77016,US,TX,77016,8.25,,,, +US-TX-77017,US,TX,77017,8.25,,,, +US-TX-77018,US,TX,77018,8.25,,,, +US-TX-77019,US,TX,77019,8.25,,,, +US-TX-77020,US,TX,77020,8.25,,,, +US-TX-77021,US,TX,77021,8.25,,,, +US-TX-77022,US,TX,77022,8.25,,,, +US-TX-77023,US,TX,77023,8.25,,,, +US-TX-77024,US,TX,77024,8.25,,,, +US-TX-77025,US,TX,77025,8.25,,,, +US-TX-77026,US,TX,77026,8.25,,,, +US-TX-77027,US,TX,77027,8.25,,,, +US-TX-77028,US,TX,77028,8.25,,,, +US-TX-77029,US,TX,77029,8.25,,,, +US-TX-77030,US,TX,77030,8.25,,,, +US-TX-77031,US,TX,77031,8.25,,,, +US-TX-77032,US,TX,77032,8.25,,,, +US-TX-77033,US,TX,77033,8.25,,,, +US-TX-77034,US,TX,77034,8.25,,,, +US-TX-77035,US,TX,77035,8.25,,,, +US-TX-77036,US,TX,77036,8.25,,,, +US-TX-77037,US,TX,77037,8.25,,,, +US-TX-77038,US,TX,77038,8.25,,,, +US-TX-77039,US,TX,77039,8.25,,,, +US-TX-77040,US,TX,77040,8.25,,,, +US-TX-77041,US,TX,77041,8.25,,,, +US-TX-77042,US,TX,77042,8.25,,,, +US-TX-77043,US,TX,77043,8.25,,,, +US-TX-77044,US,TX,77044,8.25,,,, +US-TX-77045,US,TX,77045,8.25,,,, +US-TX-77046,US,TX,77046,8.25,,,, +US-TX-77047,US,TX,77047,8.25,,,, +US-TX-77048,US,TX,77048,8.25,,,, +US-TX-77049,US,TX,77049,8.25,,,, +US-TX-77050,US,TX,77050,6.25,,,, +US-TX-77051,US,TX,77051,8.25,,,, +US-TX-77052,US,TX,77052,8.25,,,, +US-TX-77053,US,TX,77053,8.25,,,, +US-TX-77054,US,TX,77054,8.25,,,, +US-TX-77055,US,TX,77055,8.25,,,, +US-TX-77056,US,TX,77056,8.25,,,, +US-TX-77057,US,TX,77057,8.25,,,, +US-TX-77058,US,TX,77058,8.25,,,, +US-TX-77059,US,TX,77059,8.25,,,, +US-TX-77060,US,TX,77060,8.25,,,, +US-TX-77061,US,TX,77061,8.25,,,, +US-TX-77062,US,TX,77062,8.25,,,, +US-TX-77063,US,TX,77063,8.25,,,, +US-TX-77064,US,TX,77064,8.25,,,, +US-TX-77065,US,TX,77065,8.25,,,, +US-TX-77066,US,TX,77066,8.25,,,, +US-TX-77067,US,TX,77067,8.25,,,, +US-TX-77068,US,TX,77068,7.25,,,, +US-TX-77069,US,TX,77069,8.25,,,, +US-TX-77070,US,TX,77070,7.25,,,, +US-TX-77071,US,TX,77071,8.25,,,, +US-TX-77072,US,TX,77072,8.25,,,, +US-TX-77073,US,TX,77073,7.25,,,, +US-TX-77074,US,TX,77074,8.25,,,, +US-TX-77075,US,TX,77075,8.25,,,, +US-TX-77076,US,TX,77076,8.25,,,, +US-TX-77077,US,TX,77077,8.25,,,, +US-TX-77078,US,TX,77078,8.25,,,, +US-TX-77079,US,TX,77079,8.25,,,, +US-TX-77080,US,TX,77080,8.25,,,, +US-TX-77081,US,TX,77081,8.25,,,, +US-TX-77082,US,TX,77082,8.25,,,, +US-TX-77083,US,TX,77083,8.25,,,, +US-TX-77084,US,TX,77084,8.25,,,, +US-TX-77085,US,TX,77085,8.25,,,, +US-TX-77086,US,TX,77086,8.25,,,, +US-TX-77087,US,TX,77087,8.25,,,, +US-TX-77088,US,TX,77088,8.25,,,, +US-TX-77089,US,TX,77089,8.25,,,, +US-TX-77090,US,TX,77090,8.25,,,, +US-TX-77091,US,TX,77091,8.25,,,, +US-TX-77092,US,TX,77092,8.25,,,, +US-TX-77093,US,TX,77093,8.25,,,, +US-TX-77094,US,TX,77094,7.25,,,, +US-TX-77095,US,TX,77095,8.25,,,, +US-TX-77096,US,TX,77096,8.25,,,, +US-TX-77098,US,TX,77098,8.25,,,, +US-TX-77099,US,TX,77099,8.25,,,, +US-TX-77201,US,TX,77201,8.25,,,, +US-TX-77202,US,TX,77202,8.25,,,, +US-TX-77203,US,TX,77203,8.25,,,, +US-TX-77204,US,TX,77204,8.25,,,, +US-TX-77205,US,TX,77205,8.25,,,, +US-TX-77206,US,TX,77206,8.25,,,, +US-TX-77207,US,TX,77207,8.25,,,, +US-TX-77208,US,TX,77208,8.25,,,, +US-TX-77209,US,TX,77209,8.25,,,, +US-TX-77210,US,TX,77210,8.25,,,, +US-TX-77212,US,TX,77212,8.25,,,, +US-TX-77213,US,TX,77213,8.25,,,, +US-TX-77215,US,TX,77215,8.25,,,, +US-TX-77216,US,TX,77216,8.25,,,, +US-TX-77217,US,TX,77217,8.25,,,, +US-TX-77218,US,TX,77218,8.25,,,, +US-TX-77219,US,TX,77219,8.25,,,, +US-TX-77220,US,TX,77220,8.25,,,, +US-TX-77221,US,TX,77221,8.25,,,, +US-TX-77222,US,TX,77222,8.25,,,, +US-TX-77223,US,TX,77223,8.25,,,, +US-TX-77224,US,TX,77224,8.25,,,, +US-TX-77225,US,TX,77225,8.25,,,, +US-TX-77226,US,TX,77226,8.25,,,, +US-TX-77227,US,TX,77227,8.25,,,, +US-TX-77228,US,TX,77228,8.25,,,, +US-TX-77229,US,TX,77229,8.25,,,, +US-TX-77230,US,TX,77230,8.25,,,, +US-TX-77231,US,TX,77231,8.25,,,, +US-TX-77233,US,TX,77233,8.25,,,, +US-TX-77234,US,TX,77234,8.25,,,, +US-TX-77235,US,TX,77235,8.25,,,, +US-TX-77236,US,TX,77236,8.25,,,, +US-TX-77237,US,TX,77237,8.25,,,, +US-TX-77238,US,TX,77238,8.25,,,, +US-TX-77240,US,TX,77240,8.25,,,, +US-TX-77241,US,TX,77241,8.25,,,, +US-TX-77242,US,TX,77242,8.25,,,, +US-TX-77243,US,TX,77243,8.25,,,, +US-TX-77244,US,TX,77244,8.25,,,, +US-TX-77245,US,TX,77245,8.25,,,, +US-TX-77248,US,TX,77248,8.25,,,, +US-TX-77249,US,TX,77249,8.25,,,, +US-TX-77251,US,TX,77251,8.25,,,, +US-TX-77252,US,TX,77252,8.25,,,, +US-TX-77253,US,TX,77253,8.25,,,, +US-TX-77254,US,TX,77254,8.25,,,, +US-TX-77255,US,TX,77255,8.25,,,, +US-TX-77256,US,TX,77256,8.25,,,, +US-TX-77257,US,TX,77257,8.25,,,, +US-TX-77258,US,TX,77258,8.25,,,, +US-TX-77259,US,TX,77259,8.25,,,, +US-TX-77261,US,TX,77261,8.25,,,, +US-TX-77262,US,TX,77262,8.25,,,, +US-TX-77263,US,TX,77263,8.25,,,, +US-TX-77265,US,TX,77265,8.25,,,, +US-TX-77266,US,TX,77266,8.25,,,, +US-TX-77267,US,TX,77267,8.25,,,, +US-TX-77268,US,TX,77268,8.25,,,, +US-TX-77269,US,TX,77269,8.25,,,, +US-TX-77270,US,TX,77270,8.25,,,, +US-TX-77271,US,TX,77271,8.25,,,, +US-TX-77272,US,TX,77272,8.25,,,, +US-TX-77273,US,TX,77273,8.25,,,, +US-TX-77274,US,TX,77274,8.25,,,, +US-TX-77275,US,TX,77275,8.25,,,, +US-TX-77277,US,TX,77277,8.25,,,, +US-TX-77279,US,TX,77279,8.25,,,, +US-TX-77280,US,TX,77280,8.25,,,, +US-TX-77282,US,TX,77282,8.25,,,, +US-TX-77284,US,TX,77284,8.25,,,, +US-TX-77287,US,TX,77287,8.25,,,, +US-TX-77288,US,TX,77288,8.25,,,, +US-TX-77289,US,TX,77289,8.25,,,, +US-TX-77290,US,TX,77290,8.25,,,, +US-TX-77291,US,TX,77291,8.25,,,, +US-TX-77292,US,TX,77292,8.25,,,, +US-TX-77293,US,TX,77293,8.25,,,, +US-TX-77297,US,TX,77297,8.25,,,, +US-TX-77299,US,TX,77299,8.25,,,, +US-TX-77301,US,TX,77301,8.25,,,, +US-TX-77302,US,TX,77302,8.25,,,, +US-TX-77303,US,TX,77303,8.25,,,, +US-TX-77304,US,TX,77304,8.25,,,, +US-TX-77305,US,TX,77305,8.25,,,, +US-TX-77306,US,TX,77306,8.25,,,, +US-TX-77315,US,TX,77315,8.25,,,, +US-TX-77316,US,TX,77316,8.25,,,, +US-TX-77318,US,TX,77318,8.25,,,, +US-TX-77320,US,TX,77320,6.75,,,, +US-TX-77325,US,TX,77325,8.25,,,, +US-TX-77326,US,TX,77326,6.75,,,, +US-TX-77327,US,TX,77327,6.75,,,, +US-TX-77328,US,TX,77328,7.25,,,, +US-TX-77331,US,TX,77331,7.25,,,, +US-TX-77332,US,TX,77332,6.75,,,, +US-TX-77333,US,TX,77333,6.25,,,, +US-TX-77334,US,TX,77334,6.75,,,, +US-TX-77335,US,TX,77335,6.75,,,, +US-TX-77336,US,TX,77336,8.25,,,, +US-TX-77337,US,TX,77337,8.25,,,, +US-TX-77338,US,TX,77338,8.25,,,, +US-TX-77339,US,TX,77339,8.25,,,, +US-TX-77340,US,TX,77340,8.25,,,, +US-TX-77341,US,TX,77341,8.25,,,, +US-TX-77342,US,TX,77342,8.25,,,, +US-TX-77343,US,TX,77343,8.25,,,, +US-TX-77344,US,TX,77344,8.25,,,, +US-TX-77345,US,TX,77345,8.25,,,, +US-TX-77346,US,TX,77346,7.25,,,, +US-TX-77347,US,TX,77347,8.25,,,, +US-TX-77348,US,TX,77348,8.25,,,, +US-TX-77349,US,TX,77349,8.25,,,, +US-TX-77350,US,TX,77350,6.75,,,, +US-TX-77351,US,TX,77351,6.75,,,, +US-TX-77353,US,TX,77353,8.25,,,, +US-TX-77354,US,TX,77354,6.25,,,, +US-TX-77355,US,TX,77355,6.25,,,, +US-TX-77356,US,TX,77356,6.25,,,, +US-TX-77357,US,TX,77357,8.25,,,, +US-TX-77358,US,TX,77358,7.25,,,, +US-TX-77359,US,TX,77359,7.25,,,, +US-TX-77360,US,TX,77360,6.75,,,, +US-TX-77362,US,TX,77362,6.25,,,, +US-TX-77363,US,TX,77363,6.75,,,, +US-TX-77364,US,TX,77364,7.25,,,, +US-TX-77365,US,TX,77365,8.25,,,, +US-TX-77367,US,TX,77367,8.25,,,, +US-TX-77368,US,TX,77368,6.75,,,, +US-TX-77369,US,TX,77369,6.75,,,, +US-TX-77371,US,TX,77371,7.25,,,, +US-TX-77372,US,TX,77372,7.75,,,, +US-TX-77373,US,TX,77373,8.25,,,, +US-TX-77374,US,TX,77374,6.25,,,, +US-TX-77375,US,TX,77375,8.25,,,, +US-TX-77376,US,TX,77376,6.25,,,, +US-TX-77377,US,TX,77377,7.25,,,, +US-TX-77378,US,TX,77378,8.25,,,, +US-TX-77379,US,TX,77379,7.25,,,, +US-TX-77380,US,TX,77380,8.25,,,, +US-TX-77381,US,TX,77381,8.25,,,, +US-TX-77382,US,TX,77382,8.25,,,, +US-TX-77383,US,TX,77383,8.25,,,, +US-TX-77384,US,TX,77384,8.25,,,, +US-TX-77385,US,TX,77385,7.75,,,, +US-TX-77386,US,TX,77386,7.25,,,, +US-TX-77387,US,TX,77387,8.25,,,, +US-TX-77388,US,TX,77388,8.25,,,, +US-TX-77389,US,TX,77389,8.25,,,, +US-TX-77391,US,TX,77391,8.25,,,, +US-TX-77393,US,TX,77393,8.25,,,, +US-TX-77396,US,TX,77396,7.25,,,, +US-TX-77399,US,TX,77399,6.75,,,, +US-TX-77401,US,TX,77401,8.25,,,, +US-TX-77402,US,TX,77402,8.25,,,, +US-TX-77404,US,TX,77404,8.25,,,, +US-TX-77406,US,TX,77406,6.25,,,, +US-TX-77407,US,TX,77407,7.25,,,, +US-TX-77410,US,TX,77410,8.25,,,, +US-TX-77411,US,TX,77411,8.25,,,, +US-TX-77412,US,TX,77412,7.25,,,, +US-TX-77413,US,TX,77413,7.25,,,, +US-TX-77414,US,TX,77414,8.25,,,, +US-TX-77415,US,TX,77415,6.25,,,, +US-TX-77417,US,TX,77417,6.25,,,, +US-TX-77418,US,TX,77418,6.75,,,, +US-TX-77419,US,TX,77419,6.25,,,, +US-TX-77420,US,TX,77420,6.75,,,, +US-TX-77422,US,TX,77422,6.75,,,, +US-TX-77423,US,TX,77423,6.25,,,, +US-TX-77426,US,TX,77426,6.75,,,, +US-TX-77428,US,TX,77428,6.25,,,, +US-TX-77429,US,TX,77429,8.25,,,, +US-TX-77430,US,TX,77430,6.75,,,, +US-TX-77431,US,TX,77431,6.75,,,, +US-TX-77432,US,TX,77432,6.75,,,, +US-TX-77433,US,TX,77433,8.25,,,, +US-TX-77434,US,TX,77434,8.25,,,, +US-TX-77435,US,TX,77435,6.75,,,, +US-TX-77436,US,TX,77436,6.75,,,, +US-TX-77437,US,TX,77437,8.25,,,, +US-TX-77440,US,TX,77440,6.25,,,, +US-TX-77441,US,TX,77441,6.25,,,, +US-TX-77442,US,TX,77442,7.25,,,, +US-TX-77443,US,TX,77443,6.75,,,, +US-TX-77444,US,TX,77444,6.25,,,, +US-TX-77445,US,TX,77445,6.25,,,, +US-TX-77446,US,TX,77446,8.25,,,, +US-TX-77447,US,TX,77447,6.25,,,, +US-TX-77448,US,TX,77448,6.75,,,, +US-TX-77449,US,TX,77449,8.25,,,, +US-TX-77450,US,TX,77450,7.25,,,, +US-TX-77451,US,TX,77451,7.25,,,, +US-TX-77452,US,TX,77452,6.75,,,, +US-TX-77453,US,TX,77453,6.75,,,, +US-TX-77454,US,TX,77454,6.75,,,, +US-TX-77455,US,TX,77455,6.75,,,, +US-TX-77456,US,TX,77456,6.25,,,, +US-TX-77457,US,TX,77457,6.25,,,, +US-TX-77458,US,TX,77458,6.25,,,, +US-TX-77459,US,TX,77459,8.25,,,, +US-TX-77460,US,TX,77460,7.25,,,, +US-TX-77461,US,TX,77461,6.25,,,, +US-TX-77463,US,TX,77463,6.75,,,, +US-TX-77464,US,TX,77464,8.25,,,, +US-TX-77465,US,TX,77465,8.25,,,, +US-TX-77466,US,TX,77466,7.25,,,, +US-TX-77467,US,TX,77467,6.75,,,, +US-TX-77468,US,TX,77468,6.25,,,, +US-TX-77469,US,TX,77469,6.25,,,, +US-TX-77470,US,TX,77470,6.75,,,, +US-TX-77471,US,TX,77471,8.25,,,, +US-TX-77473,US,TX,77473,8.25,,,, +US-TX-77474,US,TX,77474,6.75,,,, +US-TX-77475,US,TX,77475,7.25,,,, +US-TX-77476,US,TX,77476,8.25,,,, +US-TX-77477,US,TX,77477,8.25,,,, +US-TX-77478,US,TX,77478,8.25,,,, +US-TX-77479,US,TX,77479,8.25,,,, +US-TX-77480,US,TX,77480,6.75,,,, +US-TX-77481,US,TX,77481,6.25,,,, +US-TX-77482,US,TX,77482,6.25,,,, +US-TX-77483,US,TX,77483,6.25,,,, +US-TX-77484,US,TX,77484,6.25,,,, +US-TX-77485,US,TX,77485,6.75,,,, +US-TX-77486,US,TX,77486,6.75,,,, +US-TX-77487,US,TX,77487,8.25,,,, +US-TX-77488,US,TX,77488,8.25,,,, +US-TX-77489,US,TX,77489,8.25,,,, +US-TX-77491,US,TX,77491,8.25,,,, +US-TX-77492,US,TX,77492,8.25,,,, +US-TX-77493,US,TX,77493,8.25,,,, +US-TX-77494,US,TX,77494,6.25,,,, +US-TX-77496,US,TX,77496,8.25,,,, +US-TX-77497,US,TX,77497,8.25,,,, +US-TX-77498,US,TX,77498,6.25,,,, +US-TX-77501,US,TX,77501,8.25,,,, +US-TX-77502,US,TX,77502,8.25,,,, +US-TX-77503,US,TX,77503,8.25,,,, +US-TX-77504,US,TX,77504,8.25,,,, +US-TX-77505,US,TX,77505,8.25,,,, +US-TX-77506,US,TX,77506,8.25,,,, +US-TX-77507,US,TX,77507,6.25,,,, +US-TX-77508,US,TX,77508,8.25,,,, +US-TX-77510,US,TX,77510,8.25,,,, +US-TX-77511,US,TX,77511,8.25,,,, +US-TX-77512,US,TX,77512,8.25,,,, +US-TX-77514,US,TX,77514,6.75,,,, +US-TX-77515,US,TX,77515,8.25,,,, +US-TX-77516,US,TX,77516,8.25,,,, +US-TX-77517,US,TX,77517,6.25,,,, +US-TX-77518,US,TX,77518,6.25,,,, +US-TX-77519,US,TX,77519,6.25,,,, +US-TX-77520,US,TX,77520,8.25,,,, +US-TX-77521,US,TX,77521,8.25,,,, +US-TX-77522,US,TX,77522,8.25,,,, +US-TX-77523,US,TX,77523,6.75,,,, +US-TX-77530,US,TX,77530,7.25,,,, +US-TX-77531,US,TX,77531,8.25,,,, +US-TX-77532,US,TX,77532,8.25,,,, +US-TX-77533,US,TX,77533,7.75,,,, +US-TX-77534,US,TX,77534,7.75,,,, +US-TX-77535,US,TX,77535,6.75,,,, +US-TX-77536,US,TX,77536,7.75,,,, +US-TX-77538,US,TX,77538,6.75,,,, +US-TX-77539,US,TX,77539,8.25,,,, +US-TX-77541,US,TX,77541,8.25,,,, +US-TX-77542,US,TX,77542,8.25,,,, +US-TX-77545,US,TX,77545,6.25,,,, +US-TX-77546,US,TX,77546,7.75,,,, +US-TX-77547,US,TX,77547,7.25,,,, +US-TX-77549,US,TX,77549,7.75,,,, +US-TX-77550,US,TX,77550,8.25,,,, +US-TX-77551,US,TX,77551,8.25,,,, +US-TX-77552,US,TX,77552,8.25,,,, +US-TX-77553,US,TX,77553,8.25,,,, +US-TX-77554,US,TX,77554,8.25,,,, +US-TX-77555,US,TX,77555,8.25,,,, +US-TX-77560,US,TX,77560,6.75,,,, +US-TX-77561,US,TX,77561,7.75,,,, +US-TX-77562,US,TX,77562,8.25,,,, +US-TX-77563,US,TX,77563,8.25,,,, +US-TX-77564,US,TX,77564,6.75,,,, +US-TX-77565,US,TX,77565,8.25,,,, +US-TX-77566,US,TX,77566,8.25,,,, +US-TX-77568,US,TX,77568,8.25,,,, +US-TX-77571,US,TX,77571,8.25,,,, +US-TX-77572,US,TX,77572,8.25,,,, +US-TX-77573,US,TX,77573,8,,,, +US-TX-77574,US,TX,77574,8,,,, +US-TX-77575,US,TX,77575,8.25,,,, +US-TX-77577,US,TX,77577,6.75,,,, +US-TX-77578,US,TX,77578,8.25,,,, +US-TX-77580,US,TX,77580,8.25,,,, +US-TX-77581,US,TX,77581,8.25,,,, +US-TX-77582,US,TX,77582,6.75,,,, +US-TX-77583,US,TX,77583,6.75,,,, +US-TX-77584,US,TX,77584,8.25,,,, +US-TX-77585,US,TX,77585,6.25,,,, +US-TX-77586,US,TX,77586,8.25,,,, +US-TX-77587,US,TX,77587,8.25,,,, +US-TX-77588,US,TX,77588,8.25,,,, +US-TX-77590,US,TX,77590,8.25,,,, +US-TX-77591,US,TX,77591,8.25,,,, +US-TX-77592,US,TX,77592,8.25,,,, +US-TX-77597,US,TX,77597,6.75,,,, +US-TX-77598,US,TX,77598,8.25,,,, +US-TX-77611,US,TX,77611,8.25,,,, +US-TX-77612,US,TX,77612,6.25,,,, +US-TX-77613,US,TX,77613,8.25,,,, +US-TX-77614,US,TX,77614,6.25,,,, +US-TX-77615,US,TX,77615,6.25,,,, +US-TX-77616,US,TX,77616,6.75,,,, +US-TX-77617,US,TX,77617,6.25,,,, +US-TX-77619,US,TX,77619,8.25,,,, +US-TX-77622,US,TX,77622,6.75,,,, +US-TX-77623,US,TX,77623,6.25,,,, +US-TX-77624,US,TX,77624,6.75,,,, +US-TX-77625,US,TX,77625,6.25,,,, +US-TX-77626,US,TX,77626,6.75,,,, +US-TX-77627,US,TX,77627,8.25,,,, +US-TX-77629,US,TX,77629,7.75,,,, +US-TX-77630,US,TX,77630,8.25,,,, +US-TX-77631,US,TX,77631,8.25,,,, +US-TX-77632,US,TX,77632,6.75,,,, +US-TX-77639,US,TX,77639,6.75,,,, +US-TX-77640,US,TX,77640,8.25,,,, +US-TX-77641,US,TX,77641,8.25,,,, +US-TX-77642,US,TX,77642,8.25,,,, +US-TX-77643,US,TX,77643,8.25,,,, +US-TX-77650,US,TX,77650,6.25,,,, +US-TX-77651,US,TX,77651,8.25,,,, +US-TX-77655,US,TX,77655,8.25,,,, +US-TX-77656,US,TX,77656,6.25,,,, +US-TX-77657,US,TX,77657,8.25,,,, +US-TX-77659,US,TX,77659,6.25,,,, +US-TX-77660,US,TX,77660,6.75,,,, +US-TX-77661,US,TX,77661,8.125,,,, +US-TX-77662,US,TX,77662,6.75,,,, +US-TX-77663,US,TX,77663,6.25,,,, +US-TX-77664,US,TX,77664,6.75,,,, +US-TX-77665,US,TX,77665,8.125,,,, +US-TX-77670,US,TX,77670,8.25,,,, +US-TX-77701,US,TX,77701,8.25,,,, +US-TX-77702,US,TX,77702,8.25,,,, +US-TX-77703,US,TX,77703,8.25,,,, +US-TX-77704,US,TX,77704,8.25,,,, +US-TX-77705,US,TX,77705,8.25,,,, +US-TX-77706,US,TX,77706,8.25,,,, +US-TX-77707,US,TX,77707,8.25,,,, +US-TX-77708,US,TX,77708,8.25,,,, +US-TX-77709,US,TX,77709,8.25,,,, +US-TX-77710,US,TX,77710,8.25,,,, +US-TX-77713,US,TX,77713,6.75,,,, +US-TX-77720,US,TX,77720,8.25,,,, +US-TX-77725,US,TX,77725,8.25,,,, +US-TX-77726,US,TX,77726,8.25,,,, +US-TX-77801,US,TX,77801,8.25,,,, +US-TX-77802,US,TX,77802,8.25,,,, +US-TX-77803,US,TX,77803,8.25,,,, +US-TX-77805,US,TX,77805,8.25,,,, +US-TX-77806,US,TX,77806,8.25,,,, +US-TX-77807,US,TX,77807,6.75,,,, +US-TX-77808,US,TX,77808,6.75,,,, +US-TX-77830,US,TX,77830,6.75,,,, +US-TX-77831,US,TX,77831,6.75,,,, +US-TX-77833,US,TX,77833,6.75,,,, +US-TX-77834,US,TX,77834,8.25,,,, +US-TX-77835,US,TX,77835,6.75,,,, +US-TX-77836,US,TX,77836,6.75,,,, +US-TX-77837,US,TX,77837,6.25,,,, +US-TX-77838,US,TX,77838,6.75,,,, +US-TX-77840,US,TX,77840,8.25,,,, +US-TX-77841,US,TX,77841,8.25,,,, +US-TX-77842,US,TX,77842,8.25,,,, +US-TX-77843,US,TX,77843,8.25,,,, +US-TX-77844,US,TX,77844,8.25,,,, +US-TX-77845,US,TX,77845,8.25,,,, +US-TX-77850,US,TX,77850,6.75,,,, +US-TX-77852,US,TX,77852,6.75,,,, +US-TX-77853,US,TX,77853,6.75,,,, +US-TX-77855,US,TX,77855,6.75,,,, +US-TX-77856,US,TX,77856,6.25,,,, +US-TX-77857,US,TX,77857,6.75,,,, +US-TX-77859,US,TX,77859,8.25,,,, +US-TX-77861,US,TX,77861,6.75,,,, +US-TX-77862,US,TX,77862,7.75,,,, +US-TX-77863,US,TX,77863,6.75,,,, +US-TX-77864,US,TX,77864,6.75,,,, +US-TX-77865,US,TX,77865,6.75,,,, +US-TX-77866,US,TX,77866,6.75,,,, +US-TX-77867,US,TX,77867,6.25,,,, +US-TX-77868,US,TX,77868,6.75,,,, +US-TX-77870,US,TX,77870,6.25,,,, +US-TX-77871,US,TX,77871,6.75,,,, +US-TX-77872,US,TX,77872,6.75,,,, +US-TX-77873,US,TX,77873,6.25,,,, +US-TX-77875,US,TX,77875,8,,,, +US-TX-77876,US,TX,77876,6.75,,,, +US-TX-77878,US,TX,77878,8.25,,,, +US-TX-77879,US,TX,77879,6.75,,,, +US-TX-77880,US,TX,77880,6.75,,,, +US-TX-77881,US,TX,77881,8.25,,,, +US-TX-77882,US,TX,77882,6.25,,,, +US-TX-77901,US,TX,77901,8.25,,,, +US-TX-77902,US,TX,77902,8.25,,,, +US-TX-77903,US,TX,77903,8.25,,,, +US-TX-77904,US,TX,77904,8.25,,,, +US-TX-77905,US,TX,77905,6.75,,,, +US-TX-77950,US,TX,77950,7.25,,,, +US-TX-77951,US,TX,77951,6.75,,,, +US-TX-77954,US,TX,77954,8.25,,,, +US-TX-77957,US,TX,77957,8.25,,,, +US-TX-77960,US,TX,77960,6.25,,,, +US-TX-77961,US,TX,77961,7.75,,,, +US-TX-77962,US,TX,77962,6.75,,,, +US-TX-77963,US,TX,77963,6.25,,,, +US-TX-77964,US,TX,77964,6.25,,,, +US-TX-77967,US,TX,77967,8.25,,,, +US-TX-77968,US,TX,77968,6.75,,,, +US-TX-77969,US,TX,77969,6.75,,,, +US-TX-77970,US,TX,77970,7.75,,,, +US-TX-77971,US,TX,77971,6.75,,,, +US-TX-77973,US,TX,77973,6.75,,,, +US-TX-77974,US,TX,77974,6.25,,,, +US-TX-77975,US,TX,77975,6.25,,,, +US-TX-77976,US,TX,77976,6.75,,,, +US-TX-77977,US,TX,77977,6.75,,,, +US-TX-77978,US,TX,77978,8.25,,,, +US-TX-77979,US,TX,77979,8.25,,,, +US-TX-77982,US,TX,77982,6.75,,,, +US-TX-77983,US,TX,77983,8.25,,,, +US-TX-77984,US,TX,77984,6.25,,,, +US-TX-77986,US,TX,77986,6.25,,,, +US-TX-77987,US,TX,77987,6.25,,,, +US-TX-77988,US,TX,77988,6.75,,,, +US-TX-77989,US,TX,77989,6.25,,,, +US-TX-77990,US,TX,77990,6.25,,,, +US-TX-77991,US,TX,77991,6.75,,,, +US-TX-77993,US,TX,77993,6.25,,,, +US-TX-77994,US,TX,77994,6.25,,,, +US-TX-77995,US,TX,77995,6.25,,,, +US-TX-78001,US,TX,78001,8.25,,,, +US-TX-78002,US,TX,78002,6.75,,,, +US-TX-78003,US,TX,78003,6.75,,,, +US-TX-78004,US,TX,78004,6.75,,,, +US-TX-78005,US,TX,78005,6.75,,,, +US-TX-78006,US,TX,78006,6.75,,,, +US-TX-78007,US,TX,78007,6.25,,,, +US-TX-78008,US,TX,78008,6.75,,,, +US-TX-78009,US,TX,78009,8.25,,,, +US-TX-78010,US,TX,78010,6.75,,,, +US-TX-78011,US,TX,78011,6.75,,,, +US-TX-78012,US,TX,78012,6.75,,,, +US-TX-78013,US,TX,78013,6.75,,,, +US-TX-78014,US,TX,78014,8.25,,,, +US-TX-78015,US,TX,78015,8.25,,,, +US-TX-78016,US,TX,78016,6.75,,,, +US-TX-78017,US,TX,78017,8.25,,,, +US-TX-78019,US,TX,78019,8.25,,,, +US-TX-78021,US,TX,78021,6.25,,,, +US-TX-78022,US,TX,78022,6.75,,,, +US-TX-78023,US,TX,78023,7.75,,,, +US-TX-78024,US,TX,78024,6.75,,,, +US-TX-78025,US,TX,78025,6.75,,,, +US-TX-78026,US,TX,78026,8.25,,,, +US-TX-78027,US,TX,78027,6.75,,,, +US-TX-78028,US,TX,78028,8.25,,,, +US-TX-78029,US,TX,78029,8.25,,,, +US-TX-78039,US,TX,78039,6.75,,,, +US-TX-78040,US,TX,78040,8.25,,,, +US-TX-78041,US,TX,78041,8.25,,,, +US-TX-78042,US,TX,78042,8.25,,,, +US-TX-78043,US,TX,78043,8.25,,,, +US-TX-78044,US,TX,78044,8.25,,,, +US-TX-78045,US,TX,78045,8.25,,,, +US-TX-78046,US,TX,78046,8.25,,,, +US-TX-78049,US,TX,78049,8.25,,,, +US-TX-78050,US,TX,78050,6.75,,,, +US-TX-78052,US,TX,78052,6.75,,,, +US-TX-78054,US,TX,78054,6.75,,,, +US-TX-78055,US,TX,78055,6.75,,,, +US-TX-78056,US,TX,78056,6.75,,,, +US-TX-78057,US,TX,78057,6.75,,,, +US-TX-78058,US,TX,78058,6.75,,,, +US-TX-78059,US,TX,78059,6.75,,,, +US-TX-78061,US,TX,78061,8.25,,,, +US-TX-78062,US,TX,78062,6.75,,,, +US-TX-78063,US,TX,78063,6.75,,,, +US-TX-78064,US,TX,78064,8.25,,,, +US-TX-78065,US,TX,78065,6.75,,,, +US-TX-78066,US,TX,78066,6.75,,,, +US-TX-78067,US,TX,78067,6.25,,,, +US-TX-78069,US,TX,78069,6.75,,,, +US-TX-78070,US,TX,78070,8.25,,,, +US-TX-78071,US,TX,78071,6.75,,,, +US-TX-78072,US,TX,78072,6.25,,,, +US-TX-78073,US,TX,78073,6.75,,,, +US-TX-78074,US,TX,78074,6.75,,,, +US-TX-78075,US,TX,78075,6.75,,,, +US-TX-78076,US,TX,78076,6.25,,,, +US-TX-78101,US,TX,78101,6.75,,,, +US-TX-78102,US,TX,78102,8.25,,,, +US-TX-78104,US,TX,78104,8.25,,,, +US-TX-78107,US,TX,78107,6.25,,,, +US-TX-78108,US,TX,78108,8.25,,,, +US-TX-78109,US,TX,78109,8.25,,,, +US-TX-78111,US,TX,78111,6.75,,,, +US-TX-78112,US,TX,78112,6.75,,,, +US-TX-78113,US,TX,78113,6.75,,,, +US-TX-78114,US,TX,78114,6.25,,,, +US-TX-78115,US,TX,78115,8.25,,,, +US-TX-78116,US,TX,78116,6.75,,,, +US-TX-78117,US,TX,78117,6.75,,,, +US-TX-78118,US,TX,78118,8.25,,,, +US-TX-78119,US,TX,78119,8.25,,,, +US-TX-78121,US,TX,78121,6.25,,,, +US-TX-78122,US,TX,78122,6.75,,,, +US-TX-78123,US,TX,78123,6.75,,,, +US-TX-78124,US,TX,78124,6.75,,,, +US-TX-78125,US,TX,78125,6.75,,,, +US-TX-78130,US,TX,78130,8.25,,,, +US-TX-78131,US,TX,78131,8.25,,,, +US-TX-78132,US,TX,78132,6.75,,,, +US-TX-78133,US,TX,78133,8.25,,,, +US-TX-78135,US,TX,78135,8.25,,,, +US-TX-78140,US,TX,78140,8.25,,,, +US-TX-78141,US,TX,78141,6.25,,,, +US-TX-78142,US,TX,78142,6.75,,,, +US-TX-78143,US,TX,78143,6.25,,,, +US-TX-78144,US,TX,78144,6.75,,,, +US-TX-78145,US,TX,78145,6.75,,,, +US-TX-78146,US,TX,78146,6.75,,,, +US-TX-78147,US,TX,78147,8,,,, +US-TX-78148,US,TX,78148,8.25,,,, +US-TX-78150,US,TX,78150,6.75,,,, +US-TX-78151,US,TX,78151,6.75,,,, +US-TX-78152,US,TX,78152,7.75,,,, +US-TX-78154,US,TX,78154,8.25,,,, +US-TX-78155,US,TX,78155,8.25,,,, +US-TX-78156,US,TX,78156,8.25,,,, +US-TX-78159,US,TX,78159,6.75,,,, +US-TX-78160,US,TX,78160,6.25,,,, +US-TX-78161,US,TX,78161,6.25,,,, +US-TX-78162,US,TX,78162,6.75,,,, +US-TX-78163,US,TX,78163,8.25,,,, +US-TX-78164,US,TX,78164,6.25,,,, +US-TX-78201,US,TX,78201,8.25,,,, +US-TX-78202,US,TX,78202,8.25,,,, +US-TX-78203,US,TX,78203,8.25,,,, +US-TX-78204,US,TX,78204,8.25,,,, +US-TX-78205,US,TX,78205,8.25,,,, +US-TX-78206,US,TX,78206,8.25,,,, +US-TX-78207,US,TX,78207,8.25,,,, +US-TX-78208,US,TX,78208,8.25,,,, +US-TX-78209,US,TX,78209,8.25,,,, +US-TX-78210,US,TX,78210,8.25,,,, +US-TX-78211,US,TX,78211,8.25,,,, +US-TX-78212,US,TX,78212,8.25,,,, +US-TX-78213,US,TX,78213,8.25,,,, +US-TX-78214,US,TX,78214,8.25,,,, +US-TX-78215,US,TX,78215,8.25,,,, +US-TX-78216,US,TX,78216,8.25,,,, +US-TX-78217,US,TX,78217,8.25,,,, +US-TX-78218,US,TX,78218,8.25,,,, +US-TX-78219,US,TX,78219,8.25,,,, +US-TX-78220,US,TX,78220,8.25,,,, +US-TX-78221,US,TX,78221,8.25,,,, +US-TX-78222,US,TX,78222,8.25,,,, +US-TX-78223,US,TX,78223,8.25,,,, +US-TX-78224,US,TX,78224,8.25,,,, +US-TX-78225,US,TX,78225,8.25,,,, +US-TX-78226,US,TX,78226,8.25,,,, +US-TX-78227,US,TX,78227,8.25,,,, +US-TX-78228,US,TX,78228,8.25,,,, +US-TX-78229,US,TX,78229,8.25,,,, +US-TX-78230,US,TX,78230,8.25,,,, +US-TX-78231,US,TX,78231,8.25,,,, +US-TX-78232,US,TX,78232,8.25,,,, +US-TX-78233,US,TX,78233,8.25,,,, +US-TX-78234,US,TX,78234,8.25,,,, +US-TX-78235,US,TX,78235,8.25,,,, +US-TX-78236,US,TX,78236,6.75,,,, +US-TX-78237,US,TX,78237,8.25,,,, +US-TX-78238,US,TX,78238,8.25,,,, +US-TX-78239,US,TX,78239,6.75,,,, +US-TX-78240,US,TX,78240,8.25,,,, +US-TX-78241,US,TX,78241,8.25,,,, +US-TX-78242,US,TX,78242,8.25,,,, +US-TX-78243,US,TX,78243,6.75,,,, +US-TX-78244,US,TX,78244,6.75,,,, +US-TX-78245,US,TX,78245,8.25,,,, +US-TX-78246,US,TX,78246,8.25,,,, +US-TX-78247,US,TX,78247,8.25,,,, +US-TX-78248,US,TX,78248,8.25,,,, +US-TX-78249,US,TX,78249,8.25,,,, +US-TX-78250,US,TX,78250,8.25,,,, +US-TX-78251,US,TX,78251,8.25,,,, +US-TX-78252,US,TX,78252,6.75,,,, +US-TX-78253,US,TX,78253,6.75,,,, +US-TX-78254,US,TX,78254,8.25,,,, +US-TX-78255,US,TX,78255,6.75,,,, +US-TX-78256,US,TX,78256,8.25,,,, +US-TX-78257,US,TX,78257,8.25,,,, +US-TX-78258,US,TX,78258,8.25,,,, +US-TX-78259,US,TX,78259,8.25,,,, +US-TX-78260,US,TX,78260,8.25,,,, +US-TX-78261,US,TX,78261,6.75,,,, +US-TX-78263,US,TX,78263,6.75,,,, +US-TX-78264,US,TX,78264,6.75,,,, +US-TX-78265,US,TX,78265,8.25,,,, +US-TX-78266,US,TX,78266,7.25,,,, +US-TX-78268,US,TX,78268,8.125,,,, +US-TX-78269,US,TX,78269,8.25,,,, +US-TX-78270,US,TX,78270,8.25,,,, +US-TX-78278,US,TX,78278,8.25,,,, +US-TX-78279,US,TX,78279,8.25,,,, +US-TX-78280,US,TX,78280,8.25,,,, +US-TX-78283,US,TX,78283,8.25,,,, +US-TX-78284,US,TX,78284,8.25,,,, +US-TX-78285,US,TX,78285,8.25,,,, +US-TX-78288,US,TX,78288,8.25,,,, +US-TX-78289,US,TX,78289,8.25,,,, +US-TX-78291,US,TX,78291,8.25,,,, +US-TX-78292,US,TX,78292,8.25,,,, +US-TX-78293,US,TX,78293,8.25,,,, +US-TX-78294,US,TX,78294,8.25,,,, +US-TX-78295,US,TX,78295,8.25,,,, +US-TX-78296,US,TX,78296,8.25,,,, +US-TX-78297,US,TX,78297,8.25,,,, +US-TX-78298,US,TX,78298,8.25,,,, +US-TX-78299,US,TX,78299,8.25,,,, +US-TX-78330,US,TX,78330,7.75,,,, +US-TX-78332,US,TX,78332,8.25,,,, +US-TX-78333,US,TX,78333,8.25,,,, +US-TX-78335,US,TX,78335,8.25,,,, +US-TX-78336,US,TX,78336,8.25,,,, +US-TX-78338,US,TX,78338,6.25,,,, +US-TX-78339,US,TX,78339,6.75,,,, +US-TX-78340,US,TX,78340,7.25,,,, +US-TX-78341,US,TX,78341,7.25,,,, +US-TX-78342,US,TX,78342,8.25,,,, +US-TX-78343,US,TX,78343,8.25,,,, +US-TX-78344,US,TX,78344,6.75,,,, +US-TX-78347,US,TX,78347,6.75,,,, +US-TX-78349,US,TX,78349,6.25,,,, +US-TX-78350,US,TX,78350,8.25,,,, +US-TX-78351,US,TX,78351,8.25,,,, +US-TX-78352,US,TX,78352,6.25,,,, +US-TX-78353,US,TX,78353,6.75,,,, +US-TX-78355,US,TX,78355,8.25,,,, +US-TX-78357,US,TX,78357,8.25,,,, +US-TX-78358,US,TX,78358,8.25,,,, +US-TX-78359,US,TX,78359,8.25,,,, +US-TX-78360,US,TX,78360,8.25,,,, +US-TX-78361,US,TX,78361,8.25,,,, +US-TX-78362,US,TX,78362,8.25,,,, +US-TX-78363,US,TX,78363,8.25,,,, +US-TX-78364,US,TX,78364,8.25,,,, +US-TX-78368,US,TX,78368,8.25,,,, +US-TX-78369,US,TX,78369,6.75,,,, +US-TX-78370,US,TX,78370,6.25,,,, +US-TX-78371,US,TX,78371,6.75,,,, +US-TX-78372,US,TX,78372,6.75,,,, +US-TX-78373,US,TX,78373,8.25,,,, +US-TX-78374,US,TX,78374,8.25,,,, +US-TX-78375,US,TX,78375,6.75,,,, +US-TX-78376,US,TX,78376,6.25,,,, +US-TX-78377,US,TX,78377,8.25,,,, +US-TX-78379,US,TX,78379,6.75,,,, +US-TX-78380,US,TX,78380,6.75,,,, +US-TX-78381,US,TX,78381,8.25,,,, +US-TX-78382,US,TX,78382,8.25,,,, +US-TX-78383,US,TX,78383,6.75,,,, +US-TX-78384,US,TX,78384,8.25,,,, +US-TX-78385,US,TX,78385,6.25,,,, +US-TX-78387,US,TX,78387,8.25,,,, +US-TX-78389,US,TX,78389,6.75,,,, +US-TX-78390,US,TX,78390,8,,,, +US-TX-78391,US,TX,78391,6.75,,,, +US-TX-78393,US,TX,78393,6.25,,,, +US-TX-78401,US,TX,78401,8.25,,,, +US-TX-78402,US,TX,78402,8.25,,,, +US-TX-78403,US,TX,78403,8.25,,,, +US-TX-78404,US,TX,78404,8.25,,,, +US-TX-78405,US,TX,78405,8.25,,,, +US-TX-78406,US,TX,78406,8.25,,,, +US-TX-78407,US,TX,78407,8.25,,,, +US-TX-78408,US,TX,78408,8.25,,,, +US-TX-78409,US,TX,78409,8.25,,,, +US-TX-78410,US,TX,78410,8.25,,,, +US-TX-78411,US,TX,78411,8.25,,,, +US-TX-78412,US,TX,78412,8.25,,,, +US-TX-78413,US,TX,78413,8.25,,,, +US-TX-78414,US,TX,78414,8.25,,,, +US-TX-78415,US,TX,78415,8.25,,,, +US-TX-78416,US,TX,78416,8.25,,,, +US-TX-78417,US,TX,78417,8.25,,,, +US-TX-78418,US,TX,78418,8.25,,,, +US-TX-78419,US,TX,78419,8.25,,,, +US-TX-78426,US,TX,78426,8.25,,,, +US-TX-78427,US,TX,78427,8.25,,,, +US-TX-78460,US,TX,78460,8.25,,,, +US-TX-78463,US,TX,78463,8.25,,,, +US-TX-78465,US,TX,78465,8.25,,,, +US-TX-78466,US,TX,78466,8.25,,,, +US-TX-78467,US,TX,78467,8.25,,,, +US-TX-78468,US,TX,78468,8.25,,,, +US-TX-78469,US,TX,78469,8.25,,,, +US-TX-78472,US,TX,78472,8.25,,,, +US-TX-78480,US,TX,78480,8.25,,,, +US-TX-78501,US,TX,78501,8.25,,,, +US-TX-78502,US,TX,78502,8.25,,,, +US-TX-78503,US,TX,78503,8.25,,,, +US-TX-78504,US,TX,78504,8.25,,,, +US-TX-78505,US,TX,78505,8.25,,,, +US-TX-78516,US,TX,78516,8.25,,,, +US-TX-78520,US,TX,78520,8.25,,,, +US-TX-78521,US,TX,78521,8.25,,,, +US-TX-78522,US,TX,78522,8.25,,,, +US-TX-78523,US,TX,78523,8.25,,,, +US-TX-78526,US,TX,78526,8.25,,,, +US-TX-78535,US,TX,78535,7.5,,,, +US-TX-78536,US,TX,78536,6.25,,,, +US-TX-78537,US,TX,78537,6.25,,,, +US-TX-78538,US,TX,78538,6.25,,,, +US-TX-78539,US,TX,78539,8.25,,,, +US-TX-78540,US,TX,78540,8.25,,,, +US-TX-78541,US,TX,78541,8.25,,,, +US-TX-78542,US,TX,78542,6.25,,,, +US-TX-78543,US,TX,78543,6.25,,,, +US-TX-78545,US,TX,78545,6.25,,,, +US-TX-78547,US,TX,78547,6.25,,,, +US-TX-78548,US,TX,78548,7.25,,,, +US-TX-78549,US,TX,78549,6.25,,,, +US-TX-78550,US,TX,78550,8.25,,,, +US-TX-78551,US,TX,78551,8.25,,,, +US-TX-78552,US,TX,78552,8.25,,,, +US-TX-78553,US,TX,78553,8.25,,,, +US-TX-78557,US,TX,78557,8.25,,,, +US-TX-78558,US,TX,78558,6.25,,,, +US-TX-78559,US,TX,78559,8.25,,,, +US-TX-78560,US,TX,78560,8.25,,,, +US-TX-78561,US,TX,78561,6.25,,,, +US-TX-78562,US,TX,78562,7.25,,,, +US-TX-78563,US,TX,78563,6.25,,,, +US-TX-78564,US,TX,78564,6.25,,,, +US-TX-78565,US,TX,78565,6.25,,,, +US-TX-78566,US,TX,78566,6.25,,,, +US-TX-78567,US,TX,78567,7.25,,,, +US-TX-78568,US,TX,78568,6.25,,,, +US-TX-78569,US,TX,78569,6.25,,,, +US-TX-78570,US,TX,78570,8.25,,,, +US-TX-78572,US,TX,78572,8.25,,,, +US-TX-78573,US,TX,78573,8.25,,,, +US-TX-78574,US,TX,78574,6.25,,,, +US-TX-78575,US,TX,78575,7.25,,,, +US-TX-78576,US,TX,78576,6.25,,,, +US-TX-78577,US,TX,78577,8.25,,,, +US-TX-78578,US,TX,78578,8.25,,,, +US-TX-78579,US,TX,78579,8,,,, +US-TX-78580,US,TX,78580,8.25,,,, +US-TX-78582,US,TX,78582,8.25,,,, +US-TX-78583,US,TX,78583,6.25,,,, +US-TX-78584,US,TX,78584,8.25,,,, +US-TX-78585,US,TX,78585,6.25,,,, +US-TX-78586,US,TX,78586,8.25,,,, +US-TX-78588,US,TX,78588,6.25,,,, +US-TX-78589,US,TX,78589,8.25,,,, +US-TX-78590,US,TX,78590,6.25,,,, +US-TX-78591,US,TX,78591,6.25,,,, +US-TX-78592,US,TX,78592,6.25,,,, +US-TX-78593,US,TX,78593,6.25,,,, +US-TX-78594,US,TX,78594,6.25,,,, +US-TX-78595,US,TX,78595,6.25,,,, +US-TX-78596,US,TX,78596,8.25,,,, +US-TX-78597,US,TX,78597,8.25,,,, +US-TX-78598,US,TX,78598,6.25,,,, +US-TX-78599,US,TX,78599,8.25,,,, +US-TX-78602,US,TX,78602,6.75,,,, +US-TX-78604,US,TX,78604,8.25,,,, +US-TX-78605,US,TX,78605,6.25,,,, +US-TX-78606,US,TX,78606,7.25,,,, +US-TX-78607,US,TX,78607,6.25,,,, +US-TX-78608,US,TX,78608,6.25,,,, +US-TX-78609,US,TX,78609,6.25,,,, +US-TX-78610,US,TX,78610,8.25,,,, +US-TX-78611,US,TX,78611,6.25,,,, +US-TX-78612,US,TX,78612,6.75,,,, +US-TX-78613,US,TX,78613,8.25,,,, +US-TX-78614,US,TX,78614,6.75,,,, +US-TX-78615,US,TX,78615,6.25,,,, +US-TX-78616,US,TX,78616,6.75,,,, +US-TX-78617,US,TX,78617,8.25,,,, +US-TX-78618,US,TX,78618,6.75,,,, +US-TX-78619,US,TX,78619,7,,,, +US-TX-78620,US,TX,78620,7,,,, +US-TX-78621,US,TX,78621,6.75,,,, +US-TX-78622,US,TX,78622,6.75,,,, +US-TX-78623,US,TX,78623,8.25,,,, +US-TX-78624,US,TX,78624,6.75,,,, +US-TX-78626,US,TX,78626,8.25,,,, +US-TX-78627,US,TX,78627,8.25,,,, +US-TX-78628,US,TX,78628,8.25,,,, +US-TX-78629,US,TX,78629,8.25,,,, +US-TX-78630,US,TX,78630,8.25,,,, +US-TX-78631,US,TX,78631,6.75,,,, +US-TX-78632,US,TX,78632,6.75,,,, +US-TX-78633,US,TX,78633,8.25,,,, +US-TX-78634,US,TX,78634,6.25,,,, +US-TX-78635,US,TX,78635,7.25,,,, +US-TX-78636,US,TX,78636,7.25,,,, +US-TX-78638,US,TX,78638,6.75,,,, +US-TX-78639,US,TX,78639,6.25,,,, +US-TX-78640,US,TX,78640,8.25,,,, +US-TX-78641,US,TX,78641,8.25,,,, +US-TX-78642,US,TX,78642,6.5,,,, +US-TX-78643,US,TX,78643,8.25,,,, +US-TX-78644,US,TX,78644,8.25,,,, +US-TX-78645,US,TX,78645,8.25,,,, +US-TX-78646,US,TX,78646,8.25,,,, +US-TX-78648,US,TX,78648,8.25,,,, +US-TX-78650,US,TX,78650,6.75,,,, +US-TX-78651,US,TX,78651,8.25,,,, +US-TX-78652,US,TX,78652,8.25,,,, +US-TX-78653,US,TX,78653,8.25,,,, +US-TX-78654,US,TX,78654,8.25,,,, +US-TX-78655,US,TX,78655,8,,,, +US-TX-78656,US,TX,78656,6.75,,,, +US-TX-78657,US,TX,78657,8,,,, +US-TX-78658,US,TX,78658,8.25,,,, +US-TX-78659,US,TX,78659,6.75,,,, +US-TX-78660,US,TX,78660,8.25,,,, +US-TX-78661,US,TX,78661,6.75,,,, +US-TX-78662,US,TX,78662,6.75,,,, +US-TX-78663,US,TX,78663,7.25,,,, +US-TX-78664,US,TX,78664,8.25,,,, +US-TX-78665,US,TX,78665,8.25,,,, +US-TX-78666,US,TX,78666,8.25,,,, +US-TX-78667,US,TX,78667,8.25,,,, +US-TX-78669,US,TX,78669,8.25,,,, +US-TX-78670,US,TX,78670,6.75,,,, +US-TX-78671,US,TX,78671,6.75,,,, +US-TX-78672,US,TX,78672,6.25,,,, +US-TX-78673,US,TX,78673,6.25,,,, +US-TX-78674,US,TX,78674,7.25,,,, +US-TX-78675,US,TX,78675,6.75,,,, +US-TX-78676,US,TX,78676,7.25,,,, +US-TX-78677,US,TX,78677,6.75,,,, +US-TX-78680,US,TX,78680,8.25,,,, +US-TX-78681,US,TX,78681,8.25,,,, +US-TX-78682,US,TX,78682,8.25,,,, +US-TX-78683,US,TX,78683,8.25,,,, +US-TX-78691,US,TX,78691,8.25,,,, +US-TX-78701,US,TX,78701,8.25,,,, +US-TX-78702,US,TX,78702,8.25,,,, +US-TX-78703,US,TX,78703,8.25,,,, +US-TX-78704,US,TX,78704,8.25,,,, +US-TX-78705,US,TX,78705,8.25,,,, +US-TX-78708,US,TX,78708,8.25,,,, +US-TX-78709,US,TX,78709,8.25,,,, +US-TX-78710,US,TX,78710,8.25,,,, +US-TX-78711,US,TX,78711,8.25,,,, +US-TX-78712,US,TX,78712,8.25,,,, +US-TX-78713,US,TX,78713,8.25,,,, +US-TX-78714,US,TX,78714,8.25,,,, +US-TX-78715,US,TX,78715,8.25,,,, +US-TX-78716,US,TX,78716,6.75,,,, +US-TX-78717,US,TX,78717,8.25,,,, +US-TX-78718,US,TX,78718,8.25,,,, +US-TX-78719,US,TX,78719,8.25,,,, +US-TX-78720,US,TX,78720,8.25,,,, +US-TX-78721,US,TX,78721,8.25,,,, +US-TX-78722,US,TX,78722,8.25,,,, +US-TX-78723,US,TX,78723,8.25,,,, +US-TX-78724,US,TX,78724,8.25,,,, +US-TX-78725,US,TX,78725,7.25,,,, +US-TX-78726,US,TX,78726,8.25,,,, +US-TX-78727,US,TX,78727,8.25,,,, +US-TX-78728,US,TX,78728,8.25,,,, +US-TX-78729,US,TX,78729,8.25,,,, +US-TX-78730,US,TX,78730,8.25,,,, +US-TX-78731,US,TX,78731,8.25,,,, +US-TX-78732,US,TX,78732,8.25,,,, +US-TX-78733,US,TX,78733,6.75,,,, +US-TX-78734,US,TX,78734,8.25,,,, +US-TX-78735,US,TX,78735,8.25,,,, +US-TX-78736,US,TX,78736,8.25,,,, +US-TX-78737,US,TX,78737,7,,,, +US-TX-78738,US,TX,78738,8.25,,,, +US-TX-78739,US,TX,78739,8.25,,,, +US-TX-78741,US,TX,78741,8.25,,,, +US-TX-78742,US,TX,78742,8.25,,,, +US-TX-78744,US,TX,78744,8.25,,,, +US-TX-78745,US,TX,78745,8.25,,,, +US-TX-78746,US,TX,78746,6.75,,,, +US-TX-78747,US,TX,78747,8.25,,,, +US-TX-78748,US,TX,78748,8.25,,,, +US-TX-78749,US,TX,78749,8.25,,,, +US-TX-78750,US,TX,78750,8.25,,,, +US-TX-78751,US,TX,78751,8.25,,,, +US-TX-78752,US,TX,78752,8.25,,,, +US-TX-78753,US,TX,78753,8.25,,,, +US-TX-78754,US,TX,78754,8.25,,,, +US-TX-78755,US,TX,78755,8.25,,,, +US-TX-78756,US,TX,78756,8.25,,,, +US-TX-78757,US,TX,78757,8.25,,,, +US-TX-78758,US,TX,78758,8.25,,,, +US-TX-78759,US,TX,78759,8.25,,,, +US-TX-78760,US,TX,78760,8.25,,,, +US-TX-78761,US,TX,78761,8.25,,,, +US-TX-78762,US,TX,78762,8.25,,,, +US-TX-78763,US,TX,78763,8.25,,,, +US-TX-78764,US,TX,78764,8.25,,,, +US-TX-78765,US,TX,78765,8.25,,,, +US-TX-78766,US,TX,78766,8.25,,,, +US-TX-78767,US,TX,78767,8.25,,,, +US-TX-78768,US,TX,78768,8.25,,,, +US-TX-78769,US,TX,78769,8.25,,,, +US-TX-78772,US,TX,78772,8.25,,,, +US-TX-78773,US,TX,78773,8.25,,,, +US-TX-78774,US,TX,78774,8.25,,,, +US-TX-78778,US,TX,78778,8.25,,,, +US-TX-78779,US,TX,78779,8.25,,,, +US-TX-78783,US,TX,78783,8.25,,,, +US-TX-78799,US,TX,78799,8.25,,,, +US-TX-78801,US,TX,78801,8.25,,,, +US-TX-78802,US,TX,78802,8.25,,,, +US-TX-78827,US,TX,78827,6.75,,,, +US-TX-78828,US,TX,78828,6.75,,,, +US-TX-78829,US,TX,78829,6.25,,,, +US-TX-78830,US,TX,78830,7.75,,,, +US-TX-78832,US,TX,78832,8.25,,,, +US-TX-78833,US,TX,78833,6.75,,,, +US-TX-78834,US,TX,78834,8.25,,,, +US-TX-78836,US,TX,78836,6.75,,,, +US-TX-78837,US,TX,78837,6.75,,,, +US-TX-78838,US,TX,78838,7.25,,,, +US-TX-78839,US,TX,78839,8.25,,,, +US-TX-78840,US,TX,78840,8.25,,,, +US-TX-78841,US,TX,78841,8.25,,,, +US-TX-78842,US,TX,78842,8.25,,,, +US-TX-78843,US,TX,78843,6.75,,,, +US-TX-78847,US,TX,78847,8.25,,,, +US-TX-78850,US,TX,78850,6.75,,,, +US-TX-78851,US,TX,78851,6.75,,,, +US-TX-78852,US,TX,78852,8.25,,,, +US-TX-78853,US,TX,78853,8.25,,,, +US-TX-78860,US,TX,78860,7.25,,,, +US-TX-78861,US,TX,78861,8.25,,,, +US-TX-78870,US,TX,78870,7.25,,,, +US-TX-78871,US,TX,78871,6.75,,,, +US-TX-78872,US,TX,78872,6.25,,,, +US-TX-78873,US,TX,78873,6.75,,,, +US-TX-78877,US,TX,78877,7.25,,,, +US-TX-78879,US,TX,78879,6.75,,,, +US-TX-78880,US,TX,78880,6.25,,,, +US-TX-78881,US,TX,78881,7.25,,,, +US-TX-78883,US,TX,78883,6.75,,,, +US-TX-78884,US,TX,78884,7.25,,,, +US-TX-78885,US,TX,78885,6.75,,,, +US-TX-78886,US,TX,78886,6.75,,,, +US-TX-78931,US,TX,78931,6.75,,,, +US-TX-78932,US,TX,78932,6.75,,,, +US-TX-78933,US,TX,78933,6.75,,,, +US-TX-78934,US,TX,78934,8.25,,,, +US-TX-78935,US,TX,78935,6.75,,,, +US-TX-78938,US,TX,78938,6.75,,,, +US-TX-78940,US,TX,78940,6.75,,,, +US-TX-78941,US,TX,78941,6.75,,,, +US-TX-78942,US,TX,78942,8.25,,,, +US-TX-78943,US,TX,78943,6.75,,,, +US-TX-78944,US,TX,78944,6.75,,,, +US-TX-78945,US,TX,78945,6.75,,,, +US-TX-78946,US,TX,78946,6.75,,,, +US-TX-78947,US,TX,78947,6.75,,,, +US-TX-78948,US,TX,78948,6.75,,,, +US-TX-78949,US,TX,78949,6.75,,,, +US-TX-78950,US,TX,78950,6.75,,,, +US-TX-78951,US,TX,78951,6.75,,,, +US-TX-78952,US,TX,78952,6.75,,,, +US-TX-78953,US,TX,78953,6.75,,,, +US-TX-78954,US,TX,78954,6.75,,,, +US-TX-78956,US,TX,78956,6.75,,,, +US-TX-78957,US,TX,78957,8.25,,,, +US-TX-78959,US,TX,78959,6.75,,,, +US-TX-78960,US,TX,78960,6.75,,,, +US-TX-78961,US,TX,78961,8.25,,,, +US-TX-78962,US,TX,78962,8.25,,,, +US-TX-78963,US,TX,78963,6.75,,,, +US-TX-79001,US,TX,79001,6.75,,,, +US-TX-79002,US,TX,79002,7.75,,,, +US-TX-79003,US,TX,79003,6.25,,,, +US-TX-79005,US,TX,79005,6.25,,,, +US-TX-79007,US,TX,79007,8.25,,,, +US-TX-79008,US,TX,79008,8.25,,,, +US-TX-79009,US,TX,79009,6.25,,,, +US-TX-79010,US,TX,79010,7.75,,,, +US-TX-79011,US,TX,79011,6.25,,,, +US-TX-79012,US,TX,79012,6.25,,,, +US-TX-79013,US,TX,79013,7.25,,,, +US-TX-79014,US,TX,79014,8.25,,,, +US-TX-79015,US,TX,79015,8.25,,,, +US-TX-79016,US,TX,79016,8.25,,,, +US-TX-79018,US,TX,79018,6.25,,,, +US-TX-79019,US,TX,79019,6.25,,,, +US-TX-79021,US,TX,79021,6.75,,,, +US-TX-79022,US,TX,79022,8.25,,,, +US-TX-79024,US,TX,79024,7.25,,,, +US-TX-79025,US,TX,79025,6.75,,,, +US-TX-79027,US,TX,79027,8.25,,,, +US-TX-79029,US,TX,79029,8.25,,,, +US-TX-79031,US,TX,79031,7.75,,,, +US-TX-79032,US,TX,79032,7.75,,,, +US-TX-79033,US,TX,79033,6.25,,,, +US-TX-79034,US,TX,79034,6.25,,,, +US-TX-79035,US,TX,79035,8.25,,,, +US-TX-79036,US,TX,79036,6.25,,,, +US-TX-79039,US,TX,79039,6.25,,,, +US-TX-79040,US,TX,79040,6.25,,,, +US-TX-79041,US,TX,79041,8.25,,,, +US-TX-79042,US,TX,79042,6.75,,,, +US-TX-79043,US,TX,79043,6.75,,,, +US-TX-79044,US,TX,79044,6.25,,,, +US-TX-79045,US,TX,79045,8.25,,,, +US-TX-79046,US,TX,79046,6.25,,,, +US-TX-79051,US,TX,79051,8.25,,,, +US-TX-79052,US,TX,79052,6.75,,,, +US-TX-79053,US,TX,79053,6.25,,,, +US-TX-79054,US,TX,79054,7.25,,,, +US-TX-79056,US,TX,79056,6.25,,,, +US-TX-79057,US,TX,79057,6.25,,,, +US-TX-79058,US,TX,79058,6.25,,,, +US-TX-79059,US,TX,79059,8.25,,,, +US-TX-79061,US,TX,79061,6.25,,,, +US-TX-79062,US,TX,79062,6.25,,,, +US-TX-79063,US,TX,79063,6.75,,,, +US-TX-79064,US,TX,79064,6.25,,,, +US-TX-79065,US,TX,79065,8.25,,,, +US-TX-79066,US,TX,79066,8.25,,,, +US-TX-79068,US,TX,79068,6.25,,,, +US-TX-79070,US,TX,79070,8.25,,,, +US-TX-79072,US,TX,79072,8.25,,,, +US-TX-79073,US,TX,79073,8.25,,,, +US-TX-79077,US,TX,79077,8,,,, +US-TX-79078,US,TX,79078,7.25,,,, +US-TX-79079,US,TX,79079,8,,,, +US-TX-79080,US,TX,79080,6.25,,,, +US-TX-79081,US,TX,79081,8.25,,,, +US-TX-79082,US,TX,79082,6.25,,,, +US-TX-79083,US,TX,79083,6.25,,,, +US-TX-79084,US,TX,79084,6.25,,,, +US-TX-79085,US,TX,79085,6.75,,,, +US-TX-79086,US,TX,79086,6.25,,,, +US-TX-79087,US,TX,79087,6.25,,,, +US-TX-79088,US,TX,79088,8.25,,,, +US-TX-79091,US,TX,79091,6.75,,,, +US-TX-79092,US,TX,79092,7.75,,,, +US-TX-79093,US,TX,79093,8.25,,,, +US-TX-79094,US,TX,79094,6.25,,,, +US-TX-79095,US,TX,79095,8.25,,,, +US-TX-79096,US,TX,79096,8,,,, +US-TX-79097,US,TX,79097,8,,,, +US-TX-79098,US,TX,79098,6.75,,,, +US-TX-79101,US,TX,79101,8.25,,,, +US-TX-79102,US,TX,79102,8.25,,,, +US-TX-79103,US,TX,79103,8.25,,,, +US-TX-79104,US,TX,79104,8.25,,,, +US-TX-79105,US,TX,79105,8.25,,,, +US-TX-79106,US,TX,79106,8.25,,,, +US-TX-79107,US,TX,79107,8.25,,,, +US-TX-79108,US,TX,79108,6.25,,,, +US-TX-79109,US,TX,79109,8.25,,,, +US-TX-79110,US,TX,79110,8.25,,,, +US-TX-79111,US,TX,79111,8.25,,,, +US-TX-79114,US,TX,79114,8.25,,,, +US-TX-79116,US,TX,79116,8.25,,,, +US-TX-79117,US,TX,79117,8.25,,,, +US-TX-79118,US,TX,79118,6.75,,,, +US-TX-79119,US,TX,79119,6.75,,,, +US-TX-79120,US,TX,79120,8.25,,,, +US-TX-79121,US,TX,79121,8.25,,,, +US-TX-79124,US,TX,79124,6.25,,,, +US-TX-79159,US,TX,79159,8.25,,,, +US-TX-79166,US,TX,79166,8.25,,,, +US-TX-79168,US,TX,79168,8.25,,,, +US-TX-79172,US,TX,79172,8.25,,,, +US-TX-79174,US,TX,79174,8.25,,,, +US-TX-79178,US,TX,79178,8.25,,,, +US-TX-79185,US,TX,79185,8.25,,,, +US-TX-79189,US,TX,79189,8.25,,,, +US-TX-79201,US,TX,79201,8.25,,,, +US-TX-79220,US,TX,79220,6.75,,,, +US-TX-79221,US,TX,79221,7.75,,,, +US-TX-79223,US,TX,79223,6.25,,,, +US-TX-79225,US,TX,79225,8,,,, +US-TX-79226,US,TX,79226,8.25,,,, +US-TX-79227,US,TX,79227,6.25,,,, +US-TX-79229,US,TX,79229,8.25,,,, +US-TX-79230,US,TX,79230,6.25,,,, +US-TX-79231,US,TX,79231,6.25,,,, +US-TX-79233,US,TX,79233,7.5,,,, +US-TX-79234,US,TX,79234,6.25,,,, +US-TX-79235,US,TX,79235,8,,,, +US-TX-79236,US,TX,79236,6.25,,,, +US-TX-79237,US,TX,79237,7.25,,,, +US-TX-79239,US,TX,79239,7.25,,,, +US-TX-79240,US,TX,79240,6.25,,,, +US-TX-79241,US,TX,79241,7.75,,,, +US-TX-79243,US,TX,79243,6.75,,,, +US-TX-79244,US,TX,79244,6.25,,,, +US-TX-79245,US,TX,79245,8.25,,,, +US-TX-79247,US,TX,79247,6.75,,,, +US-TX-79248,US,TX,79248,6.25,,,, +US-TX-79250,US,TX,79250,8.25,,,, +US-TX-79251,US,TX,79251,6.25,,,, +US-TX-79252,US,TX,79252,8.25,,,, +US-TX-79255,US,TX,79255,8.25,,,, +US-TX-79256,US,TX,79256,8.25,,,, +US-TX-79257,US,TX,79257,8,,,, +US-TX-79258,US,TX,79258,6.25,,,, +US-TX-79259,US,TX,79259,6.75,,,, +US-TX-79261,US,TX,79261,8.25,,,, +US-TX-79311,US,TX,79311,8.25,,,, +US-TX-79312,US,TX,79312,7.5,,,, +US-TX-79313,US,TX,79313,7.25,,,, +US-TX-79314,US,TX,79314,6.25,,,, +US-TX-79316,US,TX,79316,8.25,,,, +US-TX-79322,US,TX,79322,8.25,,,, +US-TX-79323,US,TX,79323,7.75,,,, +US-TX-79324,US,TX,79324,6.75,,,, +US-TX-79325,US,TX,79325,6.25,,,, +US-TX-79326,US,TX,79326,6.25,,,, +US-TX-79329,US,TX,79329,6.75,,,, +US-TX-79330,US,TX,79330,6.25,,,, +US-TX-79331,US,TX,79331,8.25,,,, +US-TX-79336,US,TX,79336,8.25,,,, +US-TX-79338,US,TX,79338,8.25,,,, +US-TX-79339,US,TX,79339,8.25,,,, +US-TX-79342,US,TX,79342,6.25,,,, +US-TX-79343,US,TX,79343,7.75,,,, +US-TX-79344,US,TX,79344,6.75,,,, +US-TX-79345,US,TX,79345,7.75,,,, +US-TX-79346,US,TX,79346,7.75,,,, +US-TX-79347,US,TX,79347,8.25,,,, +US-TX-79350,US,TX,79350,8.25,,,, +US-TX-79351,US,TX,79351,7.75,,,, +US-TX-79353,US,TX,79353,6.25,,,, +US-TX-79355,US,TX,79355,6.25,,,, +US-TX-79356,US,TX,79356,8.25,,,, +US-TX-79357,US,TX,79357,8.25,,,, +US-TX-79358,US,TX,79358,6.25,,,, +US-TX-79359,US,TX,79359,8.25,,,, +US-TX-79360,US,TX,79360,7.75,,,, +US-TX-79363,US,TX,79363,6.75,,,, +US-TX-79364,US,TX,79364,8.25,,,, +US-TX-79366,US,TX,79366,7.25,,,, +US-TX-79367,US,TX,79367,7.25,,,, +US-TX-79369,US,TX,79369,6.25,,,, +US-TX-79370,US,TX,79370,8.25,,,, +US-TX-79371,US,TX,79371,7.75,,,, +US-TX-79372,US,TX,79372,8.25,,,, +US-TX-79373,US,TX,79373,8.25,,,, +US-TX-79376,US,TX,79376,6.75,,,, +US-TX-79377,US,TX,79377,6.75,,,, +US-TX-79378,US,TX,79378,6.75,,,, +US-TX-79379,US,TX,79379,7.75,,,, +US-TX-79380,US,TX,79380,6.25,,,, +US-TX-79381,US,TX,79381,6.75,,,, +US-TX-79382,US,TX,79382,8.25,,,, +US-TX-79383,US,TX,79383,7.75,,,, +US-TX-79401,US,TX,79401,8.25,,,, +US-TX-79402,US,TX,79402,8.25,,,, +US-TX-79403,US,TX,79403,8.25,,,, +US-TX-79404,US,TX,79404,8.25,,,, +US-TX-79406,US,TX,79406,8.25,,,, +US-TX-79407,US,TX,79407,8.25,,,, +US-TX-79408,US,TX,79408,8.25,,,, +US-TX-79409,US,TX,79409,8.25,,,, +US-TX-79410,US,TX,79410,8.25,,,, +US-TX-79411,US,TX,79411,8.25,,,, +US-TX-79412,US,TX,79412,8.25,,,, +US-TX-79413,US,TX,79413,8.25,,,, +US-TX-79414,US,TX,79414,8.25,,,, +US-TX-79415,US,TX,79415,8.25,,,, +US-TX-79416,US,TX,79416,8.25,,,, +US-TX-79423,US,TX,79423,8.25,,,, +US-TX-79424,US,TX,79424,8.25,,,, +US-TX-79430,US,TX,79430,8.25,,,, +US-TX-79452,US,TX,79452,8.25,,,, +US-TX-79453,US,TX,79453,8.25,,,, +US-TX-79457,US,TX,79457,8.25,,,, +US-TX-79464,US,TX,79464,8.25,,,, +US-TX-79490,US,TX,79490,8.25,,,, +US-TX-79491,US,TX,79491,8.25,,,, +US-TX-79493,US,TX,79493,8.25,,,, +US-TX-79499,US,TX,79499,8.25,,,, +US-TX-79501,US,TX,79501,8.25,,,, +US-TX-79502,US,TX,79502,8.25,,,, +US-TX-79503,US,TX,79503,6.25,,,, +US-TX-79504,US,TX,79504,6.25,,,, +US-TX-79505,US,TX,79505,7.75,,,, +US-TX-79506,US,TX,79506,6.25,,,, +US-TX-79508,US,TX,79508,8.25,,,, +US-TX-79510,US,TX,79510,6.25,,,, +US-TX-79511,US,TX,79511,6.25,,,, +US-TX-79512,US,TX,79512,8.25,,,, +US-TX-79516,US,TX,79516,8.25,,,, +US-TX-79517,US,TX,79517,6.75,,,, +US-TX-79518,US,TX,79518,6.25,,,, +US-TX-79519,US,TX,79519,6.25,,,, +US-TX-79520,US,TX,79520,8.25,,,, +US-TX-79521,US,TX,79521,8.25,,,, +US-TX-79525,US,TX,79525,6.25,,,, +US-TX-79526,US,TX,79526,6.75,,,, +US-TX-79527,US,TX,79527,6.75,,,, +US-TX-79528,US,TX,79528,7.25,,,, +US-TX-79529,US,TX,79529,8.25,,,, +US-TX-79530,US,TX,79530,6.25,,,, +US-TX-79532,US,TX,79532,6.75,,,, +US-TX-79533,US,TX,79533,6.25,,,, +US-TX-79534,US,TX,79534,6.25,,,, +US-TX-79535,US,TX,79535,6.25,,,, +US-TX-79536,US,TX,79536,6.25,,,, +US-TX-79537,US,TX,79537,6.25,,,, +US-TX-79538,US,TX,79538,6.25,,,, +US-TX-79539,US,TX,79539,6.25,,,, +US-TX-79540,US,TX,79540,6.25,,,, +US-TX-79541,US,TX,79541,6.25,,,, +US-TX-79543,US,TX,79543,7.25,,,, +US-TX-79544,US,TX,79544,6.25,,,, +US-TX-79545,US,TX,79545,6.25,,,, +US-TX-79546,US,TX,79546,8.25,,,, +US-TX-79547,US,TX,79547,7.25,,,, +US-TX-79548,US,TX,79548,6.25,,,, +US-TX-79549,US,TX,79549,8.25,,,, +US-TX-79550,US,TX,79550,8.25,,,, +US-TX-79553,US,TX,79553,8.25,,,, +US-TX-79556,US,TX,79556,8.25,,,, +US-TX-79560,US,TX,79560,6.25,,,, +US-TX-79561,US,TX,79561,6.25,,,, +US-TX-79562,US,TX,79562,6.25,,,, +US-TX-79563,US,TX,79563,8.25,,,, +US-TX-79565,US,TX,79565,6.75,,,, +US-TX-79566,US,TX,79566,6.25,,,, +US-TX-79567,US,TX,79567,8.25,,,, +US-TX-79601,US,TX,79601,8.25,,,, +US-TX-79602,US,TX,79602,8.25,,,, +US-TX-79603,US,TX,79603,8.25,,,, +US-TX-79604,US,TX,79604,8.25,,,, +US-TX-79605,US,TX,79605,8.25,,,, +US-TX-79606,US,TX,79606,8.25,,,, +US-TX-79607,US,TX,79607,8.25,,,, +US-TX-79608,US,TX,79608,8.25,,,, +US-TX-79697,US,TX,79697,8.25,,,, +US-TX-79698,US,TX,79698,8.25,,,, +US-TX-79699,US,TX,79699,8.25,,,, +US-TX-79701,US,TX,79701,8.25,,,, +US-TX-79702,US,TX,79702,8.25,,,, +US-TX-79703,US,TX,79703,8.25,,,, +US-TX-79704,US,TX,79704,8.25,,,, +US-TX-79705,US,TX,79705,8.25,,,, +US-TX-79706,US,TX,79706,6.75,,,, +US-TX-79707,US,TX,79707,8.25,,,, +US-TX-79708,US,TX,79708,8.25,,,, +US-TX-79710,US,TX,79710,8.25,,,, +US-TX-79711,US,TX,79711,8.25,,,, +US-TX-79712,US,TX,79712,8.25,,,, +US-TX-79713,US,TX,79713,6.25,,,, +US-TX-79714,US,TX,79714,8.25,,,, +US-TX-79718,US,TX,79718,6.75,,,, +US-TX-79719,US,TX,79719,6.25,,,, +US-TX-79720,US,TX,79720,8.25,,,, +US-TX-79721,US,TX,79721,8.25,,,, +US-TX-79730,US,TX,79730,6.25,,,, +US-TX-79731,US,TX,79731,7.75,,,, +US-TX-79733,US,TX,79733,7.25,,,, +US-TX-79734,US,TX,79734,8.25,,,, +US-TX-79735,US,TX,79735,8.25,,,, +US-TX-79738,US,TX,79738,6.25,,,, +US-TX-79739,US,TX,79739,6.25,,,, +US-TX-79740,US,TX,79740,6.25,,,, +US-TX-79741,US,TX,79741,8,,,, +US-TX-79742,US,TX,79742,7.75,,,, +US-TX-79743,US,TX,79743,6.25,,,, +US-TX-79744,US,TX,79744,8.25,,,, +US-TX-79745,US,TX,79745,8.25,,,, +US-TX-79748,US,TX,79748,6.25,,,, +US-TX-79749,US,TX,79749,6.25,,,, +US-TX-79752,US,TX,79752,7.75,,,, +US-TX-79754,US,TX,79754,6.25,,,, +US-TX-79755,US,TX,79755,6.25,,,, +US-TX-79756,US,TX,79756,8.25,,,, +US-TX-79758,US,TX,79758,7,,,, +US-TX-79759,US,TX,79759,8,,,, +US-TX-79760,US,TX,79760,8.25,,,, +US-TX-79761,US,TX,79761,8.25,,,, +US-TX-79762,US,TX,79762,8.25,,,, +US-TX-79763,US,TX,79763,8.25,,,, +US-TX-79764,US,TX,79764,7,,,, +US-TX-79765,US,TX,79765,8.25,,,, +US-TX-79766,US,TX,79766,7,,,, +US-TX-79768,US,TX,79768,8.25,,,, +US-TX-79769,US,TX,79769,8.25,,,, +US-TX-79770,US,TX,79770,6.75,,,, +US-TX-79772,US,TX,79772,8.25,,,, +US-TX-79776,US,TX,79776,7,,,, +US-TX-79777,US,TX,79777,7.25,,,, +US-TX-79778,US,TX,79778,7.75,,,, +US-TX-79780,US,TX,79780,6.75,,,, +US-TX-79781,US,TX,79781,6.25,,,, +US-TX-79782,US,TX,79782,6.25,,,, +US-TX-79783,US,TX,79783,6.25,,,, +US-TX-79785,US,TX,79785,8.25,,,, +US-TX-79786,US,TX,79786,6.75,,,, +US-TX-79788,US,TX,79788,7.25,,,, +US-TX-79789,US,TX,79789,8.25,,,, +US-TX-79821,US,TX,79821,8.25,,,, +US-TX-79830,US,TX,79830,8.25,,,, +US-TX-79831,US,TX,79831,8.25,,,, +US-TX-79832,US,TX,79832,8.25,,,, +US-TX-79834,US,TX,79834,7.75,,,, +US-TX-79835,US,TX,79835,7.25,,,, +US-TX-79836,US,TX,79836,7.25,,,, +US-TX-79837,US,TX,79837,7.25,,,, +US-TX-79838,US,TX,79838,7.25,,,, +US-TX-79839,US,TX,79839,6.25,,,, +US-TX-79842,US,TX,79842,6.75,,,, +US-TX-79843,US,TX,79843,8,,,, +US-TX-79845,US,TX,79845,8.25,,,, +US-TX-79846,US,TX,79846,8.25,,,, +US-TX-79847,US,TX,79847,6.25,,,, +US-TX-79848,US,TX,79848,7.75,,,, +US-TX-79849,US,TX,79849,7.25,,,, +US-TX-79851,US,TX,79851,6.25,,,, +US-TX-79852,US,TX,79852,6.75,,,, +US-TX-79853,US,TX,79853,7.25,,,, +US-TX-79854,US,TX,79854,8.25,,,, +US-TX-79855,US,TX,79855,8,,,, +US-TX-79901,US,TX,79901,8.25,,,, +US-TX-79902,US,TX,79902,8.25,,,, +US-TX-79903,US,TX,79903,8.25,,,, +US-TX-79904,US,TX,79904,8.25,,,, +US-TX-79905,US,TX,79905,8.25,,,, +US-TX-79906,US,TX,79906,7.25,,,, +US-TX-79907,US,TX,79907,8.25,,,, +US-TX-79908,US,TX,79908,7.25,,,, +US-TX-79910,US,TX,79910,8.25,,,, +US-TX-79911,US,TX,79911,8.25,,,, +US-TX-79912,US,TX,79912,8.25,,,, +US-TX-79913,US,TX,79913,8.25,,,, +US-TX-79914,US,TX,79914,8.25,,,, +US-TX-79915,US,TX,79915,8.25,,,, +US-TX-79916,US,TX,79916,7.25,,,, +US-TX-79917,US,TX,79917,8.25,,,, +US-TX-79918,US,TX,79918,7.25,,,, +US-TX-79920,US,TX,79920,8.25,,,, +US-TX-79922,US,TX,79922,8.25,,,, +US-TX-79923,US,TX,79923,8.25,,,, +US-TX-79924,US,TX,79924,8.25,,,, +US-TX-79925,US,TX,79925,8.25,,,, +US-TX-79926,US,TX,79926,8.25,,,, +US-TX-79927,US,TX,79927,8.25,,,, +US-TX-79928,US,TX,79928,7.25,,,, +US-TX-79929,US,TX,79929,8.25,,,, +US-TX-79930,US,TX,79930,8.25,,,, +US-TX-79931,US,TX,79931,8.25,,,, +US-TX-79932,US,TX,79932,8.25,,,, +US-TX-79934,US,TX,79934,8.25,,,, +US-TX-79935,US,TX,79935,8.25,,,, +US-TX-79936,US,TX,79936,8.25,,,, +US-TX-79937,US,TX,79937,8.25,,,, +US-TX-79938,US,TX,79938,7.25,,,, +US-TX-79940,US,TX,79940,8.25,,,, +US-TX-79941,US,TX,79941,8.25,,,, +US-TX-79942,US,TX,79942,8.25,,,, +US-TX-79943,US,TX,79943,8.25,,,, +US-TX-79944,US,TX,79944,8.25,,,, +US-TX-79945,US,TX,79945,8.25,,,, +US-TX-79946,US,TX,79946,8.25,,,, +US-TX-79947,US,TX,79947,8.25,,,, +US-TX-79948,US,TX,79948,8.25,,,, +US-TX-79949,US,TX,79949,8.25,,,, +US-TX-79950,US,TX,79950,8.25,,,, +US-TX-79951,US,TX,79951,8.25,,,, +US-TX-79952,US,TX,79952,8.25,,,, +US-TX-79953,US,TX,79953,8.25,,,, +US-TX-79954,US,TX,79954,8.25,,,, +US-TX-79955,US,TX,79955,8.25,,,, +US-TX-79958,US,TX,79958,8.25,,,, +US-TX-79960,US,TX,79960,8.25,,,, +US-TX-79961,US,TX,79961,8.25,,,, +US-TX-79968,US,TX,79968,8.25,,,, +US-TX-79976,US,TX,79976,8.25,,,, +US-TX-79978,US,TX,79978,8.25,,,, +US-TX-79980,US,TX,79980,8.25,,,, +US-TX-79990,US,TX,79990,8.25,,,, +US-TX-79995,US,TX,79995,8.25,,,, +US-TX-79996,US,TX,79996,8.25,,,, +US-TX-79997,US,TX,79997,8.25,,,, +US-TX-79998,US,TX,79998,8.25,,,, +US-TX-79999,US,TX,79999,8.25,,,, +US-TX-88510,US,TX,88510,8.25,,,, +US-TX-88511,US,TX,88511,8.25,,,, +US-TX-88512,US,TX,88512,8.25,,,, +US-TX-88513,US,TX,88513,8.25,,,, +US-TX-88514,US,TX,88514,8.25,,,, +US-TX-88515,US,TX,88515,8.25,,,, +US-TX-88517,US,TX,88517,8.25,,,, +US-TX-88518,US,TX,88518,8.25,,,, +US-TX-88519,US,TX,88519,8.25,,,, +US-TX-88520,US,TX,88520,8.25,,,, +US-TX-88521,US,TX,88521,8.25,,,, +US-TX-88523,US,TX,88523,8.25,,,, +US-TX-88524,US,TX,88524,8.25,,,, +US-TX-88525,US,TX,88525,8.25,,,, +US-TX-88526,US,TX,88526,8.25,,,, +US-TX-88527,US,TX,88527,8.25,,,, +US-TX-88528,US,TX,88528,8.25,,,, +US-TX-88529,US,TX,88529,8.25,,,, +US-TX-88530,US,TX,88530,8.25,,,, +US-TX-88531,US,TX,88531,8.25,,,, +US-TX-88532,US,TX,88532,8.25,,,, +US-TX-88533,US,TX,88533,8.25,,,, +US-TX-88534,US,TX,88534,8.25,,,, +US-TX-88535,US,TX,88535,8.25,,,, +US-TX-88536,US,TX,88536,8.25,,,, +US-TX-88538,US,TX,88538,8.25,,,, +US-TX-88539,US,TX,88539,8.25,,,, +US-TX-88540,US,TX,88540,8.25,,,, +US-TX-88541,US,TX,88541,8.25,,,, +US-TX-88542,US,TX,88542,8.25,,,, +US-TX-88543,US,TX,88543,8.25,,,, +US-TX-88544,US,TX,88544,8.25,,,, +US-TX-88545,US,TX,88545,8.25,,,, +US-TX-88546,US,TX,88546,8.25,,,, +US-TX-88547,US,TX,88547,8.25,,,, +US-TX-88548,US,TX,88548,8.25,,,, +US-TX-88549,US,TX,88549,8.25,,,, +US-TX-88550,US,TX,88550,8.25,,,, +US-TX-88553,US,TX,88553,8.25,,,, +US-TX-88554,US,TX,88554,8.25,,,, +US-TX-88555,US,TX,88555,8.25,,,, +US-TX-88556,US,TX,88556,8.25,,,, +US-TX-88557,US,TX,88557,8.25,,,, +US-TX-88558,US,TX,88558,8.25,,,, +US-TX-88559,US,TX,88559,8.25,,,, +US-TX-88560,US,TX,88560,8.25,,,, +US-TX-88561,US,TX,88561,8.25,,,, +US-TX-88562,US,TX,88562,8.25,,,, +US-TX-88563,US,TX,88563,8.25,,,, +US-TX-88565,US,TX,88565,8.25,,,, +US-TX-88566,US,TX,88566,8.25,,,, +US-TX-88567,US,TX,88567,8.25,,,, +US-TX-88568,US,TX,88568,8.25,,,, +US-TX-88569,US,TX,88569,8.25,,,, +US-TX-88570,US,TX,88570,8.25,,,, +US-TX-88571,US,TX,88571,8.25,,,, +US-TX-88572,US,TX,88572,8.25,,,, +US-TX-88573,US,TX,88573,8.25,,,, +US-TX-88574,US,TX,88574,8.25,,,, +US-TX-88575,US,TX,88575,8.25,,,, +US-TX-88576,US,TX,88576,8.25,,,, +US-TX-88577,US,TX,88577,8.25,,,, +US-TX-88578,US,TX,88578,8.25,,,, +US-TX-88579,US,TX,88579,8.25,,,, +US-TX-88580,US,TX,88580,8.25,,,, +US-TX-88581,US,TX,88581,8.25,,,, +US-TX-88582,US,TX,88582,8.25,,,, +US-TX-88583,US,TX,88583,8.25,,,, +US-TX-88584,US,TX,88584,8.25,,,, +US-TX-88585,US,TX,88585,8.25,,,, +US-TX-88586,US,TX,88586,8.25,,,, +US-TX-88587,US,TX,88587,8.25,,,, +US-TX-88588,US,TX,88588,8.25,,,, +US-TX-88589,US,TX,88589,8.25,,,, +US-TX-88590,US,TX,88590,8.25,,,, +US-TX-88595,US,TX,88595,8.25,,,, +US-UT-84001,US,UT,84001,5.95,,,, +US-UT-84002,US,UT,84002,5.95,,,, +US-UT-84003,US,UT,84003,6.75,,,, +US-UT-84004,US,UT,84004,6.75,,,, +US-UT-84005,US,UT,84005,6.75,,,, +US-UT-84006,US,UT,84006,6.85,,,, +US-UT-84007,US,UT,84007,5.95,,,, +US-UT-84010,US,UT,84010,6.6,,,, +US-UT-84011,US,UT,84011,6.6,,,, +US-UT-84013,US,UT,84013,6.75,,,, +US-UT-84014,US,UT,84014,6.6,,,, +US-UT-84015,US,UT,84015,6.5,,,, +US-UT-84016,US,UT,84016,6.5,,,, +US-UT-84017,US,UT,84017,6.05,,,, +US-UT-84018,US,UT,84018,5.95,,,, +US-UT-84020,US,UT,84020,6.85,,,, +US-UT-84021,US,UT,84021,6.05,,,, +US-UT-84022,US,UT,84022,5.95,,,, +US-UT-84023,US,UT,84023,6.95,,,, +US-UT-84024,US,UT,84024,6.05,,,, +US-UT-84025,US,UT,84025,6.5,,,, +US-UT-84026,US,UT,84026,6.05,,,, +US-UT-84027,US,UT,84027,6.05,,,, +US-UT-84028,US,UT,84028,7.55,,,, +US-UT-84029,US,UT,84029,6.25,,,, +US-UT-84031,US,UT,84031,5.95,,,, +US-UT-84032,US,UT,84032,6.25,,,, +US-UT-84033,US,UT,84033,6.05,,,, +US-UT-84035,US,UT,84035,6.05,,,, +US-UT-84036,US,UT,84036,6.05,,,, +US-UT-84037,US,UT,84037,6.5,,,, +US-UT-84038,US,UT,84038,5.95,,,, +US-UT-84039,US,UT,84039,6.05,,,, +US-UT-84040,US,UT,84040,6.5,,,, +US-UT-84041,US,UT,84041,6.5,,,, +US-UT-84042,US,UT,84042,6.75,,,, +US-UT-84043,US,UT,84043,6.75,,,, +US-UT-84044,US,UT,84044,6.85,,,, +US-UT-84045,US,UT,84045,6.75,,,, +US-UT-84046,US,UT,84046,6.95,,,, +US-UT-84047,US,UT,84047,6.85,,,, +US-UT-84049,US,UT,84049,7.35,,,, +US-UT-84050,US,UT,84050,5.95,,,, +US-UT-84051,US,UT,84051,5.95,,,, +US-UT-84052,US,UT,84052,5.95,,,, +US-UT-84053,US,UT,84053,5.95,,,, +US-UT-84054,US,UT,84054,6.6,,,, +US-UT-84055,US,UT,84055,6.05,,,, +US-UT-84056,US,UT,84056,6.5,,,, +US-UT-84057,US,UT,84057,6.85,,,, +US-UT-84058,US,UT,84058,6.85,,,, +US-UT-84059,US,UT,84059,6.85,,,, +US-UT-84060,US,UT,84060,7.95,,,, +US-UT-84061,US,UT,84061,6.05,,,, +US-UT-84062,US,UT,84062,6.75,,,, +US-UT-84063,US,UT,84063,6.05,,,, +US-UT-84064,US,UT,84064,5.95,,,, +US-UT-84065,US,UT,84065,6.85,,,, +US-UT-84066,US,UT,84066,6.35,,,, +US-UT-84067,US,UT,84067,6.85,,,, +US-UT-84068,US,UT,84068,7.95,,,, +US-UT-84069,US,UT,84069,5.95,,,, +US-UT-84070,US,UT,84070,6.85,,,, +US-UT-84071,US,UT,84071,5.95,,,, +US-UT-84072,US,UT,84072,5.95,,,, +US-UT-84073,US,UT,84073,5.95,,,, +US-UT-84074,US,UT,84074,6.35,,,, +US-UT-84075,US,UT,84075,6.5,,,, +US-UT-84076,US,UT,84076,6.05,,,, +US-UT-84078,US,UT,84078,6.05,,,, +US-UT-84079,US,UT,84079,6.35,,,, +US-UT-84080,US,UT,84080,5.95,,,, +US-UT-84081,US,UT,84081,6.85,,,, +US-UT-84082,US,UT,84082,5.95,,,, +US-UT-84083,US,UT,84083,5.95,,,, +US-UT-84084,US,UT,84084,6.85,,,, +US-UT-84085,US,UT,84085,6.05,,,, +US-UT-84086,US,UT,84086,5.95,,,, +US-UT-84087,US,UT,84087,6.6,,,, +US-UT-84088,US,UT,84088,6.85,,,, +US-UT-84089,US,UT,84089,6.5,,,, +US-UT-84090,US,UT,84090,6.85,,,, +US-UT-84091,US,UT,84091,6.85,,,, +US-UT-84092,US,UT,84092,6.85,,,, +US-UT-84093,US,UT,84093,6.85,,,, +US-UT-84094,US,UT,84094,6.85,,,, +US-UT-84095,US,UT,84095,6.85,,,, +US-UT-84096,US,UT,84096,6.85,,,, +US-UT-84097,US,UT,84097,6.85,,,, +US-UT-84098,US,UT,84098,6.35,,,, +US-UT-84101,US,UT,84101,6.85,,,, +US-UT-84102,US,UT,84102,6.85,,,, +US-UT-84103,US,UT,84103,6.85,,,, +US-UT-84104,US,UT,84104,6.85,,,, +US-UT-84105,US,UT,84105,6.85,,,, +US-UT-84106,US,UT,84106,6.85,,,, +US-UT-84107,US,UT,84107,6.85,,,, +US-UT-84108,US,UT,84108,6.85,,,, +US-UT-84109,US,UT,84109,6.85,,,, +US-UT-84110,US,UT,84110,6.85,,,, +US-UT-84111,US,UT,84111,6.85,,,, +US-UT-84112,US,UT,84112,6.85,,,, +US-UT-84113,US,UT,84113,6.85,,,, +US-UT-84114,US,UT,84114,6.85,,,, +US-UT-84115,US,UT,84115,7.05,,,, +US-UT-84116,US,UT,84116,6.85,,,, +US-UT-84117,US,UT,84117,6.85,,,, +US-UT-84118,US,UT,84118,6.85,,,, +US-UT-84119,US,UT,84119,6.85,,,, +US-UT-84120,US,UT,84120,6.85,,,, +US-UT-84121,US,UT,84121,6.85,,,, +US-UT-84122,US,UT,84122,7.05,,,, +US-UT-84123,US,UT,84123,6.85,,,, +US-UT-84124,US,UT,84124,6.85,,,, +US-UT-84125,US,UT,84125,6.85,,,, +US-UT-84126,US,UT,84126,6.85,,,, +US-UT-84127,US,UT,84127,6.85,,,, +US-UT-84128,US,UT,84128,6.85,,,, +US-UT-84129,US,UT,84129,6.85,,,, +US-UT-84130,US,UT,84130,6.85,,,, +US-UT-84131,US,UT,84131,6.85,,,, +US-UT-84132,US,UT,84132,6.85,,,, +US-UT-84133,US,UT,84133,6.85,,,, +US-UT-84134,US,UT,84134,6.85,,,, +US-UT-84136,US,UT,84136,6.85,,,, +US-UT-84138,US,UT,84138,6.85,,,, +US-UT-84139,US,UT,84139,6.85,,,, +US-UT-84141,US,UT,84141,6.85,,,, +US-UT-84143,US,UT,84143,6.85,,,, +US-UT-84145,US,UT,84145,6.85,,,, +US-UT-84147,US,UT,84147,6.85,,,, +US-UT-84148,US,UT,84148,6.85,,,, +US-UT-84150,US,UT,84150,6.85,,,, +US-UT-84151,US,UT,84151,6.85,,,, +US-UT-84152,US,UT,84152,6.85,,,, +US-UT-84157,US,UT,84157,6.85,,,, +US-UT-84158,US,UT,84158,6.85,,,, +US-UT-84165,US,UT,84165,7.05,,,, +US-UT-84170,US,UT,84170,6.85,,,, +US-UT-84171,US,UT,84171,6.85,,,, +US-UT-84180,US,UT,84180,6.85,,,, +US-UT-84184,US,UT,84184,6.85,,,, +US-UT-84189,US,UT,84189,6.85,,,, +US-UT-84190,US,UT,84190,6.85,,,, +US-UT-84199,US,UT,84199,6.85,,,, +US-UT-84201,US,UT,84201,6.85,,,, +US-UT-84244,US,UT,84244,6.85,,,, +US-UT-84301,US,UT,84301,5.95,,,, +US-UT-84302,US,UT,84302,6.5,,,, +US-UT-84304,US,UT,84304,6.3,,,, +US-UT-84305,US,UT,84305,6.3,,,, +US-UT-84306,US,UT,84306,5.95,,,, +US-UT-84307,US,UT,84307,5.95,,,, +US-UT-84308,US,UT,84308,6.3,,,, +US-UT-84309,US,UT,84309,5.95,,,, +US-UT-84310,US,UT,84310,6.85,,,, +US-UT-84311,US,UT,84311,5.95,,,, +US-UT-84312,US,UT,84312,5.95,,,, +US-UT-84313,US,UT,84313,5.95,,,, +US-UT-84314,US,UT,84314,5.95,,,, +US-UT-84315,US,UT,84315,6.85,,,, +US-UT-84316,US,UT,84316,5.95,,,, +US-UT-84317,US,UT,84317,6.85,,,, +US-UT-84318,US,UT,84318,6.55,,,, +US-UT-84319,US,UT,84319,6.6,,,, +US-UT-84320,US,UT,84320,6.55,,,, +US-UT-84321,US,UT,84321,6.6,,,, +US-UT-84322,US,UT,84322,6.6,,,, +US-UT-84323,US,UT,84323,6.6,,,, +US-UT-84324,US,UT,84324,5.95,,,, +US-UT-84325,US,UT,84325,6.3,,,, +US-UT-84326,US,UT,84326,6.55,,,, +US-UT-84327,US,UT,84327,6.3,,,, +US-UT-84328,US,UT,84328,6.3,,,, +US-UT-84329,US,UT,84329,5.95,,,, +US-UT-84330,US,UT,84330,5.95,,,, +US-UT-84331,US,UT,84331,5.95,,,, +US-UT-84332,US,UT,84332,6.6,,,, +US-UT-84333,US,UT,84333,6.6,,,, +US-UT-84334,US,UT,84334,5.95,,,, +US-UT-84335,US,UT,84335,6.6,,,, +US-UT-84336,US,UT,84336,5.95,,,, +US-UT-84337,US,UT,84337,5.95,,,, +US-UT-84338,US,UT,84338,6.3,,,, +US-UT-84339,US,UT,84339,6.3,,,, +US-UT-84340,US,UT,84340,5.95,,,, +US-UT-84341,US,UT,84341,6.6,,,, +US-UT-84401,US,UT,84401,6.85,,,, +US-UT-84402,US,UT,84402,6.85,,,, +US-UT-84403,US,UT,84403,6.85,,,, +US-UT-84404,US,UT,84404,6.85,,,, +US-UT-84405,US,UT,84405,7.05,,,, +US-UT-84407,US,UT,84407,6.85,,,, +US-UT-84408,US,UT,84408,6.85,,,, +US-UT-84409,US,UT,84409,6.85,,,, +US-UT-84412,US,UT,84412,6.85,,,, +US-UT-84414,US,UT,84414,6.85,,,, +US-UT-84415,US,UT,84415,6.85,,,, +US-UT-84501,US,UT,84501,6.35,,,, +US-UT-84510,US,UT,84510,6.35,,,, +US-UT-84511,US,UT,84511,6.35,,,, +US-UT-84512,US,UT,84512,5.95,,,, +US-UT-84513,US,UT,84513,5.95,,,, +US-UT-84516,US,UT,84516,5.95,,,, +US-UT-84518,US,UT,84518,5.95,,,, +US-UT-84520,US,UT,84520,5.95,,,, +US-UT-84521,US,UT,84521,5.95,,,, +US-UT-84522,US,UT,84522,5.95,,,, +US-UT-84523,US,UT,84523,5.95,,,, +US-UT-84525,US,UT,84525,7.75,,,, +US-UT-84526,US,UT,84526,5.95,,,, +US-UT-84528,US,UT,84528,5.95,,,, +US-UT-84529,US,UT,84529,5.95,,,, +US-UT-84530,US,UT,84530,5.95,,,, +US-UT-84531,US,UT,84531,5.95,,,, +US-UT-84532,US,UT,84532,7.85,,,, +US-UT-84533,US,UT,84533,5.95,,,, +US-UT-84534,US,UT,84534,6.35,,,, +US-UT-84535,US,UT,84535,6.35,,,, +US-UT-84536,US,UT,84536,5.95,,,, +US-UT-84537,US,UT,84537,5.95,,,, +US-UT-84539,US,UT,84539,5.95,,,, +US-UT-84540,US,UT,84540,5.95,,,, +US-UT-84542,US,UT,84542,6.25,,,, +US-UT-84601,US,UT,84601,6.75,,,, +US-UT-84602,US,UT,84602,6.75,,,, +US-UT-84603,US,UT,84603,6.75,,,, +US-UT-84604,US,UT,84604,6.75,,,, +US-UT-84605,US,UT,84605,6.75,,,, +US-UT-84606,US,UT,84606,6.75,,,, +US-UT-84620,US,UT,84620,6.05,,,, +US-UT-84621,US,UT,84621,6.35,,,, +US-UT-84622,US,UT,84622,6.35,,,, +US-UT-84623,US,UT,84623,5.95,,,, +US-UT-84624,US,UT,84624,5.95,,,, +US-UT-84626,US,UT,84626,6.75,,,, +US-UT-84627,US,UT,84627,6.25,,,, +US-UT-84628,US,UT,84628,5.95,,,, +US-UT-84629,US,UT,84629,5.95,,,, +US-UT-84630,US,UT,84630,5.95,,,, +US-UT-84631,US,UT,84631,5.95,,,, +US-UT-84632,US,UT,84632,5.95,,,, +US-UT-84633,US,UT,84633,6.75,,,, +US-UT-84634,US,UT,84634,6.35,,,, +US-UT-84635,US,UT,84635,5.95,,,, +US-UT-84636,US,UT,84636,5.95,,,, +US-UT-84637,US,UT,84637,5.95,,,, +US-UT-84638,US,UT,84638,5.95,,,, +US-UT-84639,US,UT,84639,5.95,,,, +US-UT-84640,US,UT,84640,5.95,,,, +US-UT-84642,US,UT,84642,5.95,,,, +US-UT-84643,US,UT,84643,6.05,,,, +US-UT-84644,US,UT,84644,5.95,,,, +US-UT-84645,US,UT,84645,5.95,,,, +US-UT-84646,US,UT,84646,5.95,,,, +US-UT-84647,US,UT,84647,6.25,,,, +US-UT-84648,US,UT,84648,6.25,,,, +US-UT-84649,US,UT,84649,5.95,,,, +US-UT-84651,US,UT,84651,6.75,,,, +US-UT-84652,US,UT,84652,6.05,,,, +US-UT-84653,US,UT,84653,6.75,,,, +US-UT-84654,US,UT,84654,6.35,,,, +US-UT-84655,US,UT,84655,6.75,,,, +US-UT-84656,US,UT,84656,5.95,,,, +US-UT-84657,US,UT,84657,5.95,,,, +US-UT-84660,US,UT,84660,6.75,,,, +US-UT-84662,US,UT,84662,5.95,,,, +US-UT-84663,US,UT,84663,6.75,,,, +US-UT-84664,US,UT,84664,6.75,,,, +US-UT-84665,US,UT,84665,5.95,,,, +US-UT-84667,US,UT,84667,5.95,,,, +US-UT-84701,US,UT,84701,6.35,,,, +US-UT-84710,US,UT,84710,6.95,,,, +US-UT-84711,US,UT,84711,5.95,,,, +US-UT-84712,US,UT,84712,5.95,,,, +US-UT-84713,US,UT,84713,6.95,,,, +US-UT-84714,US,UT,84714,5.95,,,, +US-UT-84715,US,UT,84715,5.95,,,, +US-UT-84716,US,UT,84716,6.95,,,, +US-UT-84718,US,UT,84718,7.95,,,, +US-UT-84719,US,UT,84719,5.95,,,, +US-UT-84720,US,UT,84720,6.05,,,, +US-UT-84721,US,UT,84721,6.05,,,, +US-UT-84722,US,UT,84722,5.95,,,, +US-UT-84723,US,UT,84723,5.95,,,, +US-UT-84724,US,UT,84724,5.95,,,, +US-UT-84725,US,UT,84725,5.95,,,, +US-UT-84726,US,UT,84726,6.95,,,, +US-UT-84728,US,UT,84728,5.95,,,, +US-UT-84729,US,UT,84729,6.95,,,, +US-UT-84730,US,UT,84730,5.95,,,, +US-UT-84733,US,UT,84733,5.95,,,, +US-UT-84734,US,UT,84734,5.95,,,, +US-UT-84735,US,UT,84735,6.95,,,, +US-UT-84736,US,UT,84736,6.95,,,, +US-UT-84737,US,UT,84737,6.25,,,, +US-UT-84738,US,UT,84738,6.25,,,, +US-UT-84739,US,UT,84739,5.95,,,, +US-UT-84740,US,UT,84740,5.95,,,, +US-UT-84741,US,UT,84741,7.95,,,, +US-UT-84742,US,UT,84742,5.95,,,, +US-UT-84743,US,UT,84743,5.95,,,, +US-UT-84744,US,UT,84744,5.95,,,, +US-UT-84745,US,UT,84745,6.25,,,, +US-UT-84746,US,UT,84746,6.25,,,, +US-UT-84747,US,UT,84747,5.95,,,, +US-UT-84749,US,UT,84749,5.95,,,, +US-UT-84750,US,UT,84750,5.95,,,, +US-UT-84751,US,UT,84751,5.95,,,, +US-UT-84752,US,UT,84752,5.95,,,, +US-UT-84753,US,UT,84753,5.95,,,, +US-UT-84754,US,UT,84754,5.95,,,, +US-UT-84755,US,UT,84755,7.95,,,, +US-UT-84756,US,UT,84756,5.95,,,, +US-UT-84757,US,UT,84757,5.95,,,, +US-UT-84758,US,UT,84758,7.95,,,, +US-UT-84759,US,UT,84759,7.95,,,, +US-UT-84760,US,UT,84760,5.95,,,, +US-UT-84761,US,UT,84761,5.95,,,, +US-UT-84762,US,UT,84762,6.95,,,, +US-UT-84763,US,UT,84763,7.55,,,, +US-UT-84764,US,UT,84764,7.95,,,, +US-UT-84765,US,UT,84765,6.25,,,, +US-UT-84766,US,UT,84766,5.95,,,, +US-UT-84767,US,UT,84767,7.55,,,, +US-UT-84770,US,UT,84770,6.25,,,, +US-UT-84771,US,UT,84771,6.25,,,, +US-UT-84772,US,UT,84772,5.95,,,, +US-UT-84773,US,UT,84773,5.95,,,, +US-UT-84774,US,UT,84774,5.95,,,, +US-UT-84775,US,UT,84775,5.95,,,, +US-UT-84776,US,UT,84776,7.95,,,, +US-UT-84779,US,UT,84779,5.95,,,, +US-UT-84780,US,UT,84780,6.25,,,, +US-UT-84781,US,UT,84781,5.95,,,, +US-UT-84782,US,UT,84782,5.95,,,, +US-UT-84783,US,UT,84783,5.95,,,, +US-UT-84790,US,UT,84790,6.25,,,, +US-UT-84791,US,UT,84791,6.25,,,, +US-VA-20101,US,VA,20101,6,,,, +US-VA-20102,US,VA,20102,6,,,, +US-VA-20103,US,VA,20103,6,,,, +US-VA-20104,US,VA,20104,6,,,, +US-VA-20105,US,VA,20105,6,,,, +US-VA-20106,US,VA,20106,5.3,,,, +US-VA-20108,US,VA,20108,6,,,, +US-VA-20109,US,VA,20109,6,,,, +US-VA-20110,US,VA,20110,6,,,, +US-VA-20111,US,VA,20111,6,,,, +US-VA-20112,US,VA,20112,6,,,, +US-VA-20113,US,VA,20113,6,,,, +US-VA-20115,US,VA,20115,5.3,,,, +US-VA-20116,US,VA,20116,5.3,,,, +US-VA-20117,US,VA,20117,6,,,, +US-VA-20118,US,VA,20118,6,,,, +US-VA-20119,US,VA,20119,5.3,,,, +US-VA-20120,US,VA,20120,6,,,, +US-VA-20121,US,VA,20121,6,,,, +US-VA-20122,US,VA,20122,6,,,, +US-VA-20124,US,VA,20124,6,,,, +US-VA-20128,US,VA,20128,5.3,,,, +US-VA-20129,US,VA,20129,6,,,, +US-VA-20130,US,VA,20130,5.3,,,, +US-VA-20131,US,VA,20131,6,,,, +US-VA-20132,US,VA,20132,6,,,, +US-VA-20134,US,VA,20134,6,,,, +US-VA-20135,US,VA,20135,5.3,,,, +US-VA-20136,US,VA,20136,6,,,, +US-VA-20137,US,VA,20137,5.3,,,, +US-VA-20138,US,VA,20138,5.3,,,, +US-VA-20139,US,VA,20139,5.3,,,, +US-VA-20140,US,VA,20140,5.3,,,, +US-VA-20141,US,VA,20141,6,,,, +US-VA-20142,US,VA,20142,6,,,, +US-VA-20143,US,VA,20143,6,,,, +US-VA-20144,US,VA,20144,5.3,,,, +US-VA-20146,US,VA,20146,6,,,, +US-VA-20147,US,VA,20147,6,,,, +US-VA-20148,US,VA,20148,6,,,, +US-VA-20149,US,VA,20149,6,,,, +US-VA-20151,US,VA,20151,6,,,, +US-VA-20152,US,VA,20152,6,,,, +US-VA-20153,US,VA,20153,6,,,, +US-VA-20155,US,VA,20155,6,,,, +US-VA-20156,US,VA,20156,6,,,, +US-VA-20158,US,VA,20158,6,,,, +US-VA-20159,US,VA,20159,6,,,, +US-VA-20160,US,VA,20160,6,,,, +US-VA-20163,US,VA,20163,6,,,, +US-VA-20164,US,VA,20164,6,,,, +US-VA-20165,US,VA,20165,6,,,, +US-VA-20166,US,VA,20166,6,,,, +US-VA-20167,US,VA,20167,6,,,, +US-VA-20168,US,VA,20168,6,,,, +US-VA-20169,US,VA,20169,6,,,, +US-VA-20170,US,VA,20170,6,,,, +US-VA-20171,US,VA,20171,6,,,, +US-VA-20172,US,VA,20172,6,,,, +US-VA-20175,US,VA,20175,6,,,, +US-VA-20176,US,VA,20176,6,,,, +US-VA-20177,US,VA,20177,6,,,, +US-VA-20178,US,VA,20178,6,,,, +US-VA-20180,US,VA,20180,6,,,, +US-VA-20181,US,VA,20181,6,,,, +US-VA-20182,US,VA,20182,6,,,, +US-VA-20184,US,VA,20184,5.3,,,, +US-VA-20185,US,VA,20185,5.3,,,, +US-VA-20186,US,VA,20186,5.3,,,, +US-VA-20187,US,VA,20187,5.3,,,, +US-VA-20188,US,VA,20188,5.3,,,, +US-VA-20189,US,VA,20189,6,,,, +US-VA-20190,US,VA,20190,6,,,, +US-VA-20191,US,VA,20191,6,,,, +US-VA-20192,US,VA,20192,6,,,, +US-VA-20194,US,VA,20194,6,,,, +US-VA-20195,US,VA,20195,6,,,, +US-VA-20196,US,VA,20196,6,,,, +US-VA-20197,US,VA,20197,6,,,, +US-VA-20198,US,VA,20198,5.3,,,, +US-VA-22003,US,VA,22003,6,,,, +US-VA-22009,US,VA,22009,6,,,, +US-VA-22015,US,VA,22015,6,,,, +US-VA-22025,US,VA,22025,6,,,, +US-VA-22026,US,VA,22026,6,,,, +US-VA-22027,US,VA,22027,6,,,, +US-VA-22030,US,VA,22030,6,,,, +US-VA-22031,US,VA,22031,6,,,, +US-VA-22032,US,VA,22032,6,,,, +US-VA-22033,US,VA,22033,6,,,, +US-VA-22034,US,VA,22034,6,,,, +US-VA-22035,US,VA,22035,6,,,, +US-VA-22036,US,VA,22036,6,,,, +US-VA-22037,US,VA,22037,6,,,, +US-VA-22038,US,VA,22038,6,,,, +US-VA-22039,US,VA,22039,6,,,, +US-VA-22040,US,VA,22040,6,,,, +US-VA-22041,US,VA,22041,6,,,, +US-VA-22042,US,VA,22042,6,,,, +US-VA-22043,US,VA,22043,6,,,, +US-VA-22044,US,VA,22044,6,,,, +US-VA-22046,US,VA,22046,6,,,, +US-VA-22060,US,VA,22060,6,,,, +US-VA-22066,US,VA,22066,6,,,, +US-VA-22067,US,VA,22067,6,,,, +US-VA-22079,US,VA,22079,6,,,, +US-VA-22081,US,VA,22081,6,,,, +US-VA-22082,US,VA,22082,6,,,, +US-VA-22095,US,VA,22095,6,,,, +US-VA-22096,US,VA,22096,6,,,, +US-VA-22101,US,VA,22101,6,,,, +US-VA-22102,US,VA,22102,6,,,, +US-VA-22103,US,VA,22103,6,,,, +US-VA-22106,US,VA,22106,6,,,, +US-VA-22107,US,VA,22107,6,,,, +US-VA-22108,US,VA,22108,6,,,, +US-VA-22109,US,VA,22109,6,,,, +US-VA-22116,US,VA,22116,6,,,, +US-VA-22118,US,VA,22118,6,,,, +US-VA-22119,US,VA,22119,6,,,, +US-VA-22121,US,VA,22121,6,,,, +US-VA-22122,US,VA,22122,6,,,, +US-VA-22124,US,VA,22124,6,,,, +US-VA-22125,US,VA,22125,6,,,, +US-VA-22134,US,VA,22134,6,,,, +US-VA-22135,US,VA,22135,6,,,, +US-VA-22150,US,VA,22150,6,,,, +US-VA-22151,US,VA,22151,6,,,, +US-VA-22152,US,VA,22152,6,,,, +US-VA-22153,US,VA,22153,6,,,, +US-VA-22156,US,VA,22156,6,,,, +US-VA-22158,US,VA,22158,6,,,, +US-VA-22159,US,VA,22159,6,,,, +US-VA-22160,US,VA,22160,6,,,, +US-VA-22161,US,VA,22161,6,,,, +US-VA-22172,US,VA,22172,6,,,, +US-VA-22180,US,VA,22180,6,,,, +US-VA-22181,US,VA,22181,6,,,, +US-VA-22182,US,VA,22182,6,,,, +US-VA-22183,US,VA,22183,6,,,, +US-VA-22185,US,VA,22185,6,,,, +US-VA-22191,US,VA,22191,6,,,, +US-VA-22192,US,VA,22192,6,,,, +US-VA-22193,US,VA,22193,6,,,, +US-VA-22194,US,VA,22194,6,,,, +US-VA-22195,US,VA,22195,6,,,, +US-VA-22199,US,VA,22199,6,,,, +US-VA-22201,US,VA,22201,6,,,, +US-VA-22202,US,VA,22202,6,,,, +US-VA-22203,US,VA,22203,6,,,, +US-VA-22204,US,VA,22204,6,,,, +US-VA-22205,US,VA,22205,6,,,, +US-VA-22206,US,VA,22206,6,,,, +US-VA-22207,US,VA,22207,6,,,, +US-VA-22209,US,VA,22209,6,,,, +US-VA-22210,US,VA,22210,6,,,, +US-VA-22211,US,VA,22211,6,,,, +US-VA-22212,US,VA,22212,6,,,, +US-VA-22213,US,VA,22213,6,,,, +US-VA-22214,US,VA,22214,6,,,, +US-VA-22215,US,VA,22215,6,,,, +US-VA-22216,US,VA,22216,6,,,, +US-VA-22217,US,VA,22217,6,,,, +US-VA-22219,US,VA,22219,6,,,, +US-VA-22225,US,VA,22225,6,,,, +US-VA-22226,US,VA,22226,6,,,, +US-VA-22227,US,VA,22227,6,,,, +US-VA-22230,US,VA,22230,6,,,, +US-VA-22240,US,VA,22240,6,,,, +US-VA-22241,US,VA,22241,6,,,, +US-VA-22242,US,VA,22242,6,,,, +US-VA-22243,US,VA,22243,6,,,, +US-VA-22244,US,VA,22244,6,,,, +US-VA-22245,US,VA,22245,6,,,, +US-VA-22246,US,VA,22246,6,,,, +US-VA-22301,US,VA,22301,6,,,, +US-VA-22302,US,VA,22302,6,,,, +US-VA-22303,US,VA,22303,6,,,, +US-VA-22304,US,VA,22304,6,,,, +US-VA-22305,US,VA,22305,6,,,, +US-VA-22306,US,VA,22306,6,,,, +US-VA-22307,US,VA,22307,6,,,, +US-VA-22308,US,VA,22308,6,,,, +US-VA-22309,US,VA,22309,6,,,, +US-VA-22310,US,VA,22310,6,,,, +US-VA-22311,US,VA,22311,6,,,, +US-VA-22312,US,VA,22312,6,,,, +US-VA-22313,US,VA,22313,6,,,, +US-VA-22314,US,VA,22314,6,,,, +US-VA-22315,US,VA,22315,6,,,, +US-VA-22320,US,VA,22320,6,,,, +US-VA-22331,US,VA,22331,6,,,, +US-VA-22332,US,VA,22332,6,,,, +US-VA-22333,US,VA,22333,6,,,, +US-VA-22334,US,VA,22334,6,,,, +US-VA-22350,US,VA,22350,6,,,, +US-VA-22401,US,VA,22401,5.3,,,, +US-VA-22402,US,VA,22402,5.3,,,, +US-VA-22403,US,VA,22403,5.3,,,, +US-VA-22404,US,VA,22404,5.3,,,, +US-VA-22405,US,VA,22405,5.3,,,, +US-VA-22406,US,VA,22406,5.3,,,, +US-VA-22407,US,VA,22407,5.3,,,, +US-VA-22408,US,VA,22408,5.3,,,, +US-VA-22412,US,VA,22412,5.3,,,, +US-VA-22427,US,VA,22427,5.3,,,, +US-VA-22428,US,VA,22428,5.3,,,, +US-VA-22430,US,VA,22430,5.3,,,, +US-VA-22432,US,VA,22432,5.3,,,, +US-VA-22433,US,VA,22433,5.3,,,, +US-VA-22435,US,VA,22435,5.3,,,, +US-VA-22436,US,VA,22436,5.3,,,, +US-VA-22437,US,VA,22437,5.3,,,, +US-VA-22438,US,VA,22438,5.3,,,, +US-VA-22442,US,VA,22442,5.3,,,, +US-VA-22443,US,VA,22443,5.3,,,, +US-VA-22446,US,VA,22446,5.3,,,, +US-VA-22448,US,VA,22448,5.3,,,, +US-VA-22451,US,VA,22451,5.3,,,, +US-VA-22454,US,VA,22454,5.3,,,, +US-VA-22456,US,VA,22456,5.3,,,, +US-VA-22460,US,VA,22460,5.3,,,, +US-VA-22463,US,VA,22463,5.3,,,, +US-VA-22469,US,VA,22469,5.3,,,, +US-VA-22471,US,VA,22471,5.3,,,, +US-VA-22472,US,VA,22472,5.3,,,, +US-VA-22473,US,VA,22473,5.3,,,, +US-VA-22476,US,VA,22476,5.3,,,, +US-VA-22480,US,VA,22480,5.3,,,, +US-VA-22481,US,VA,22481,5.3,,,, +US-VA-22482,US,VA,22482,5.3,,,, +US-VA-22485,US,VA,22485,5.3,,,, +US-VA-22488,US,VA,22488,5.3,,,, +US-VA-22501,US,VA,22501,5.3,,,, +US-VA-22503,US,VA,22503,5.3,,,, +US-VA-22504,US,VA,22504,5.3,,,, +US-VA-22507,US,VA,22507,5.3,,,, +US-VA-22508,US,VA,22508,5.3,,,, +US-VA-22509,US,VA,22509,5.3,,,, +US-VA-22511,US,VA,22511,5.3,,,, +US-VA-22513,US,VA,22513,5.3,,,, +US-VA-22514,US,VA,22514,5.3,,,, +US-VA-22517,US,VA,22517,5.3,,,, +US-VA-22520,US,VA,22520,5.3,,,, +US-VA-22523,US,VA,22523,5.3,,,, +US-VA-22524,US,VA,22524,5.3,,,, +US-VA-22528,US,VA,22528,5.3,,,, +US-VA-22529,US,VA,22529,5.3,,,, +US-VA-22530,US,VA,22530,5.3,,,, +US-VA-22534,US,VA,22534,5.3,,,, +US-VA-22535,US,VA,22535,5.3,,,, +US-VA-22538,US,VA,22538,5.3,,,, +US-VA-22539,US,VA,22539,5.3,,,, +US-VA-22542,US,VA,22542,5.3,,,, +US-VA-22544,US,VA,22544,5.3,,,, +US-VA-22545,US,VA,22545,5.3,,,, +US-VA-22546,US,VA,22546,5.3,,,, +US-VA-22548,US,VA,22548,5.3,,,, +US-VA-22551,US,VA,22551,5.3,,,, +US-VA-22552,US,VA,22552,5.3,,,, +US-VA-22553,US,VA,22553,5.3,,,, +US-VA-22554,US,VA,22554,5.3,,,, +US-VA-22555,US,VA,22555,5.3,,,, +US-VA-22556,US,VA,22556,5.3,,,, +US-VA-22558,US,VA,22558,5.3,,,, +US-VA-22560,US,VA,22560,5.3,,,, +US-VA-22565,US,VA,22565,5.3,,,, +US-VA-22567,US,VA,22567,5.3,,,, +US-VA-22570,US,VA,22570,5.3,,,, +US-VA-22572,US,VA,22572,5.3,,,, +US-VA-22576,US,VA,22576,5.3,,,, +US-VA-22577,US,VA,22577,5.3,,,, +US-VA-22578,US,VA,22578,5.3,,,, +US-VA-22579,US,VA,22579,5.3,,,, +US-VA-22580,US,VA,22580,5.3,,,, +US-VA-22581,US,VA,22581,5.3,,,, +US-VA-22601,US,VA,22601,5.3,,,, +US-VA-22602,US,VA,22602,5.3,,,, +US-VA-22603,US,VA,22603,5.3,,,, +US-VA-22604,US,VA,22604,5.3,,,, +US-VA-22610,US,VA,22610,5.3,,,, +US-VA-22611,US,VA,22611,5.3,,,, +US-VA-22620,US,VA,22620,5.3,,,, +US-VA-22622,US,VA,22622,5.3,,,, +US-VA-22623,US,VA,22623,5.3,,,, +US-VA-22624,US,VA,22624,5.3,,,, +US-VA-22625,US,VA,22625,5.3,,,, +US-VA-22626,US,VA,22626,5.3,,,, +US-VA-22627,US,VA,22627,5.3,,,, +US-VA-22630,US,VA,22630,5.3,,,, +US-VA-22637,US,VA,22637,5.3,,,, +US-VA-22639,US,VA,22639,5.3,,,, +US-VA-22640,US,VA,22640,5.3,,,, +US-VA-22641,US,VA,22641,5.3,,,, +US-VA-22642,US,VA,22642,5.3,,,, +US-VA-22643,US,VA,22643,5.3,,,, +US-VA-22644,US,VA,22644,5.3,,,, +US-VA-22645,US,VA,22645,5.3,,,, +US-VA-22646,US,VA,22646,5.3,,,, +US-VA-22649,US,VA,22649,5.3,,,, +US-VA-22650,US,VA,22650,5.3,,,, +US-VA-22652,US,VA,22652,5.3,,,, +US-VA-22654,US,VA,22654,5.3,,,, +US-VA-22655,US,VA,22655,5.3,,,, +US-VA-22656,US,VA,22656,5.3,,,, +US-VA-22657,US,VA,22657,5.3,,,, +US-VA-22660,US,VA,22660,5.3,,,, +US-VA-22663,US,VA,22663,5.3,,,, +US-VA-22664,US,VA,22664,5.3,,,, +US-VA-22701,US,VA,22701,5.3,,,, +US-VA-22709,US,VA,22709,5.3,,,, +US-VA-22711,US,VA,22711,5.3,,,, +US-VA-22712,US,VA,22712,5.3,,,, +US-VA-22713,US,VA,22713,5.3,,,, +US-VA-22714,US,VA,22714,5.3,,,, +US-VA-22715,US,VA,22715,5.3,,,, +US-VA-22716,US,VA,22716,5.3,,,, +US-VA-22718,US,VA,22718,5.3,,,, +US-VA-22719,US,VA,22719,5.3,,,, +US-VA-22720,US,VA,22720,5.3,,,, +US-VA-22722,US,VA,22722,5.3,,,, +US-VA-22723,US,VA,22723,5.3,,,, +US-VA-22724,US,VA,22724,5.3,,,, +US-VA-22725,US,VA,22725,5.3,,,, +US-VA-22726,US,VA,22726,5.3,,,, +US-VA-22727,US,VA,22727,5.3,,,, +US-VA-22728,US,VA,22728,5.3,,,, +US-VA-22729,US,VA,22729,5.3,,,, +US-VA-22730,US,VA,22730,5.3,,,, +US-VA-22731,US,VA,22731,5.3,,,, +US-VA-22732,US,VA,22732,5.3,,,, +US-VA-22733,US,VA,22733,5.3,,,, +US-VA-22734,US,VA,22734,5.3,,,, +US-VA-22735,US,VA,22735,5.3,,,, +US-VA-22736,US,VA,22736,5.3,,,, +US-VA-22737,US,VA,22737,5.3,,,, +US-VA-22738,US,VA,22738,5.3,,,, +US-VA-22739,US,VA,22739,5.3,,,, +US-VA-22740,US,VA,22740,5.3,,,, +US-VA-22741,US,VA,22741,5.3,,,, +US-VA-22742,US,VA,22742,5.3,,,, +US-VA-22743,US,VA,22743,5.3,,,, +US-VA-22746,US,VA,22746,5.3,,,, +US-VA-22747,US,VA,22747,5.3,,,, +US-VA-22748,US,VA,22748,5.3,,,, +US-VA-22749,US,VA,22749,5.3,,,, +US-VA-22801,US,VA,22801,5.3,,,, +US-VA-22802,US,VA,22802,5.3,,,, +US-VA-22803,US,VA,22803,5.3,,,, +US-VA-22807,US,VA,22807,5.3,,,, +US-VA-22810,US,VA,22810,5.3,,,, +US-VA-22811,US,VA,22811,5.3,,,, +US-VA-22812,US,VA,22812,5.3,,,, +US-VA-22815,US,VA,22815,5.3,,,, +US-VA-22820,US,VA,22820,5.3,,,, +US-VA-22821,US,VA,22821,5.3,,,, +US-VA-22824,US,VA,22824,5.3,,,, +US-VA-22827,US,VA,22827,5.3,,,, +US-VA-22830,US,VA,22830,5.3,,,, +US-VA-22831,US,VA,22831,5.3,,,, +US-VA-22832,US,VA,22832,5.3,,,, +US-VA-22833,US,VA,22833,5.3,,,, +US-VA-22834,US,VA,22834,5.3,,,, +US-VA-22835,US,VA,22835,5.3,,,, +US-VA-22840,US,VA,22840,5.3,,,, +US-VA-22841,US,VA,22841,5.3,,,, +US-VA-22842,US,VA,22842,5.3,,,, +US-VA-22843,US,VA,22843,5.3,,,, +US-VA-22844,US,VA,22844,5.3,,,, +US-VA-22845,US,VA,22845,5.3,,,, +US-VA-22846,US,VA,22846,5.3,,,, +US-VA-22847,US,VA,22847,5.3,,,, +US-VA-22848,US,VA,22848,5.3,,,, +US-VA-22849,US,VA,22849,5.3,,,, +US-VA-22850,US,VA,22850,5.3,,,, +US-VA-22851,US,VA,22851,5.3,,,, +US-VA-22853,US,VA,22853,5.3,,,, +US-VA-22901,US,VA,22901,5.3,,,, +US-VA-22902,US,VA,22902,5.3,,,, +US-VA-22903,US,VA,22903,5.3,,,, +US-VA-22904,US,VA,22904,5.3,,,, +US-VA-22905,US,VA,22905,5.3,,,, +US-VA-22906,US,VA,22906,5.3,,,, +US-VA-22907,US,VA,22907,5.3,,,, +US-VA-22908,US,VA,22908,5.3,,,, +US-VA-22909,US,VA,22909,5.3,,,, +US-VA-22910,US,VA,22910,5.3,,,, +US-VA-22911,US,VA,22911,5.3,,,, +US-VA-22920,US,VA,22920,5.3,,,, +US-VA-22922,US,VA,22922,5.3,,,, +US-VA-22923,US,VA,22923,5.3,,,, +US-VA-22924,US,VA,22924,5.3,,,, +US-VA-22931,US,VA,22931,5.3,,,, +US-VA-22932,US,VA,22932,5.3,,,, +US-VA-22935,US,VA,22935,5.3,,,, +US-VA-22936,US,VA,22936,5.3,,,, +US-VA-22937,US,VA,22937,5.3,,,, +US-VA-22938,US,VA,22938,5.3,,,, +US-VA-22939,US,VA,22939,5.3,,,, +US-VA-22940,US,VA,22940,5.3,,,, +US-VA-22942,US,VA,22942,5.3,,,, +US-VA-22943,US,VA,22943,5.3,,,, +US-VA-22945,US,VA,22945,5.3,,,, +US-VA-22946,US,VA,22946,5.3,,,, +US-VA-22947,US,VA,22947,5.3,,,, +US-VA-22948,US,VA,22948,5.3,,,, +US-VA-22949,US,VA,22949,5.3,,,, +US-VA-22952,US,VA,22952,5.3,,,, +US-VA-22957,US,VA,22957,5.3,,,, +US-VA-22958,US,VA,22958,5.3,,,, +US-VA-22959,US,VA,22959,5.3,,,, +US-VA-22960,US,VA,22960,5.3,,,, +US-VA-22963,US,VA,22963,5.3,,,, +US-VA-22964,US,VA,22964,5.3,,,, +US-VA-22967,US,VA,22967,5.3,,,, +US-VA-22968,US,VA,22968,5.3,,,, +US-VA-22969,US,VA,22969,5.3,,,, +US-VA-22971,US,VA,22971,5.3,,,, +US-VA-22972,US,VA,22972,5.3,,,, +US-VA-22973,US,VA,22973,5.3,,,, +US-VA-22974,US,VA,22974,5.3,,,, +US-VA-22976,US,VA,22976,5.3,,,, +US-VA-22980,US,VA,22980,5.3,,,, +US-VA-22987,US,VA,22987,5.3,,,, +US-VA-22989,US,VA,22989,5.3,,,, +US-VA-23002,US,VA,23002,5.3,,,, +US-VA-23003,US,VA,23003,5.3,,,, +US-VA-23004,US,VA,23004,5.3,,,, +US-VA-23005,US,VA,23005,5.3,,,, +US-VA-23009,US,VA,23009,5.3,,,, +US-VA-23011,US,VA,23011,5.3,,,, +US-VA-23014,US,VA,23014,5.3,,,, +US-VA-23015,US,VA,23015,5.3,,,, +US-VA-23018,US,VA,23018,5.3,,,, +US-VA-23021,US,VA,23021,5.3,,,, +US-VA-23022,US,VA,23022,5.3,,,, +US-VA-23023,US,VA,23023,5.3,,,, +US-VA-23024,US,VA,23024,5.3,,,, +US-VA-23025,US,VA,23025,5.3,,,, +US-VA-23027,US,VA,23027,5.3,,,, +US-VA-23030,US,VA,23030,5.3,,,, +US-VA-23031,US,VA,23031,5.3,,,, +US-VA-23032,US,VA,23032,5.3,,,, +US-VA-23035,US,VA,23035,5.3,,,, +US-VA-23038,US,VA,23038,5.3,,,, +US-VA-23039,US,VA,23039,5.3,,,, +US-VA-23040,US,VA,23040,5.3,,,, +US-VA-23043,US,VA,23043,5.3,,,, +US-VA-23045,US,VA,23045,5.3,,,, +US-VA-23047,US,VA,23047,5.3,,,, +US-VA-23050,US,VA,23050,5.3,,,, +US-VA-23055,US,VA,23055,5.3,,,, +US-VA-23056,US,VA,23056,5.3,,,, +US-VA-23058,US,VA,23058,5.3,,,, +US-VA-23059,US,VA,23059,5.3,,,, +US-VA-23060,US,VA,23060,5.3,,,, +US-VA-23061,US,VA,23061,5.3,,,, +US-VA-23062,US,VA,23062,5.3,,,, +US-VA-23063,US,VA,23063,5.3,,,, +US-VA-23064,US,VA,23064,5.3,,,, +US-VA-23065,US,VA,23065,5.3,,,, +US-VA-23066,US,VA,23066,5.3,,,, +US-VA-23067,US,VA,23067,5.3,,,, +US-VA-23068,US,VA,23068,5.3,,,, +US-VA-23069,US,VA,23069,5.3,,,, +US-VA-23070,US,VA,23070,5.3,,,, +US-VA-23071,US,VA,23071,5.3,,,, +US-VA-23072,US,VA,23072,5.3,,,, +US-VA-23075,US,VA,23075,5.3,,,, +US-VA-23076,US,VA,23076,5.3,,,, +US-VA-23079,US,VA,23079,5.3,,,, +US-VA-23081,US,VA,23081,6,,,, +US-VA-23083,US,VA,23083,5.3,,,, +US-VA-23084,US,VA,23084,5.3,,,, +US-VA-23085,US,VA,23085,5.3,,,, +US-VA-23086,US,VA,23086,5.3,,,, +US-VA-23089,US,VA,23089,5.3,,,, +US-VA-23090,US,VA,23090,6,,,, +US-VA-23091,US,VA,23091,5.3,,,, +US-VA-23092,US,VA,23092,5.3,,,, +US-VA-23093,US,VA,23093,5.3,,,, +US-VA-23102,US,VA,23102,5.3,,,, +US-VA-23103,US,VA,23103,5.3,,,, +US-VA-23105,US,VA,23105,5.3,,,, +US-VA-23106,US,VA,23106,5.3,,,, +US-VA-23107,US,VA,23107,5.3,,,, +US-VA-23108,US,VA,23108,5.3,,,, +US-VA-23109,US,VA,23109,5.3,,,, +US-VA-23110,US,VA,23110,5.3,,,, +US-VA-23111,US,VA,23111,5.3,,,, +US-VA-23112,US,VA,23112,5.3,,,, +US-VA-23113,US,VA,23113,5.3,,,, +US-VA-23114,US,VA,23114,5.3,,,, +US-VA-23115,US,VA,23115,5.3,,,, +US-VA-23116,US,VA,23116,5.3,,,, +US-VA-23117,US,VA,23117,5.3,,,, +US-VA-23119,US,VA,23119,5.3,,,, +US-VA-23120,US,VA,23120,5.3,,,, +US-VA-23123,US,VA,23123,5.3,,,, +US-VA-23124,US,VA,23124,5.3,,,, +US-VA-23125,US,VA,23125,5.3,,,, +US-VA-23126,US,VA,23126,5.3,,,, +US-VA-23128,US,VA,23128,5.3,,,, +US-VA-23129,US,VA,23129,5.3,,,, +US-VA-23130,US,VA,23130,5.3,,,, +US-VA-23131,US,VA,23131,5.3,,,, +US-VA-23138,US,VA,23138,5.3,,,, +US-VA-23139,US,VA,23139,5.3,,,, +US-VA-23140,US,VA,23140,5.3,,,, +US-VA-23141,US,VA,23141,5.3,,,, +US-VA-23146,US,VA,23146,5.3,,,, +US-VA-23147,US,VA,23147,5.3,,,, +US-VA-23148,US,VA,23148,5.3,,,, +US-VA-23149,US,VA,23149,5.3,,,, +US-VA-23150,US,VA,23150,5.3,,,, +US-VA-23153,US,VA,23153,5.3,,,, +US-VA-23154,US,VA,23154,5.3,,,, +US-VA-23156,US,VA,23156,5.3,,,, +US-VA-23160,US,VA,23160,5.3,,,, +US-VA-23161,US,VA,23161,5.3,,,, +US-VA-23162,US,VA,23162,5.3,,,, +US-VA-23163,US,VA,23163,5.3,,,, +US-VA-23168,US,VA,23168,6,,,, +US-VA-23169,US,VA,23169,5.3,,,, +US-VA-23170,US,VA,23170,5.3,,,, +US-VA-23173,US,VA,23173,5.3,,,, +US-VA-23175,US,VA,23175,5.3,,,, +US-VA-23176,US,VA,23176,5.3,,,, +US-VA-23177,US,VA,23177,5.3,,,, +US-VA-23178,US,VA,23178,5.3,,,, +US-VA-23180,US,VA,23180,5.3,,,, +US-VA-23181,US,VA,23181,5.3,,,, +US-VA-23183,US,VA,23183,5.3,,,, +US-VA-23184,US,VA,23184,5.3,,,, +US-VA-23185,US,VA,23185,6,,,, +US-VA-23186,US,VA,23186,6,,,, +US-VA-23187,US,VA,23187,6,,,, +US-VA-23188,US,VA,23188,6,,,, +US-VA-23190,US,VA,23190,5.3,,,, +US-VA-23192,US,VA,23192,5.3,,,, +US-VA-23218,US,VA,23218,5.3,,,, +US-VA-23219,US,VA,23219,5.3,,,, +US-VA-23220,US,VA,23220,5.3,,,, +US-VA-23221,US,VA,23221,5.3,,,, +US-VA-23222,US,VA,23222,5.3,,,, +US-VA-23223,US,VA,23223,5.3,,,, +US-VA-23224,US,VA,23224,5.3,,,, +US-VA-23225,US,VA,23225,5.3,,,, +US-VA-23226,US,VA,23226,5.3,,,, +US-VA-23227,US,VA,23227,5.3,,,, +US-VA-23228,US,VA,23228,5.3,,,, +US-VA-23229,US,VA,23229,5.3,,,, +US-VA-23230,US,VA,23230,5.3,,,, +US-VA-23231,US,VA,23231,5.3,,,, +US-VA-23232,US,VA,23232,5.3,,,, +US-VA-23233,US,VA,23233,5.3,,,, +US-VA-23234,US,VA,23234,5.3,,,, +US-VA-23235,US,VA,23235,5.3,,,, +US-VA-23236,US,VA,23236,5.3,,,, +US-VA-23237,US,VA,23237,5.3,,,, +US-VA-23238,US,VA,23238,5.3,,,, +US-VA-23241,US,VA,23241,5.3,,,, +US-VA-23242,US,VA,23242,5.3,,,, +US-VA-23249,US,VA,23249,5.3,,,, +US-VA-23250,US,VA,23250,5.3,,,, +US-VA-23255,US,VA,23255,5.3,,,, +US-VA-23260,US,VA,23260,5.3,,,, +US-VA-23261,US,VA,23261,5.3,,,, +US-VA-23269,US,VA,23269,5.3,,,, +US-VA-23273,US,VA,23273,5.3,,,, +US-VA-23274,US,VA,23274,5.3,,,, +US-VA-23276,US,VA,23276,5.3,,,, +US-VA-23278,US,VA,23278,5.3,,,, +US-VA-23279,US,VA,23279,5.3,,,, +US-VA-23282,US,VA,23282,5.3,,,, +US-VA-23284,US,VA,23284,5.3,,,, +US-VA-23285,US,VA,23285,5.3,,,, +US-VA-23286,US,VA,23286,5.3,,,, +US-VA-23288,US,VA,23288,5.3,,,, +US-VA-23289,US,VA,23289,5.3,,,, +US-VA-23290,US,VA,23290,5.3,,,, +US-VA-23291,US,VA,23291,5.3,,,, +US-VA-23292,US,VA,23292,5.3,,,, +US-VA-23293,US,VA,23293,5.3,,,, +US-VA-23294,US,VA,23294,5.3,,,, +US-VA-23295,US,VA,23295,5.3,,,, +US-VA-23297,US,VA,23297,5.3,,,, +US-VA-23298,US,VA,23298,5.3,,,, +US-VA-23301,US,VA,23301,5.3,,,, +US-VA-23302,US,VA,23302,5.3,,,, +US-VA-23303,US,VA,23303,5.3,,,, +US-VA-23304,US,VA,23304,6,,,, +US-VA-23306,US,VA,23306,5.3,,,, +US-VA-23307,US,VA,23307,5.3,,,, +US-VA-23308,US,VA,23308,5.3,,,, +US-VA-23310,US,VA,23310,5.3,,,, +US-VA-23313,US,VA,23313,5.3,,,, +US-VA-23314,US,VA,23314,6,,,, +US-VA-23315,US,VA,23315,6,,,, +US-VA-23316,US,VA,23316,5.3,,,, +US-VA-23320,US,VA,23320,6,,,, +US-VA-23321,US,VA,23321,6,,,, +US-VA-23322,US,VA,23322,6,,,, +US-VA-23323,US,VA,23323,6,,,, +US-VA-23324,US,VA,23324,6,,,, +US-VA-23325,US,VA,23325,6,,,, +US-VA-23326,US,VA,23326,6,,,, +US-VA-23327,US,VA,23327,6,,,, +US-VA-23328,US,VA,23328,6,,,, +US-VA-23336,US,VA,23336,5.3,,,, +US-VA-23337,US,VA,23337,5.3,,,, +US-VA-23341,US,VA,23341,5.3,,,, +US-VA-23345,US,VA,23345,5.3,,,, +US-VA-23347,US,VA,23347,5.3,,,, +US-VA-23350,US,VA,23350,5.3,,,, +US-VA-23354,US,VA,23354,5.3,,,, +US-VA-23356,US,VA,23356,5.3,,,, +US-VA-23357,US,VA,23357,5.3,,,, +US-VA-23358,US,VA,23358,5.3,,,, +US-VA-23359,US,VA,23359,5.3,,,, +US-VA-23389,US,VA,23389,5.3,,,, +US-VA-23395,US,VA,23395,5.3,,,, +US-VA-23396,US,VA,23396,5.3,,,, +US-VA-23397,US,VA,23397,6,,,, +US-VA-23398,US,VA,23398,5.3,,,, +US-VA-23399,US,VA,23399,5.3,,,, +US-VA-23401,US,VA,23401,5.3,,,, +US-VA-23404,US,VA,23404,5.3,,,, +US-VA-23405,US,VA,23405,5.3,,,, +US-VA-23407,US,VA,23407,5.3,,,, +US-VA-23408,US,VA,23408,5.3,,,, +US-VA-23409,US,VA,23409,5.3,,,, +US-VA-23410,US,VA,23410,5.3,,,, +US-VA-23412,US,VA,23412,5.3,,,, +US-VA-23413,US,VA,23413,5.3,,,, +US-VA-23414,US,VA,23414,5.3,,,, +US-VA-23415,US,VA,23415,5.3,,,, +US-VA-23416,US,VA,23416,5.3,,,, +US-VA-23417,US,VA,23417,5.3,,,, +US-VA-23418,US,VA,23418,5.3,,,, +US-VA-23419,US,VA,23419,5.3,,,, +US-VA-23420,US,VA,23420,5.3,,,, +US-VA-23421,US,VA,23421,5.3,,,, +US-VA-23422,US,VA,23422,5.3,,,, +US-VA-23423,US,VA,23423,5.3,,,, +US-VA-23424,US,VA,23424,6,,,, +US-VA-23426,US,VA,23426,5.3,,,, +US-VA-23427,US,VA,23427,5.3,,,, +US-VA-23429,US,VA,23429,5.3,,,, +US-VA-23430,US,VA,23430,6,,,, +US-VA-23431,US,VA,23431,6,,,, +US-VA-23432,US,VA,23432,6,,,, +US-VA-23433,US,VA,23433,6,,,, +US-VA-23434,US,VA,23434,6,,,, +US-VA-23435,US,VA,23435,6,,,, +US-VA-23436,US,VA,23436,6,,,, +US-VA-23437,US,VA,23437,6,,,, +US-VA-23438,US,VA,23438,6,,,, +US-VA-23439,US,VA,23439,6,,,, +US-VA-23440,US,VA,23440,5.3,,,, +US-VA-23441,US,VA,23441,5.3,,,, +US-VA-23442,US,VA,23442,5.3,,,, +US-VA-23443,US,VA,23443,5.3,,,, +US-VA-23450,US,VA,23450,6,,,, +US-VA-23451,US,VA,23451,6,,,, +US-VA-23452,US,VA,23452,6,,,, +US-VA-23453,US,VA,23453,6,,,, +US-VA-23454,US,VA,23454,6,,,, +US-VA-23455,US,VA,23455,6,,,, +US-VA-23456,US,VA,23456,6,,,, +US-VA-23457,US,VA,23457,6,,,, +US-VA-23458,US,VA,23458,6,,,, +US-VA-23459,US,VA,23459,6,,,, +US-VA-23460,US,VA,23460,6,,,, +US-VA-23461,US,VA,23461,6,,,, +US-VA-23462,US,VA,23462,6,,,, +US-VA-23463,US,VA,23463,6,,,, +US-VA-23464,US,VA,23464,6,,,, +US-VA-23465,US,VA,23465,6,,,, +US-VA-23466,US,VA,23466,6,,,, +US-VA-23467,US,VA,23467,6,,,, +US-VA-23471,US,VA,23471,6,,,, +US-VA-23479,US,VA,23479,6,,,, +US-VA-23480,US,VA,23480,5.3,,,, +US-VA-23482,US,VA,23482,5.3,,,, +US-VA-23483,US,VA,23483,5.3,,,, +US-VA-23486,US,VA,23486,5.3,,,, +US-VA-23487,US,VA,23487,6,,,, +US-VA-23488,US,VA,23488,5.3,,,, +US-VA-23501,US,VA,23501,6,,,, +US-VA-23502,US,VA,23502,6,,,, +US-VA-23503,US,VA,23503,6,,,, +US-VA-23504,US,VA,23504,6,,,, +US-VA-23505,US,VA,23505,6,,,, +US-VA-23506,US,VA,23506,6,,,, +US-VA-23507,US,VA,23507,6,,,, +US-VA-23508,US,VA,23508,6,,,, +US-VA-23509,US,VA,23509,6,,,, +US-VA-23510,US,VA,23510,6,,,, +US-VA-23511,US,VA,23511,6,,,, +US-VA-23513,US,VA,23513,6,,,, +US-VA-23514,US,VA,23514,6,,,, +US-VA-23515,US,VA,23515,6,,,, +US-VA-23517,US,VA,23517,6,,,, +US-VA-23518,US,VA,23518,6,,,, +US-VA-23519,US,VA,23519,6,,,, +US-VA-23520,US,VA,23520,6,,,, +US-VA-23521,US,VA,23521,6,,,, +US-VA-23523,US,VA,23523,6,,,, +US-VA-23529,US,VA,23529,6,,,, +US-VA-23541,US,VA,23541,6,,,, +US-VA-23551,US,VA,23551,6,,,, +US-VA-23601,US,VA,23601,6,,,, +US-VA-23602,US,VA,23602,6,,,, +US-VA-23603,US,VA,23603,6,,,, +US-VA-23604,US,VA,23604,6,,,, +US-VA-23605,US,VA,23605,6,,,, +US-VA-23606,US,VA,23606,6,,,, +US-VA-23607,US,VA,23607,6,,,, +US-VA-23608,US,VA,23608,6,,,, +US-VA-23609,US,VA,23609,6,,,, +US-VA-23612,US,VA,23612,6,,,, +US-VA-23628,US,VA,23628,6,,,, +US-VA-23630,US,VA,23630,6,,,, +US-VA-23651,US,VA,23651,6,,,, +US-VA-23661,US,VA,23661,6,,,, +US-VA-23662,US,VA,23662,6,,,, +US-VA-23663,US,VA,23663,6,,,, +US-VA-23664,US,VA,23664,6,,,, +US-VA-23665,US,VA,23665,6,,,, +US-VA-23666,US,VA,23666,6,,,, +US-VA-23667,US,VA,23667,6,,,, +US-VA-23668,US,VA,23668,6,,,, +US-VA-23669,US,VA,23669,6,,,, +US-VA-23670,US,VA,23670,6,,,, +US-VA-23681,US,VA,23681,6,,,, +US-VA-23690,US,VA,23690,6,,,, +US-VA-23691,US,VA,23691,6,,,, +US-VA-23692,US,VA,23692,6,,,, +US-VA-23693,US,VA,23693,6,,,, +US-VA-23694,US,VA,23694,6,,,, +US-VA-23696,US,VA,23696,6,,,, +US-VA-23701,US,VA,23701,6,,,, +US-VA-23702,US,VA,23702,6,,,, +US-VA-23703,US,VA,23703,6,,,, +US-VA-23704,US,VA,23704,6,,,, +US-VA-23705,US,VA,23705,6,,,, +US-VA-23707,US,VA,23707,6,,,, +US-VA-23708,US,VA,23708,6,,,, +US-VA-23709,US,VA,23709,6,,,, +US-VA-23801,US,VA,23801,5.3,,,, +US-VA-23803,US,VA,23803,5.3,,,, +US-VA-23804,US,VA,23804,5.3,,,, +US-VA-23805,US,VA,23805,5.3,,,, +US-VA-23806,US,VA,23806,5.3,,,, +US-VA-23821,US,VA,23821,5.3,,,, +US-VA-23822,US,VA,23822,5.3,,,, +US-VA-23824,US,VA,23824,5.3,,,, +US-VA-23827,US,VA,23827,6,,,, +US-VA-23828,US,VA,23828,6,,,, +US-VA-23829,US,VA,23829,6,,,, +US-VA-23830,US,VA,23830,5.3,,,, +US-VA-23831,US,VA,23831,5.3,,,, +US-VA-23832,US,VA,23832,5.3,,,, +US-VA-23833,US,VA,23833,5.3,,,, +US-VA-23834,US,VA,23834,5.3,,,, +US-VA-23836,US,VA,23836,5.3,,,, +US-VA-23837,US,VA,23837,6,,,, +US-VA-23838,US,VA,23838,5.3,,,, +US-VA-23839,US,VA,23839,5.3,,,, +US-VA-23840,US,VA,23840,5.3,,,, +US-VA-23841,US,VA,23841,5.3,,,, +US-VA-23842,US,VA,23842,5.3,,,, +US-VA-23843,US,VA,23843,5.3,,,, +US-VA-23844,US,VA,23844,6,,,, +US-VA-23845,US,VA,23845,5.3,,,, +US-VA-23846,US,VA,23846,5.3,,,, +US-VA-23847,US,VA,23847,5.3,,,, +US-VA-23850,US,VA,23850,5.3,,,, +US-VA-23851,US,VA,23851,6,,,, +US-VA-23856,US,VA,23856,5.3,,,, +US-VA-23857,US,VA,23857,5.3,,,, +US-VA-23860,US,VA,23860,5.3,,,, +US-VA-23866,US,VA,23866,6,,,, +US-VA-23867,US,VA,23867,5.3,,,, +US-VA-23868,US,VA,23868,5.3,,,, +US-VA-23870,US,VA,23870,5.3,,,, +US-VA-23872,US,VA,23872,5.3,,,, +US-VA-23874,US,VA,23874,6,,,, +US-VA-23875,US,VA,23875,5.3,,,, +US-VA-23876,US,VA,23876,5.3,,,, +US-VA-23878,US,VA,23878,6,,,, +US-VA-23879,US,VA,23879,5.3,,,, +US-VA-23881,US,VA,23881,5.3,,,, +US-VA-23882,US,VA,23882,5.3,,,, +US-VA-23883,US,VA,23883,5.3,,,, +US-VA-23884,US,VA,23884,5.3,,,, +US-VA-23885,US,VA,23885,5.3,,,, +US-VA-23887,US,VA,23887,5.3,,,, +US-VA-23888,US,VA,23888,5.3,,,, +US-VA-23889,US,VA,23889,5.3,,,, +US-VA-23890,US,VA,23890,5.3,,,, +US-VA-23891,US,VA,23891,5.3,,,, +US-VA-23893,US,VA,23893,5.3,,,, +US-VA-23894,US,VA,23894,5.3,,,, +US-VA-23897,US,VA,23897,5.3,,,, +US-VA-23898,US,VA,23898,6,,,, +US-VA-23899,US,VA,23899,5.3,,,, +US-VA-23901,US,VA,23901,5.3,,,, +US-VA-23909,US,VA,23909,5.3,,,, +US-VA-23915,US,VA,23915,5.3,,,, +US-VA-23917,US,VA,23917,5.3,,,, +US-VA-23919,US,VA,23919,5.3,,,, +US-VA-23920,US,VA,23920,5.3,,,, +US-VA-23921,US,VA,23921,5.3,,,, +US-VA-23922,US,VA,23922,5.3,,,, +US-VA-23923,US,VA,23923,5.3,,,, +US-VA-23924,US,VA,23924,5.3,,,, +US-VA-23927,US,VA,23927,5.3,,,, +US-VA-23930,US,VA,23930,5.3,,,, +US-VA-23934,US,VA,23934,5.3,,,, +US-VA-23936,US,VA,23936,5.3,,,, +US-VA-23937,US,VA,23937,5.3,,,, +US-VA-23938,US,VA,23938,5.3,,,, +US-VA-23939,US,VA,23939,5.3,,,, +US-VA-23941,US,VA,23941,5.3,,,, +US-VA-23942,US,VA,23942,5.3,,,, +US-VA-23943,US,VA,23943,5.3,,,, +US-VA-23944,US,VA,23944,5.3,,,, +US-VA-23947,US,VA,23947,5.3,,,, +US-VA-23950,US,VA,23950,5.3,,,, +US-VA-23952,US,VA,23952,5.3,,,, +US-VA-23954,US,VA,23954,5.3,,,, +US-VA-23955,US,VA,23955,5.3,,,, +US-VA-23958,US,VA,23958,5.3,,,, +US-VA-23959,US,VA,23959,5.3,,,, +US-VA-23960,US,VA,23960,5.3,,,, +US-VA-23962,US,VA,23962,5.3,,,, +US-VA-23963,US,VA,23963,5.3,,,, +US-VA-23964,US,VA,23964,5.3,,,, +US-VA-23966,US,VA,23966,5.3,,,, +US-VA-23967,US,VA,23967,5.3,,,, +US-VA-23968,US,VA,23968,5.3,,,, +US-VA-23970,US,VA,23970,5.3,,,, +US-VA-23974,US,VA,23974,5.3,,,, +US-VA-23976,US,VA,23976,5.3,,,, +US-VA-24001,US,VA,24001,5.3,,,, +US-VA-24002,US,VA,24002,5.3,,,, +US-VA-24003,US,VA,24003,5.3,,,, +US-VA-24004,US,VA,24004,5.3,,,, +US-VA-24005,US,VA,24005,5.3,,,, +US-VA-24006,US,VA,24006,5.3,,,, +US-VA-24007,US,VA,24007,5.3,,,, +US-VA-24008,US,VA,24008,5.3,,,, +US-VA-24009,US,VA,24009,5.3,,,, +US-VA-24010,US,VA,24010,5.3,,,, +US-VA-24011,US,VA,24011,5.3,,,, +US-VA-24012,US,VA,24012,5.3,,,, +US-VA-24013,US,VA,24013,5.3,,,, +US-VA-24014,US,VA,24014,5.3,,,, +US-VA-24015,US,VA,24015,5.3,,,, +US-VA-24016,US,VA,24016,5.3,,,, +US-VA-24017,US,VA,24017,5.3,,,, +US-VA-24018,US,VA,24018,5.3,,,, +US-VA-24019,US,VA,24019,5.3,,,, +US-VA-24020,US,VA,24020,5.3,,,, +US-VA-24022,US,VA,24022,5.3,,,, +US-VA-24023,US,VA,24023,5.3,,,, +US-VA-24024,US,VA,24024,5.3,,,, +US-VA-24025,US,VA,24025,5.3,,,, +US-VA-24026,US,VA,24026,5.3,,,, +US-VA-24027,US,VA,24027,5.3,,,, +US-VA-24028,US,VA,24028,5.3,,,, +US-VA-24029,US,VA,24029,5.3,,,, +US-VA-24030,US,VA,24030,5.3,,,, +US-VA-24031,US,VA,24031,5.3,,,, +US-VA-24032,US,VA,24032,5.3,,,, +US-VA-24033,US,VA,24033,5.3,,,, +US-VA-24034,US,VA,24034,5.3,,,, +US-VA-24035,US,VA,24035,5.3,,,, +US-VA-24036,US,VA,24036,5.3,,,, +US-VA-24037,US,VA,24037,5.3,,,, +US-VA-24038,US,VA,24038,5.3,,,, +US-VA-24040,US,VA,24040,5.3,,,, +US-VA-24042,US,VA,24042,5.3,,,, +US-VA-24043,US,VA,24043,5.3,,,, +US-VA-24050,US,VA,24050,5.3,,,, +US-VA-24053,US,VA,24053,5.3,,,, +US-VA-24054,US,VA,24054,5.3,,,, +US-VA-24055,US,VA,24055,5.3,,,, +US-VA-24058,US,VA,24058,5.3,,,, +US-VA-24059,US,VA,24059,5.3,,,, +US-VA-24060,US,VA,24060,5.3,,,, +US-VA-24061,US,VA,24061,5.3,,,, +US-VA-24062,US,VA,24062,5.3,,,, +US-VA-24063,US,VA,24063,5.3,,,, +US-VA-24064,US,VA,24064,5.3,,,, +US-VA-24065,US,VA,24065,5.3,,,, +US-VA-24066,US,VA,24066,5.3,,,, +US-VA-24067,US,VA,24067,5.3,,,, +US-VA-24068,US,VA,24068,5.3,,,, +US-VA-24069,US,VA,24069,5.3,,,, +US-VA-24070,US,VA,24070,5.3,,,, +US-VA-24072,US,VA,24072,5.3,,,, +US-VA-24073,US,VA,24073,5.3,,,, +US-VA-24076,US,VA,24076,5.3,,,, +US-VA-24077,US,VA,24077,5.3,,,, +US-VA-24078,US,VA,24078,5.3,,,, +US-VA-24079,US,VA,24079,5.3,,,, +US-VA-24082,US,VA,24082,5.3,,,, +US-VA-24083,US,VA,24083,5.3,,,, +US-VA-24084,US,VA,24084,5.3,,,, +US-VA-24085,US,VA,24085,5.3,,,, +US-VA-24086,US,VA,24086,5.3,,,, +US-VA-24087,US,VA,24087,5.3,,,, +US-VA-24088,US,VA,24088,5.3,,,, +US-VA-24089,US,VA,24089,5.3,,,, +US-VA-24090,US,VA,24090,5.3,,,, +US-VA-24091,US,VA,24091,5.3,,,, +US-VA-24092,US,VA,24092,5.3,,,, +US-VA-24093,US,VA,24093,5.3,,,, +US-VA-24095,US,VA,24095,5.3,,,, +US-VA-24101,US,VA,24101,5.3,,,, +US-VA-24102,US,VA,24102,5.3,,,, +US-VA-24104,US,VA,24104,5.3,,,, +US-VA-24105,US,VA,24105,5.3,,,, +US-VA-24112,US,VA,24112,5.3,,,, +US-VA-24113,US,VA,24113,5.3,,,, +US-VA-24114,US,VA,24114,5.3,,,, +US-VA-24115,US,VA,24115,5.3,,,, +US-VA-24120,US,VA,24120,5.3,,,, +US-VA-24121,US,VA,24121,5.3,,,, +US-VA-24122,US,VA,24122,5.3,,,, +US-VA-24124,US,VA,24124,5.3,,,, +US-VA-24127,US,VA,24127,5.3,,,, +US-VA-24128,US,VA,24128,5.3,,,, +US-VA-24129,US,VA,24129,5.3,,,, +US-VA-24130,US,VA,24130,5.3,,,, +US-VA-24131,US,VA,24131,5.3,,,, +US-VA-24132,US,VA,24132,5.3,,,, +US-VA-24133,US,VA,24133,5.3,,,, +US-VA-24134,US,VA,24134,5.3,,,, +US-VA-24136,US,VA,24136,5.3,,,, +US-VA-24137,US,VA,24137,5.3,,,, +US-VA-24138,US,VA,24138,5.3,,,, +US-VA-24139,US,VA,24139,5.3,,,, +US-VA-24141,US,VA,24141,5.3,,,, +US-VA-24142,US,VA,24142,5.3,,,, +US-VA-24143,US,VA,24143,5.3,,,, +US-VA-24146,US,VA,24146,5.3,,,, +US-VA-24147,US,VA,24147,5.3,,,, +US-VA-24148,US,VA,24148,5.3,,,, +US-VA-24149,US,VA,24149,5.3,,,, +US-VA-24150,US,VA,24150,5.3,,,, +US-VA-24151,US,VA,24151,5.3,,,, +US-VA-24153,US,VA,24153,5.3,,,, +US-VA-24155,US,VA,24155,5.3,,,, +US-VA-24157,US,VA,24157,5.3,,,, +US-VA-24161,US,VA,24161,5.3,,,, +US-VA-24162,US,VA,24162,5.3,,,, +US-VA-24165,US,VA,24165,5.3,,,, +US-VA-24167,US,VA,24167,5.3,,,, +US-VA-24168,US,VA,24168,5.3,,,, +US-VA-24171,US,VA,24171,5.3,,,, +US-VA-24174,US,VA,24174,5.3,,,, +US-VA-24175,US,VA,24175,5.3,,,, +US-VA-24176,US,VA,24176,5.3,,,, +US-VA-24177,US,VA,24177,5.3,,,, +US-VA-24178,US,VA,24178,5.3,,,, +US-VA-24179,US,VA,24179,5.3,,,, +US-VA-24184,US,VA,24184,5.3,,,, +US-VA-24185,US,VA,24185,5.3,,,, +US-VA-24201,US,VA,24201,5.3,,,, +US-VA-24202,US,VA,24202,5.3,,,, +US-VA-24203,US,VA,24203,5.3,,,, +US-VA-24205,US,VA,24205,5.3,,,, +US-VA-24209,US,VA,24209,5.3,,,, +US-VA-24210,US,VA,24210,5.3,,,, +US-VA-24211,US,VA,24211,5.3,,,, +US-VA-24212,US,VA,24212,5.3,,,, +US-VA-24215,US,VA,24215,5.3,,,, +US-VA-24216,US,VA,24216,5.3,,,, +US-VA-24217,US,VA,24217,5.3,,,, +US-VA-24218,US,VA,24218,5.3,,,, +US-VA-24219,US,VA,24219,5.3,,,, +US-VA-24220,US,VA,24220,5.3,,,, +US-VA-24221,US,VA,24221,5.3,,,, +US-VA-24224,US,VA,24224,5.3,,,, +US-VA-24225,US,VA,24225,5.3,,,, +US-VA-24226,US,VA,24226,5.3,,,, +US-VA-24228,US,VA,24228,5.3,,,, +US-VA-24230,US,VA,24230,5.3,,,, +US-VA-24236,US,VA,24236,5.3,,,, +US-VA-24237,US,VA,24237,5.3,,,, +US-VA-24239,US,VA,24239,5.3,,,, +US-VA-24243,US,VA,24243,5.3,,,, +US-VA-24244,US,VA,24244,5.3,,,, +US-VA-24245,US,VA,24245,5.3,,,, +US-VA-24246,US,VA,24246,5.3,,,, +US-VA-24248,US,VA,24248,5.3,,,, +US-VA-24250,US,VA,24250,5.3,,,, +US-VA-24251,US,VA,24251,5.3,,,, +US-VA-24256,US,VA,24256,5.3,,,, +US-VA-24258,US,VA,24258,5.3,,,, +US-VA-24260,US,VA,24260,5.3,,,, +US-VA-24263,US,VA,24263,5.3,,,, +US-VA-24265,US,VA,24265,5.3,,,, +US-VA-24266,US,VA,24266,5.3,,,, +US-VA-24269,US,VA,24269,5.3,,,, +US-VA-24270,US,VA,24270,5.3,,,, +US-VA-24271,US,VA,24271,5.3,,,, +US-VA-24272,US,VA,24272,5.3,,,, +US-VA-24273,US,VA,24273,5.3,,,, +US-VA-24277,US,VA,24277,5.3,,,, +US-VA-24279,US,VA,24279,5.3,,,, +US-VA-24280,US,VA,24280,5.3,,,, +US-VA-24281,US,VA,24281,5.3,,,, +US-VA-24282,US,VA,24282,5.3,,,, +US-VA-24283,US,VA,24283,5.3,,,, +US-VA-24290,US,VA,24290,5.3,,,, +US-VA-24292,US,VA,24292,5.3,,,, +US-VA-24293,US,VA,24293,5.3,,,, +US-VA-24301,US,VA,24301,5.3,,,, +US-VA-24311,US,VA,24311,5.3,,,, +US-VA-24312,US,VA,24312,5.3,,,, +US-VA-24313,US,VA,24313,5.3,,,, +US-VA-24314,US,VA,24314,5.3,,,, +US-VA-24315,US,VA,24315,5.3,,,, +US-VA-24316,US,VA,24316,5.3,,,, +US-VA-24317,US,VA,24317,5.3,,,, +US-VA-24318,US,VA,24318,5.3,,,, +US-VA-24319,US,VA,24319,5.3,,,, +US-VA-24322,US,VA,24322,5.3,,,, +US-VA-24323,US,VA,24323,5.3,,,, +US-VA-24324,US,VA,24324,5.3,,,, +US-VA-24325,US,VA,24325,5.3,,,, +US-VA-24326,US,VA,24326,5.3,,,, +US-VA-24327,US,VA,24327,5.3,,,, +US-VA-24328,US,VA,24328,5.3,,,, +US-VA-24330,US,VA,24330,5.3,,,, +US-VA-24333,US,VA,24333,5.3,,,, +US-VA-24340,US,VA,24340,5.3,,,, +US-VA-24343,US,VA,24343,5.3,,,, +US-VA-24347,US,VA,24347,5.3,,,, +US-VA-24348,US,VA,24348,5.3,,,, +US-VA-24350,US,VA,24350,5.3,,,, +US-VA-24351,US,VA,24351,5.3,,,, +US-VA-24352,US,VA,24352,5.3,,,, +US-VA-24354,US,VA,24354,5.3,,,, +US-VA-24360,US,VA,24360,5.3,,,, +US-VA-24361,US,VA,24361,5.3,,,, +US-VA-24363,US,VA,24363,5.3,,,, +US-VA-24366,US,VA,24366,5.3,,,, +US-VA-24368,US,VA,24368,5.3,,,, +US-VA-24370,US,VA,24370,5.3,,,, +US-VA-24374,US,VA,24374,5.3,,,, +US-VA-24375,US,VA,24375,5.3,,,, +US-VA-24377,US,VA,24377,5.3,,,, +US-VA-24378,US,VA,24378,5.3,,,, +US-VA-24380,US,VA,24380,5.3,,,, +US-VA-24381,US,VA,24381,5.3,,,, +US-VA-24382,US,VA,24382,5.3,,,, +US-VA-24401,US,VA,24401,5.3,,,, +US-VA-24402,US,VA,24402,5.3,,,, +US-VA-24411,US,VA,24411,5.3,,,, +US-VA-24412,US,VA,24412,5.3,,,, +US-VA-24413,US,VA,24413,5.3,,,, +US-VA-24415,US,VA,24415,5.3,,,, +US-VA-24416,US,VA,24416,5.3,,,, +US-VA-24421,US,VA,24421,5.3,,,, +US-VA-24422,US,VA,24422,5.3,,,, +US-VA-24426,US,VA,24426,5.3,,,, +US-VA-24430,US,VA,24430,5.3,,,, +US-VA-24431,US,VA,24431,5.3,,,, +US-VA-24432,US,VA,24432,5.3,,,, +US-VA-24433,US,VA,24433,5.3,,,, +US-VA-24435,US,VA,24435,5.3,,,, +US-VA-24437,US,VA,24437,5.3,,,, +US-VA-24438,US,VA,24438,5.3,,,, +US-VA-24439,US,VA,24439,5.3,,,, +US-VA-24440,US,VA,24440,5.3,,,, +US-VA-24441,US,VA,24441,5.3,,,, +US-VA-24442,US,VA,24442,5.3,,,, +US-VA-24445,US,VA,24445,5.3,,,, +US-VA-24448,US,VA,24448,5.3,,,, +US-VA-24450,US,VA,24450,5.3,,,, +US-VA-24457,US,VA,24457,5.3,,,, +US-VA-24458,US,VA,24458,5.3,,,, +US-VA-24459,US,VA,24459,5.3,,,, +US-VA-24460,US,VA,24460,5.3,,,, +US-VA-24463,US,VA,24463,5.3,,,, +US-VA-24464,US,VA,24464,5.3,,,, +US-VA-24465,US,VA,24465,5.3,,,, +US-VA-24467,US,VA,24467,5.3,,,, +US-VA-24468,US,VA,24468,5.3,,,, +US-VA-24469,US,VA,24469,5.3,,,, +US-VA-24471,US,VA,24471,5.3,,,, +US-VA-24472,US,VA,24472,5.3,,,, +US-VA-24473,US,VA,24473,5.3,,,, +US-VA-24474,US,VA,24474,5.3,,,, +US-VA-24476,US,VA,24476,5.3,,,, +US-VA-24477,US,VA,24477,5.3,,,, +US-VA-24479,US,VA,24479,5.3,,,, +US-VA-24482,US,VA,24482,5.3,,,, +US-VA-24483,US,VA,24483,5.3,,,, +US-VA-24484,US,VA,24484,5.3,,,, +US-VA-24485,US,VA,24485,5.3,,,, +US-VA-24486,US,VA,24486,5.3,,,, +US-VA-24487,US,VA,24487,5.3,,,, +US-VA-24501,US,VA,24501,5.3,,,, +US-VA-24502,US,VA,24502,5.3,,,, +US-VA-24503,US,VA,24503,5.3,,,, +US-VA-24504,US,VA,24504,5.3,,,, +US-VA-24505,US,VA,24505,5.3,,,, +US-VA-24506,US,VA,24506,5.3,,,, +US-VA-24513,US,VA,24513,5.3,,,, +US-VA-24514,US,VA,24514,5.3,,,, +US-VA-24515,US,VA,24515,5.3,,,, +US-VA-24517,US,VA,24517,5.3,,,, +US-VA-24520,US,VA,24520,5.3,,,, +US-VA-24521,US,VA,24521,5.3,,,, +US-VA-24522,US,VA,24522,5.3,,,, +US-VA-24523,US,VA,24523,5.3,,,, +US-VA-24526,US,VA,24526,5.3,,,, +US-VA-24527,US,VA,24527,5.3,,,, +US-VA-24528,US,VA,24528,5.3,,,, +US-VA-24529,US,VA,24529,5.3,,,, +US-VA-24530,US,VA,24530,5.3,,,, +US-VA-24531,US,VA,24531,5.3,,,, +US-VA-24533,US,VA,24533,5.3,,,, +US-VA-24534,US,VA,24534,5.3,,,, +US-VA-24535,US,VA,24535,5.3,,,, +US-VA-24536,US,VA,24536,5.3,,,, +US-VA-24538,US,VA,24538,5.3,,,, +US-VA-24539,US,VA,24539,5.3,,,, +US-VA-24540,US,VA,24540,5.3,,,, +US-VA-24541,US,VA,24541,5.3,,,, +US-VA-24543,US,VA,24543,5.3,,,, +US-VA-24549,US,VA,24549,5.3,,,, +US-VA-24550,US,VA,24550,5.3,,,, +US-VA-24551,US,VA,24551,5.3,,,, +US-VA-24553,US,VA,24553,5.3,,,, +US-VA-24554,US,VA,24554,5.3,,,, +US-VA-24555,US,VA,24555,5.3,,,, +US-VA-24556,US,VA,24556,5.3,,,, +US-VA-24557,US,VA,24557,5.3,,,, +US-VA-24558,US,VA,24558,5.3,,,, +US-VA-24562,US,VA,24562,5.3,,,, +US-VA-24563,US,VA,24563,5.3,,,, +US-VA-24565,US,VA,24565,5.3,,,, +US-VA-24566,US,VA,24566,5.3,,,, +US-VA-24569,US,VA,24569,5.3,,,, +US-VA-24570,US,VA,24570,5.3,,,, +US-VA-24571,US,VA,24571,5.3,,,, +US-VA-24572,US,VA,24572,5.3,,,, +US-VA-24574,US,VA,24574,5.3,,,, +US-VA-24576,US,VA,24576,5.3,,,, +US-VA-24577,US,VA,24577,5.3,,,, +US-VA-24578,US,VA,24578,5.3,,,, +US-VA-24579,US,VA,24579,5.3,,,, +US-VA-24580,US,VA,24580,5.3,,,, +US-VA-24581,US,VA,24581,5.3,,,, +US-VA-24586,US,VA,24586,5.3,,,, +US-VA-24588,US,VA,24588,5.3,,,, +US-VA-24589,US,VA,24589,5.3,,,, +US-VA-24590,US,VA,24590,5.3,,,, +US-VA-24592,US,VA,24592,5.3,,,, +US-VA-24593,US,VA,24593,5.3,,,, +US-VA-24594,US,VA,24594,5.3,,,, +US-VA-24595,US,VA,24595,5.3,,,, +US-VA-24597,US,VA,24597,5.3,,,, +US-VA-24598,US,VA,24598,5.3,,,, +US-VA-24599,US,VA,24599,5.3,,,, +US-VA-24601,US,VA,24601,5.3,,,, +US-VA-24602,US,VA,24602,5.3,,,, +US-VA-24603,US,VA,24603,5.3,,,, +US-VA-24604,US,VA,24604,5.3,,,, +US-VA-24605,US,VA,24605,5.3,,,, +US-VA-24606,US,VA,24606,5.3,,,, +US-VA-24607,US,VA,24607,5.3,,,, +US-VA-24608,US,VA,24608,5.3,,,, +US-VA-24609,US,VA,24609,5.3,,,, +US-VA-24612,US,VA,24612,5.3,,,, +US-VA-24613,US,VA,24613,5.3,,,, +US-VA-24614,US,VA,24614,5.3,,,, +US-VA-24619,US,VA,24619,5.3,,,, +US-VA-24620,US,VA,24620,5.3,,,, +US-VA-24622,US,VA,24622,5.3,,,, +US-VA-24624,US,VA,24624,5.3,,,, +US-VA-24628,US,VA,24628,5.3,,,, +US-VA-24630,US,VA,24630,5.3,,,, +US-VA-24631,US,VA,24631,5.3,,,, +US-VA-24634,US,VA,24634,5.3,,,, +US-VA-24635,US,VA,24635,5.3,,,, +US-VA-24637,US,VA,24637,5.3,,,, +US-VA-24639,US,VA,24639,5.3,,,, +US-VA-24640,US,VA,24640,5.3,,,, +US-VA-24641,US,VA,24641,5.3,,,, +US-VA-24646,US,VA,24646,5.3,,,, +US-VA-24647,US,VA,24647,5.3,,,, +US-VA-24649,US,VA,24649,5.3,,,, +US-VA-24651,US,VA,24651,5.3,,,, +US-VA-24656,US,VA,24656,5.3,,,, +US-VA-24657,US,VA,24657,5.3,,,, +US-VA-24658,US,VA,24658,5.3,,,, +US-VT-05001,US,VT,05001,6,,,, +US-VT-05009,US,VT,05009,6,,,, +US-VT-05030,US,VT,05030,6,,,, +US-VT-05031,US,VT,05031,6,,,, +US-VT-05032,US,VT,05032,6,,,, +US-VT-05033,US,VT,05033,6,,,, +US-VT-05034,US,VT,05034,6,,,, +US-VT-05035,US,VT,05035,6,,,, +US-VT-05036,US,VT,05036,6,,,, +US-VT-05037,US,VT,05037,6,,,, +US-VT-05038,US,VT,05038,6,,,, +US-VT-05039,US,VT,05039,6,,,, +US-VT-05040,US,VT,05040,6,,,, +US-VT-05041,US,VT,05041,6,,,, +US-VT-05042,US,VT,05042,6,,,, +US-VT-05043,US,VT,05043,6,,,, +US-VT-05045,US,VT,05045,6,,,, +US-VT-05046,US,VT,05046,6,,,, +US-VT-05047,US,VT,05047,6,,,, +US-VT-05048,US,VT,05048,6,,,, +US-VT-05049,US,VT,05049,6,,,, +US-VT-05050,US,VT,05050,6,,,, +US-VT-05051,US,VT,05051,6,,,, +US-VT-05052,US,VT,05052,6,,,, +US-VT-05053,US,VT,05053,6,,,, +US-VT-05054,US,VT,05054,6,,,, +US-VT-05055,US,VT,05055,6,,,, +US-VT-05056,US,VT,05056,6,,,, +US-VT-05058,US,VT,05058,6,,,, +US-VT-05059,US,VT,05059,6,,,, +US-VT-05060,US,VT,05060,6,,,, +US-VT-05061,US,VT,05061,6,,,, +US-VT-05062,US,VT,05062,6,,,, +US-VT-05065,US,VT,05065,6,,,, +US-VT-05067,US,VT,05067,6,,,, +US-VT-05068,US,VT,05068,6,,,, +US-VT-05069,US,VT,05069,6,,,, +US-VT-05070,US,VT,05070,6,,,, +US-VT-05071,US,VT,05071,6,,,, +US-VT-05072,US,VT,05072,6,,,, +US-VT-05073,US,VT,05073,6,,,, +US-VT-05074,US,VT,05074,6,,,, +US-VT-05075,US,VT,05075,6,,,, +US-VT-05076,US,VT,05076,6,,,, +US-VT-05077,US,VT,05077,6,,,, +US-VT-05079,US,VT,05079,6,,,, +US-VT-05081,US,VT,05081,6,,,, +US-VT-05083,US,VT,05083,6,,,, +US-VT-05084,US,VT,05084,6,,,, +US-VT-05085,US,VT,05085,6,,,, +US-VT-05086,US,VT,05086,6,,,, +US-VT-05088,US,VT,05088,6,,,, +US-VT-05089,US,VT,05089,6,,,, +US-VT-05091,US,VT,05091,6,,,, +US-VT-05101,US,VT,05101,6,,,, +US-VT-05141,US,VT,05141,6,,,, +US-VT-05142,US,VT,05142,6,,,, +US-VT-05143,US,VT,05143,6,,,, +US-VT-05144,US,VT,05144,6,,,, +US-VT-05146,US,VT,05146,6,,,, +US-VT-05148,US,VT,05148,6,,,, +US-VT-05149,US,VT,05149,6,,,, +US-VT-05150,US,VT,05150,6,,,, +US-VT-05151,US,VT,05151,6,,,, +US-VT-05152,US,VT,05152,6,,,, +US-VT-05153,US,VT,05153,6,,,, +US-VT-05154,US,VT,05154,6,,,, +US-VT-05155,US,VT,05155,6,,,, +US-VT-05156,US,VT,05156,6,,,, +US-VT-05158,US,VT,05158,6,,,, +US-VT-05159,US,VT,05159,6,,,, +US-VT-05161,US,VT,05161,6,,,, +US-VT-05201,US,VT,05201,6,,,, +US-VT-05250,US,VT,05250,6,,,, +US-VT-05251,US,VT,05251,6,,,, +US-VT-05252,US,VT,05252,6,,,, +US-VT-05253,US,VT,05253,6,,,, +US-VT-05254,US,VT,05254,7,,,, +US-VT-05255,US,VT,05255,7,,,, +US-VT-05257,US,VT,05257,6,,,, +US-VT-05260,US,VT,05260,6,,,, +US-VT-05261,US,VT,05261,6,,,, +US-VT-05262,US,VT,05262,6,,,, +US-VT-05301,US,VT,05301,6,,,, +US-VT-05302,US,VT,05302,6,,,, +US-VT-05303,US,VT,05303,6,,,, +US-VT-05304,US,VT,05304,6,,,, +US-VT-05340,US,VT,05340,7,,,, +US-VT-05341,US,VT,05341,7,,,, +US-VT-05342,US,VT,05342,6,,,, +US-VT-05343,US,VT,05343,6,,,, +US-VT-05344,US,VT,05344,6,,,, +US-VT-05345,US,VT,05345,6,,,, +US-VT-05346,US,VT,05346,6,,,, +US-VT-05350,US,VT,05350,6,,,, +US-VT-05351,US,VT,05351,6,,,, +US-VT-05352,US,VT,05352,6,,,, +US-VT-05353,US,VT,05353,6,,,, +US-VT-05354,US,VT,05354,6,,,, +US-VT-05355,US,VT,05355,6,,,, +US-VT-05356,US,VT,05356,7,,,, +US-VT-05357,US,VT,05357,6,,,, +US-VT-05358,US,VT,05358,6,,,, +US-VT-05359,US,VT,05359,6,,,, +US-VT-05360,US,VT,05360,7,,,, +US-VT-05361,US,VT,05361,6,,,, +US-VT-05362,US,VT,05362,6,,,, +US-VT-05363,US,VT,05363,7,,,, +US-VT-05401,US,VT,05401,7,,,, +US-VT-05402,US,VT,05402,7,,,, +US-VT-05403,US,VT,05403,7,,,, +US-VT-05404,US,VT,05404,6,,,, +US-VT-05405,US,VT,05405,7,,,, +US-VT-05406,US,VT,05406,7,,,, +US-VT-05407,US,VT,05407,7,,,, +US-VT-05408,US,VT,05408,7,,,, +US-VT-05439,US,VT,05439,6,,,, +US-VT-05440,US,VT,05440,6,,,, +US-VT-05441,US,VT,05441,6,,,, +US-VT-05442,US,VT,05442,6,,,, +US-VT-05443,US,VT,05443,6,,,, +US-VT-05444,US,VT,05444,6,,,, +US-VT-05445,US,VT,05445,6,,,, +US-VT-05446,US,VT,05446,6,,,, +US-VT-05447,US,VT,05447,6,,,, +US-VT-05448,US,VT,05448,6,,,, +US-VT-05449,US,VT,05449,6,,,, +US-VT-05450,US,VT,05450,6,,,, +US-VT-05451,US,VT,05451,6,,,, +US-VT-05452,US,VT,05452,6,,,, +US-VT-05453,US,VT,05453,6,,,, +US-VT-05454,US,VT,05454,6,,,, +US-VT-05455,US,VT,05455,6,,,, +US-VT-05456,US,VT,05456,6,,,, +US-VT-05457,US,VT,05457,6,,,, +US-VT-05458,US,VT,05458,6,,,, +US-VT-05459,US,VT,05459,6,,,, +US-VT-05460,US,VT,05460,6,,,, +US-VT-05461,US,VT,05461,6,,,, +US-VT-05462,US,VT,05462,6,,,, +US-VT-05463,US,VT,05463,6,,,, +US-VT-05464,US,VT,05464,6,,,, +US-VT-05465,US,VT,05465,6,,,, +US-VT-05466,US,VT,05466,6,,,, +US-VT-05468,US,VT,05468,6,,,, +US-VT-05469,US,VT,05469,6,,,, +US-VT-05470,US,VT,05470,6,,,, +US-VT-05471,US,VT,05471,6,,,, +US-VT-05472,US,VT,05472,6,,,, +US-VT-05473,US,VT,05473,6,,,, +US-VT-05474,US,VT,05474,6,,,, +US-VT-05476,US,VT,05476,6,,,, +US-VT-05477,US,VT,05477,6,,,, +US-VT-05478,US,VT,05478,6,,,, +US-VT-05479,US,VT,05479,6,,,, +US-VT-05481,US,VT,05481,6,,,, +US-VT-05482,US,VT,05482,6,,,, +US-VT-05483,US,VT,05483,6,,,, +US-VT-05485,US,VT,05485,6,,,, +US-VT-05486,US,VT,05486,6,,,, +US-VT-05487,US,VT,05487,6,,,, +US-VT-05488,US,VT,05488,6,,,, +US-VT-05489,US,VT,05489,6,,,, +US-VT-05490,US,VT,05490,6,,,, +US-VT-05491,US,VT,05491,6,,,, +US-VT-05492,US,VT,05492,6,,,, +US-VT-05494,US,VT,05494,6,,,, +US-VT-05495,US,VT,05495,7,,,, +US-VT-05601,US,VT,05601,6,,,, +US-VT-05602,US,VT,05602,6,,,, +US-VT-05603,US,VT,05603,6,,,, +US-VT-05604,US,VT,05604,6,,,, +US-VT-05609,US,VT,05609,6,,,, +US-VT-05620,US,VT,05620,6,,,, +US-VT-05633,US,VT,05633,6,,,, +US-VT-05640,US,VT,05640,6,,,, +US-VT-05641,US,VT,05641,6,,,, +US-VT-05647,US,VT,05647,6,,,, +US-VT-05648,US,VT,05648,6,,,, +US-VT-05649,US,VT,05649,6,,,, +US-VT-05650,US,VT,05650,6,,,, +US-VT-05651,US,VT,05651,6,,,, +US-VT-05652,US,VT,05652,6,,,, +US-VT-05653,US,VT,05653,6,,,, +US-VT-05654,US,VT,05654,6,,,, +US-VT-05655,US,VT,05655,6,,,, +US-VT-05656,US,VT,05656,6,,,, +US-VT-05657,US,VT,05657,6,,,, +US-VT-05658,US,VT,05658,6,,,, +US-VT-05660,US,VT,05660,6,,,, +US-VT-05661,US,VT,05661,6,,,, +US-VT-05662,US,VT,05662,6,,,, +US-VT-05663,US,VT,05663,6,,,, +US-VT-05664,US,VT,05664,6,,,, +US-VT-05665,US,VT,05665,6,,,, +US-VT-05666,US,VT,05666,6,,,, +US-VT-05667,US,VT,05667,6,,,, +US-VT-05669,US,VT,05669,6,,,, +US-VT-05670,US,VT,05670,6,,,, +US-VT-05671,US,VT,05671,6,,,, +US-VT-05672,US,VT,05672,6,,,, +US-VT-05673,US,VT,05673,6,,,, +US-VT-05674,US,VT,05674,6,,,, +US-VT-05675,US,VT,05675,6,,,, +US-VT-05676,US,VT,05676,6,,,, +US-VT-05677,US,VT,05677,6,,,, +US-VT-05678,US,VT,05678,6,,,, +US-VT-05679,US,VT,05679,6,,,, +US-VT-05680,US,VT,05680,6,,,, +US-VT-05681,US,VT,05681,6,,,, +US-VT-05682,US,VT,05682,6,,,, +US-VT-05701,US,VT,05701,6,,,, +US-VT-05702,US,VT,05702,6,,,, +US-VT-05730,US,VT,05730,6,,,, +US-VT-05731,US,VT,05731,6,,,, +US-VT-05732,US,VT,05732,6,,,, +US-VT-05733,US,VT,05733,6,,,, +US-VT-05734,US,VT,05734,6,,,, +US-VT-05735,US,VT,05735,6,,,, +US-VT-05736,US,VT,05736,7,,,, +US-VT-05737,US,VT,05737,6,,,, +US-VT-05738,US,VT,05738,6,,,, +US-VT-05739,US,VT,05739,6,,,, +US-VT-05740,US,VT,05740,7,,,, +US-VT-05741,US,VT,05741,6,,,, +US-VT-05742,US,VT,05742,6,,,, +US-VT-05743,US,VT,05743,6,,,, +US-VT-05744,US,VT,05744,6,,,, +US-VT-05745,US,VT,05745,6,,,, +US-VT-05746,US,VT,05746,6,,,, +US-VT-05747,US,VT,05747,6,,,, +US-VT-05748,US,VT,05748,6,,,, +US-VT-05750,US,VT,05750,6,,,, +US-VT-05751,US,VT,05751,7,,,, +US-VT-05753,US,VT,05753,7,,,, +US-VT-05757,US,VT,05757,6,,,, +US-VT-05758,US,VT,05758,6,,,, +US-VT-05759,US,VT,05759,6,,,, +US-VT-05760,US,VT,05760,6,,,, +US-VT-05761,US,VT,05761,6,,,, +US-VT-05762,US,VT,05762,6,,,, +US-VT-05763,US,VT,05763,6,,,, +US-VT-05764,US,VT,05764,6,,,, +US-VT-05765,US,VT,05765,6,,,, +US-VT-05766,US,VT,05766,6,,,, +US-VT-05767,US,VT,05767,6,,,, +US-VT-05768,US,VT,05768,6,,,, +US-VT-05769,US,VT,05769,6,,,, +US-VT-05770,US,VT,05770,6,,,, +US-VT-05772,US,VT,05772,6,,,, +US-VT-05773,US,VT,05773,6,,,, +US-VT-05774,US,VT,05774,6,,,, +US-VT-05775,US,VT,05775,6,,,, +US-VT-05776,US,VT,05776,6,,,, +US-VT-05777,US,VT,05777,6,,,, +US-VT-05778,US,VT,05778,6,,,, +US-VT-05819,US,VT,05819,6,,,, +US-VT-05820,US,VT,05820,6,,,, +US-VT-05821,US,VT,05821,6,,,, +US-VT-05822,US,VT,05822,6,,,, +US-VT-05823,US,VT,05823,6,,,, +US-VT-05824,US,VT,05824,6,,,, +US-VT-05825,US,VT,05825,6,,,, +US-VT-05826,US,VT,05826,6,,,, +US-VT-05827,US,VT,05827,6,,,, +US-VT-05828,US,VT,05828,6,,,, +US-VT-05829,US,VT,05829,6,,,, +US-VT-05830,US,VT,05830,6,,,, +US-VT-05832,US,VT,05832,6,,,, +US-VT-05833,US,VT,05833,6,,,, +US-VT-05836,US,VT,05836,6,,,, +US-VT-05837,US,VT,05837,6,,,, +US-VT-05838,US,VT,05838,6,,,, +US-VT-05839,US,VT,05839,6,,,, +US-VT-05840,US,VT,05840,6,,,, +US-VT-05841,US,VT,05841,6,,,, +US-VT-05842,US,VT,05842,6,,,, +US-VT-05843,US,VT,05843,6,,,, +US-VT-05845,US,VT,05845,6,,,, +US-VT-05846,US,VT,05846,6,,,, +US-VT-05847,US,VT,05847,6,,,, +US-VT-05848,US,VT,05848,6,,,, +US-VT-05849,US,VT,05849,6,,,, +US-VT-05850,US,VT,05850,6,,,, +US-VT-05851,US,VT,05851,6,,,, +US-VT-05853,US,VT,05853,6,,,, +US-VT-05855,US,VT,05855,6,,,, +US-VT-05857,US,VT,05857,6,,,, +US-VT-05858,US,VT,05858,6,,,, +US-VT-05859,US,VT,05859,6,,,, +US-VT-05860,US,VT,05860,6,,,, +US-VT-05861,US,VT,05861,6,,,, +US-VT-05862,US,VT,05862,6,,,, +US-VT-05863,US,VT,05863,6,,,, +US-VT-05866,US,VT,05866,6,,,, +US-VT-05867,US,VT,05867,6,,,, +US-VT-05868,US,VT,05868,6,,,, +US-VT-05871,US,VT,05871,6,,,, +US-VT-05872,US,VT,05872,6,,,, +US-VT-05873,US,VT,05873,6,,,, +US-VT-05874,US,VT,05874,6,,,, +US-VT-05875,US,VT,05875,6,,,, +US-VT-05901,US,VT,05901,6,,,, +US-VT-05902,US,VT,05902,6,,,, +US-VT-05903,US,VT,05903,6,,,, +US-VT-05904,US,VT,05904,6,,,, +US-VT-05905,US,VT,05905,6,,,, +US-VT-05906,US,VT,05906,6,,,, +US-VT-05907,US,VT,05907,6,,,, +US-WA-98001,US,WA,98001,9.5,,,, +US-WA-98002,US,WA,98002,9.5,,,, +US-WA-98003,US,WA,98003,9.5,,,, +US-WA-98004,US,WA,98004,9.5,,,, +US-WA-98005,US,WA,98005,9.5,,,, +US-WA-98006,US,WA,98006,9.5,,,, +US-WA-98007,US,WA,98007,9.5,,,, +US-WA-98008,US,WA,98008,9.5,,,, +US-WA-98009,US,WA,98009,9.5,,,, +US-WA-98010,US,WA,98010,8.6,,,, +US-WA-98011,US,WA,98011,9.5,,,, +US-WA-98012,US,WA,98012,9.6,,,, +US-WA-98013,US,WA,98013,8.6,,,, +US-WA-98014,US,WA,98014,8.6,,,, +US-WA-98015,US,WA,98015,9.5,,,, +US-WA-98019,US,WA,98019,8.6,,,, +US-WA-98020,US,WA,98020,9.5,,,, +US-WA-98021,US,WA,98021,9.5,,,, +US-WA-98022,US,WA,98022,8.6,,,, +US-WA-98023,US,WA,98023,9.5,,,, +US-WA-98024,US,WA,98024,8.6,,,, +US-WA-98025,US,WA,98025,8.6,,,, +US-WA-98026,US,WA,98026,9.5,,,, +US-WA-98027,US,WA,98027,9.5,,,, +US-WA-98028,US,WA,98028,9.5,,,, +US-WA-98029,US,WA,98029,9.5,,,, +US-WA-98030,US,WA,98030,9.5,,,, +US-WA-98031,US,WA,98031,9.5,,,, +US-WA-98032,US,WA,98032,9.5,,,, +US-WA-98033,US,WA,98033,9.5,,,, +US-WA-98034,US,WA,98034,9.5,,,, +US-WA-98035,US,WA,98035,9.5,,,, +US-WA-98036,US,WA,98036,9.5,,,, +US-WA-98037,US,WA,98037,9.5,,,, +US-WA-98038,US,WA,98038,8.6,,,, +US-WA-98039,US,WA,98039,9.5,,,, +US-WA-98040,US,WA,98040,9.5,,,, +US-WA-98041,US,WA,98041,9.5,,,, +US-WA-98042,US,WA,98042,8.6,,,, +US-WA-98043,US,WA,98043,9.5,,,, +US-WA-98045,US,WA,98045,8.6,,,, +US-WA-98046,US,WA,98046,9.5,,,, +US-WA-98047,US,WA,98047,9.5,,,, +US-WA-98050,US,WA,98050,8.6,,,, +US-WA-98051,US,WA,98051,8.6,,,, +US-WA-98052,US,WA,98052,9.5,,,, +US-WA-98053,US,WA,98053,8.6,,,, +US-WA-98055,US,WA,98055,9.5,,,, +US-WA-98056,US,WA,98056,9.5,,,, +US-WA-98057,US,WA,98057,9.5,,,, +US-WA-98058,US,WA,98058,9.5,,,, +US-WA-98059,US,WA,98059,9.5,,,, +US-WA-98061,US,WA,98061,8.6,,,, +US-WA-98062,US,WA,98062,9.5,,,, +US-WA-98063,US,WA,98063,9.5,,,, +US-WA-98064,US,WA,98064,9.5,,,, +US-WA-98065,US,WA,98065,8.6,,,, +US-WA-98068,US,WA,98068,8.8,,,, +US-WA-98070,US,WA,98070,8.6,,,, +US-WA-98071,US,WA,98071,9.5,,,, +US-WA-98072,US,WA,98072,9.5,,,, +US-WA-98073,US,WA,98073,9.5,,,, +US-WA-98074,US,WA,98074,9.5,,,, +US-WA-98075,US,WA,98075,9.5,,,, +US-WA-98077,US,WA,98077,8.6,,,, +US-WA-98082,US,WA,98082,9.6,,,, +US-WA-98083,US,WA,98083,9.5,,,, +US-WA-98087,US,WA,98087,9.5,,,, +US-WA-98089,US,WA,98089,9.5,,,, +US-WA-98092,US,WA,98092,9.5,,,, +US-WA-98093,US,WA,98093,9.5,,,, +US-WA-98101,US,WA,98101,9.5,,,, +US-WA-98102,US,WA,98102,9.5,,,, +US-WA-98103,US,WA,98103,9.5,,,, +US-WA-98104,US,WA,98104,9.5,,,, +US-WA-98105,US,WA,98105,9.5,,,, +US-WA-98106,US,WA,98106,9.5,,,, +US-WA-98107,US,WA,98107,9.5,,,, +US-WA-98108,US,WA,98108,9.5,,,, +US-WA-98109,US,WA,98109,9.5,,,, +US-WA-98110,US,WA,98110,8.6,,,, +US-WA-98111,US,WA,98111,9.5,,,, +US-WA-98112,US,WA,98112,9.5,,,, +US-WA-98113,US,WA,98113,9.5,,,, +US-WA-98114,US,WA,98114,9.5,,,, +US-WA-98115,US,WA,98115,9.5,,,, +US-WA-98116,US,WA,98116,9.5,,,, +US-WA-98117,US,WA,98117,9.5,,,, +US-WA-98118,US,WA,98118,9.5,,,, +US-WA-98119,US,WA,98119,9.5,,,, +US-WA-98121,US,WA,98121,9.5,,,, +US-WA-98122,US,WA,98122,9.5,,,, +US-WA-98124,US,WA,98124,9.5,,,, +US-WA-98125,US,WA,98125,9.5,,,, +US-WA-98126,US,WA,98126,9.5,,,, +US-WA-98127,US,WA,98127,9.5,,,, +US-WA-98129,US,WA,98129,9.5,,,, +US-WA-98131,US,WA,98131,9.5,,,, +US-WA-98132,US,WA,98132,9.5,,,, +US-WA-98133,US,WA,98133,9.5,,,, +US-WA-98134,US,WA,98134,9.5,,,, +US-WA-98136,US,WA,98136,9.5,,,, +US-WA-98138,US,WA,98138,9.5,,,, +US-WA-98139,US,WA,98139,9.5,,,, +US-WA-98141,US,WA,98141,9.5,,,, +US-WA-98144,US,WA,98144,9.5,,,, +US-WA-98145,US,WA,98145,9.5,,,, +US-WA-98146,US,WA,98146,9.5,,,, +US-WA-98148,US,WA,98148,9.5,,,, +US-WA-98154,US,WA,98154,9.5,,,, +US-WA-98155,US,WA,98155,9.5,,,, +US-WA-98158,US,WA,98158,9.5,,,, +US-WA-98160,US,WA,98160,9.5,,,, +US-WA-98161,US,WA,98161,9.5,,,, +US-WA-98164,US,WA,98164,9.5,,,, +US-WA-98165,US,WA,98165,9.5,,,, +US-WA-98166,US,WA,98166,9.5,,,, +US-WA-98168,US,WA,98168,9.5,,,, +US-WA-98170,US,WA,98170,9.5,,,, +US-WA-98174,US,WA,98174,9.5,,,, +US-WA-98175,US,WA,98175,9.5,,,, +US-WA-98177,US,WA,98177,9.5,,,, +US-WA-98178,US,WA,98178,9.5,,,, +US-WA-98181,US,WA,98181,9.5,,,, +US-WA-98185,US,WA,98185,9.5,,,, +US-WA-98188,US,WA,98188,9.5,,,, +US-WA-98189,US,WA,98189,9.5,,,, +US-WA-98190,US,WA,98190,9.5,,,, +US-WA-98191,US,WA,98191,9.5,,,, +US-WA-98194,US,WA,98194,9.5,,,, +US-WA-98195,US,WA,98195,9.5,,,, +US-WA-98198,US,WA,98198,9.5,,,, +US-WA-98199,US,WA,98199,9.5,,,, +US-WA-98201,US,WA,98201,9.2,,,, +US-WA-98203,US,WA,98203,9.2,,,, +US-WA-98204,US,WA,98204,9.5,,,, +US-WA-98205,US,WA,98205,9.2,,,, +US-WA-98206,US,WA,98206,9.5,,,, +US-WA-98207,US,WA,98207,9.2,,,, +US-WA-98208,US,WA,98208,9.5,,,, +US-WA-98213,US,WA,98213,9.2,,,, +US-WA-98220,US,WA,98220,8.5,,,, +US-WA-98221,US,WA,98221,8.2,,,, +US-WA-98222,US,WA,98222,8.1,,,, +US-WA-98223,US,WA,98223,8.6,,,, +US-WA-98224,US,WA,98224,8.6,,,, +US-WA-98225,US,WA,98225,8.7,,,, +US-WA-98226,US,WA,98226,8.7,,,, +US-WA-98227,US,WA,98227,8.7,,,, +US-WA-98228,US,WA,98228,8.7,,,, +US-WA-98229,US,WA,98229,8.7,,,, +US-WA-98230,US,WA,98230,8.5,,,, +US-WA-98231,US,WA,98231,8.5,,,, +US-WA-98232,US,WA,98232,8.2,,,, +US-WA-98233,US,WA,98233,8.2,,,, +US-WA-98235,US,WA,98235,8.2,,,, +US-WA-98236,US,WA,98236,8.7,,,, +US-WA-98237,US,WA,98237,8.2,,,, +US-WA-98238,US,WA,98238,7.8,,,, +US-WA-98239,US,WA,98239,8.7,,,, +US-WA-98240,US,WA,98240,8.5,,,, +US-WA-98241,US,WA,98241,8.6,,,, +US-WA-98243,US,WA,98243,8.1,,,, +US-WA-98244,US,WA,98244,8.5,,,, +US-WA-98245,US,WA,98245,8.1,,,, +US-WA-98247,US,WA,98247,8.5,,,, +US-WA-98248,US,WA,98248,8.7,,,, +US-WA-98249,US,WA,98249,8.7,,,, +US-WA-98250,US,WA,98250,8.1,,,, +US-WA-98251,US,WA,98251,8.6,,,, +US-WA-98252,US,WA,98252,8.6,,,, +US-WA-98253,US,WA,98253,8.7,,,, +US-WA-98255,US,WA,98255,8.2,,,, +US-WA-98256,US,WA,98256,8.6,,,, +US-WA-98257,US,WA,98257,7.8,,,, +US-WA-98258,US,WA,98258,8.6,,,, +US-WA-98259,US,WA,98259,8.6,,,, +US-WA-98260,US,WA,98260,8.7,,,, +US-WA-98261,US,WA,98261,8.1,,,, +US-WA-98262,US,WA,98262,8.5,,,, +US-WA-98263,US,WA,98263,8.2,,,, +US-WA-98264,US,WA,98264,8.7,,,, +US-WA-98266,US,WA,98266,8.5,,,, +US-WA-98267,US,WA,98267,8.2,,,, +US-WA-98270,US,WA,98270,8.6,,,, +US-WA-98271,US,WA,98271,8.6,,,, +US-WA-98272,US,WA,98272,8.6,,,, +US-WA-98273,US,WA,98273,8.2,,,, +US-WA-98274,US,WA,98274,8.2,,,, +US-WA-98275,US,WA,98275,9.5,,,, +US-WA-98276,US,WA,98276,8.5,,,, +US-WA-98277,US,WA,98277,8.7,,,, +US-WA-98278,US,WA,98278,8.7,,,, +US-WA-98279,US,WA,98279,8.1,,,, +US-WA-98280,US,WA,98280,8.1,,,, +US-WA-98281,US,WA,98281,8.5,,,, +US-WA-98282,US,WA,98282,8.7,,,, +US-WA-98283,US,WA,98283,8.2,,,, +US-WA-98284,US,WA,98284,8.2,,,, +US-WA-98286,US,WA,98286,8.1,,,, +US-WA-98287,US,WA,98287,8.6,,,, +US-WA-98288,US,WA,98288,8.6,,,, +US-WA-98290,US,WA,98290,7.7,,,, +US-WA-98291,US,WA,98291,8.8,,,, +US-WA-98292,US,WA,98292,7.7,,,, +US-WA-98293,US,WA,98293,8.6,,,, +US-WA-98294,US,WA,98294,8.6,,,, +US-WA-98295,US,WA,98295,8.5,,,, +US-WA-98296,US,WA,98296,7.7,,,, +US-WA-98297,US,WA,98297,8.1,,,, +US-WA-98303,US,WA,98303,7.9,,,, +US-WA-98304,US,WA,98304,7.9,,,, +US-WA-98305,US,WA,98305,8.4,,,, +US-WA-98310,US,WA,98310,8.6,,,, +US-WA-98311,US,WA,98311,8.6,,,, +US-WA-98312,US,WA,98312,8.6,,,, +US-WA-98314,US,WA,98314,8.6,,,, +US-WA-98315,US,WA,98315,8.6,,,, +US-WA-98320,US,WA,98320,9,,,, +US-WA-98321,US,WA,98321,7.9,,,, +US-WA-98322,US,WA,98322,8.6,,,, +US-WA-98323,US,WA,98323,7.9,,,, +US-WA-98324,US,WA,98324,8.4,,,, +US-WA-98325,US,WA,98325,9,,,, +US-WA-98326,US,WA,98326,8.4,,,, +US-WA-98327,US,WA,98327,8.8,,,, +US-WA-98328,US,WA,98328,7.9,,,, +US-WA-98329,US,WA,98329,7.9,,,, +US-WA-98330,US,WA,98330,7.9,,,, +US-WA-98331,US,WA,98331,8.4,,,, +US-WA-98332,US,WA,98332,7.9,,,, +US-WA-98333,US,WA,98333,7.9,,,, +US-WA-98335,US,WA,98335,7.9,,,, +US-WA-98336,US,WA,98336,7.8,,,, +US-WA-98337,US,WA,98337,8.6,,,, +US-WA-98338,US,WA,98338,7.9,,,, +US-WA-98339,US,WA,98339,9,,,, +US-WA-98340,US,WA,98340,8.6,,,, +US-WA-98342,US,WA,98342,8.6,,,, +US-WA-98343,US,WA,98343,8.4,,,, +US-WA-98344,US,WA,98344,7.9,,,, +US-WA-98345,US,WA,98345,8.6,,,, +US-WA-98346,US,WA,98346,8.6,,,, +US-WA-98348,US,WA,98348,7.9,,,, +US-WA-98349,US,WA,98349,7.9,,,, +US-WA-98350,US,WA,98350,8.4,,,, +US-WA-98351,US,WA,98351,7.9,,,, +US-WA-98352,US,WA,98352,8.8,,,, +US-WA-98353,US,WA,98353,8.6,,,, +US-WA-98354,US,WA,98354,9.4,,,, +US-WA-98355,US,WA,98355,7.8,,,, +US-WA-98356,US,WA,98356,7.8,,,, +US-WA-98357,US,WA,98357,8.4,,,, +US-WA-98358,US,WA,98358,9,,,, +US-WA-98359,US,WA,98359,8.6,,,, +US-WA-98360,US,WA,98360,7.9,,,, +US-WA-98361,US,WA,98361,7.8,,,, +US-WA-98362,US,WA,98362,8.4,,,, +US-WA-98363,US,WA,98363,8.4,,,, +US-WA-98364,US,WA,98364,8.6,,,, +US-WA-98365,US,WA,98365,9,,,, +US-WA-98366,US,WA,98366,8.6,,,, +US-WA-98367,US,WA,98367,8.6,,,, +US-WA-98368,US,WA,98368,9,,,, +US-WA-98370,US,WA,98370,8.6,,,, +US-WA-98371,US,WA,98371,9.4,,,, +US-WA-98372,US,WA,98372,9.4,,,, +US-WA-98373,US,WA,98373,9.4,,,, +US-WA-98374,US,WA,98374,9.4,,,, +US-WA-98375,US,WA,98375,8.8,,,, +US-WA-98376,US,WA,98376,9,,,, +US-WA-98377,US,WA,98377,7.8,,,, +US-WA-98378,US,WA,98378,8.6,,,, +US-WA-98380,US,WA,98380,8.6,,,, +US-WA-98381,US,WA,98381,8.4,,,, +US-WA-98382,US,WA,98382,8.4,,,, +US-WA-98383,US,WA,98383,8.6,,,, +US-WA-98384,US,WA,98384,8.6,,,, +US-WA-98385,US,WA,98385,7.9,,,, +US-WA-98386,US,WA,98386,8.6,,,, +US-WA-98387,US,WA,98387,9.4,,,, +US-WA-98388,US,WA,98388,9.4,,,, +US-WA-98390,US,WA,98390,8.8,,,, +US-WA-98391,US,WA,98391,8.8,,,, +US-WA-98392,US,WA,98392,8.6,,,, +US-WA-98393,US,WA,98393,8.6,,,, +US-WA-98394,US,WA,98394,7.9,,,, +US-WA-98395,US,WA,98395,7.9,,,, +US-WA-98396,US,WA,98396,7.9,,,, +US-WA-98397,US,WA,98397,7.9,,,, +US-WA-98398,US,WA,98398,7.9,,,, +US-WA-98401,US,WA,98401,9.5,,,, +US-WA-98402,US,WA,98402,9.5,,,, +US-WA-98403,US,WA,98403,9.5,,,, +US-WA-98404,US,WA,98404,9.5,,,, +US-WA-98405,US,WA,98405,9.5,,,, +US-WA-98406,US,WA,98406,9.5,,,, +US-WA-98407,US,WA,98407,9.5,,,, +US-WA-98408,US,WA,98408,9.5,,,, +US-WA-98409,US,WA,98409,9.5,,,, +US-WA-98411,US,WA,98411,9.5,,,, +US-WA-98412,US,WA,98412,9.5,,,, +US-WA-98413,US,WA,98413,9.5,,,, +US-WA-98415,US,WA,98415,9.5,,,, +US-WA-98416,US,WA,98416,9.5,,,, +US-WA-98417,US,WA,98417,9.5,,,, +US-WA-98418,US,WA,98418,9.5,,,, +US-WA-98419,US,WA,98419,9.5,,,, +US-WA-98421,US,WA,98421,9.5,,,, +US-WA-98422,US,WA,98422,9.5,,,, +US-WA-98424,US,WA,98424,9.4,,,, +US-WA-98430,US,WA,98430,9.5,,,, +US-WA-98431,US,WA,98431,9.5,,,, +US-WA-98433,US,WA,98433,8.8,,,, +US-WA-98438,US,WA,98438,8.8,,,, +US-WA-98439,US,WA,98439,9.4,,,, +US-WA-98443,US,WA,98443,9.4,,,, +US-WA-98444,US,WA,98444,9.4,,,, +US-WA-98445,US,WA,98445,9.4,,,, +US-WA-98446,US,WA,98446,8.8,,,, +US-WA-98447,US,WA,98447,9.4,,,, +US-WA-98448,US,WA,98448,9.5,,,, +US-WA-98464,US,WA,98464,9.4,,,, +US-WA-98465,US,WA,98465,9.5,,,, +US-WA-98466,US,WA,98466,9.4,,,, +US-WA-98467,US,WA,98467,9.4,,,, +US-WA-98471,US,WA,98471,9.5,,,, +US-WA-98481,US,WA,98481,9.5,,,, +US-WA-98490,US,WA,98490,9.5,,,, +US-WA-98493,US,WA,98493,9.5,,,, +US-WA-98496,US,WA,98496,9.4,,,, +US-WA-98497,US,WA,98497,9.5,,,, +US-WA-98498,US,WA,98498,9.4,,,, +US-WA-98499,US,WA,98499,9.4,,,, +US-WA-98501,US,WA,98501,8.8,,,, +US-WA-98502,US,WA,98502,8.8,,,, +US-WA-98503,US,WA,98503,8.7,,,, +US-WA-98504,US,WA,98504,8.8,,,, +US-WA-98505,US,WA,98505,8.7,,,, +US-WA-98506,US,WA,98506,8.8,,,, +US-WA-98507,US,WA,98507,8.8,,,, +US-WA-98508,US,WA,98508,8.8,,,, +US-WA-98509,US,WA,98509,8.7,,,, +US-WA-98511,US,WA,98511,8.7,,,, +US-WA-98512,US,WA,98512,8.7,,,, +US-WA-98513,US,WA,98513,8.7,,,, +US-WA-98516,US,WA,98516,7.9,,,, +US-WA-98520,US,WA,98520,8.53,,,, +US-WA-98522,US,WA,98522,7.8,,,, +US-WA-98524,US,WA,98524,8.5,,,, +US-WA-98526,US,WA,98526,8.4,,,, +US-WA-98527,US,WA,98527,7.8,,,, +US-WA-98528,US,WA,98528,8.5,,,, +US-WA-98530,US,WA,98530,7.9,,,, +US-WA-98531,US,WA,98531,8,,,, +US-WA-98532,US,WA,98532,8,,,, +US-WA-98533,US,WA,98533,7.8,,,, +US-WA-98535,US,WA,98535,8.4,,,, +US-WA-98536,US,WA,98536,8.4,,,, +US-WA-98537,US,WA,98537,8.4,,,, +US-WA-98538,US,WA,98538,7.8,,,, +US-WA-98539,US,WA,98539,7.8,,,, +US-WA-98540,US,WA,98540,7.9,,,, +US-WA-98541,US,WA,98541,8.4,,,, +US-WA-98542,US,WA,98542,7.8,,,, +US-WA-98544,US,WA,98544,7.8,,,, +US-WA-98546,US,WA,98546,8.5,,,, +US-WA-98547,US,WA,98547,7.8,,,, +US-WA-98548,US,WA,98548,8.5,,,, +US-WA-98550,US,WA,98550,8.4,,,, +US-WA-98552,US,WA,98552,8.4,,,, +US-WA-98554,US,WA,98554,7.8,,,, +US-WA-98555,US,WA,98555,8.5,,,, +US-WA-98556,US,WA,98556,7.9,,,, +US-WA-98557,US,WA,98557,8.4,,,, +US-WA-98558,US,WA,98558,7.9,,,, +US-WA-98559,US,WA,98559,8.4,,,, +US-WA-98560,US,WA,98560,8.5,,,, +US-WA-98561,US,WA,98561,7.8,,,, +US-WA-98562,US,WA,98562,8.4,,,, +US-WA-98563,US,WA,98563,8.4,,,, +US-WA-98564,US,WA,98564,7.8,,,, +US-WA-98565,US,WA,98565,7.8,,,, +US-WA-98566,US,WA,98566,8.4,,,, +US-WA-98568,US,WA,98568,8.4,,,, +US-WA-98569,US,WA,98569,8.4,,,, +US-WA-98570,US,WA,98570,7.8,,,, +US-WA-98571,US,WA,98571,8.4,,,, +US-WA-98572,US,WA,98572,7.8,,,, +US-WA-98575,US,WA,98575,8.4,,,, +US-WA-98576,US,WA,98576,7.9,,,, +US-WA-98577,US,WA,98577,7.8,,,, +US-WA-98579,US,WA,98579,7.9,,,, +US-WA-98580,US,WA,98580,7.9,,,, +US-WA-98581,US,WA,98581,7.7,,,, +US-WA-98582,US,WA,98582,7.8,,,, +US-WA-98583,US,WA,98583,8.4,,,, +US-WA-98584,US,WA,98584,8.5,,,, +US-WA-98585,US,WA,98585,7.8,,,, +US-WA-98586,US,WA,98586,7.8,,,, +US-WA-98587,US,WA,98587,8.4,,,, +US-WA-98588,US,WA,98588,8.5,,,, +US-WA-98589,US,WA,98589,7.9,,,, +US-WA-98590,US,WA,98590,7.8,,,, +US-WA-98591,US,WA,98591,7.8,,,, +US-WA-98592,US,WA,98592,8.5,,,, +US-WA-98593,US,WA,98593,7.8,,,, +US-WA-98595,US,WA,98595,8.4,,,, +US-WA-98596,US,WA,98596,7.8,,,, +US-WA-98597,US,WA,98597,7.9,,,, +US-WA-98599,US,WA,98599,8.8,,,, +US-WA-98601,US,WA,98601,7.7,,,, +US-WA-98602,US,WA,98602,7,,,, +US-WA-98603,US,WA,98603,7.7,,,, +US-WA-98604,US,WA,98604,7.7,,,, +US-WA-98605,US,WA,98605,7.5,,,, +US-WA-98606,US,WA,98606,7.7,,,, +US-WA-98607,US,WA,98607,8.4,,,, +US-WA-98609,US,WA,98609,7.7,,,, +US-WA-98610,US,WA,98610,7.7,,,, +US-WA-98611,US,WA,98611,7.7,,,, +US-WA-98612,US,WA,98612,7.6,,,, +US-WA-98613,US,WA,98613,7,,,, +US-WA-98614,US,WA,98614,7.8,,,, +US-WA-98616,US,WA,98616,7.7,,,, +US-WA-98617,US,WA,98617,7,,,, +US-WA-98619,US,WA,98619,7,,,, +US-WA-98620,US,WA,98620,7,,,, +US-WA-98621,US,WA,98621,7.6,,,, +US-WA-98622,US,WA,98622,8.4,,,, +US-WA-98623,US,WA,98623,7,,,, +US-WA-98624,US,WA,98624,7.8,,,, +US-WA-98625,US,WA,98625,7.7,,,, +US-WA-98626,US,WA,98626,8,,,, +US-WA-98628,US,WA,98628,7,,,, +US-WA-98629,US,WA,98629,7.7,,,, +US-WA-98631,US,WA,98631,7.8,,,, +US-WA-98632,US,WA,98632,8,,,, +US-WA-98635,US,WA,98635,7,,,, +US-WA-98637,US,WA,98637,7.8,,,, +US-WA-98638,US,WA,98638,7.8,,,, +US-WA-98639,US,WA,98639,7.7,,,, +US-WA-98640,US,WA,98640,7.8,,,, +US-WA-98641,US,WA,98641,7.8,,,, +US-WA-98642,US,WA,98642,7.7,,,, +US-WA-98643,US,WA,98643,7.6,,,, +US-WA-98644,US,WA,98644,7.8,,,, +US-WA-98645,US,WA,98645,7.7,,,, +US-WA-98647,US,WA,98647,7.6,,,, +US-WA-98648,US,WA,98648,7.7,,,, +US-WA-98649,US,WA,98649,7.7,,,, +US-WA-98650,US,WA,98650,7,,,, +US-WA-98651,US,WA,98651,7.7,,,, +US-WA-98660,US,WA,98660,8.4,,,, +US-WA-98661,US,WA,98661,8.4,,,, +US-WA-98662,US,WA,98662,8.4,,,, +US-WA-98663,US,WA,98663,8.4,,,, +US-WA-98664,US,WA,98664,8.4,,,, +US-WA-98665,US,WA,98665,8.4,,,, +US-WA-98666,US,WA,98666,8.4,,,, +US-WA-98668,US,WA,98668,8.4,,,, +US-WA-98670,US,WA,98670,7,,,, +US-WA-98671,US,WA,98671,8.4,,,, +US-WA-98672,US,WA,98672,7,,,, +US-WA-98673,US,WA,98673,7,,,, +US-WA-98674,US,WA,98674,7.7,,,, +US-WA-98675,US,WA,98675,7.7,,,, +US-WA-98682,US,WA,98682,8.4,,,, +US-WA-98683,US,WA,98683,8.4,,,, +US-WA-98684,US,WA,98684,8.4,,,, +US-WA-98685,US,WA,98685,8.4,,,, +US-WA-98686,US,WA,98686,8.4,,,, +US-WA-98687,US,WA,98687,8.4,,,, +US-WA-98801,US,WA,98801,8.4,,,, +US-WA-98802,US,WA,98802,8.2,,,, +US-WA-98807,US,WA,98807,8.4,,,, +US-WA-98811,US,WA,98811,8.2,,,, +US-WA-98812,US,WA,98812,7.7,,,, +US-WA-98813,US,WA,98813,7.7,,,, +US-WA-98814,US,WA,98814,7.7,,,, +US-WA-98815,US,WA,98815,8.2,,,, +US-WA-98816,US,WA,98816,8.2,,,, +US-WA-98817,US,WA,98817,8.2,,,, +US-WA-98819,US,WA,98819,7.7,,,, +US-WA-98821,US,WA,98821,8.2,,,, +US-WA-98822,US,WA,98822,8.2,,,, +US-WA-98823,US,WA,98823,7.9,,,, +US-WA-98824,US,WA,98824,7.9,,,, +US-WA-98826,US,WA,98826,8.2,,,, +US-WA-98827,US,WA,98827,7.7,,,, +US-WA-98828,US,WA,98828,8.2,,,, +US-WA-98829,US,WA,98829,7.7,,,, +US-WA-98830,US,WA,98830,7.8,,,, +US-WA-98831,US,WA,98831,8.2,,,, +US-WA-98832,US,WA,98832,7.9,,,, +US-WA-98833,US,WA,98833,7.7,,,, +US-WA-98834,US,WA,98834,7.7,,,, +US-WA-98836,US,WA,98836,8.2,,,, +US-WA-98837,US,WA,98837,7.9,,,, +US-WA-98840,US,WA,98840,7.8,,,, +US-WA-98841,US,WA,98841,7.7,,,, +US-WA-98843,US,WA,98843,8.2,,,, +US-WA-98844,US,WA,98844,7.7,,,, +US-WA-98845,US,WA,98845,7.8,,,, +US-WA-98846,US,WA,98846,7.7,,,, +US-WA-98847,US,WA,98847,8.2,,,, +US-WA-98848,US,WA,98848,7.9,,,, +US-WA-98849,US,WA,98849,7.7,,,, +US-WA-98850,US,WA,98850,8.2,,,, +US-WA-98851,US,WA,98851,7.9,,,, +US-WA-98852,US,WA,98852,8.2,,,, +US-WA-98853,US,WA,98853,7.9,,,, +US-WA-98855,US,WA,98855,7.7,,,, +US-WA-98856,US,WA,98856,7.8,,,, +US-WA-98857,US,WA,98857,7.9,,,, +US-WA-98858,US,WA,98858,8.2,,,, +US-WA-98859,US,WA,98859,7.7,,,, +US-WA-98860,US,WA,98860,7.9,,,, +US-WA-98862,US,WA,98862,7.7,,,, +US-WA-98901,US,WA,98901,8.2,,,, +US-WA-98902,US,WA,98902,8.2,,,, +US-WA-98903,US,WA,98903,7.9,,,, +US-WA-98904,US,WA,98904,8.2,,,, +US-WA-98907,US,WA,98907,8.2,,,, +US-WA-98908,US,WA,98908,8.2,,,, +US-WA-98909,US,WA,98909,8.2,,,, +US-WA-98920,US,WA,98920,7.9,,,, +US-WA-98921,US,WA,98921,7.9,,,, +US-WA-98922,US,WA,98922,8,,,, +US-WA-98923,US,WA,98923,7.9,,,, +US-WA-98925,US,WA,98925,8,,,, +US-WA-98926,US,WA,98926,8,,,, +US-WA-98930,US,WA,98930,7.9,,,, +US-WA-98932,US,WA,98932,7.9,,,, +US-WA-98933,US,WA,98933,7.9,,,, +US-WA-98934,US,WA,98934,8,,,, +US-WA-98935,US,WA,98935,7.9,,,, +US-WA-98936,US,WA,98936,7.9,,,, +US-WA-98937,US,WA,98937,7.9,,,, +US-WA-98938,US,WA,98938,7.9,,,, +US-WA-98939,US,WA,98939,7.9,,,, +US-WA-98940,US,WA,98940,8,,,, +US-WA-98941,US,WA,98941,8,,,, +US-WA-98942,US,WA,98942,7.9,,,, +US-WA-98943,US,WA,98943,8,,,, +US-WA-98944,US,WA,98944,7.9,,,, +US-WA-98946,US,WA,98946,8,,,, +US-WA-98947,US,WA,98947,7.9,,,, +US-WA-98948,US,WA,98948,7.9,,,, +US-WA-98950,US,WA,98950,8,,,, +US-WA-98951,US,WA,98951,7.9,,,, +US-WA-98952,US,WA,98952,7.9,,,, +US-WA-98953,US,WA,98953,7.9,,,, +US-WA-99001,US,WA,99001,8.7,,,, +US-WA-99003,US,WA,99003,8.1,,,, +US-WA-99004,US,WA,99004,8.7,,,, +US-WA-99005,US,WA,99005,8.1,,,, +US-WA-99006,US,WA,99006,8.1,,,, +US-WA-99008,US,WA,99008,7.7,,,, +US-WA-99009,US,WA,99009,8.1,,,, +US-WA-99011,US,WA,99011,8.7,,,, +US-WA-99012,US,WA,99012,8.1,,,, +US-WA-99013,US,WA,99013,7.6,,,, +US-WA-99014,US,WA,99014,8.7,,,, +US-WA-99016,US,WA,99016,8.7,,,, +US-WA-99017,US,WA,99017,7.8,,,, +US-WA-99018,US,WA,99018,8.1,,,, +US-WA-99019,US,WA,99019,8.7,,,, +US-WA-99020,US,WA,99020,8.1,,,, +US-WA-99021,US,WA,99021,8.1,,,, +US-WA-99022,US,WA,99022,8.1,,,, +US-WA-99023,US,WA,99023,8.1,,,, +US-WA-99025,US,WA,99025,8.1,,,, +US-WA-99026,US,WA,99026,8.1,,,, +US-WA-99027,US,WA,99027,8.1,,,, +US-WA-99029,US,WA,99029,7.7,,,, +US-WA-99030,US,WA,99030,8.1,,,, +US-WA-99031,US,WA,99031,8.1,,,, +US-WA-99032,US,WA,99032,7.7,,,, +US-WA-99033,US,WA,99033,7.8,,,, +US-WA-99034,US,WA,99034,7.6,,,, +US-WA-99036,US,WA,99036,8.1,,,, +US-WA-99037,US,WA,99037,8.7,,,, +US-WA-99039,US,WA,99039,8.1,,,, +US-WA-99040,US,WA,99040,7.6,,,, +US-WA-99101,US,WA,99101,7.6,,,, +US-WA-99102,US,WA,99102,7.8,,,, +US-WA-99103,US,WA,99103,7.7,,,, +US-WA-99104,US,WA,99104,7.8,,,, +US-WA-99105,US,WA,99105,7.7,,,, +US-WA-99107,US,WA,99107,7.7,,,, +US-WA-99109,US,WA,99109,7.6,,,, +US-WA-99110,US,WA,99110,7.6,,,, +US-WA-99111,US,WA,99111,7.8,,,, +US-WA-99113,US,WA,99113,7.8,,,, +US-WA-99114,US,WA,99114,7.6,,,, +US-WA-99115,US,WA,99115,7.9,,,, +US-WA-99116,US,WA,99116,7.7,,,, +US-WA-99117,US,WA,99117,7.7,,,, +US-WA-99118,US,WA,99118,7.7,,,, +US-WA-99119,US,WA,99119,7.6,,,, +US-WA-99121,US,WA,99121,7.7,,,, +US-WA-99122,US,WA,99122,7.7,,,, +US-WA-99123,US,WA,99123,7.9,,,, +US-WA-99124,US,WA,99124,7.7,,,, +US-WA-99125,US,WA,99125,7.8,,,, +US-WA-99126,US,WA,99126,7.6,,,, +US-WA-99128,US,WA,99128,7.8,,,, +US-WA-99129,US,WA,99129,7.6,,,, +US-WA-99130,US,WA,99130,7.8,,,, +US-WA-99131,US,WA,99131,7.6,,,, +US-WA-99133,US,WA,99133,7.9,,,, +US-WA-99134,US,WA,99134,7.7,,,, +US-WA-99135,US,WA,99135,7.9,,,, +US-WA-99136,US,WA,99136,7.8,,,, +US-WA-99137,US,WA,99137,7.6,,,, +US-WA-99138,US,WA,99138,7.7,,,, +US-WA-99139,US,WA,99139,7.6,,,, +US-WA-99140,US,WA,99140,7.7,,,, +US-WA-99141,US,WA,99141,7.6,,,, +US-WA-99143,US,WA,99143,7.8,,,, +US-WA-99144,US,WA,99144,7.7,,,, +US-WA-99146,US,WA,99146,7.7,,,, +US-WA-99147,US,WA,99147,7.7,,,, +US-WA-99148,US,WA,99148,7.6,,,, +US-WA-99149,US,WA,99149,7.8,,,, +US-WA-99150,US,WA,99150,7.7,,,, +US-WA-99151,US,WA,99151,7.6,,,, +US-WA-99152,US,WA,99152,7.6,,,, +US-WA-99153,US,WA,99153,7.6,,,, +US-WA-99154,US,WA,99154,7.7,,,, +US-WA-99155,US,WA,99155,7.7,,,, +US-WA-99156,US,WA,99156,7.6,,,, +US-WA-99157,US,WA,99157,7.6,,,, +US-WA-99158,US,WA,99158,7.8,,,, +US-WA-99159,US,WA,99159,7.7,,,, +US-WA-99160,US,WA,99160,7.7,,,, +US-WA-99161,US,WA,99161,7.8,,,, +US-WA-99163,US,WA,99163,7.8,,,, +US-WA-99164,US,WA,99164,7.8,,,, +US-WA-99166,US,WA,99166,7.7,,,, +US-WA-99167,US,WA,99167,7.6,,,, +US-WA-99169,US,WA,99169,7.7,,,, +US-WA-99170,US,WA,99170,7.8,,,, +US-WA-99171,US,WA,99171,7.8,,,, +US-WA-99173,US,WA,99173,7.6,,,, +US-WA-99174,US,WA,99174,7.8,,,, +US-WA-99176,US,WA,99176,7.8,,,, +US-WA-99179,US,WA,99179,7.8,,,, +US-WA-99180,US,WA,99180,7.6,,,, +US-WA-99181,US,WA,99181,7.6,,,, +US-WA-99185,US,WA,99185,7.7,,,, +US-WA-99201,US,WA,99201,8.7,,,, +US-WA-99202,US,WA,99202,8.7,,,, +US-WA-99203,US,WA,99203,8.7,,,, +US-WA-99204,US,WA,99204,8.7,,,, +US-WA-99205,US,WA,99205,8.7,,,, +US-WA-99206,US,WA,99206,8.7,,,, +US-WA-99207,US,WA,99207,8.7,,,, +US-WA-99208,US,WA,99208,8.7,,,, +US-WA-99209,US,WA,99209,8.7,,,, +US-WA-99210,US,WA,99210,8.7,,,, +US-WA-99211,US,WA,99211,8.7,,,, +US-WA-99212,US,WA,99212,8.7,,,, +US-WA-99213,US,WA,99213,8.7,,,, +US-WA-99214,US,WA,99214,8.7,,,, +US-WA-99215,US,WA,99215,8.7,,,, +US-WA-99216,US,WA,99216,8.7,,,, +US-WA-99217,US,WA,99217,8.7,,,, +US-WA-99218,US,WA,99218,8.7,,,, +US-WA-99219,US,WA,99219,8.7,,,, +US-WA-99220,US,WA,99220,8.7,,,, +US-WA-99223,US,WA,99223,8.7,,,, +US-WA-99224,US,WA,99224,8.7,,,, +US-WA-99228,US,WA,99228,8.7,,,, +US-WA-99251,US,WA,99251,8.7,,,, +US-WA-99252,US,WA,99252,8.7,,,, +US-WA-99256,US,WA,99256,8.7,,,, +US-WA-99258,US,WA,99258,8.7,,,, +US-WA-99260,US,WA,99260,8.7,,,, +US-WA-99301,US,WA,99301,8.6,,,, +US-WA-99302,US,WA,99302,8.6,,,, +US-WA-99320,US,WA,99320,8.3,,,, +US-WA-99321,US,WA,99321,7.9,,,, +US-WA-99322,US,WA,99322,7,,,, +US-WA-99323,US,WA,99323,8.1,,,, +US-WA-99324,US,WA,99324,8.7,,,, +US-WA-99326,US,WA,99326,8,,,, +US-WA-99328,US,WA,99328,7.9,,,, +US-WA-99329,US,WA,99329,8.1,,,, +US-WA-99330,US,WA,99330,8,,,, +US-WA-99333,US,WA,99333,7.8,,,, +US-WA-99335,US,WA,99335,8,,,, +US-WA-99336,US,WA,99336,8.3,,,, +US-WA-99337,US,WA,99337,8.3,,,, +US-WA-99338,US,WA,99338,8.3,,,, +US-WA-99341,US,WA,99341,7.7,,,, +US-WA-99343,US,WA,99343,8,,,, +US-WA-99344,US,WA,99344,7.7,,,, +US-WA-99345,US,WA,99345,7.7,,,, +US-WA-99346,US,WA,99346,7.7,,,, +US-WA-99347,US,WA,99347,7.5,,,, +US-WA-99348,US,WA,99348,8.1,,,, +US-WA-99349,US,WA,99349,7.9,,,, +US-WA-99350,US,WA,99350,8.3,,,, +US-WA-99352,US,WA,99352,8.3,,,, +US-WA-99353,US,WA,99353,8.3,,,, +US-WA-99354,US,WA,99354,8.3,,,, +US-WA-99356,US,WA,99356,7,,,, +US-WA-99357,US,WA,99357,7.9,,,, +US-WA-99359,US,WA,99359,7.9,,,, +US-WA-99360,US,WA,99360,8.1,,,, +US-WA-99361,US,WA,99361,8.1,,,, +US-WA-99362,US,WA,99362,8.9,,,, +US-WA-99363,US,WA,99363,8.1,,,, +US-WA-99371,US,WA,99371,7.7,,,, +US-WA-99401,US,WA,99401,7.5,,,, +US-WA-99402,US,WA,99402,7.5,,,, +US-WA-99403,US,WA,99403,7.5,,,, +US-WI-53001,US,WI,53001,5,,,, +US-WI-53002,US,WI,53002,5.6,,,, +US-WI-53003,US,WI,53003,5.5,,,, +US-WI-53004,US,WI,53004,5.6,,,, +US-WI-53005,US,WI,53005,5.1,,,, +US-WI-53006,US,WI,53006,5.5,,,, +US-WI-53007,US,WI,53007,5.1,,,, +US-WI-53008,US,WI,53008,5.1,,,, +US-WI-53010,US,WI,53010,5.5,,,, +US-WI-53011,US,WI,53011,5,,,, +US-WI-53012,US,WI,53012,5.6,,,, +US-WI-53013,US,WI,53013,5,,,, +US-WI-53014,US,WI,53014,5,,,, +US-WI-53015,US,WI,53015,5,,,, +US-WI-53016,US,WI,53016,5.5,,,, +US-WI-53017,US,WI,53017,5.6,,,, +US-WI-53018,US,WI,53018,5.1,,,, +US-WI-53019,US,WI,53019,5.5,,,, +US-WI-53020,US,WI,53020,5,,,, +US-WI-53021,US,WI,53021,5.6,,,, +US-WI-53022,US,WI,53022,5.6,,,, +US-WI-53023,US,WI,53023,5,,,, +US-WI-53024,US,WI,53024,5.6,,,, +US-WI-53026,US,WI,53026,5,,,, +US-WI-53027,US,WI,53027,5.6,,,, +US-WI-53029,US,WI,53029,5.1,,,, +US-WI-53031,US,WI,53031,5,,,, +US-WI-53032,US,WI,53032,5.5,,,, +US-WI-53033,US,WI,53033,5.6,,,, +US-WI-53034,US,WI,53034,5.5,,,, +US-WI-53035,US,WI,53035,5.5,,,, +US-WI-53036,US,WI,53036,5.5,,,, +US-WI-53037,US,WI,53037,5.6,,,, +US-WI-53038,US,WI,53038,5.5,,,, +US-WI-53039,US,WI,53039,5.5,,,, +US-WI-53040,US,WI,53040,5.6,,,, +US-WI-53042,US,WI,53042,5,,,, +US-WI-53044,US,WI,53044,5,,,, +US-WI-53045,US,WI,53045,5.1,,,, +US-WI-53046,US,WI,53046,5.1,,,, +US-WI-53047,US,WI,53047,5.5,,,, +US-WI-53048,US,WI,53048,5.5,,,, +US-WI-53049,US,WI,53049,5.5,,,, +US-WI-53050,US,WI,53050,5.5,,,, +US-WI-53051,US,WI,53051,5.1,,,, +US-WI-53052,US,WI,53052,5.1,,,, +US-WI-53056,US,WI,53056,5.1,,,, +US-WI-53057,US,WI,53057,5.5,,,, +US-WI-53058,US,WI,53058,5.1,,,, +US-WI-53059,US,WI,53059,5.5,,,, +US-WI-53060,US,WI,53060,5.6,,,, +US-WI-53061,US,WI,53061,5,,,, +US-WI-53062,US,WI,53062,5,,,, +US-WI-53063,US,WI,53063,5,,,, +US-WI-53064,US,WI,53064,5.1,,,, +US-WI-53065,US,WI,53065,5.5,,,, +US-WI-53066,US,WI,53066,5.1,,,, +US-WI-53069,US,WI,53069,5.1,,,, +US-WI-53070,US,WI,53070,5,,,, +US-WI-53072,US,WI,53072,5.1,,,, +US-WI-53073,US,WI,53073,5,,,, +US-WI-53074,US,WI,53074,5.6,,,, +US-WI-53075,US,WI,53075,5,,,, +US-WI-53076,US,WI,53076,5.6,,,, +US-WI-53078,US,WI,53078,5.5,,,, +US-WI-53079,US,WI,53079,5.5,,,, +US-WI-53080,US,WI,53080,5.6,,,, +US-WI-53081,US,WI,53081,5,,,, +US-WI-53082,US,WI,53082,5,,,, +US-WI-53083,US,WI,53083,5,,,, +US-WI-53085,US,WI,53085,5,,,, +US-WI-53086,US,WI,53086,5.6,,,, +US-WI-53088,US,WI,53088,5,,,, +US-WI-53089,US,WI,53089,5.1,,,, +US-WI-53090,US,WI,53090,5.6,,,, +US-WI-53091,US,WI,53091,5.5,,,, +US-WI-53092,US,WI,53092,5.6,,,, +US-WI-53093,US,WI,53093,5,,,, +US-WI-53094,US,WI,53094,5.5,,,, +US-WI-53095,US,WI,53095,5.6,,,, +US-WI-53097,US,WI,53097,5.6,,,, +US-WI-53098,US,WI,53098,5.5,,,, +US-WI-53099,US,WI,53099,5.5,,,, +US-WI-53101,US,WI,53101,5.5,,,, +US-WI-53102,US,WI,53102,5.5,,,, +US-WI-53103,US,WI,53103,5.1,,,, +US-WI-53104,US,WI,53104,5.5,,,, +US-WI-53105,US,WI,53105,5.1,,,, +US-WI-53108,US,WI,53108,5.1,,,, +US-WI-53109,US,WI,53109,5.5,,,, +US-WI-53110,US,WI,53110,5.6,,,, +US-WI-53114,US,WI,53114,5.5,,,, +US-WI-53115,US,WI,53115,5.5,,,, +US-WI-53118,US,WI,53118,5.1,,,, +US-WI-53119,US,WI,53119,5.1,,,, +US-WI-53120,US,WI,53120,5.5,,,, +US-WI-53121,US,WI,53121,5.5,,,, +US-WI-53122,US,WI,53122,5.1,,,, +US-WI-53125,US,WI,53125,5.5,,,, +US-WI-53126,US,WI,53126,5.1,,,, +US-WI-53127,US,WI,53127,5.1,,,, +US-WI-53128,US,WI,53128,5.5,,,, +US-WI-53129,US,WI,53129,5.6,,,, +US-WI-53130,US,WI,53130,5.6,,,, +US-WI-53132,US,WI,53132,5.6,,,, +US-WI-53137,US,WI,53137,5.5,,,, +US-WI-53138,US,WI,53138,5.5,,,, +US-WI-53139,US,WI,53139,5.1,,,, +US-WI-53140,US,WI,53140,5.5,,,, +US-WI-53141,US,WI,53141,5.5,,,, +US-WI-53142,US,WI,53142,5.5,,,, +US-WI-53143,US,WI,53143,5.5,,,, +US-WI-53144,US,WI,53144,5.5,,,, +US-WI-53146,US,WI,53146,5.1,,,, +US-WI-53147,US,WI,53147,5.5,,,, +US-WI-53148,US,WI,53148,5.5,,,, +US-WI-53149,US,WI,53149,5.1,,,, +US-WI-53150,US,WI,53150,5.1,,,, +US-WI-53151,US,WI,53151,5.1,,,, +US-WI-53152,US,WI,53152,5.5,,,, +US-WI-53153,US,WI,53153,5.1,,,, +US-WI-53154,US,WI,53154,5.6,,,, +US-WI-53156,US,WI,53156,5.5,,,, +US-WI-53157,US,WI,53157,5.5,,,, +US-WI-53158,US,WI,53158,5.5,,,, +US-WI-53159,US,WI,53159,5.5,,,, +US-WI-53167,US,WI,53167,5.1,,,, +US-WI-53168,US,WI,53168,5.5,,,, +US-WI-53170,US,WI,53170,5.5,,,, +US-WI-53171,US,WI,53171,5.5,,,, +US-WI-53172,US,WI,53172,5.6,,,, +US-WI-53176,US,WI,53176,5.5,,,, +US-WI-53177,US,WI,53177,5.1,,,, +US-WI-53178,US,WI,53178,5.5,,,, +US-WI-53179,US,WI,53179,5.5,,,, +US-WI-53181,US,WI,53181,5.5,,,, +US-WI-53182,US,WI,53182,5.1,,,, +US-WI-53183,US,WI,53183,5.1,,,, +US-WI-53184,US,WI,53184,5.5,,,, +US-WI-53185,US,WI,53185,5.1,,,, +US-WI-53186,US,WI,53186,5.1,,,, +US-WI-53187,US,WI,53187,5.1,,,, +US-WI-53188,US,WI,53188,5.1,,,, +US-WI-53189,US,WI,53189,5.1,,,, +US-WI-53190,US,WI,53190,5.5,,,, +US-WI-53191,US,WI,53191,5.5,,,, +US-WI-53192,US,WI,53192,5.5,,,, +US-WI-53194,US,WI,53194,5.5,,,, +US-WI-53195,US,WI,53195,5.5,,,, +US-WI-53201,US,WI,53201,5.6,,,, +US-WI-53202,US,WI,53202,5.6,,,, +US-WI-53203,US,WI,53203,5.6,,,, +US-WI-53204,US,WI,53204,5.6,,,, +US-WI-53205,US,WI,53205,5.6,,,, +US-WI-53206,US,WI,53206,5.6,,,, +US-WI-53207,US,WI,53207,5.6,,,, +US-WI-53208,US,WI,53208,5.6,,,, +US-WI-53209,US,WI,53209,5.6,,,, +US-WI-53210,US,WI,53210,5.6,,,, +US-WI-53211,US,WI,53211,5.6,,,, +US-WI-53212,US,WI,53212,5.6,,,, +US-WI-53213,US,WI,53213,5.6,,,, +US-WI-53214,US,WI,53214,5.6,,,, +US-WI-53215,US,WI,53215,5.6,,,, +US-WI-53216,US,WI,53216,5.6,,,, +US-WI-53217,US,WI,53217,5.6,,,, +US-WI-53218,US,WI,53218,5.6,,,, +US-WI-53219,US,WI,53219,5.6,,,, +US-WI-53220,US,WI,53220,5.6,,,, +US-WI-53221,US,WI,53221,5.6,,,, +US-WI-53222,US,WI,53222,5.6,,,, +US-WI-53223,US,WI,53223,5.6,,,, +US-WI-53224,US,WI,53224,5.6,,,, +US-WI-53225,US,WI,53225,5.6,,,, +US-WI-53226,US,WI,53226,5.6,,,, +US-WI-53227,US,WI,53227,5.6,,,, +US-WI-53228,US,WI,53228,5.6,,,, +US-WI-53233,US,WI,53233,5.6,,,, +US-WI-53234,US,WI,53234,5.6,,,, +US-WI-53235,US,WI,53235,5.6,,,, +US-WI-53237,US,WI,53237,5.6,,,, +US-WI-53259,US,WI,53259,5.6,,,, +US-WI-53263,US,WI,53263,5.6,,,, +US-WI-53267,US,WI,53267,5.6,,,, +US-WI-53268,US,WI,53268,5.6,,,, +US-WI-53274,US,WI,53274,5.6,,,, +US-WI-53278,US,WI,53278,5.6,,,, +US-WI-53288,US,WI,53288,5.6,,,, +US-WI-53290,US,WI,53290,5.6,,,, +US-WI-53293,US,WI,53293,5.6,,,, +US-WI-53295,US,WI,53295,5.6,,,, +US-WI-53401,US,WI,53401,5.1,,,, +US-WI-53402,US,WI,53402,5.1,,,, +US-WI-53403,US,WI,53403,5.1,,,, +US-WI-53404,US,WI,53404,5.1,,,, +US-WI-53405,US,WI,53405,5.1,,,, +US-WI-53406,US,WI,53406,5.1,,,, +US-WI-53407,US,WI,53407,5.1,,,, +US-WI-53408,US,WI,53408,5.1,,,, +US-WI-53501,US,WI,53501,5.5,,,, +US-WI-53502,US,WI,53502,5.5,,,, +US-WI-53503,US,WI,53503,5.5,,,, +US-WI-53504,US,WI,53504,5.5,,,, +US-WI-53505,US,WI,53505,5.5,,,, +US-WI-53506,US,WI,53506,5.5,,,, +US-WI-53507,US,WI,53507,5.5,,,, +US-WI-53508,US,WI,53508,5.5,,,, +US-WI-53510,US,WI,53510,5.5,,,, +US-WI-53511,US,WI,53511,5.5,,,, +US-WI-53512,US,WI,53512,5.5,,,, +US-WI-53515,US,WI,53515,5.5,,,, +US-WI-53516,US,WI,53516,5.5,,,, +US-WI-53517,US,WI,53517,5.5,,,, +US-WI-53518,US,WI,53518,5.5,,,, +US-WI-53520,US,WI,53520,5.5,,,, +US-WI-53521,US,WI,53521,5.5,,,, +US-WI-53522,US,WI,53522,5.5,,,, +US-WI-53523,US,WI,53523,5.5,,,, +US-WI-53525,US,WI,53525,5.5,,,, +US-WI-53526,US,WI,53526,5.5,,,, +US-WI-53527,US,WI,53527,5.5,,,, +US-WI-53528,US,WI,53528,5.5,,,, +US-WI-53529,US,WI,53529,5.5,,,, +US-WI-53530,US,WI,53530,5.5,,,, +US-WI-53531,US,WI,53531,5.5,,,, +US-WI-53532,US,WI,53532,5.5,,,, +US-WI-53533,US,WI,53533,5.5,,,, +US-WI-53534,US,WI,53534,5.5,,,, +US-WI-53535,US,WI,53535,5.5,,,, +US-WI-53536,US,WI,53536,5.5,,,, +US-WI-53537,US,WI,53537,5.5,,,, +US-WI-53538,US,WI,53538,5.5,,,, +US-WI-53540,US,WI,53540,5.5,,,, +US-WI-53541,US,WI,53541,5.5,,,, +US-WI-53542,US,WI,53542,5.5,,,, +US-WI-53543,US,WI,53543,5.5,,,, +US-WI-53544,US,WI,53544,5.5,,,, +US-WI-53545,US,WI,53545,5.5,,,, +US-WI-53546,US,WI,53546,5.5,,,, +US-WI-53547,US,WI,53547,5.5,,,, +US-WI-53548,US,WI,53548,5.5,,,, +US-WI-53549,US,WI,53549,5.5,,,, +US-WI-53550,US,WI,53550,5.5,,,, +US-WI-53551,US,WI,53551,5.5,,,, +US-WI-53553,US,WI,53553,5.5,,,, +US-WI-53554,US,WI,53554,5.5,,,, +US-WI-53555,US,WI,53555,5.5,,,, +US-WI-53556,US,WI,53556,5.5,,,, +US-WI-53557,US,WI,53557,5.5,,,, +US-WI-53558,US,WI,53558,5.5,,,, +US-WI-53559,US,WI,53559,5.5,,,, +US-WI-53560,US,WI,53560,5.5,,,, +US-WI-53561,US,WI,53561,5.5,,,, +US-WI-53562,US,WI,53562,5.5,,,, +US-WI-53563,US,WI,53563,5.5,,,, +US-WI-53565,US,WI,53565,5.5,,,, +US-WI-53566,US,WI,53566,5.5,,,, +US-WI-53569,US,WI,53569,5.5,,,, +US-WI-53570,US,WI,53570,5.5,,,, +US-WI-53571,US,WI,53571,5.5,,,, +US-WI-53572,US,WI,53572,5.5,,,, +US-WI-53573,US,WI,53573,5.5,,,, +US-WI-53574,US,WI,53574,5.5,,,, +US-WI-53575,US,WI,53575,5.5,,,, +US-WI-53576,US,WI,53576,5.5,,,, +US-WI-53577,US,WI,53577,5.5,,,, +US-WI-53578,US,WI,53578,5.5,,,, +US-WI-53579,US,WI,53579,5.5,,,, +US-WI-53580,US,WI,53580,5.5,,,, +US-WI-53581,US,WI,53581,5.5,,,, +US-WI-53582,US,WI,53582,5.5,,,, +US-WI-53583,US,WI,53583,5.5,,,, +US-WI-53584,US,WI,53584,5.5,,,, +US-WI-53585,US,WI,53585,5.5,,,, +US-WI-53586,US,WI,53586,5.5,,,, +US-WI-53587,US,WI,53587,5.5,,,, +US-WI-53588,US,WI,53588,5.5,,,, +US-WI-53589,US,WI,53589,5.5,,,, +US-WI-53590,US,WI,53590,5.5,,,, +US-WI-53593,US,WI,53593,5.5,,,, +US-WI-53594,US,WI,53594,5.5,,,, +US-WI-53595,US,WI,53595,5.5,,,, +US-WI-53596,US,WI,53596,5.5,,,, +US-WI-53597,US,WI,53597,5.5,,,, +US-WI-53598,US,WI,53598,5.5,,,, +US-WI-53599,US,WI,53599,5.5,,,, +US-WI-53701,US,WI,53701,5.5,,,, +US-WI-53702,US,WI,53702,5.5,,,, +US-WI-53703,US,WI,53703,5.5,,,, +US-WI-53704,US,WI,53704,5.5,,,, +US-WI-53705,US,WI,53705,5.5,,,, +US-WI-53706,US,WI,53706,5.5,,,, +US-WI-53707,US,WI,53707,5.5,,,, +US-WI-53708,US,WI,53708,5.5,,,, +US-WI-53711,US,WI,53711,5.5,,,, +US-WI-53713,US,WI,53713,5.5,,,, +US-WI-53714,US,WI,53714,5.5,,,, +US-WI-53715,US,WI,53715,5.5,,,, +US-WI-53716,US,WI,53716,5.5,,,, +US-WI-53717,US,WI,53717,5.5,,,, +US-WI-53718,US,WI,53718,5.5,,,, +US-WI-53719,US,WI,53719,5.5,,,, +US-WI-53725,US,WI,53725,5.5,,,, +US-WI-53726,US,WI,53726,5.5,,,, +US-WI-53744,US,WI,53744,5.5,,,, +US-WI-53774,US,WI,53774,5.5,,,, +US-WI-53777,US,WI,53777,5.5,,,, +US-WI-53778,US,WI,53778,5.5,,,, +US-WI-53779,US,WI,53779,5.5,,,, +US-WI-53782,US,WI,53782,5.5,,,, +US-WI-53783,US,WI,53783,5.5,,,, +US-WI-53784,US,WI,53784,5.5,,,, +US-WI-53785,US,WI,53785,5.5,,,, +US-WI-53786,US,WI,53786,5.5,,,, +US-WI-53788,US,WI,53788,5.5,,,, +US-WI-53789,US,WI,53789,5.5,,,, +US-WI-53790,US,WI,53790,5.5,,,, +US-WI-53791,US,WI,53791,5.5,,,, +US-WI-53792,US,WI,53792,5.5,,,, +US-WI-53793,US,WI,53793,5.5,,,, +US-WI-53794,US,WI,53794,5.5,,,, +US-WI-53801,US,WI,53801,5.5,,,, +US-WI-53802,US,WI,53802,5.5,,,, +US-WI-53803,US,WI,53803,5.5,,,, +US-WI-53804,US,WI,53804,5.5,,,, +US-WI-53805,US,WI,53805,5.5,,,, +US-WI-53806,US,WI,53806,5.5,,,, +US-WI-53807,US,WI,53807,5.5,,,, +US-WI-53808,US,WI,53808,5.5,,,, +US-WI-53809,US,WI,53809,5.5,,,, +US-WI-53810,US,WI,53810,5.5,,,, +US-WI-53811,US,WI,53811,5.5,,,, +US-WI-53812,US,WI,53812,5.5,,,, +US-WI-53813,US,WI,53813,5.5,,,, +US-WI-53816,US,WI,53816,5.5,,,, +US-WI-53817,US,WI,53817,5.5,,,, +US-WI-53818,US,WI,53818,5.5,,,, +US-WI-53820,US,WI,53820,5.5,,,, +US-WI-53821,US,WI,53821,5.5,,,, +US-WI-53824,US,WI,53824,5.5,,,, +US-WI-53825,US,WI,53825,5.5,,,, +US-WI-53826,US,WI,53826,5.5,,,, +US-WI-53827,US,WI,53827,5.5,,,, +US-WI-53901,US,WI,53901,5.5,,,, +US-WI-53910,US,WI,53910,5.5,,,, +US-WI-53911,US,WI,53911,5.5,,,, +US-WI-53913,US,WI,53913,5.5,,,, +US-WI-53916,US,WI,53916,5.5,,,, +US-WI-53919,US,WI,53919,5.5,,,, +US-WI-53920,US,WI,53920,5.5,,,, +US-WI-53922,US,WI,53922,5.5,,,, +US-WI-53923,US,WI,53923,5.5,,,, +US-WI-53924,US,WI,53924,5.5,,,, +US-WI-53925,US,WI,53925,5.5,,,, +US-WI-53926,US,WI,53926,5.5,,,, +US-WI-53927,US,WI,53927,5.5,,,, +US-WI-53928,US,WI,53928,5.5,,,, +US-WI-53929,US,WI,53929,5.5,,,, +US-WI-53930,US,WI,53930,5.5,,,, +US-WI-53931,US,WI,53931,5.5,,,, +US-WI-53932,US,WI,53932,5.5,,,, +US-WI-53933,US,WI,53933,5.5,,,, +US-WI-53934,US,WI,53934,5.5,,,, +US-WI-53935,US,WI,53935,5.5,,,, +US-WI-53936,US,WI,53936,5.5,,,, +US-WI-53937,US,WI,53937,5.5,,,, +US-WI-53939,US,WI,53939,5.5,,,, +US-WI-53940,US,WI,53940,5.5,,,, +US-WI-53941,US,WI,53941,5.5,,,, +US-WI-53942,US,WI,53942,5.5,,,, +US-WI-53943,US,WI,53943,5.5,,,, +US-WI-53944,US,WI,53944,5.5,,,, +US-WI-53946,US,WI,53946,5.5,,,, +US-WI-53947,US,WI,53947,5.5,,,, +US-WI-53948,US,WI,53948,5.5,,,, +US-WI-53949,US,WI,53949,5.5,,,, +US-WI-53950,US,WI,53950,5.5,,,, +US-WI-53951,US,WI,53951,5.5,,,, +US-WI-53952,US,WI,53952,5.5,,,, +US-WI-53953,US,WI,53953,5.5,,,, +US-WI-53954,US,WI,53954,5.5,,,, +US-WI-53955,US,WI,53955,5.5,,,, +US-WI-53956,US,WI,53956,5.5,,,, +US-WI-53957,US,WI,53957,5.5,,,, +US-WI-53958,US,WI,53958,5.5,,,, +US-WI-53959,US,WI,53959,5.5,,,, +US-WI-53960,US,WI,53960,5.5,,,, +US-WI-53961,US,WI,53961,5.5,,,, +US-WI-53962,US,WI,53962,5.5,,,, +US-WI-53963,US,WI,53963,5.5,,,, +US-WI-53964,US,WI,53964,5.5,,,, +US-WI-53965,US,WI,53965,5.5,,,, +US-WI-53968,US,WI,53968,5.5,,,, +US-WI-53969,US,WI,53969,5.5,,,, +US-WI-54001,US,WI,54001,5.5,,,, +US-WI-54002,US,WI,54002,5.5,,,, +US-WI-54003,US,WI,54003,5.5,,,, +US-WI-54004,US,WI,54004,5.5,,,, +US-WI-54005,US,WI,54005,5.5,,,, +US-WI-54006,US,WI,54006,5.5,,,, +US-WI-54007,US,WI,54007,5.5,,,, +US-WI-54009,US,WI,54009,5.5,,,, +US-WI-54010,US,WI,54010,5.5,,,, +US-WI-54011,US,WI,54011,5.5,,,, +US-WI-54013,US,WI,54013,5.5,,,, +US-WI-54014,US,WI,54014,5.5,,,, +US-WI-54015,US,WI,54015,5.5,,,, +US-WI-54016,US,WI,54016,5.5,,,, +US-WI-54017,US,WI,54017,5.5,,,, +US-WI-54020,US,WI,54020,5.5,,,, +US-WI-54021,US,WI,54021,5.5,,,, +US-WI-54022,US,WI,54022,5.5,,,, +US-WI-54023,US,WI,54023,5.5,,,, +US-WI-54024,US,WI,54024,5.5,,,, +US-WI-54025,US,WI,54025,5.5,,,, +US-WI-54026,US,WI,54026,5.5,,,, +US-WI-54027,US,WI,54027,5.5,,,, +US-WI-54028,US,WI,54028,5.5,,,, +US-WI-54082,US,WI,54082,5.5,,,, +US-WI-54101,US,WI,54101,5.5,,,, +US-WI-54102,US,WI,54102,5.5,,,, +US-WI-54103,US,WI,54103,5.5,,,, +US-WI-54104,US,WI,54104,5.5,,,, +US-WI-54106,US,WI,54106,5,,,, +US-WI-54107,US,WI,54107,5.5,,,, +US-WI-54110,US,WI,54110,5,,,, +US-WI-54111,US,WI,54111,5.5,,,, +US-WI-54112,US,WI,54112,5.5,,,, +US-WI-54113,US,WI,54113,5,,,, +US-WI-54114,US,WI,54114,5.5,,,, +US-WI-54115,US,WI,54115,5.5,,,, +US-WI-54119,US,WI,54119,5.5,,,, +US-WI-54120,US,WI,54120,5.5,,,, +US-WI-54121,US,WI,54121,5.5,,,, +US-WI-54123,US,WI,54123,5,,,, +US-WI-54124,US,WI,54124,5.5,,,, +US-WI-54125,US,WI,54125,5.5,,,, +US-WI-54126,US,WI,54126,5.5,,,, +US-WI-54127,US,WI,54127,5.5,,,, +US-WI-54128,US,WI,54128,5.5,,,, +US-WI-54129,US,WI,54129,5,,,, +US-WI-54130,US,WI,54130,5,,,, +US-WI-54131,US,WI,54131,5,,,, +US-WI-54135,US,WI,54135,5,,,, +US-WI-54136,US,WI,54136,5,,,, +US-WI-54137,US,WI,54137,5.5,,,, +US-WI-54138,US,WI,54138,5.5,,,, +US-WI-54139,US,WI,54139,5.5,,,, +US-WI-54140,US,WI,54140,5,,,, +US-WI-54141,US,WI,54141,5.5,,,, +US-WI-54143,US,WI,54143,5.5,,,, +US-WI-54149,US,WI,54149,5.5,,,, +US-WI-54150,US,WI,54150,5,,,, +US-WI-54151,US,WI,54151,5.5,,,, +US-WI-54152,US,WI,54152,5,,,, +US-WI-54153,US,WI,54153,5.5,,,, +US-WI-54154,US,WI,54154,5.5,,,, +US-WI-54155,US,WI,54155,5.5,,,, +US-WI-54156,US,WI,54156,5.5,,,, +US-WI-54157,US,WI,54157,5.5,,,, +US-WI-54159,US,WI,54159,5.5,,,, +US-WI-54160,US,WI,54160,5,,,, +US-WI-54161,US,WI,54161,5.5,,,, +US-WI-54162,US,WI,54162,5.5,,,, +US-WI-54165,US,WI,54165,5,,,, +US-WI-54166,US,WI,54166,5.5,,,, +US-WI-54169,US,WI,54169,5,,,, +US-WI-54170,US,WI,54170,5,,,, +US-WI-54171,US,WI,54171,5.5,,,, +US-WI-54173,US,WI,54173,5.5,,,, +US-WI-54174,US,WI,54174,5.5,,,, +US-WI-54175,US,WI,54175,5.5,,,, +US-WI-54177,US,WI,54177,5.5,,,, +US-WI-54180,US,WI,54180,5.5,,,, +US-WI-54182,US,WI,54182,5.5,,,, +US-WI-54201,US,WI,54201,5,,,, +US-WI-54202,US,WI,54202,5.5,,,, +US-WI-54204,US,WI,54204,5.5,,,, +US-WI-54205,US,WI,54205,5,,,, +US-WI-54207,US,WI,54207,5,,,, +US-WI-54208,US,WI,54208,5.5,,,, +US-WI-54209,US,WI,54209,5.5,,,, +US-WI-54210,US,WI,54210,5.5,,,, +US-WI-54211,US,WI,54211,5.5,,,, +US-WI-54212,US,WI,54212,5.5,,,, +US-WI-54213,US,WI,54213,5.5,,,, +US-WI-54214,US,WI,54214,5,,,, +US-WI-54215,US,WI,54215,5,,,, +US-WI-54216,US,WI,54216,5,,,, +US-WI-54217,US,WI,54217,5,,,, +US-WI-54220,US,WI,54220,5,,,, +US-WI-54221,US,WI,54221,5,,,, +US-WI-54226,US,WI,54226,5.5,,,, +US-WI-54227,US,WI,54227,5,,,, +US-WI-54228,US,WI,54228,5,,,, +US-WI-54229,US,WI,54229,5.5,,,, +US-WI-54230,US,WI,54230,5,,,, +US-WI-54232,US,WI,54232,5,,,, +US-WI-54234,US,WI,54234,5.5,,,, +US-WI-54235,US,WI,54235,5.5,,,, +US-WI-54241,US,WI,54241,5,,,, +US-WI-54245,US,WI,54245,5,,,, +US-WI-54246,US,WI,54246,5.5,,,, +US-WI-54247,US,WI,54247,5,,,, +US-WI-54301,US,WI,54301,5.5,,,, +US-WI-54302,US,WI,54302,5.5,,,, +US-WI-54303,US,WI,54303,5.5,,,, +US-WI-54304,US,WI,54304,5.5,,,, +US-WI-54305,US,WI,54305,5.5,,,, +US-WI-54306,US,WI,54306,5.5,,,, +US-WI-54307,US,WI,54307,5.5,,,, +US-WI-54308,US,WI,54308,5.5,,,, +US-WI-54311,US,WI,54311,5.5,,,, +US-WI-54313,US,WI,54313,5.5,,,, +US-WI-54324,US,WI,54324,5.5,,,, +US-WI-54344,US,WI,54344,5.5,,,, +US-WI-54401,US,WI,54401,5.5,,,, +US-WI-54402,US,WI,54402,5.5,,,, +US-WI-54403,US,WI,54403,5.5,,,, +US-WI-54404,US,WI,54404,5.5,,,, +US-WI-54405,US,WI,54405,5.5,,,, +US-WI-54406,US,WI,54406,5.5,,,, +US-WI-54407,US,WI,54407,5.5,,,, +US-WI-54408,US,WI,54408,5.5,,,, +US-WI-54409,US,WI,54409,5.5,,,, +US-WI-54410,US,WI,54410,5.5,,,, +US-WI-54411,US,WI,54411,5.5,,,, +US-WI-54412,US,WI,54412,5.5,,,, +US-WI-54413,US,WI,54413,5.5,,,, +US-WI-54414,US,WI,54414,5.5,,,, +US-WI-54415,US,WI,54415,5.5,,,, +US-WI-54416,US,WI,54416,5.5,,,, +US-WI-54417,US,WI,54417,5.5,,,, +US-WI-54418,US,WI,54418,5.5,,,, +US-WI-54420,US,WI,54420,5.5,,,, +US-WI-54421,US,WI,54421,5.5,,,, +US-WI-54422,US,WI,54422,5.5,,,, +US-WI-54423,US,WI,54423,5.5,,,, +US-WI-54424,US,WI,54424,5.5,,,, +US-WI-54425,US,WI,54425,5.5,,,, +US-WI-54426,US,WI,54426,5.5,,,, +US-WI-54427,US,WI,54427,5.5,,,, +US-WI-54428,US,WI,54428,5.5,,,, +US-WI-54429,US,WI,54429,5.5,,,, +US-WI-54430,US,WI,54430,5.5,,,, +US-WI-54432,US,WI,54432,5.5,,,, +US-WI-54433,US,WI,54433,5.5,,,, +US-WI-54434,US,WI,54434,5.5,,,, +US-WI-54435,US,WI,54435,5.5,,,, +US-WI-54436,US,WI,54436,5.5,,,, +US-WI-54437,US,WI,54437,5.5,,,, +US-WI-54439,US,WI,54439,5.5,,,, +US-WI-54440,US,WI,54440,5.5,,,, +US-WI-54441,US,WI,54441,5.5,,,, +US-WI-54442,US,WI,54442,5.5,,,, +US-WI-54443,US,WI,54443,5.5,,,, +US-WI-54446,US,WI,54446,5.5,,,, +US-WI-54447,US,WI,54447,5.5,,,, +US-WI-54448,US,WI,54448,5.5,,,, +US-WI-54449,US,WI,54449,5.5,,,, +US-WI-54450,US,WI,54450,5.5,,,, +US-WI-54451,US,WI,54451,5.5,,,, +US-WI-54452,US,WI,54452,5.5,,,, +US-WI-54454,US,WI,54454,5.5,,,, +US-WI-54455,US,WI,54455,5.5,,,, +US-WI-54456,US,WI,54456,5.5,,,, +US-WI-54457,US,WI,54457,5.5,,,, +US-WI-54458,US,WI,54458,5.5,,,, +US-WI-54459,US,WI,54459,5.5,,,, +US-WI-54460,US,WI,54460,5.5,,,, +US-WI-54462,US,WI,54462,5.5,,,, +US-WI-54463,US,WI,54463,5.5,,,, +US-WI-54464,US,WI,54464,5.5,,,, +US-WI-54465,US,WI,54465,5.5,,,, +US-WI-54466,US,WI,54466,5.5,,,, +US-WI-54467,US,WI,54467,5.5,,,, +US-WI-54469,US,WI,54469,5.5,,,, +US-WI-54470,US,WI,54470,5.5,,,, +US-WI-54471,US,WI,54471,5.5,,,, +US-WI-54472,US,WI,54472,5.5,,,, +US-WI-54473,US,WI,54473,5.5,,,, +US-WI-54474,US,WI,54474,5.5,,,, +US-WI-54475,US,WI,54475,5.5,,,, +US-WI-54476,US,WI,54476,5.5,,,, +US-WI-54479,US,WI,54479,5.5,,,, +US-WI-54480,US,WI,54480,5.5,,,, +US-WI-54481,US,WI,54481,5.5,,,, +US-WI-54482,US,WI,54482,5.5,,,, +US-WI-54484,US,WI,54484,5.5,,,, +US-WI-54485,US,WI,54485,5.5,,,, +US-WI-54486,US,WI,54486,5.5,,,, +US-WI-54487,US,WI,54487,5.5,,,, +US-WI-54488,US,WI,54488,5.5,,,, +US-WI-54489,US,WI,54489,5.5,,,, +US-WI-54490,US,WI,54490,5.5,,,, +US-WI-54491,US,WI,54491,5.5,,,, +US-WI-54492,US,WI,54492,5.5,,,, +US-WI-54493,US,WI,54493,5.5,,,, +US-WI-54494,US,WI,54494,5.5,,,, +US-WI-54495,US,WI,54495,5.5,,,, +US-WI-54498,US,WI,54498,5.5,,,, +US-WI-54499,US,WI,54499,5.5,,,, +US-WI-54501,US,WI,54501,5.5,,,, +US-WI-54511,US,WI,54511,5.5,,,, +US-WI-54512,US,WI,54512,5.5,,,, +US-WI-54513,US,WI,54513,5.5,,,, +US-WI-54514,US,WI,54514,5.5,,,, +US-WI-54515,US,WI,54515,5.5,,,, +US-WI-54517,US,WI,54517,5.5,,,, +US-WI-54519,US,WI,54519,5.5,,,, +US-WI-54520,US,WI,54520,5.5,,,, +US-WI-54521,US,WI,54521,5.5,,,, +US-WI-54524,US,WI,54524,5.5,,,, +US-WI-54525,US,WI,54525,5.5,,,, +US-WI-54526,US,WI,54526,5.5,,,, +US-WI-54527,US,WI,54527,5.5,,,, +US-WI-54529,US,WI,54529,5.5,,,, +US-WI-54530,US,WI,54530,5.5,,,, +US-WI-54531,US,WI,54531,5.5,,,, +US-WI-54532,US,WI,54532,5.5,,,, +US-WI-54534,US,WI,54534,5.5,,,, +US-WI-54536,US,WI,54536,5.5,,,, +US-WI-54537,US,WI,54537,5.5,,,, +US-WI-54538,US,WI,54538,5.5,,,, +US-WI-54539,US,WI,54539,5.5,,,, +US-WI-54540,US,WI,54540,5.5,,,, +US-WI-54541,US,WI,54541,5.5,,,, +US-WI-54542,US,WI,54542,5.5,,,, +US-WI-54543,US,WI,54543,5.5,,,, +US-WI-54545,US,WI,54545,5.5,,,, +US-WI-54546,US,WI,54546,5.5,,,, +US-WI-54547,US,WI,54547,5.5,,,, +US-WI-54548,US,WI,54548,5.5,,,, +US-WI-54550,US,WI,54550,5.5,,,, +US-WI-54552,US,WI,54552,5.5,,,, +US-WI-54554,US,WI,54554,5.5,,,, +US-WI-54555,US,WI,54555,5.5,,,, +US-WI-54556,US,WI,54556,5.5,,,, +US-WI-54557,US,WI,54557,5.5,,,, +US-WI-54558,US,WI,54558,5.5,,,, +US-WI-54559,US,WI,54559,5.5,,,, +US-WI-54560,US,WI,54560,5.5,,,, +US-WI-54561,US,WI,54561,5.5,,,, +US-WI-54562,US,WI,54562,5.5,,,, +US-WI-54563,US,WI,54563,5.5,,,, +US-WI-54564,US,WI,54564,5.5,,,, +US-WI-54565,US,WI,54565,5.5,,,, +US-WI-54566,US,WI,54566,5.5,,,, +US-WI-54568,US,WI,54568,5.5,,,, +US-WI-54601,US,WI,54601,5.5,,,, +US-WI-54602,US,WI,54602,5.5,,,, +US-WI-54603,US,WI,54603,5.5,,,, +US-WI-54610,US,WI,54610,5.5,,,, +US-WI-54611,US,WI,54611,5.5,,,, +US-WI-54612,US,WI,54612,5.5,,,, +US-WI-54613,US,WI,54613,5.5,,,, +US-WI-54614,US,WI,54614,5.5,,,, +US-WI-54615,US,WI,54615,5.5,,,, +US-WI-54616,US,WI,54616,5.5,,,, +US-WI-54618,US,WI,54618,5.5,,,, +US-WI-54619,US,WI,54619,5.5,,,, +US-WI-54620,US,WI,54620,5.5,,,, +US-WI-54621,US,WI,54621,5.5,,,, +US-WI-54622,US,WI,54622,5.5,,,, +US-WI-54623,US,WI,54623,5.5,,,, +US-WI-54624,US,WI,54624,5.5,,,, +US-WI-54625,US,WI,54625,5.5,,,, +US-WI-54626,US,WI,54626,5.5,,,, +US-WI-54627,US,WI,54627,5.5,,,, +US-WI-54628,US,WI,54628,5.5,,,, +US-WI-54629,US,WI,54629,5.5,,,, +US-WI-54630,US,WI,54630,5.5,,,, +US-WI-54631,US,WI,54631,5.5,,,, +US-WI-54632,US,WI,54632,5.5,,,, +US-WI-54634,US,WI,54634,5.5,,,, +US-WI-54635,US,WI,54635,5.5,,,, +US-WI-54636,US,WI,54636,5.5,,,, +US-WI-54637,US,WI,54637,5.5,,,, +US-WI-54638,US,WI,54638,5.5,,,, +US-WI-54639,US,WI,54639,5.5,,,, +US-WI-54640,US,WI,54640,5.5,,,, +US-WI-54641,US,WI,54641,5.5,,,, +US-WI-54642,US,WI,54642,5.5,,,, +US-WI-54643,US,WI,54643,5.5,,,, +US-WI-54644,US,WI,54644,5.5,,,, +US-WI-54645,US,WI,54645,5.5,,,, +US-WI-54646,US,WI,54646,5.5,,,, +US-WI-54648,US,WI,54648,5.5,,,, +US-WI-54649,US,WI,54649,5.5,,,, +US-WI-54650,US,WI,54650,5.5,,,, +US-WI-54651,US,WI,54651,5.5,,,, +US-WI-54652,US,WI,54652,5.5,,,, +US-WI-54653,US,WI,54653,5.5,,,, +US-WI-54654,US,WI,54654,5.5,,,, +US-WI-54655,US,WI,54655,5.5,,,, +US-WI-54656,US,WI,54656,5.5,,,, +US-WI-54657,US,WI,54657,5.5,,,, +US-WI-54658,US,WI,54658,5.5,,,, +US-WI-54659,US,WI,54659,5.5,,,, +US-WI-54660,US,WI,54660,5.5,,,, +US-WI-54661,US,WI,54661,5.5,,,, +US-WI-54662,US,WI,54662,5.5,,,, +US-WI-54664,US,WI,54664,5.5,,,, +US-WI-54665,US,WI,54665,5.5,,,, +US-WI-54666,US,WI,54666,5.5,,,, +US-WI-54667,US,WI,54667,5.5,,,, +US-WI-54669,US,WI,54669,5.5,,,, +US-WI-54670,US,WI,54670,5.5,,,, +US-WI-54701,US,WI,54701,5.5,,,, +US-WI-54702,US,WI,54702,5.5,,,, +US-WI-54703,US,WI,54703,5.5,,,, +US-WI-54720,US,WI,54720,5.5,,,, +US-WI-54721,US,WI,54721,5.5,,,, +US-WI-54722,US,WI,54722,5.5,,,, +US-WI-54723,US,WI,54723,5.5,,,, +US-WI-54724,US,WI,54724,5.5,,,, +US-WI-54725,US,WI,54725,5.5,,,, +US-WI-54726,US,WI,54726,5.5,,,, +US-WI-54727,US,WI,54727,5.5,,,, +US-WI-54728,US,WI,54728,5.5,,,, +US-WI-54729,US,WI,54729,5.5,,,, +US-WI-54730,US,WI,54730,5.5,,,, +US-WI-54731,US,WI,54731,5.5,,,, +US-WI-54732,US,WI,54732,5.5,,,, +US-WI-54733,US,WI,54733,5.5,,,, +US-WI-54734,US,WI,54734,5.5,,,, +US-WI-54735,US,WI,54735,5.5,,,, +US-WI-54736,US,WI,54736,5.5,,,, +US-WI-54737,US,WI,54737,5.5,,,, +US-WI-54738,US,WI,54738,5.5,,,, +US-WI-54739,US,WI,54739,5.5,,,, +US-WI-54740,US,WI,54740,5.5,,,, +US-WI-54741,US,WI,54741,5.5,,,, +US-WI-54742,US,WI,54742,5.5,,,, +US-WI-54743,US,WI,54743,5.5,,,, +US-WI-54745,US,WI,54745,5.5,,,, +US-WI-54746,US,WI,54746,5.5,,,, +US-WI-54747,US,WI,54747,5.5,,,, +US-WI-54748,US,WI,54748,5.5,,,, +US-WI-54749,US,WI,54749,5.5,,,, +US-WI-54750,US,WI,54750,5.5,,,, +US-WI-54751,US,WI,54751,5.5,,,, +US-WI-54754,US,WI,54754,5.5,,,, +US-WI-54755,US,WI,54755,5.5,,,, +US-WI-54756,US,WI,54756,5.5,,,, +US-WI-54757,US,WI,54757,5.5,,,, +US-WI-54758,US,WI,54758,5.5,,,, +US-WI-54759,US,WI,54759,5.5,,,, +US-WI-54760,US,WI,54760,5.5,,,, +US-WI-54761,US,WI,54761,5.5,,,, +US-WI-54762,US,WI,54762,5.5,,,, +US-WI-54763,US,WI,54763,5.5,,,, +US-WI-54764,US,WI,54764,5.5,,,, +US-WI-54765,US,WI,54765,5.5,,,, +US-WI-54766,US,WI,54766,5.5,,,, +US-WI-54767,US,WI,54767,5.5,,,, +US-WI-54768,US,WI,54768,5.5,,,, +US-WI-54769,US,WI,54769,5.5,,,, +US-WI-54770,US,WI,54770,5.5,,,, +US-WI-54771,US,WI,54771,5.5,,,, +US-WI-54772,US,WI,54772,5.5,,,, +US-WI-54773,US,WI,54773,5.5,,,, +US-WI-54774,US,WI,54774,5.5,,,, +US-WI-54801,US,WI,54801,5.5,,,, +US-WI-54805,US,WI,54805,5.5,,,, +US-WI-54806,US,WI,54806,5.5,,,, +US-WI-54810,US,WI,54810,5.5,,,, +US-WI-54812,US,WI,54812,5.5,,,, +US-WI-54813,US,WI,54813,5.5,,,, +US-WI-54814,US,WI,54814,5.5,,,, +US-WI-54816,US,WI,54816,5.5,,,, +US-WI-54817,US,WI,54817,5.5,,,, +US-WI-54818,US,WI,54818,5.5,,,, +US-WI-54819,US,WI,54819,5.5,,,, +US-WI-54820,US,WI,54820,5.5,,,, +US-WI-54821,US,WI,54821,5.5,,,, +US-WI-54822,US,WI,54822,5.5,,,, +US-WI-54824,US,WI,54824,5.5,,,, +US-WI-54826,US,WI,54826,5.5,,,, +US-WI-54827,US,WI,54827,5.5,,,, +US-WI-54828,US,WI,54828,5.5,,,, +US-WI-54829,US,WI,54829,5.5,,,, +US-WI-54830,US,WI,54830,5.5,,,, +US-WI-54832,US,WI,54832,5.5,,,, +US-WI-54834,US,WI,54834,5.5,,,, +US-WI-54835,US,WI,54835,5.5,,,, +US-WI-54836,US,WI,54836,5.5,,,, +US-WI-54837,US,WI,54837,5.5,,,, +US-WI-54838,US,WI,54838,5.5,,,, +US-WI-54839,US,WI,54839,5.5,,,, +US-WI-54840,US,WI,54840,5.5,,,, +US-WI-54841,US,WI,54841,5.5,,,, +US-WI-54842,US,WI,54842,5.5,,,, +US-WI-54843,US,WI,54843,5.5,,,, +US-WI-54844,US,WI,54844,5.5,,,, +US-WI-54845,US,WI,54845,5.5,,,, +US-WI-54846,US,WI,54846,5.5,,,, +US-WI-54847,US,WI,54847,5.5,,,, +US-WI-54848,US,WI,54848,5.5,,,, +US-WI-54849,US,WI,54849,5.5,,,, +US-WI-54850,US,WI,54850,5.5,,,, +US-WI-54853,US,WI,54853,5.5,,,, +US-WI-54854,US,WI,54854,5.5,,,, +US-WI-54855,US,WI,54855,5.5,,,, +US-WI-54856,US,WI,54856,5.5,,,, +US-WI-54857,US,WI,54857,5.5,,,, +US-WI-54858,US,WI,54858,5.5,,,, +US-WI-54859,US,WI,54859,5.5,,,, +US-WI-54861,US,WI,54861,5.5,,,, +US-WI-54862,US,WI,54862,5.5,,,, +US-WI-54864,US,WI,54864,5.5,,,, +US-WI-54865,US,WI,54865,5.5,,,, +US-WI-54867,US,WI,54867,5.5,,,, +US-WI-54868,US,WI,54868,5.5,,,, +US-WI-54870,US,WI,54870,5.5,,,, +US-WI-54871,US,WI,54871,5.5,,,, +US-WI-54872,US,WI,54872,5.5,,,, +US-WI-54873,US,WI,54873,5.5,,,, +US-WI-54874,US,WI,54874,5.5,,,, +US-WI-54875,US,WI,54875,5.5,,,, +US-WI-54876,US,WI,54876,5.5,,,, +US-WI-54880,US,WI,54880,5.5,,,, +US-WI-54888,US,WI,54888,5.5,,,, +US-WI-54889,US,WI,54889,5.5,,,, +US-WI-54890,US,WI,54890,5.5,,,, +US-WI-54891,US,WI,54891,5.5,,,, +US-WI-54893,US,WI,54893,5.5,,,, +US-WI-54895,US,WI,54895,5.5,,,, +US-WI-54896,US,WI,54896,5.5,,,, +US-WI-54901,US,WI,54901,5,,,, +US-WI-54902,US,WI,54902,5,,,, +US-WI-54903,US,WI,54903,5,,,, +US-WI-54904,US,WI,54904,5,,,, +US-WI-54906,US,WI,54906,5,,,, +US-WI-54909,US,WI,54909,5.5,,,, +US-WI-54911,US,WI,54911,5,,,, +US-WI-54912,US,WI,54912,5,,,, +US-WI-54913,US,WI,54913,5,,,, +US-WI-54914,US,WI,54914,5,,,, +US-WI-54915,US,WI,54915,5,,,, +US-WI-54919,US,WI,54919,5,,,, +US-WI-54921,US,WI,54921,5.5,,,, +US-WI-54922,US,WI,54922,5,,,, +US-WI-54923,US,WI,54923,5.5,,,, +US-WI-54926,US,WI,54926,5.5,,,, +US-WI-54927,US,WI,54927,5,,,, +US-WI-54928,US,WI,54928,5.5,,,, +US-WI-54929,US,WI,54929,5.5,,,, +US-WI-54930,US,WI,54930,5.5,,,, +US-WI-54931,US,WI,54931,5,,,, +US-WI-54932,US,WI,54932,5.5,,,, +US-WI-54933,US,WI,54933,5.5,,,, +US-WI-54934,US,WI,54934,5,,,, +US-WI-54935,US,WI,54935,5.5,,,, +US-WI-54936,US,WI,54936,5.5,,,, +US-WI-54937,US,WI,54937,5.5,,,, +US-WI-54940,US,WI,54940,5.5,,,, +US-WI-54941,US,WI,54941,5.5,,,, +US-WI-54942,US,WI,54942,5,,,, +US-WI-54943,US,WI,54943,5.5,,,, +US-WI-54944,US,WI,54944,5,,,, +US-WI-54945,US,WI,54945,5.5,,,, +US-WI-54946,US,WI,54946,5.5,,,, +US-WI-54947,US,WI,54947,5,,,, +US-WI-54948,US,WI,54948,5.5,,,, +US-WI-54949,US,WI,54949,5.5,,,, +US-WI-54950,US,WI,54950,5.5,,,, +US-WI-54952,US,WI,54952,5,,,, +US-WI-54956,US,WI,54956,5,,,, +US-WI-54957,US,WI,54957,5,,,, +US-WI-54960,US,WI,54960,5.5,,,, +US-WI-54961,US,WI,54961,5.5,,,, +US-WI-54962,US,WI,54962,5.5,,,, +US-WI-54963,US,WI,54963,5,,,, +US-WI-54964,US,WI,54964,5,,,, +US-WI-54965,US,WI,54965,5.5,,,, +US-WI-54966,US,WI,54966,5.5,,,, +US-WI-54967,US,WI,54967,5.5,,,, +US-WI-54968,US,WI,54968,5.5,,,, +US-WI-54969,US,WI,54969,5.5,,,, +US-WI-54970,US,WI,54970,5.5,,,, +US-WI-54971,US,WI,54971,5.5,,,, +US-WI-54974,US,WI,54974,5.5,,,, +US-WI-54976,US,WI,54976,5.5,,,, +US-WI-54977,US,WI,54977,5.5,,,, +US-WI-54978,US,WI,54978,5.5,,,, +US-WI-54979,US,WI,54979,5.5,,,, +US-WI-54980,US,WI,54980,5,,,, +US-WI-54981,US,WI,54981,5.5,,,, +US-WI-54982,US,WI,54982,5.5,,,, +US-WI-54983,US,WI,54983,5.5,,,, +US-WI-54984,US,WI,54984,5.5,,,, +US-WI-54985,US,WI,54985,5,,,, +US-WI-54986,US,WI,54986,5,,,, +US-WI-54990,US,WI,54990,5.5,,,, +US-WV-24701,US,WV,24701,6,,,, +US-WV-24712,US,WV,24712,6,,,, +US-WV-24714,US,WV,24714,6,,,, +US-WV-24715,US,WV,24715,6,,,, +US-WV-24716,US,WV,24716,6,,,, +US-WV-24719,US,WV,24719,6,,,, +US-WV-24724,US,WV,24724,6,,,, +US-WV-24726,US,WV,24726,6,,,, +US-WV-24729,US,WV,24729,6,,,, +US-WV-24731,US,WV,24731,6,,,, +US-WV-24732,US,WV,24732,6,,,, +US-WV-24733,US,WV,24733,6,,,, +US-WV-24736,US,WV,24736,6,,,, +US-WV-24737,US,WV,24737,6,,,, +US-WV-24738,US,WV,24738,6,,,, +US-WV-24739,US,WV,24739,6,,,, +US-WV-24740,US,WV,24740,6,,,, +US-WV-24747,US,WV,24747,6,,,, +US-WV-24751,US,WV,24751,6,,,, +US-WV-24801,US,WV,24801,6,,,, +US-WV-24808,US,WV,24808,6,,,, +US-WV-24811,US,WV,24811,6,,,, +US-WV-24813,US,WV,24813,6,,,, +US-WV-24815,US,WV,24815,6,,,, +US-WV-24816,US,WV,24816,6,,,, +US-WV-24817,US,WV,24817,6,,,, +US-WV-24818,US,WV,24818,6,,,, +US-WV-24822,US,WV,24822,6,,,, +US-WV-24823,US,WV,24823,6,,,, +US-WV-24826,US,WV,24826,6,,,, +US-WV-24827,US,WV,24827,6,,,, +US-WV-24828,US,WV,24828,6,,,, +US-WV-24829,US,WV,24829,6,,,, +US-WV-24830,US,WV,24830,6,,,, +US-WV-24831,US,WV,24831,6,,,, +US-WV-24834,US,WV,24834,6,,,, +US-WV-24836,US,WV,24836,6,,,, +US-WV-24839,US,WV,24839,6,,,, +US-WV-24843,US,WV,24843,6,,,, +US-WV-24844,US,WV,24844,6,,,, +US-WV-24845,US,WV,24845,6,,,, +US-WV-24846,US,WV,24846,6,,,, +US-WV-24847,US,WV,24847,6,,,, +US-WV-24848,US,WV,24848,6,,,, +US-WV-24849,US,WV,24849,6,,,, +US-WV-24850,US,WV,24850,6,,,, +US-WV-24851,US,WV,24851,6,,,, +US-WV-24853,US,WV,24853,6,,,, +US-WV-24854,US,WV,24854,6,,,, +US-WV-24855,US,WV,24855,6,,,, +US-WV-24857,US,WV,24857,6,,,, +US-WV-24859,US,WV,24859,6,,,, +US-WV-24860,US,WV,24860,6,,,, +US-WV-24861,US,WV,24861,6,,,, +US-WV-24862,US,WV,24862,6,,,, +US-WV-24866,US,WV,24866,6,,,, +US-WV-24867,US,WV,24867,6,,,, +US-WV-24868,US,WV,24868,6,,,, +US-WV-24869,US,WV,24869,6,,,, +US-WV-24870,US,WV,24870,6,,,, +US-WV-24871,US,WV,24871,6,,,, +US-WV-24872,US,WV,24872,6,,,, +US-WV-24873,US,WV,24873,6,,,, +US-WV-24874,US,WV,24874,6,,,, +US-WV-24878,US,WV,24878,6,,,, +US-WV-24879,US,WV,24879,6,,,, +US-WV-24880,US,WV,24880,6,,,, +US-WV-24881,US,WV,24881,6,,,, +US-WV-24882,US,WV,24882,6,,,, +US-WV-24884,US,WV,24884,6,,,, +US-WV-24887,US,WV,24887,6,,,, +US-WV-24888,US,WV,24888,6,,,, +US-WV-24892,US,WV,24892,6,,,, +US-WV-24894,US,WV,24894,6,,,, +US-WV-24895,US,WV,24895,6,,,, +US-WV-24898,US,WV,24898,6,,,, +US-WV-24901,US,WV,24901,6,,,, +US-WV-24902,US,WV,24902,6,,,, +US-WV-24910,US,WV,24910,6,,,, +US-WV-24915,US,WV,24915,6,,,, +US-WV-24916,US,WV,24916,6,,,, +US-WV-24918,US,WV,24918,6,,,, +US-WV-24920,US,WV,24920,6,,,, +US-WV-24924,US,WV,24924,6,,,, +US-WV-24925,US,WV,24925,6,,,, +US-WV-24927,US,WV,24927,6,,,, +US-WV-24931,US,WV,24931,6,,,, +US-WV-24934,US,WV,24934,6,,,, +US-WV-24935,US,WV,24935,6,,,, +US-WV-24938,US,WV,24938,6,,,, +US-WV-24941,US,WV,24941,6,,,, +US-WV-24943,US,WV,24943,6,,,, +US-WV-24944,US,WV,24944,6,,,, +US-WV-24945,US,WV,24945,6,,,, +US-WV-24946,US,WV,24946,6,,,, +US-WV-24951,US,WV,24951,6,,,, +US-WV-24954,US,WV,24954,6,,,, +US-WV-24957,US,WV,24957,6,,,, +US-WV-24962,US,WV,24962,6,,,, +US-WV-24963,US,WV,24963,6,,,, +US-WV-24966,US,WV,24966,6,,,, +US-WV-24970,US,WV,24970,6,,,, +US-WV-24974,US,WV,24974,6,,,, +US-WV-24976,US,WV,24976,6,,,, +US-WV-24977,US,WV,24977,6,,,, +US-WV-24981,US,WV,24981,6,,,, +US-WV-24983,US,WV,24983,6,,,, +US-WV-24984,US,WV,24984,6,,,, +US-WV-24985,US,WV,24985,6,,,, +US-WV-24986,US,WV,24986,6,,,, +US-WV-24991,US,WV,24991,6,,,, +US-WV-24993,US,WV,24993,6,,,, +US-WV-25002,US,WV,25002,6,,,, +US-WV-25003,US,WV,25003,6,,,, +US-WV-25005,US,WV,25005,6,,,, +US-WV-25007,US,WV,25007,6,,,, +US-WV-25008,US,WV,25008,6,,,, +US-WV-25009,US,WV,25009,6,,,, +US-WV-25011,US,WV,25011,6,,,, +US-WV-25015,US,WV,25015,6,,,, +US-WV-25019,US,WV,25019,6,,,, +US-WV-25021,US,WV,25021,6,,,, +US-WV-25022,US,WV,25022,6,,,, +US-WV-25024,US,WV,25024,6,,,, +US-WV-25025,US,WV,25025,6,,,, +US-WV-25026,US,WV,25026,6,,,, +US-WV-25028,US,WV,25028,6,,,, +US-WV-25030,US,WV,25030,6,,,, +US-WV-25031,US,WV,25031,6,,,, +US-WV-25033,US,WV,25033,6,,,, +US-WV-25035,US,WV,25035,6,,,, +US-WV-25036,US,WV,25036,6,,,, +US-WV-25039,US,WV,25039,6,,,, +US-WV-25040,US,WV,25040,6,,,, +US-WV-25043,US,WV,25043,6,,,, +US-WV-25044,US,WV,25044,6,,,, +US-WV-25045,US,WV,25045,6,,,, +US-WV-25047,US,WV,25047,6,,,, +US-WV-25048,US,WV,25048,6,,,, +US-WV-25049,US,WV,25049,6,,,, +US-WV-25051,US,WV,25051,6,,,, +US-WV-25053,US,WV,25053,6,,,, +US-WV-25054,US,WV,25054,6,,,, +US-WV-25057,US,WV,25057,6,,,, +US-WV-25059,US,WV,25059,6,,,, +US-WV-25060,US,WV,25060,6,,,, +US-WV-25061,US,WV,25061,6,,,, +US-WV-25062,US,WV,25062,6,,,, +US-WV-25063,US,WV,25063,6,,,, +US-WV-25064,US,WV,25064,6,,,, +US-WV-25067,US,WV,25067,6,,,, +US-WV-25070,US,WV,25070,6,,,, +US-WV-25071,US,WV,25071,6,,,, +US-WV-25075,US,WV,25075,6,,,, +US-WV-25076,US,WV,25076,6,,,, +US-WV-25079,US,WV,25079,6,,,, +US-WV-25081,US,WV,25081,6,,,, +US-WV-25082,US,WV,25082,6,,,, +US-WV-25083,US,WV,25083,6,,,, +US-WV-25085,US,WV,25085,6,,,, +US-WV-25086,US,WV,25086,6,,,, +US-WV-25088,US,WV,25088,6,,,, +US-WV-25090,US,WV,25090,6,,,, +US-WV-25093,US,WV,25093,6,,,, +US-WV-25102,US,WV,25102,6,,,, +US-WV-25103,US,WV,25103,6,,,, +US-WV-25106,US,WV,25106,6,,,, +US-WV-25107,US,WV,25107,6,,,, +US-WV-25108,US,WV,25108,6,,,, +US-WV-25109,US,WV,25109,6,,,, +US-WV-25110,US,WV,25110,6,,,, +US-WV-25111,US,WV,25111,6,,,, +US-WV-25112,US,WV,25112,6,,,, +US-WV-25113,US,WV,25113,6,,,, +US-WV-25114,US,WV,25114,6,,,, +US-WV-25115,US,WV,25115,6,,,, +US-WV-25118,US,WV,25118,6,,,, +US-WV-25119,US,WV,25119,6,,,, +US-WV-25121,US,WV,25121,6,,,, +US-WV-25123,US,WV,25123,6,,,, +US-WV-25124,US,WV,25124,6,,,, +US-WV-25125,US,WV,25125,6,,,, +US-WV-25126,US,WV,25126,6,,,, +US-WV-25130,US,WV,25130,6,,,, +US-WV-25132,US,WV,25132,6,,,, +US-WV-25133,US,WV,25133,6,,,, +US-WV-25134,US,WV,25134,6,,,, +US-WV-25136,US,WV,25136,6,,,, +US-WV-25139,US,WV,25139,6,,,, +US-WV-25140,US,WV,25140,6,,,, +US-WV-25141,US,WV,25141,6,,,, +US-WV-25142,US,WV,25142,6,,,, +US-WV-25143,US,WV,25143,6,,,, +US-WV-25148,US,WV,25148,6,,,, +US-WV-25149,US,WV,25149,6,,,, +US-WV-25152,US,WV,25152,6,,,, +US-WV-25154,US,WV,25154,6,,,, +US-WV-25156,US,WV,25156,6,,,, +US-WV-25159,US,WV,25159,6,,,, +US-WV-25160,US,WV,25160,6,,,, +US-WV-25161,US,WV,25161,6,,,, +US-WV-25162,US,WV,25162,6,,,, +US-WV-25164,US,WV,25164,6,,,, +US-WV-25165,US,WV,25165,6,,,, +US-WV-25168,US,WV,25168,6,,,, +US-WV-25169,US,WV,25169,6,,,, +US-WV-25173,US,WV,25173,6,,,, +US-WV-25174,US,WV,25174,6,,,, +US-WV-25177,US,WV,25177,6,,,, +US-WV-25180,US,WV,25180,6,,,, +US-WV-25181,US,WV,25181,6,,,, +US-WV-25183,US,WV,25183,6,,,, +US-WV-25185,US,WV,25185,6,,,, +US-WV-25186,US,WV,25186,6,,,, +US-WV-25187,US,WV,25187,6,,,, +US-WV-25193,US,WV,25193,6,,,, +US-WV-25201,US,WV,25201,6,,,, +US-WV-25202,US,WV,25202,6,,,, +US-WV-25203,US,WV,25203,6,,,, +US-WV-25204,US,WV,25204,6,,,, +US-WV-25205,US,WV,25205,6,,,, +US-WV-25206,US,WV,25206,6,,,, +US-WV-25208,US,WV,25208,6,,,, +US-WV-25209,US,WV,25209,6,,,, +US-WV-25211,US,WV,25211,6,,,, +US-WV-25213,US,WV,25213,6,,,, +US-WV-25214,US,WV,25214,6,,,, +US-WV-25231,US,WV,25231,6,,,, +US-WV-25234,US,WV,25234,6,,,, +US-WV-25235,US,WV,25235,6,,,, +US-WV-25239,US,WV,25239,6,,,, +US-WV-25241,US,WV,25241,6,,,, +US-WV-25243,US,WV,25243,6,,,, +US-WV-25244,US,WV,25244,6,,,, +US-WV-25245,US,WV,25245,6,,,, +US-WV-25247,US,WV,25247,6,,,, +US-WV-25248,US,WV,25248,6,,,, +US-WV-25251,US,WV,25251,6,,,, +US-WV-25252,US,WV,25252,6,,,, +US-WV-25253,US,WV,25253,6,,,, +US-WV-25259,US,WV,25259,6,,,, +US-WV-25260,US,WV,25260,6,,,, +US-WV-25261,US,WV,25261,6,,,, +US-WV-25262,US,WV,25262,6,,,, +US-WV-25264,US,WV,25264,6,,,, +US-WV-25265,US,WV,25265,6,,,, +US-WV-25266,US,WV,25266,6,,,, +US-WV-25267,US,WV,25267,6,,,, +US-WV-25268,US,WV,25268,6,,,, +US-WV-25270,US,WV,25270,6,,,, +US-WV-25271,US,WV,25271,6,,,, +US-WV-25275,US,WV,25275,6,,,, +US-WV-25276,US,WV,25276,6,,,, +US-WV-25285,US,WV,25285,6,,,, +US-WV-25286,US,WV,25286,6,,,, +US-WV-25287,US,WV,25287,6,,,, +US-WV-25301,US,WV,25301,6.5,,,, +US-WV-25302,US,WV,25302,6.5,,,, +US-WV-25303,US,WV,25303,6,,,, +US-WV-25304,US,WV,25304,6.5,,,, +US-WV-25305,US,WV,25305,6.5,,,, +US-WV-25306,US,WV,25306,6,,,, +US-WV-25309,US,WV,25309,6,,,, +US-WV-25311,US,WV,25311,6.5,,,, +US-WV-25312,US,WV,25312,6,,,, +US-WV-25313,US,WV,25313,6,,,, +US-WV-25314,US,WV,25314,6.5,,,, +US-WV-25315,US,WV,25315,6,,,, +US-WV-25317,US,WV,25317,6.5,,,, +US-WV-25320,US,WV,25320,6,,,, +US-WV-25321,US,WV,25321,6.5,,,, +US-WV-25322,US,WV,25322,6.5,,,, +US-WV-25323,US,WV,25323,6.5,,,, +US-WV-25324,US,WV,25324,6.5,,,, +US-WV-25325,US,WV,25325,6.5,,,, +US-WV-25326,US,WV,25326,6.5,,,, +US-WV-25327,US,WV,25327,6.5,,,, +US-WV-25328,US,WV,25328,6.5,,,, +US-WV-25329,US,WV,25329,6.5,,,, +US-WV-25330,US,WV,25330,6.5,,,, +US-WV-25331,US,WV,25331,6.5,,,, +US-WV-25332,US,WV,25332,6.5,,,, +US-WV-25333,US,WV,25333,6.5,,,, +US-WV-25334,US,WV,25334,6.5,,,, +US-WV-25335,US,WV,25335,6.5,,,, +US-WV-25336,US,WV,25336,6.5,,,, +US-WV-25337,US,WV,25337,6.5,,,, +US-WV-25338,US,WV,25338,6.5,,,, +US-WV-25339,US,WV,25339,6.5,,,, +US-WV-25350,US,WV,25350,6.5,,,, +US-WV-25356,US,WV,25356,6,,,, +US-WV-25357,US,WV,25357,6.5,,,, +US-WV-25358,US,WV,25358,6.5,,,, +US-WV-25360,US,WV,25360,6,,,, +US-WV-25361,US,WV,25361,6.5,,,, +US-WV-25362,US,WV,25362,6.5,,,, +US-WV-25364,US,WV,25364,6.5,,,, +US-WV-25365,US,WV,25365,6,,,, +US-WV-25375,US,WV,25375,6.5,,,, +US-WV-25387,US,WV,25387,6.5,,,, +US-WV-25389,US,WV,25389,6.5,,,, +US-WV-25392,US,WV,25392,6.5,,,, +US-WV-25396,US,WV,25396,6.5,,,, +US-WV-25401,US,WV,25401,6,,,, +US-WV-25402,US,WV,25402,6,,,, +US-WV-25403,US,WV,25403,6,,,, +US-WV-25404,US,WV,25404,6,,,, +US-WV-25405,US,WV,25405,6,,,, +US-WV-25410,US,WV,25410,6,,,, +US-WV-25411,US,WV,25411,6,,,, +US-WV-25413,US,WV,25413,6,,,, +US-WV-25414,US,WV,25414,6,,,, +US-WV-25419,US,WV,25419,6,,,, +US-WV-25420,US,WV,25420,6,,,, +US-WV-25421,US,WV,25421,6,,,, +US-WV-25422,US,WV,25422,6,,,, +US-WV-25423,US,WV,25423,6,,,, +US-WV-25425,US,WV,25425,6,,,, +US-WV-25427,US,WV,25427,6,,,, +US-WV-25428,US,WV,25428,6,,,, +US-WV-25430,US,WV,25430,6,,,, +US-WV-25431,US,WV,25431,6,,,, +US-WV-25432,US,WV,25432,6,,,, +US-WV-25434,US,WV,25434,6,,,, +US-WV-25437,US,WV,25437,6,,,, +US-WV-25438,US,WV,25438,6,,,, +US-WV-25440,US,WV,25440,6,,,, +US-WV-25441,US,WV,25441,6,,,, +US-WV-25442,US,WV,25442,6,,,, +US-WV-25443,US,WV,25443,6,,,, +US-WV-25444,US,WV,25444,6,,,, +US-WV-25446,US,WV,25446,6,,,, +US-WV-25501,US,WV,25501,6,,,, +US-WV-25502,US,WV,25502,6,,,, +US-WV-25503,US,WV,25503,6,,,, +US-WV-25504,US,WV,25504,6,,,, +US-WV-25505,US,WV,25505,6,,,, +US-WV-25506,US,WV,25506,6,,,, +US-WV-25507,US,WV,25507,6,,,, +US-WV-25508,US,WV,25508,6,,,, +US-WV-25510,US,WV,25510,6,,,, +US-WV-25511,US,WV,25511,6,,,, +US-WV-25512,US,WV,25512,6,,,, +US-WV-25514,US,WV,25514,6,,,, +US-WV-25515,US,WV,25515,6,,,, +US-WV-25517,US,WV,25517,6,,,, +US-WV-25520,US,WV,25520,6,,,, +US-WV-25521,US,WV,25521,6,,,, +US-WV-25523,US,WV,25523,6,,,, +US-WV-25524,US,WV,25524,6,,,, +US-WV-25526,US,WV,25526,6,,,, +US-WV-25529,US,WV,25529,6,,,, +US-WV-25530,US,WV,25530,6,,,, +US-WV-25534,US,WV,25534,6,,,, +US-WV-25535,US,WV,25535,6,,,, +US-WV-25537,US,WV,25537,6,,,, +US-WV-25540,US,WV,25540,6,,,, +US-WV-25541,US,WV,25541,6,,,, +US-WV-25544,US,WV,25544,6,,,, +US-WV-25545,US,WV,25545,6,,,, +US-WV-25547,US,WV,25547,6,,,, +US-WV-25550,US,WV,25550,6,,,, +US-WV-25555,US,WV,25555,6,,,, +US-WV-25557,US,WV,25557,6,,,, +US-WV-25559,US,WV,25559,6,,,, +US-WV-25560,US,WV,25560,6,,,, +US-WV-25562,US,WV,25562,6,,,, +US-WV-25564,US,WV,25564,6,,,, +US-WV-25565,US,WV,25565,6,,,, +US-WV-25567,US,WV,25567,6,,,, +US-WV-25569,US,WV,25569,6,,,, +US-WV-25570,US,WV,25570,6,,,, +US-WV-25571,US,WV,25571,6,,,, +US-WV-25572,US,WV,25572,6,,,, +US-WV-25573,US,WV,25573,6,,,, +US-WV-25601,US,WV,25601,6,,,, +US-WV-25606,US,WV,25606,6,,,, +US-WV-25607,US,WV,25607,6,,,, +US-WV-25608,US,WV,25608,6,,,, +US-WV-25611,US,WV,25611,6,,,, +US-WV-25612,US,WV,25612,6,,,, +US-WV-25614,US,WV,25614,6,,,, +US-WV-25617,US,WV,25617,6,,,, +US-WV-25621,US,WV,25621,6,,,, +US-WV-25624,US,WV,25624,6,,,, +US-WV-25625,US,WV,25625,6,,,, +US-WV-25628,US,WV,25628,6,,,, +US-WV-25630,US,WV,25630,6,,,, +US-WV-25632,US,WV,25632,6,,,, +US-WV-25634,US,WV,25634,6,,,, +US-WV-25635,US,WV,25635,6,,,, +US-WV-25637,US,WV,25637,6,,,, +US-WV-25638,US,WV,25638,6,,,, +US-WV-25639,US,WV,25639,6,,,, +US-WV-25644,US,WV,25644,6,,,, +US-WV-25646,US,WV,25646,6,,,, +US-WV-25647,US,WV,25647,6,,,, +US-WV-25649,US,WV,25649,6,,,, +US-WV-25650,US,WV,25650,6,,,, +US-WV-25651,US,WV,25651,6,,,, +US-WV-25652,US,WV,25652,6,,,, +US-WV-25653,US,WV,25653,6,,,, +US-WV-25654,US,WV,25654,6,,,, +US-WV-25661,US,WV,25661,6,,,, +US-WV-25665,US,WV,25665,6,,,, +US-WV-25666,US,WV,25666,6,,,, +US-WV-25667,US,WV,25667,6,,,, +US-WV-25669,US,WV,25669,6,,,, +US-WV-25670,US,WV,25670,6,,,, +US-WV-25671,US,WV,25671,6,,,, +US-WV-25672,US,WV,25672,6,,,, +US-WV-25674,US,WV,25674,6,,,, +US-WV-25676,US,WV,25676,6,,,, +US-WV-25678,US,WV,25678,6,,,, +US-WV-25685,US,WV,25685,6,,,, +US-WV-25686,US,WV,25686,6,,,, +US-WV-25688,US,WV,25688,6,,,, +US-WV-25690,US,WV,25690,6,,,, +US-WV-25691,US,WV,25691,6,,,, +US-WV-25692,US,WV,25692,6,,,, +US-WV-25696,US,WV,25696,6,,,, +US-WV-25699,US,WV,25699,6,,,, +US-WV-25701,US,WV,25701,7,,,, +US-WV-25702,US,WV,25702,7,,,, +US-WV-25703,US,WV,25703,7,,,, +US-WV-25704,US,WV,25704,7,,,, +US-WV-25705,US,WV,25705,6,,,, +US-WV-25706,US,WV,25706,7,,,, +US-WV-25707,US,WV,25707,7,,,, +US-WV-25708,US,WV,25708,7,,,, +US-WV-25709,US,WV,25709,7,,,, +US-WV-25710,US,WV,25710,7,,,, +US-WV-25711,US,WV,25711,7,,,, +US-WV-25712,US,WV,25712,7,,,, +US-WV-25713,US,WV,25713,7,,,, +US-WV-25714,US,WV,25714,7,,,, +US-WV-25715,US,WV,25715,7,,,, +US-WV-25716,US,WV,25716,7,,,, +US-WV-25717,US,WV,25717,7,,,, +US-WV-25718,US,WV,25718,7,,,, +US-WV-25719,US,WV,25719,7,,,, +US-WV-25720,US,WV,25720,7,,,, +US-WV-25721,US,WV,25721,7,,,, +US-WV-25722,US,WV,25722,7,,,, +US-WV-25723,US,WV,25723,7,,,, +US-WV-25724,US,WV,25724,7,,,, +US-WV-25725,US,WV,25725,7,,,, +US-WV-25726,US,WV,25726,7,,,, +US-WV-25727,US,WV,25727,7,,,, +US-WV-25728,US,WV,25728,7,,,, +US-WV-25729,US,WV,25729,7,,,, +US-WV-25755,US,WV,25755,7,,,, +US-WV-25770,US,WV,25770,7,,,, +US-WV-25771,US,WV,25771,7,,,, +US-WV-25772,US,WV,25772,7,,,, +US-WV-25773,US,WV,25773,7,,,, +US-WV-25774,US,WV,25774,7,,,, +US-WV-25775,US,WV,25775,7,,,, +US-WV-25776,US,WV,25776,7,,,, +US-WV-25777,US,WV,25777,7,,,, +US-WV-25778,US,WV,25778,7,,,, +US-WV-25779,US,WV,25779,7,,,, +US-WV-25801,US,WV,25801,6,,,, +US-WV-25802,US,WV,25802,6,,,, +US-WV-25810,US,WV,25810,6,,,, +US-WV-25811,US,WV,25811,6,,,, +US-WV-25812,US,WV,25812,6,,,, +US-WV-25813,US,WV,25813,6,,,, +US-WV-25817,US,WV,25817,6,,,, +US-WV-25818,US,WV,25818,6,,,, +US-WV-25820,US,WV,25820,6,,,, +US-WV-25823,US,WV,25823,6,,,, +US-WV-25825,US,WV,25825,6,,,, +US-WV-25826,US,WV,25826,6,,,, +US-WV-25827,US,WV,25827,6,,,, +US-WV-25831,US,WV,25831,6,,,, +US-WV-25832,US,WV,25832,6,,,, +US-WV-25833,US,WV,25833,6,,,, +US-WV-25836,US,WV,25836,6,,,, +US-WV-25837,US,WV,25837,6,,,, +US-WV-25839,US,WV,25839,6,,,, +US-WV-25840,US,WV,25840,6,,,, +US-WV-25841,US,WV,25841,6,,,, +US-WV-25843,US,WV,25843,6,,,, +US-WV-25844,US,WV,25844,6,,,, +US-WV-25845,US,WV,25845,6,,,, +US-WV-25846,US,WV,25846,6,,,, +US-WV-25848,US,WV,25848,6,,,, +US-WV-25849,US,WV,25849,6,,,, +US-WV-25851,US,WV,25851,6,,,, +US-WV-25853,US,WV,25853,6,,,, +US-WV-25854,US,WV,25854,6,,,, +US-WV-25855,US,WV,25855,6,,,, +US-WV-25857,US,WV,25857,6,,,, +US-WV-25860,US,WV,25860,6,,,, +US-WV-25862,US,WV,25862,6,,,, +US-WV-25864,US,WV,25864,6,,,, +US-WV-25865,US,WV,25865,6,,,, +US-WV-25866,US,WV,25866,6,,,, +US-WV-25868,US,WV,25868,6,,,, +US-WV-25870,US,WV,25870,6,,,, +US-WV-25871,US,WV,25871,6,,,, +US-WV-25873,US,WV,25873,6,,,, +US-WV-25875,US,WV,25875,6,,,, +US-WV-25876,US,WV,25876,6,,,, +US-WV-25878,US,WV,25878,6,,,, +US-WV-25879,US,WV,25879,6,,,, +US-WV-25880,US,WV,25880,6,,,, +US-WV-25882,US,WV,25882,6,,,, +US-WV-25888,US,WV,25888,6,,,, +US-WV-25901,US,WV,25901,6,,,, +US-WV-25902,US,WV,25902,6,,,, +US-WV-25904,US,WV,25904,6,,,, +US-WV-25906,US,WV,25906,6,,,, +US-WV-25907,US,WV,25907,6,,,, +US-WV-25908,US,WV,25908,6,,,, +US-WV-25909,US,WV,25909,6,,,, +US-WV-25911,US,WV,25911,6,,,, +US-WV-25913,US,WV,25913,6,,,, +US-WV-25915,US,WV,25915,6,,,, +US-WV-25916,US,WV,25916,6,,,, +US-WV-25917,US,WV,25917,6,,,, +US-WV-25918,US,WV,25918,6,,,, +US-WV-25919,US,WV,25919,6,,,, +US-WV-25920,US,WV,25920,6,,,, +US-WV-25921,US,WV,25921,6,,,, +US-WV-25922,US,WV,25922,6,,,, +US-WV-25927,US,WV,25927,6,,,, +US-WV-25928,US,WV,25928,6,,,, +US-WV-25932,US,WV,25932,6,,,, +US-WV-25936,US,WV,25936,6,,,, +US-WV-25938,US,WV,25938,6,,,, +US-WV-25942,US,WV,25942,6,,,, +US-WV-25943,US,WV,25943,6,,,, +US-WV-25951,US,WV,25951,6,,,, +US-WV-25958,US,WV,25958,6,,,, +US-WV-25962,US,WV,25962,6,,,, +US-WV-25966,US,WV,25966,6,,,, +US-WV-25969,US,WV,25969,6,,,, +US-WV-25971,US,WV,25971,6,,,, +US-WV-25972,US,WV,25972,6,,,, +US-WV-25976,US,WV,25976,6,,,, +US-WV-25977,US,WV,25977,6,,,, +US-WV-25978,US,WV,25978,6,,,, +US-WV-25979,US,WV,25979,6,,,, +US-WV-25981,US,WV,25981,6,,,, +US-WV-25984,US,WV,25984,7,,,, +US-WV-25985,US,WV,25985,6,,,, +US-WV-25986,US,WV,25986,6,,,, +US-WV-25989,US,WV,25989,6,,,, +US-WV-26003,US,WV,26003,6.5,,,, +US-WV-26030,US,WV,26030,6,,,, +US-WV-26031,US,WV,26031,6,,,, +US-WV-26032,US,WV,26032,6,,,, +US-WV-26033,US,WV,26033,6,,,, +US-WV-26034,US,WV,26034,6,,,, +US-WV-26035,US,WV,26035,6,,,, +US-WV-26036,US,WV,26036,6,,,, +US-WV-26037,US,WV,26037,6,,,, +US-WV-26038,US,WV,26038,6,,,, +US-WV-26039,US,WV,26039,6,,,, +US-WV-26040,US,WV,26040,6,,,, +US-WV-26041,US,WV,26041,6,,,, +US-WV-26047,US,WV,26047,6,,,, +US-WV-26050,US,WV,26050,6,,,, +US-WV-26055,US,WV,26055,6,,,, +US-WV-26056,US,WV,26056,6,,,, +US-WV-26058,US,WV,26058,6,,,, +US-WV-26059,US,WV,26059,6,,,, +US-WV-26060,US,WV,26060,6,,,, +US-WV-26062,US,WV,26062,6,,,, +US-WV-26070,US,WV,26070,6,,,, +US-WV-26074,US,WV,26074,6,,,, +US-WV-26075,US,WV,26075,6,,,, +US-WV-26101,US,WV,26101,6,,,, +US-WV-26102,US,WV,26102,6,,,, +US-WV-26103,US,WV,26103,6,,,, +US-WV-26104,US,WV,26104,6,,,, +US-WV-26105,US,WV,26105,6,,,, +US-WV-26106,US,WV,26106,6,,,, +US-WV-26120,US,WV,26120,6,,,, +US-WV-26121,US,WV,26121,6,,,, +US-WV-26133,US,WV,26133,6,,,, +US-WV-26134,US,WV,26134,6,,,, +US-WV-26136,US,WV,26136,6,,,, +US-WV-26137,US,WV,26137,6,,,, +US-WV-26138,US,WV,26138,6,,,, +US-WV-26141,US,WV,26141,6,,,, +US-WV-26142,US,WV,26142,6,,,, +US-WV-26143,US,WV,26143,6,,,, +US-WV-26146,US,WV,26146,6,,,, +US-WV-26147,US,WV,26147,6,,,, +US-WV-26148,US,WV,26148,6,,,, +US-WV-26149,US,WV,26149,6,,,, +US-WV-26150,US,WV,26150,6,,,, +US-WV-26151,US,WV,26151,6,,,, +US-WV-26152,US,WV,26152,6,,,, +US-WV-26155,US,WV,26155,6,,,, +US-WV-26159,US,WV,26159,6,,,, +US-WV-26160,US,WV,26160,6,,,, +US-WV-26161,US,WV,26161,6,,,, +US-WV-26162,US,WV,26162,6,,,, +US-WV-26164,US,WV,26164,6,,,, +US-WV-26167,US,WV,26167,6,,,, +US-WV-26169,US,WV,26169,6,,,, +US-WV-26170,US,WV,26170,6,,,, +US-WV-26175,US,WV,26175,6,,,, +US-WV-26178,US,WV,26178,6,,,, +US-WV-26180,US,WV,26180,6,,,, +US-WV-26181,US,WV,26181,6,,,, +US-WV-26184,US,WV,26184,6,,,, +US-WV-26187,US,WV,26187,7,,,, +US-WV-26201,US,WV,26201,6,,,, +US-WV-26202,US,WV,26202,6,,,, +US-WV-26203,US,WV,26203,6,,,, +US-WV-26205,US,WV,26205,6,,,, +US-WV-26206,US,WV,26206,6,,,, +US-WV-26208,US,WV,26208,6,,,, +US-WV-26209,US,WV,26209,6,,,, +US-WV-26210,US,WV,26210,6,,,, +US-WV-26215,US,WV,26215,6,,,, +US-WV-26217,US,WV,26217,6,,,, +US-WV-26218,US,WV,26218,6,,,, +US-WV-26219,US,WV,26219,6,,,, +US-WV-26222,US,WV,26222,6,,,, +US-WV-26224,US,WV,26224,6,,,, +US-WV-26228,US,WV,26228,6,,,, +US-WV-26229,US,WV,26229,6,,,, +US-WV-26230,US,WV,26230,6,,,, +US-WV-26234,US,WV,26234,6,,,, +US-WV-26236,US,WV,26236,6,,,, +US-WV-26237,US,WV,26237,6,,,, +US-WV-26238,US,WV,26238,6,,,, +US-WV-26241,US,WV,26241,6,,,, +US-WV-26250,US,WV,26250,6,,,, +US-WV-26253,US,WV,26253,6,,,, +US-WV-26254,US,WV,26254,6,,,, +US-WV-26257,US,WV,26257,6,,,, +US-WV-26259,US,WV,26259,6,,,, +US-WV-26260,US,WV,26260,6,,,, +US-WV-26261,US,WV,26261,6,,,, +US-WV-26263,US,WV,26263,6,,,, +US-WV-26264,US,WV,26264,6,,,, +US-WV-26266,US,WV,26266,6,,,, +US-WV-26267,US,WV,26267,6,,,, +US-WV-26268,US,WV,26268,6,,,, +US-WV-26269,US,WV,26269,6,,,, +US-WV-26270,US,WV,26270,6,,,, +US-WV-26271,US,WV,26271,6,,,, +US-WV-26273,US,WV,26273,6,,,, +US-WV-26275,US,WV,26275,6,,,, +US-WV-26276,US,WV,26276,6,,,, +US-WV-26278,US,WV,26278,6,,,, +US-WV-26280,US,WV,26280,6,,,, +US-WV-26282,US,WV,26282,6,,,, +US-WV-26283,US,WV,26283,6,,,, +US-WV-26285,US,WV,26285,6,,,, +US-WV-26287,US,WV,26287,6,,,, +US-WV-26288,US,WV,26288,6,,,, +US-WV-26289,US,WV,26289,6,,,, +US-WV-26291,US,WV,26291,6,,,, +US-WV-26292,US,WV,26292,6,,,, +US-WV-26293,US,WV,26293,6,,,, +US-WV-26294,US,WV,26294,6,,,, +US-WV-26296,US,WV,26296,6,,,, +US-WV-26298,US,WV,26298,6,,,, +US-WV-26301,US,WV,26301,6,,,, +US-WV-26302,US,WV,26302,6,,,, +US-WV-26306,US,WV,26306,6,,,, +US-WV-26320,US,WV,26320,6,,,, +US-WV-26321,US,WV,26321,6,,,, +US-WV-26323,US,WV,26323,6,,,, +US-WV-26325,US,WV,26325,6,,,, +US-WV-26327,US,WV,26327,6,,,, +US-WV-26330,US,WV,26330,6,,,, +US-WV-26335,US,WV,26335,6,,,, +US-WV-26337,US,WV,26337,6,,,, +US-WV-26338,US,WV,26338,6,,,, +US-WV-26339,US,WV,26339,6,,,, +US-WV-26342,US,WV,26342,6,,,, +US-WV-26343,US,WV,26343,6,,,, +US-WV-26346,US,WV,26346,6,,,, +US-WV-26347,US,WV,26347,6,,,, +US-WV-26348,US,WV,26348,6,,,, +US-WV-26349,US,WV,26349,6,,,, +US-WV-26351,US,WV,26351,6,,,, +US-WV-26354,US,WV,26354,6,,,, +US-WV-26361,US,WV,26361,6,,,, +US-WV-26362,US,WV,26362,7,,,, +US-WV-26366,US,WV,26366,6,,,, +US-WV-26369,US,WV,26369,6,,,, +US-WV-26372,US,WV,26372,6,,,, +US-WV-26374,US,WV,26374,6,,,, +US-WV-26376,US,WV,26376,6,,,, +US-WV-26377,US,WV,26377,6,,,, +US-WV-26378,US,WV,26378,6,,,, +US-WV-26384,US,WV,26384,6,,,, +US-WV-26385,US,WV,26385,6,,,, +US-WV-26386,US,WV,26386,6,,,, +US-WV-26404,US,WV,26404,6,,,, +US-WV-26405,US,WV,26405,6,,,, +US-WV-26408,US,WV,26408,6,,,, +US-WV-26410,US,WV,26410,6,,,, +US-WV-26411,US,WV,26411,6,,,, +US-WV-26412,US,WV,26412,6,,,, +US-WV-26415,US,WV,26415,6,,,, +US-WV-26416,US,WV,26416,6,,,, +US-WV-26419,US,WV,26419,6,,,, +US-WV-26421,US,WV,26421,6,,,, +US-WV-26422,US,WV,26422,6,,,, +US-WV-26424,US,WV,26424,6,,,, +US-WV-26425,US,WV,26425,6,,,, +US-WV-26426,US,WV,26426,6,,,, +US-WV-26430,US,WV,26430,6,,,, +US-WV-26431,US,WV,26431,6,,,, +US-WV-26434,US,WV,26434,6,,,, +US-WV-26435,US,WV,26435,6,,,, +US-WV-26436,US,WV,26436,6,,,, +US-WV-26437,US,WV,26437,6,,,, +US-WV-26438,US,WV,26438,6,,,, +US-WV-26440,US,WV,26440,6,,,, +US-WV-26443,US,WV,26443,6,,,, +US-WV-26444,US,WV,26444,6,,,, +US-WV-26447,US,WV,26447,6,,,, +US-WV-26448,US,WV,26448,6,,,, +US-WV-26451,US,WV,26451,6,,,, +US-WV-26452,US,WV,26452,6,,,, +US-WV-26456,US,WV,26456,6,,,, +US-WV-26463,US,WV,26463,6,,,, +US-WV-26501,US,WV,26501,6,,,, +US-WV-26502,US,WV,26502,6,,,, +US-WV-26504,US,WV,26504,6,,,, +US-WV-26505,US,WV,26505,6,,,, +US-WV-26506,US,WV,26506,6,,,, +US-WV-26507,US,WV,26507,6,,,, +US-WV-26508,US,WV,26508,6,,,, +US-WV-26519,US,WV,26519,6,,,, +US-WV-26520,US,WV,26520,6,,,, +US-WV-26521,US,WV,26521,6,,,, +US-WV-26524,US,WV,26524,6,,,, +US-WV-26525,US,WV,26525,6,,,, +US-WV-26527,US,WV,26527,6,,,, +US-WV-26531,US,WV,26531,6,,,, +US-WV-26534,US,WV,26534,6,,,, +US-WV-26537,US,WV,26537,6,,,, +US-WV-26541,US,WV,26541,6,,,, +US-WV-26542,US,WV,26542,6,,,, +US-WV-26543,US,WV,26543,6,,,, +US-WV-26544,US,WV,26544,6,,,, +US-WV-26546,US,WV,26546,6,,,, +US-WV-26547,US,WV,26547,6,,,, +US-WV-26554,US,WV,26554,6,,,, +US-WV-26555,US,WV,26555,6,,,, +US-WV-26559,US,WV,26559,6,,,, +US-WV-26560,US,WV,26560,6,,,, +US-WV-26561,US,WV,26561,6,,,, +US-WV-26562,US,WV,26562,6,,,, +US-WV-26563,US,WV,26563,6,,,, +US-WV-26566,US,WV,26566,6,,,, +US-WV-26568,US,WV,26568,6,,,, +US-WV-26570,US,WV,26570,6,,,, +US-WV-26571,US,WV,26571,6,,,, +US-WV-26572,US,WV,26572,6,,,, +US-WV-26574,US,WV,26574,6,,,, +US-WV-26575,US,WV,26575,6,,,, +US-WV-26576,US,WV,26576,6,,,, +US-WV-26578,US,WV,26578,6,,,, +US-WV-26581,US,WV,26581,6,,,, +US-WV-26582,US,WV,26582,6,,,, +US-WV-26585,US,WV,26585,6,,,, +US-WV-26586,US,WV,26586,6,,,, +US-WV-26587,US,WV,26587,6,,,, +US-WV-26588,US,WV,26588,6,,,, +US-WV-26590,US,WV,26590,6,,,, +US-WV-26591,US,WV,26591,6,,,, +US-WV-26601,US,WV,26601,6,,,, +US-WV-26610,US,WV,26610,6,,,, +US-WV-26611,US,WV,26611,6,,,, +US-WV-26615,US,WV,26615,6,,,, +US-WV-26617,US,WV,26617,6,,,, +US-WV-26619,US,WV,26619,6,,,, +US-WV-26621,US,WV,26621,6,,,, +US-WV-26623,US,WV,26623,6,,,, +US-WV-26624,US,WV,26624,6,,,, +US-WV-26627,US,WV,26627,6,,,, +US-WV-26629,US,WV,26629,6,,,, +US-WV-26631,US,WV,26631,6,,,, +US-WV-26636,US,WV,26636,6,,,, +US-WV-26638,US,WV,26638,6,,,, +US-WV-26651,US,WV,26651,6,,,, +US-WV-26656,US,WV,26656,6,,,, +US-WV-26660,US,WV,26660,6,,,, +US-WV-26662,US,WV,26662,6,,,, +US-WV-26667,US,WV,26667,6,,,, +US-WV-26671,US,WV,26671,6,,,, +US-WV-26675,US,WV,26675,6,,,, +US-WV-26676,US,WV,26676,6,,,, +US-WV-26678,US,WV,26678,6,,,, +US-WV-26679,US,WV,26679,6,,,, +US-WV-26680,US,WV,26680,6,,,, +US-WV-26681,US,WV,26681,6,,,, +US-WV-26684,US,WV,26684,6,,,, +US-WV-26690,US,WV,26690,6,,,, +US-WV-26691,US,WV,26691,6,,,, +US-WV-26704,US,WV,26704,6,,,, +US-WV-26705,US,WV,26705,6,,,, +US-WV-26707,US,WV,26707,6,,,, +US-WV-26710,US,WV,26710,6,,,, +US-WV-26711,US,WV,26711,6,,,, +US-WV-26714,US,WV,26714,6,,,, +US-WV-26716,US,WV,26716,6,,,, +US-WV-26717,US,WV,26717,6,,,, +US-WV-26719,US,WV,26719,6,,,, +US-WV-26720,US,WV,26720,6,,,, +US-WV-26722,US,WV,26722,6,,,, +US-WV-26726,US,WV,26726,6,,,, +US-WV-26731,US,WV,26731,6,,,, +US-WV-26739,US,WV,26739,6,,,, +US-WV-26743,US,WV,26743,6,,,, +US-WV-26750,US,WV,26750,6,,,, +US-WV-26753,US,WV,26753,6,,,, +US-WV-26755,US,WV,26755,6,,,, +US-WV-26757,US,WV,26757,6,,,, +US-WV-26761,US,WV,26761,6,,,, +US-WV-26763,US,WV,26763,6,,,, +US-WV-26764,US,WV,26764,6,,,, +US-WV-26767,US,WV,26767,6,,,, +US-WV-26801,US,WV,26801,6,,,, +US-WV-26802,US,WV,26802,6,,,, +US-WV-26804,US,WV,26804,6,,,, +US-WV-26807,US,WV,26807,6,,,, +US-WV-26808,US,WV,26808,6,,,, +US-WV-26810,US,WV,26810,6,,,, +US-WV-26812,US,WV,26812,6,,,, +US-WV-26814,US,WV,26814,6,,,, +US-WV-26815,US,WV,26815,6,,,, +US-WV-26817,US,WV,26817,6,,,, +US-WV-26818,US,WV,26818,6,,,, +US-WV-26823,US,WV,26823,6,,,, +US-WV-26833,US,WV,26833,6,,,, +US-WV-26836,US,WV,26836,6,,,, +US-WV-26838,US,WV,26838,6,,,, +US-WV-26845,US,WV,26845,6,,,, +US-WV-26847,US,WV,26847,6,,,, +US-WV-26851,US,WV,26851,6,,,, +US-WV-26852,US,WV,26852,6,,,, +US-WV-26855,US,WV,26855,6,,,, +US-WV-26865,US,WV,26865,6,,,, +US-WV-26866,US,WV,26866,6,,,, +US-WV-26884,US,WV,26884,6,,,, +US-WV-26886,US,WV,26886,6,,,, +US-WY-82001,US,WY,82001,6,,,, +US-WY-82002,US,WY,82002,6,,,, +US-WY-82003,US,WY,82003,6,,,, +US-WY-82005,US,WY,82005,6,,,, +US-WY-82006,US,WY,82006,6,,,, +US-WY-82007,US,WY,82007,6,,,, +US-WY-82008,US,WY,82008,6,,,, +US-WY-82009,US,WY,82009,6,,,, +US-WY-82010,US,WY,82010,6,,,, +US-WY-82050,US,WY,82050,6,,,, +US-WY-82051,US,WY,82051,6,,,, +US-WY-82052,US,WY,82052,6,,,, +US-WY-82053,US,WY,82053,6,,,, +US-WY-82054,US,WY,82054,6,,,, +US-WY-82055,US,WY,82055,6,,,, +US-WY-82058,US,WY,82058,6,,,, +US-WY-82059,US,WY,82059,6,,,, +US-WY-82060,US,WY,82060,6,,,, +US-WY-82061,US,WY,82061,6,,,, +US-WY-82063,US,WY,82063,6,,,, +US-WY-82070,US,WY,82070,6,,,, +US-WY-82071,US,WY,82071,6,,,, +US-WY-82072,US,WY,82072,6,,,, +US-WY-82073,US,WY,82073,6,,,, +US-WY-82081,US,WY,82081,6,,,, +US-WY-82082,US,WY,82082,6,,,, +US-WY-82083,US,WY,82083,6,,,, +US-WY-82084,US,WY,82084,6,,,, +US-WY-82190,US,WY,82190,4,,,, +US-WY-82201,US,WY,82201,6,,,, +US-WY-82210,US,WY,82210,6,,,, +US-WY-82212,US,WY,82212,5.25,,,, +US-WY-82213,US,WY,82213,6,,,, +US-WY-82214,US,WY,82214,6,,,, +US-WY-82215,US,WY,82215,6,,,, +US-WY-82217,US,WY,82217,5.25,,,, +US-WY-82218,US,WY,82218,5.25,,,, +US-WY-82219,US,WY,82219,5.25,,,, +US-WY-82221,US,WY,82221,5.25,,,, +US-WY-82222,US,WY,82222,6,,,, +US-WY-82223,US,WY,82223,5.25,,,, +US-WY-82224,US,WY,82224,6,,,, +US-WY-82225,US,WY,82225,6,,,, +US-WY-82227,US,WY,82227,6,,,, +US-WY-82229,US,WY,82229,6,,,, +US-WY-82240,US,WY,82240,5.25,,,, +US-WY-82242,US,WY,82242,6,,,, +US-WY-82243,US,WY,82243,5.25,,,, +US-WY-82244,US,WY,82244,5.25,,,, +US-WY-82301,US,WY,82301,6,,,, +US-WY-82310,US,WY,82310,6,,,, +US-WY-82321,US,WY,82321,6,,,, +US-WY-82322,US,WY,82322,6,,,, +US-WY-82323,US,WY,82323,6,,,, +US-WY-82324,US,WY,82324,6,,,, +US-WY-82325,US,WY,82325,6,,,, +US-WY-82327,US,WY,82327,6,,,, +US-WY-82329,US,WY,82329,6,,,, +US-WY-82331,US,WY,82331,6,,,, +US-WY-82332,US,WY,82332,6,,,, +US-WY-82334,US,WY,82334,6,,,, +US-WY-82335,US,WY,82335,6,,,, +US-WY-82336,US,WY,82336,6,,,, +US-WY-82401,US,WY,82401,5,,,, +US-WY-82410,US,WY,82410,5,,,, +US-WY-82411,US,WY,82411,5,,,, +US-WY-82412,US,WY,82412,5,,,, +US-WY-82414,US,WY,82414,4,,,, +US-WY-82420,US,WY,82420,5,,,, +US-WY-82421,US,WY,82421,5,,,, +US-WY-82422,US,WY,82422,5,,,, +US-WY-82423,US,WY,82423,4,,,, +US-WY-82426,US,WY,82426,5,,,, +US-WY-82428,US,WY,82428,5,,,, +US-WY-82430,US,WY,82430,5,,,, +US-WY-82431,US,WY,82431,5,,,, +US-WY-82432,US,WY,82432,5,,,, +US-WY-82433,US,WY,82433,4,,,, +US-WY-82434,US,WY,82434,5,,,, +US-WY-82435,US,WY,82435,4,,,, +US-WY-82440,US,WY,82440,4,,,, +US-WY-82441,US,WY,82441,5,,,, +US-WY-82442,US,WY,82442,5,,,, +US-WY-82443,US,WY,82443,5,,,, +US-WY-82450,US,WY,82450,4,,,, +US-WY-82501,US,WY,82501,5,,,, +US-WY-82510,US,WY,82510,5,,,, +US-WY-82512,US,WY,82512,5,,,, +US-WY-82513,US,WY,82513,5,,,, +US-WY-82514,US,WY,82514,5,,,, +US-WY-82515,US,WY,82515,5,,,, +US-WY-82516,US,WY,82516,5,,,, +US-WY-82520,US,WY,82520,5,,,, +US-WY-82523,US,WY,82523,5,,,, +US-WY-82524,US,WY,82524,5,,,, +US-WY-82601,US,WY,82601,5,,,, +US-WY-82602,US,WY,82602,5,,,, +US-WY-82604,US,WY,82604,5,,,, +US-WY-82605,US,WY,82605,5,,,, +US-WY-82609,US,WY,82609,5,,,, +US-WY-82620,US,WY,82620,5,,,, +US-WY-82630,US,WY,82630,5,,,, +US-WY-82633,US,WY,82633,6,,,, +US-WY-82635,US,WY,82635,5,,,, +US-WY-82636,US,WY,82636,5,,,, +US-WY-82637,US,WY,82637,6,,,, +US-WY-82638,US,WY,82638,5,,,, +US-WY-82639,US,WY,82639,5,,,, +US-WY-82640,US,WY,82640,5,,,, +US-WY-82642,US,WY,82642,5,,,, +US-WY-82643,US,WY,82643,5,,,, +US-WY-82644,US,WY,82644,5,,,, +US-WY-82646,US,WY,82646,5,,,, +US-WY-82648,US,WY,82648,5,,,, +US-WY-82649,US,WY,82649,5,,,, +US-WY-82701,US,WY,82701,5,,,, +US-WY-82710,US,WY,82710,5,,,, +US-WY-82711,US,WY,82711,5,,,, +US-WY-82712,US,WY,82712,5,,,, +US-WY-82714,US,WY,82714,5,,,, +US-WY-82715,US,WY,82715,5,,,, +US-WY-82716,US,WY,82716,6,,,, +US-WY-82717,US,WY,82717,6,,,, +US-WY-82718,US,WY,82718,6,,,, +US-WY-82720,US,WY,82720,5,,,, +US-WY-82721,US,WY,82721,5,,,, +US-WY-82723,US,WY,82723,5,,,, +US-WY-82725,US,WY,82725,6,,,, +US-WY-82727,US,WY,82727,6,,,, +US-WY-82729,US,WY,82729,5,,,, +US-WY-82730,US,WY,82730,5,,,, +US-WY-82731,US,WY,82731,6,,,, +US-WY-82732,US,WY,82732,6,,,, +US-WY-82801,US,WY,82801,6,,,, +US-WY-82831,US,WY,82831,6,,,, +US-WY-82832,US,WY,82832,6,,,, +US-WY-82833,US,WY,82833,6,,,, +US-WY-82834,US,WY,82834,5,,,, +US-WY-82835,US,WY,82835,6,,,, +US-WY-82836,US,WY,82836,6,,,, +US-WY-82837,US,WY,82837,6,,,, +US-WY-82838,US,WY,82838,6,,,, +US-WY-82839,US,WY,82839,6,,,, +US-WY-82840,US,WY,82840,5,,,, +US-WY-82842,US,WY,82842,6,,,, +US-WY-82844,US,WY,82844,6,,,, +US-WY-82845,US,WY,82845,6,,,, +US-WY-82901,US,WY,82901,6,,,, +US-WY-82902,US,WY,82902,6,,,, +US-WY-82922,US,WY,82922,4,,,, +US-WY-82923,US,WY,82923,4,,,, +US-WY-82925,US,WY,82925,4,,,, +US-WY-82930,US,WY,82930,5,,,, +US-WY-82931,US,WY,82931,5,,,, +US-WY-82932,US,WY,82932,6,,,, +US-WY-82933,US,WY,82933,5,,,, +US-WY-82934,US,WY,82934,6,,,, +US-WY-82935,US,WY,82935,6,,,, +US-WY-82936,US,WY,82936,5,,,, +US-WY-82937,US,WY,82937,5,,,, +US-WY-82938,US,WY,82938,6,,,, +US-WY-82939,US,WY,82939,5,,,, +US-WY-82941,US,WY,82941,4,,,, +US-WY-82942,US,WY,82942,6,,,, +US-WY-82943,US,WY,82943,6,,,, +US-WY-82944,US,WY,82944,5,,,, +US-WY-82945,US,WY,82945,6,,,, +US-WY-83001,US,WY,83001,6,,,, +US-WY-83002,US,WY,83002,6,,,, +US-WY-83011,US,WY,83011,6,,,, +US-WY-83012,US,WY,83012,6,,,, +US-WY-83013,US,WY,83013,6,,,, +US-WY-83014,US,WY,83014,6,,,, +US-WY-83025,US,WY,83025,6,,,, +US-WY-83101,US,WY,83101,5,,,, +US-WY-83110,US,WY,83110,5,,,, +US-WY-83111,US,WY,83111,5,,,, +US-WY-83112,US,WY,83112,5,,,, +US-WY-83113,US,WY,83113,4,,,, +US-WY-83114,US,WY,83114,5,,,, +US-WY-83115,US,WY,83115,4,,,, +US-WY-83116,US,WY,83116,5,,,, +US-WY-83118,US,WY,83118,5,,,, +US-WY-83119,US,WY,83119,5,,,, +US-WY-83120,US,WY,83120,5,,,, +US-WY-83121,US,WY,83121,5,,,, +US-WY-83122,US,WY,83122,5,,,, +US-WY-83123,US,WY,83123,5,,,, +US-WY-83124,US,WY,83124,5,,,, +US-WY-83126,US,WY,83126,5,,,, +US-WY-83127,US,WY,83127,5,,,, +US-WY-83128,US,WY,83128,5,,,, +US-WY-83414,US,WY,83414,6,,,, diff --git a/magento/setup/src/Magento/Setup/Fixtures/_files/tax_rates_small.csv b/magento/setup/src/Magento/Setup/Fixtures/_files/tax_rates_small.csv new file mode 100644 index 0000000..bc68322 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Fixtures/_files/tax_rates_small.csv @@ -0,0 +1,133 @@ +"Code","Country","State","Zip/Post Code","Rate","Zip/Post is Range","Range From","Range To","default" +"US-AL","US","AL","*","4","","","","" +"US-AK","US","AK","*","0","","","","" +"US-AZ","US","AZ","*","6.6","","","","" +"US-AR","US","AR","*","6","","","","" +"US-CA","US","CA","*","8.25","","","","" +"US-CO","US","CO","*","2.9","","","","" +"US-CT","US","CT","*","6","","","","" +"US-DE","US","DE","*","0","","","","" +"US-FL","US","FL","*","6","","","","" +"US-GA","US","GA","*","4","","","","" +"US-HI","US","HI","*","4","","","","" +"US-ID","US","ID","*","6","","","","" +"US-IL","US","IL","*","6.25","","","","" +"US-IN","US","IN","*","7","","","","" +"US-IA","US","IA","*","6","","","","" +"US-KS","US","KS","*","6.3","","","","" +"US-KY","US","KY","*","6","","","","" +"US-LA","US","LA","*","4","","","","" +"US-ME","US","ME","*","5","","","","" +"US-MD","US","MD","*","6","","","","" +"US-MA","US","MA","*","6.25","","","","" +"US-MI","US","MI","*","6","","","","" +"US-MN","US","MN","*","6.875","","","","" +"US-MS","US","MS","*","7","","","","" +"US-MO","US","MO","*","4.225","","","","" +"US-MT","US","MT","*","0","","","","" +"US-NE","US","NE","*","5.5","","","","" +"US-NV","US","NV","*","6.85","","","","" +"US-NH","US","NH","*","0","","","","" +"US-NJ","US","NJ","*","7","","","","" +"US-NM","US","NM","*","5.125","","","","" +"US-NY","US","NY","*","4","","","","" +"US-NC","US","NC","*","5.75","","","","" +"US-ND","US","ND","*","5","","","","" +"US-OH","US","OH","*","5.5","","","","" +"US-OK","US","OK","*","4.5","","","","" +"US-OR","US","OR","*","0","","","","" +"US-PA","US","PA","*","6","","","","" +"US-RI","US","RI","*","7","","","","" +"US-SC","US","SC","*","6","","","","" +"US-SD","US","SD","*","4","","","","" +"US-TN","US","TN","*","7","","","","" +"US-TX","US","TX","*","6.25","","","","" +"US-UT","US","UT","*","4.7","","","","" +"US-VT","US","VT","*","6","","","","" +"US-VA","US","VA","*","4","","","","" +"US-WA","US","WA","*","6.5","","","","" +"US-WV","US","WV","*","6","","","","" +"US-WI","US","WI","*","5","","","","" +"US-WY","US","WY","*","4","","","","" +"Austria (standard)","AT","*","","20.0000","","","","" +"Austria (reduced: food / books / pharma / hotels)","AT","*","","10.0000","","","","" +"Belgium (standard)","BE","*","","21.0000","","","","" +"Belgium (reduced: restaurants)","BE","*","","12.0000","","","","" +"Belgium (reduced: food / books/ pharma / medical / hotels)","BE","*","","6.0000","","","","" +"Bulgaria (standard)","BG","*","","20.0000","","","","" +"Bulgaria (reduced: hotels)","BG","*","","9.0000","","","","" +"Croatia (standard)","HR","*","","25.0000","","","","" +"Croatia (reduced: hotels / newspapers)","HR","*","","13.0000","","","","" +"Cyprus (standard)","CY","*","","19.0000","","","","" +"Cyprus (reduced: hotels)","CY","*","","9.0000","","","","" +"Cyprus (reduced: food / books / pharma / medical)","CY","*","","5.0000","","","","" +"Czech Republic (standard)","CZ","*","","21.0000","","","","" +"Czech Republic (reduced: food / medical / pharma / hotels)","CZ","*","","15.0000","","","","" +"Czech Republic (reduced: pharma / books)","CZ","*","","10.0000","","","","" +"Denmark (standard)","DK","*","","25.0000","","","","" +"Estonia (standard)","EE","*","","20.0000","","","","" +"Estonia (reduced: books / pharma / medical / hotels)","EE","*","","9.0000","","","","" +"Finland (standard)","FI","*","","24.0000","","","","" +"Finland (reduced: restaurants)","FI","*","","14.0000","","","","" +"Finland (reduced: books / pharma / hotels)","FI","*","","10.0000","","","","" +"France (standard)","FR","*","","20.0000","","","","" +"France (reduced: pharma / hotels / restaurants)","FR","*","","10.0000","","","","" +"France (reduced: medicals / food / books)","FR","*","","5.5000","","","","" +"France (reduced: newspapers / pharma)","FR","*","","2.1000","","","","" +"Germany (standard)","DE","*","","19.0000","","","","" +"Germany (reduced: food / medical / books / hotels)","DE","*","","7.0000","","","","" +"Greece (standard)","GR","*","","24.0000","","","","" +"Greece (reduced: food / pharma / medical)","GR","*","","13.0000","","","","" +"Greece (reduced: books / hotels)","GR","*","","6.0000","","","","" +"Hungary (standard)","HU","*","","27.0000","","","","" +"Hungary (reduced: food / hotels)","HU","*","","18.0000","","","","" +"Hungary (reduced: books / medical)","HU","*","","5.0000","","","","" +"Ireland (standard)","IE","*","","23.0000","","","","" +"Ireland (reduced: medical)","IE","*","","13.5000","","","","" +"Ireland (reduced: newspapers / hotels / restaurants)","IE","*","","9.0000","","","","" +"Ireland (reduced: food)","IE","*","","4.8000","","","","" +"Ireland (free: books / medical / children clothing)","IE","*","","0.0000","","","","" +"Italy (standard)","IT","*","","22.0000","","","","" +"Italy (reduced: transport / hotels / restaurants)","IT","*","","10.0000","","","","" +"Italy (reduced: food / medical / books)","IT","*","","4.0000","","","","" +"Latvia (standard)","LV","*","","21.0000","","","","" +"Latvia (reduced: books / pharma / medical / hotels)","LV","*","","12.0000","","","","" +"Lithuania (standard)","LT","*","","21.0000","","","","" +"Lithuania (reduced: books)","LT","*","","9.0000","","","","" +"Lithuania (reduced: medical)","LT","*","","5.0000","","","","" +"Luxembourg (standard)","LU","*","","17.0000","","","","" +"Luxembourg (reduced: wine / advertising)","LU","*","","14.0000","","","","" +"Luxembourg (reduced: bikes / domestic)","LU","*","","8.0000","","","","" +"Luxembourg (reduced: food / books / pharma / medical / hotels / restaurants)","LU","*","","3.0000","","","","" +"Malta (standard)","MT","*","","18.0000","","","","" +"Malta (reduced: hotels)","MT","*","","7.0000","","","","" +"Malta (reduced: books / medical)","MT","*","","5.0000","","","","" +"Malta (reduced: food / pharma)","MT","*","","0.0000","","","","" +"Netherlands (standard)","NL","*","","21.0000","","","","" +"Netherlands (reduced: food / books / pharma / medical / hotels)","NL","*","","6.0000","","","","" +"Poland (standard)","PL","*","","23.0000","","","","" +"Poland (reduced: pharma / medical / hotels / restaurants)","PL","*","","8.0000","","","","" +"Poland (reduced: food)","PL","*","","5.0000","","","","" +"Portugal (standard)","PT","*","","23.0000","","","","" +"Portugal (reduced: food)","PT","*","","13.0000","","","","" +"Portugal (reduced: food / books / pharma / medical / hotels)","PT","*","","6.0000","","","","" +"Romania (standard)","RO","*","","24.0000","","","","" +"Romania (reduced: social housing)","RO","*","","5.0000","","","","" +"Romania (reduced: books / pharma / medical / hotels)","RO","*","","9.0000","","","","" +"Slovakia (standard)","SK","*","","20.0000","","","","" +"Slovakia (reduced: books / food / medical / pharma)","SK","*","","10.0000","","","","" +"Slovenia (standard)","SI","*","","22.0000","","","","" +"Slovenia (reduced: food / books / pharma / medical / hotels)","SI","*","","9.5000","","","","" +"Spain (standard)","ES","*","","21.0000","","","","" +"Spain (reduced: medical / pharma)","ES","*","","10.0000","","","","" +"Spain (reduced: food / newspapers)","ES","*","","4.0000","","","","" +"Spain (Tenerife) (standard)","ES","Santa Cruz de Tenerife","","0.0000","","","","" +"Spain (Las Palmas) (standard)","ES","Las Palmas","*","0.0000","","","","" +"Spain (Melilla) (standard)","ES","Melilla","","0.0000","","","","" +"Spain (Ceuta) (standard)","ES","Ceuta","*","0.0000","","","","" +"Sweden (standard)","SE","*","","25.0000","","","","" +"Sweden (reduced: food)","SE","*","","12.0000","","","","" +"Sweden (reduced: books)","SE","*","","6.0000","","","","" +"United Kingdom (standard)","GB","*","","20.0000","","","","" +"United Kingdom (reduced: property renovations)","GB","*","","5.0000","","","","" +"United Kingdom (reduced: food / books / pharma / medical)","GB","*","","0.0000","","","","" \ No newline at end of file diff --git a/magento/setup/src/Magento/Setup/Framework/Mail/Template/TransportBuilderMock.php b/magento/setup/src/Magento/Setup/Framework/Mail/Template/TransportBuilderMock.php new file mode 100644 index 0000000..2791487 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Framework/Mail/Template/TransportBuilderMock.php @@ -0,0 +1,28 @@ +prepareMessage(); + $this->reset(); + + return new TransportInterfaceMock($this->message); + } +} diff --git a/magento/setup/src/Magento/Setup/Framework/Mail/TransportInterfaceMock.php b/magento/setup/src/Magento/Setup/Framework/Mail/TransportInterfaceMock.php new file mode 100644 index 0000000..64abddc --- /dev/null +++ b/magento/setup/src/Magento/Setup/Framework/Mail/TransportInterfaceMock.php @@ -0,0 +1,45 @@ +message = $message; + } + + /** + * @inheritDoc + */ + public function sendMessage() + { + } + + /** + * @inheritDoc + */ + public function getMessage() + { + return $this->message; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Address/AddressDataGenerator.php b/magento/setup/src/Magento/Setup/Model/Address/AddressDataGenerator.php new file mode 100644 index 0000000..f41f840 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Address/AddressDataGenerator.php @@ -0,0 +1,26 @@ + mt_rand(10000, 99999) + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/AdminAccount.php b/magento/setup/src/Magento/Setup/Model/AdminAccount.php new file mode 100644 index 0000000..87b113a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/AdminAccount.php @@ -0,0 +1,283 @@ +connection = $connection; + $this->encryptor = $encryptor; + $this->data = $data; + } + + /** + * Generate password string + * + * @return string + */ + protected function generatePassword() + { + return $this->encryptor->getHash($this->data[self::KEY_PASSWORD], true); + } + + /** + * Save administrator account and user role to DB. + * + * If the administrator account exists, update it. + * + * @return void + */ + public function save() + { + $adminId = $this->saveAdminUser(); + $this->saveAdminUserRole($adminId); + } + + /** + * Uses the information in data[] to create the admin user. + * + * If the username already exists, it will update the record with information from data[] + * and set the is_active flag. + * + * @return int The admin user id + */ + private function saveAdminUser() + { + $passwordHash = $this->generatePassword(); + $adminData = [ + 'firstname' => $this->data[self::KEY_FIRST_NAME], + 'lastname' => $this->data[self::KEY_LAST_NAME], + 'password' => $passwordHash, + 'is_active' => 1, + ]; + $result = $this->connection->fetchRow( + 'SELECT user_id, username, email FROM ' . $this->getTableName('admin_user') . ' ' . + 'WHERE username = :username OR email = :email', + ['username' => $this->data[self::KEY_USER], 'email' => $this->data[self::KEY_EMAIL]], + null + ); + + if (!empty($result)) { + // User exists, update + $this->validateUserMatches(); + $adminId = $result['user_id']; + $adminData['modified'] = date('Y-m-d H:i:s'); + + $this->connection->update( + $this->getTableName('admin_user'), + $adminData, + $this->connection->quoteInto('username = ?', $this->data[self::KEY_USER]) + ); + } else { + // User does not exist, create it + $adminData['username'] = $this->data[self::KEY_USER]; + $adminData['email'] = $this->data[self::KEY_EMAIL]; + $this->connection->insert( + $this->getTableName('admin_user'), + $adminData + ); + $adminId = $this->connection->lastInsertId(); + } + $this->trackPassword($adminId, $passwordHash); + + return $adminId; + } + + /** + * Remember a password hash for further usage. + * + * @param int $adminId + * @param string $passwordHash + * @return void + */ + private function trackPassword($adminId, $passwordHash) + { + $this->connection->insert( + $this->getTableName('admin_passwords'), + [ + 'user_id' => $adminId, + 'password_hash' => $passwordHash, + 'last_updated' => time() + ] + ); + } + + /** + * Validates that the username and email both match the user, + * and that password exists and is different from user name. + * + * @return void + * @throws \Exception If the username and email do not both match data provided to install + * @throws \Exception If password is empty and if password is the same as the user name + */ + public function validateUserMatches() + { + if (empty($this->data[self::KEY_PASSWORD])) { + throw new \Exception( + '"Password" is required. Enter and try again.' + ); + } + + if (strcasecmp($this->data[self::KEY_PASSWORD], $this->data[self::KEY_USER]) == 0) { + throw new \Exception( + 'Password cannot be the same as the user name.' + ); + } + + try { + $result = $this->connection->fetchRow( + "SELECT user_id, username, email FROM {$this->getTableName('admin_user')} " + . "WHERE username = :username OR email = :email", + ['username' => $this->data[self::KEY_USER], 'email' => $this->data[self::KEY_EMAIL]] + ); + } catch (\Exception $e) { + return; // New installation, no need to validate existing users. + } + + $email = $result['email']; + $username = $result['username']; + + if ((strcasecmp($email, $this->data[self::KEY_EMAIL]) == 0) && + (strcasecmp($username, $this->data[self::KEY_USER]) != 0)) { + // email matched but username did not + throw new \Exception( + 'An existing user has the given email but different username. ' + . 'Username and email both need to match an existing user or both be new.' + ); + } + if ((strcasecmp($username, $this->data[self::KEY_USER]) == 0) && + (strcasecmp($email, $this->data[self::KEY_EMAIL]) != 0)) { + // username matched but email did not + throw new \Exception( + 'An existing user has the given username but different email. ' + . 'Username and email both need to match an existing user or both be new.' + ); + } + } + + /** + * Creates the admin user role if one does not exist. + * + * Do nothing if a role already exists for this user + * + * @param int $adminId User id of administrator to set role for + * @return void + */ + private function saveAdminUserRole($adminId) + { + $result = $this->connection->fetchRow( + 'SELECT * FROM ' . $this->getTableName('authorization_role') . ' ' . + 'WHERE user_id = :user_id AND user_type = :user_type', + ['user_id' => $adminId, 'user_type' => UserContextInterface::USER_TYPE_ADMIN] + ); + if (empty($result)) { + // No user role exists for this user id, create it + $adminRoleData = [ + 'parent_id' => $this->retrieveAdministratorsRoleId(), + 'tree_level' => 2, + 'role_type' => User::ROLE_TYPE, + 'user_id' => $adminId, + 'user_type' => UserContextInterface::USER_TYPE_ADMIN, + 'role_name' => $this->data[self::KEY_USER], + ]; + $this->connection->insert($this->getTableName('authorization_role'), $adminRoleData); + } + } + + /** + * Gets the "Administrators" role id, the special role created by data fixture in Authorization module. + * + * @return int The id of the Administrators role + * @throws \Exception If Administrators role not found or problem connecting with database. + */ + private function retrieveAdministratorsRoleId() + { + // Get Administrators role id to use as parent_id + $administratorsRoleData = [ + 'parent_id' => 0, + 'tree_level' => 1, + 'role_type' => Group::ROLE_TYPE, + 'user_id' => 0, + 'user_type' => UserContextInterface::USER_TYPE_ADMIN, + 'role_name' => 'Administrators', + ]; + $result = $this->connection->fetchRow( + 'SELECT * FROM ' . $this->getTableName('authorization_role') . ' ' . + 'WHERE parent_id = :parent_id AND tree_level = :tree_level AND role_type = :role_type AND ' . + 'user_id = :user_id AND user_type = :user_type AND role_name = :role_name', + $administratorsRoleData + ); + if (empty($result)) { + throw new \Exception('No Administrators role was found, data fixture needs to be run'); + } else { + // Found at least one, use first + return $result['role_id']; + } + } + + /** + * Take table with prefix without loading modules + * + * @param string $table + * @return string + */ + private function getTableName($table) + { + if (!empty($this->data[self::KEY_PREFIX])) { + return $this->connection->getTableName($this->data[self::KEY_PREFIX] . $table); + } + + return $this->connection->getTableName($table); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/AdminAccountFactory.php b/magento/setup/src/Magento/Setup/Model/AdminAccountFactory.php new file mode 100644 index 0000000..0811be7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/AdminAccountFactory.php @@ -0,0 +1,45 @@ +serviceLocator = $serviceLocator; + } + + /** + * Create object + * + * @param AdapterInterface $connection + * @param array $data + * @return AdminAccount + */ + public function create(AdapterInterface $connection, $data) + { + return new AdminAccount( + $connection, + $this->serviceLocator->get(\Magento\Framework\Encryption\Encryptor::class), + $data + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/BasePackageInfo.php b/magento/setup/src/Magento/Setup/Model/BasePackageInfo.php new file mode 100644 index 0000000..a59adc4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/BasePackageInfo.php @@ -0,0 +1,71 @@ +reader = $readFactory->create(BP); + } + + /** + * Get the list of files and directory paths from magento-base extra/map section. + * + * @return string [] + * @throws \Magento\Setup\Exception + */ + public function getPaths() + { + // Locate composer.json for magento2-base module + $filesPathList = []; + $vendorDir = require VENDOR_PATH; + $basePackageComposerFilePath = $vendorDir . '/' . self::MAGENTO_BASE_PACKAGE_COMPOSER_JSON_FILE; + if (!$this->reader->isExist($basePackageComposerFilePath)) { + throw new \Magento\Setup\Exception( + 'Could not locate ' . self::MAGENTO_BASE_PACKAGE_COMPOSER_JSON_FILE . ' file.' + ); + } + if (!$this->reader->isReadable($basePackageComposerFilePath)) { + throw new \Magento\Setup\Exception( + 'Could not read ' . self::MAGENTO_BASE_PACKAGE_COMPOSER_JSON_FILE . ' file.' + ); + } + + // Fill array with list of files and directories from extra/map section + $composerJsonFileData = json_decode($this->reader->readFile($basePackageComposerFilePath), true); + if (!isset($composerJsonFileData[self::COMPOSER_KEY_EXTRA][self::COMPOSER_KEY_MAP])) { + return $filesPathList; + } + $extraMappings = $composerJsonFileData[self::COMPOSER_KEY_EXTRA][self::COMPOSER_KEY_MAP]; + foreach ($extraMappings as $map) { + $filesPathList[] = $map[1]; + } + return $filesPathList; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/BatchInsert.php b/magento/setup/src/Magento/Setup/Model/BatchInsert.php new file mode 100644 index 0000000..827f35f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/BatchInsert.php @@ -0,0 +1,124 @@ +resourceConnection = $resourceConnection; + $this->insertIntoTable = $insertIntoTable; + $this->batchSize = $batchSize; + $this->dataStorage = new \SplFixedArray($batchSize); + } + + /** + * Save data to $dataStorage and automatically flush it to DB when storage size becomes equal to $batchSize + * + * @param array $dataToInsert + * @return void + */ + public function insert(array $dataToInsert) + { + $this->dataStorage[$this->currentStorageIndex] = $dataToInsert; + $this->currentStorageIndex++; + + if ($this->currentStorageIndex >= $this->batchSize) { + $this->flush(); + } + } + + /** + * Insert all data form $dataStorage to DB and clear $dataStorage + * + * @return void + */ + public function flush() + { + if ($this->currentStorageIndex > 0) { + if ($this->currentStorageIndex < $this->batchSize) { + $this->dataStorage->setSize($this->currentStorageIndex); + } + + if (method_exists($this->dataStorage, 'getIterator')) { + // PHP > 8.0 + $this->dataStorage->getIterator()->rewind(); + $columnsToInsert = array_keys($this->dataStorage->getIterator()->current()); + } else { + // PHP 7.4. compatibility + $this->dataStorage->rewind(); + $columnsToInsert = array_keys($this->dataStorage->current()); + } + $this->getDbConnection() + ->insertArray( + $this->insertIntoTable, + $columnsToInsert, + $this->dataStorage->toArray() + ); + + $this->dataStorage = new \SplFixedArray($this->batchSize); + $this->currentStorageIndex = 0; + } + } + + /** + * Retrieve current connection to DB + * + * Method is required to eliminate multiple calls to ResourceConnection class + * + * @return \Magento\Framework\DB\Adapter\AdapterInterface + */ + private function getDbConnection() + { + if ($this->dbConnection === null) { + $this->dbConnection = $this->resourceConnection->getConnection(); + } + + return $this->dbConnection; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Bootstrap.php b/magento/setup/src/Magento/Setup/Model/Bootstrap.php new file mode 100644 index 0000000..69635e1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Bootstrap.php @@ -0,0 +1,27 @@ +_pattern = $rowPattern; + $this->_count = $count; + $this->_patternRowsCount = $this->_pattern->getRowsCount(); + $this->_limit = (int)$count * $this->_patternRowsCount; + parent::__construct($this->_pattern->getHeaders()); + } + + /** + * Get row index for template + * + * @param int $key + * + * @return float + */ + public function getIndex($key) + { + return floor($key / $this->_patternRowsCount) + 1; + } + + /** + * Whether limit of generated elements is reached (according to "Iterator" interface) + * + * @return bool + */ + public function valid() + { + return $this->_key + 1 <= $this->_limit; + } + + /** + * Get next row in set + * + * @return array|bool + */ + protected function _getNextRow() + { + $key = $this->key(); + $this->_index = $this->getIndex($key); + + if ($key > $this->_limit) { + return false; + } + return $this->_pattern->getRow($this->_index, $key); + } + + /** + * Return the current element + * + * Returns the row in associative array format: array( => , ...) + * + * @return array + */ + public function current() + { + return $this->_row; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Complex/Pattern.php b/magento/setup/src/Magento/Setup/Model/Complex/Pattern.php new file mode 100644 index 0000000..a90849c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Complex/Pattern.php @@ -0,0 +1,127 @@ +_headers = $headers; + return $this; + } + + /** + * Get headers array + * + * @return array + */ + public function getHeaders() + { + return $this->_headers; + } + + /** + * Set combined rows set + * + * @param array $rowsSet + * + * @return Pattern + * @throws \Exception + */ + public function setRowsSet(array $rowsSet) + { + if (!count($rowsSet)) { + throw new \Exception("Rows set must contain at least 1 array representing a row pattern"); + } + $this->_rowsSet = $rowsSet; + if (!isset($this->_headers)) { + $this->_headers = array_keys($rowsSet[0]); + } + return $this; + } + + /** + * Add row + * + * @param array $row + * + * @return Pattern + */ + public function addRow(array $row) + { + $this->_rowsSet[] = $row; + return $this; + } + + /** + * Get row + * + * @param int $index + * @param int $generatorKey + * + * @return array|null + */ + public function getRow($index, $generatorKey) + { + $row = $this->_rowsSet[$generatorKey % count($this->_rowsSet)]; + foreach ($this->getHeaders() as $key) { + if (isset($row[$key])) { + if (is_callable($row[$key])) { + $row[$key] = call_user_func($row[$key], $index, $generatorKey); + } else { + $row[$key] = str_replace('%s', $index, $row[$key]); + } + } else { + $row[$key] = ''; + } + } + return $row; + } + + /** + * Get rows count + * + * @return int + */ + public function getRowsCount() + { + return count($this->_rowsSet); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigGenerator.php b/magento/setup/src/Magento/Setup/Model/ConfigGenerator.php new file mode 100644 index 0000000..57f462c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigGenerator.php @@ -0,0 +1,281 @@ + ConfigOptionsListConstants::KEY_HOST, + ConfigOptionsListConstants::INPUT_KEY_DB_NAME => ConfigOptionsListConstants::KEY_NAME, + ConfigOptionsListConstants::INPUT_KEY_DB_USER => ConfigOptionsListConstants::KEY_USER, + ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD => ConfigOptionsListConstants::KEY_PASSWORD, + ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX => ConfigOptionsListConstants::KEY_PREFIX, + ConfigOptionsListConstants::INPUT_KEY_DB_MODEL => ConfigOptionsListConstants::KEY_MODEL, + ConfigOptionsListConstants::INPUT_KEY_DB_ENGINE => ConfigOptionsListConstants::KEY_ENGINE, + ConfigOptionsListConstants::INPUT_KEY_DB_INIT_STATEMENTS => ConfigOptionsListConstants::KEY_INIT_STATEMENTS, + ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY => ConfigOptionsListConstants::KEY_ENCRYPTION_KEY, + ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE => ConfigOptionsListConstants::KEY_SAVE, + ConfigOptionsListConstants::INPUT_KEY_RESOURCE => ConfigOptionsListConstants::KEY_RESOURCE, + ]; + + /** + * @var DeploymentConfig + */ + protected $deploymentConfig; + + /** + * @var Random + * @deprecated 100.2.0 + */ + protected $random; + + /** + * @var ConfigDataFactory + */ + private $configDataFactory; + + /** + * @var CryptKeyGeneratorInterface + */ + private $cryptKeyGenerator; + + /** + * @var DriverOptions + */ + private $driverOptions; + + /** + * Constructor + * + * @param Random $random Deprecated since 100.2.0 + * @param DeploymentConfig $deploymentConfig + * @param ConfigDataFactory|null $configDataFactory + * @param CryptKeyGeneratorInterface|null $cryptKeyGenerator + * @param DriverOptions|null $driverOptions + */ + public function __construct( + Random $random, + DeploymentConfig $deploymentConfig, + ConfigDataFactory $configDataFactory = null, + CryptKeyGeneratorInterface $cryptKeyGenerator = null, + DriverOptions $driverOptions = null + ) { + $this->random = $random; + $this->deploymentConfig = $deploymentConfig; + $this->configDataFactory = $configDataFactory ?? ObjectManager::getInstance()->get(ConfigDataFactory::class); + $this->cryptKeyGenerator = $cryptKeyGenerator ?? ObjectManager::getInstance()->get(CryptKeyGenerator::class); + $this->driverOptions = $driverOptions ?? ObjectManager::getInstance()->get(DriverOptions::class); + } + + /** + * Creates encryption key config data + * + * @param array $data + * @return ConfigData + */ + public function createCryptConfig(array $data) + { + $currentKey = $this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY); + + $configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); + + // Use given key if set, else use current + $key = $data[ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY] ?? $currentKey; + + // If there is no key given or currently set, generate a new one + $key = $key ?? $this->cryptKeyGenerator->generate(); + + // Chaining of ".. ?? .." is not used to keep it simpler to understand + + $configData->set(ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, $key); + + return $configData; + } + + /** + * Creates session config data + * + * @param array $data + * @return ConfigData + */ + public function createSessionConfig(array $data) + { + $configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); + + if (isset($data[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE])) { + $configData->set( + ConfigOptionsListConstants::CONFIG_PATH_SESSION_SAVE, + $data[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE] + ); + } + + return $configData; + } + + /** + * Creates definitions config data + * + * @param array $data + * @return ConfigData|null + * @deprecated 2.2.0 + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function createDefinitionsConfig(array $data) + { + return null; + } + + /** + * Creates db config data + * + * @param array $data + * @return ConfigData + */ + public function createDbConfig(array $data) + { + $configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); + + $optional = [ + ConfigOptionsListConstants::INPUT_KEY_DB_HOST, + ConfigOptionsListConstants::INPUT_KEY_DB_NAME, + ConfigOptionsListConstants::INPUT_KEY_DB_USER, + ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD, + ConfigOptionsListConstants::INPUT_KEY_DB_MODEL, + ConfigOptionsListConstants::INPUT_KEY_DB_ENGINE, + ConfigOptionsListConstants::INPUT_KEY_DB_INIT_STATEMENTS, + ]; + + if (isset($data[ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX])) { + $configData->set( + ConfigOptionsListConstants::CONFIG_PATH_DB_PREFIX, + $data[ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX] + ); + } + + $dbConnectionPrefix = ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . '/'; + + foreach ($optional as $key) { + if (isset($data[$key])) { + $configData->set($dbConnectionPrefix . self::$paramMap[$key], $data[$key]); + } + } + + $currentStatus = $this->deploymentConfig->get($dbConnectionPrefix . ConfigOptionsListConstants::KEY_ACTIVE); + + if ($currentStatus === null) { + $configData->set($dbConnectionPrefix . ConfigOptionsListConstants::KEY_ACTIVE, '1'); + } + + $driverOptions = $this->driverOptions->getDriverOptions($data); + $configData->set($dbConnectionPrefix . ConfigOptionsListConstants::KEY_DRIVER_OPTIONS, $driverOptions); + + return $configData; + } + + /** + * Creates resource config data + * + * @return ConfigData + */ + public function createResourceConfig() + { + $configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); + + if ($this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_RESOURCE_DEFAULT_SETUP) === null) { + $configData->set(ConfigOptionsListConstants::CONFIG_PATH_RESOURCE_DEFAULT_SETUP, 'default'); + } + + return $configData; + } + + /** + * Creates x-frame-options header config data + * + * @return ConfigData + */ + public function createXFrameConfig() + { + $configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); + + if ($this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT) === null) { + $configData->set(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT, 'SAMEORIGIN'); + } + + return $configData; + } + + /** + * Create default entry for mode config option + * + * @return ConfigData + */ + public function createModeConfig() + { + $configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); + + if ($this->deploymentConfig->get(State::PARAM_MODE) === null) { + $configData->set(State::PARAM_MODE, State::MODE_DEFAULT); + } + + return $configData; + } + + /** + * Creates cache hosts config data + * + * @param array $data + * @return ConfigData + */ + public function createCacheHostsConfig(array $data) + { + $configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); + + if (isset($data[ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS])) { + $hosts = explode(',', $data[ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS]); + + $hosts = array_map( + function ($hostData) { + $hostDataParts = explode(':', trim($hostData)); + + $tmp = ['host' => $hostDataParts[0]]; + + if (isset($hostDataParts[1])) { + $tmp['port'] = $hostDataParts[1]; + } + + return $tmp; + }, + $hosts + ); + + $configData->set(ConfigOptionsListConstants::CONFIG_PATH_CACHE_HOSTS, $hosts); + } + + $configData->setOverrideWhenSave(true); + return $configData; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigModel.php b/magento/setup/src/Magento/Setup/Model/ConfigModel.php new file mode 100644 index 0000000..0abb8fa --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigModel.php @@ -0,0 +1,174 @@ +collector = $collector; + $this->writer = $writer; + $this->filePermissions = $filePermissions; + $this->deploymentConfig = $deploymentConfig; + } + + /** + * Gets available config options + * + * @return AbstractConfigOption[] + */ + public function getAvailableOptions() + { + /** @var AbstractConfigOption[] $optionCollection */ + $optionCollection = []; + $optionLists = $this->collector->collectOptionsLists(); + + foreach ($optionLists as $optionList) { + $optionCollection[] = $optionList->getOptions(); + } + + $optionCollection = array_merge([], ...$optionCollection); + + foreach ($optionCollection as $option) { + $currentValue = $this->deploymentConfig->get($option->getConfigPath()); + if ($currentValue !== null) { + $option->setDefault(); + } + } + + return $optionCollection; + } + + /** + * Process input options + * + * @param array $inputOptions + * @return void + * @throws \Exception + */ + public function process($inputOptions) + { + $this->checkInstallationFilePermissions(); + + $options = $this->collector->collectOptionsLists(); + + foreach ($options as $moduleName => $option) { + $configData = $option->createConfig($inputOptions, $this->deploymentConfig); + + foreach ($configData as $config) { + $fileConfigStorage = []; + if (!$config instanceof ConfigData) { + throw new SetupException( + 'In module : ' + . $moduleName + . 'ConfigOption::createConfig should return an array of ConfigData instances' + ); + } + + if (isset($fileConfigStorage[$config->getFileKey()])) { + $fileConfigStorage[$config->getFileKey()] = array_replace_recursive( + $fileConfigStorage[$config->getFileKey()], + $config->getData() + ); + } else { + $fileConfigStorage[$config->getFileKey()] = $config->getData(); + } + $this->writer->saveConfig($fileConfigStorage, $config->isOverrideWhenSave()); + } + } + } + + /** + * Validates Input Options + * + * @param array $inputOptions + * @return array + */ + public function validate(array $inputOptions) + { + $errors = []; + + //Basic types validation + $options = $this->getAvailableOptions(); + foreach ($options as $option) { + try { + $inputValue = $inputOptions[$option->getName()] ?? null; + + if ($inputValue !== null) { + $option->validate($inputValue); + } + } catch (\InvalidArgumentException $e) { + $errors[] = $e->getMessage(); + } + } + + // validate ConfigOptionsList + $options = $this->collector->collectOptionsLists(); + + foreach ($options as $option) { + $errors[] = $option->validate($inputOptions, $this->deploymentConfig); + } + + return array_merge([], ...$errors); + } + + /** + * Check permissions of directories that are expected to be writable for installation + * + * @return void + * @throws \Exception + */ + private function checkInstallationFilePermissions() + { + $results = $this->filePermissions->getMissingWritablePathsForInstallation(); + if ($results) { + $errorMsg = "Missing write permissions to the following paths:" . PHP_EOL . implode(PHP_EOL, $results); + throw new SetupException($errorMsg); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigOptionsList.php b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList.php new file mode 100644 index 0000000..a1179da --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList.php @@ -0,0 +1,399 @@ +configGenerator = $configGenerator; + $this->dbValidator = $dbValidator; + $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); + foreach ($this->configOptionsListClasses as $className) { + $this->configOptionsCollection[] = $objectManager->get($className); + } + $this->encryptionKeyValidator = $encryptionKeyValidator ?: $objectManager->get(KeyValidator::class); + $this->driverOptions = $driverOptions ?? $objectManager->get(DriverOptions::class); + } + + /** + * @inheritdoc + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function getOptions() + { + $options = [ + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, + 'Encryption key' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_HOST, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_HOST, + 'Database server host', + 'localhost' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_NAME, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_NAME, + 'Database name', + 'magento2' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_USER, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_USER, + 'Database server username', + 'root' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_ENGINE, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_ENGINE, + 'Database server engine', + 'innodb' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD, + TextConfigOption::FRONTEND_WIZARD_PASSWORD, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_PASSWORD, + 'Database server password', + '' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_PREFIX, + 'Database table prefix', + '' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_MODEL, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_MODEL, + 'Database type', + 'mysql4' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_INIT_STATEMENTS, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_INIT_STATEMENTS, + 'Database initial set of commands', + 'SET NAMES utf8;' + ), + new FlagConfigOption( + ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION, + '', + 'If specified, then db connection validation will be skipped', + '-s' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_CACHE_HOSTS, + 'http Cache hosts' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_SSL_KEY, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT_DRIVER_OPTIONS . + '/' . ConfigOptionsListConstants::KEY_MYSQL_SSL_KEY, + 'Full path of client key file in order to establish db connection through SSL', + '' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_SSL_CERT, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT_DRIVER_OPTIONS . + '/' . ConfigOptionsListConstants::KEY_MYSQL_SSL_CERT, + 'Full path of client certificate file in order to establish db connection through SSL', + '' + ), + new TextConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_SSL_CA, + TextConfigOption::FRONTEND_WIZARD_TEXT, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT_DRIVER_OPTIONS . + '/' . ConfigOptionsListConstants::KEY_MYSQL_SSL_CA, + 'Full path of server certificate file in order to establish db connection through SSL', + '' + ), + new FlagConfigOption( + ConfigOptionsListConstants::INPUT_KEY_DB_SSL_VERIFY, + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT_DRIVER_OPTIONS . + '/' . ConfigOptionsListConstants::KEY_MYSQL_SSL_VERIFY, + 'Verify server certification' + ), + ]; + + $options = [$options]; + foreach ($this->configOptionsCollection as $configOptionsList) { + $options[] = $configOptionsList->getOptions(); + } + + return array_merge([], ...$options); + } + + /** + * @inheritdoc + */ + public function createConfig(array $data, DeploymentConfig $deploymentConfig) + { + $configData = []; + $configData[] = $this->configGenerator->createCryptConfig($data, $deploymentConfig); + $definitionConfig = $this->configGenerator->createDefinitionsConfig($data); + if (isset($definitionConfig)) { + $configData[] = $definitionConfig; + } + $configData[] = $this->configGenerator->createDbConfig($data); + $configData[] = $this->configGenerator->createResourceConfig(); + $configData[] = $this->configGenerator->createXFrameConfig(); + $configData[] = $this->configGenerator->createModeConfig(); + $configData[] = $this->configGenerator->createCacheHostsConfig($data); + + foreach ($this->configOptionsCollection as $configOptionsList) { + $configData[] = $configOptionsList->createConfig($data, $deploymentConfig); + } + + return $configData; + } + + /** + * @inheritdoc + */ + public function validate(array $options, DeploymentConfig $deploymentConfig) + { + $errors = []; + + if (isset($options[ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS])) { + $errors[] = $this->validateHttpCacheHosts($options[ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS]); + } + + if (isset($options[ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX])) { + $errors[] = $this->validateDbPrefix($options[ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX]); + } + + if (isset($options[ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION]) && + !$options[ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION]) { + $errors[] = $this->validateDbSettings($options, $deploymentConfig); + } + + foreach ($this->configOptionsCollection as $configOptionsList) { + $errors[] = $configOptionsList->validate($options, $deploymentConfig); + } + + $errors[] = $this->validateEncryptionKey($options); + + return array_merge([], ...$errors); + } + + /** + * Returns other parts of existing db config in case is only one value is presented by user + * + * @param array $options + * @param DeploymentConfig $deploymentConfig + * + * @return array + */ + private function getDbSettings(array $options, DeploymentConfig $deploymentConfig) + { + if ($options[ConfigOptionsListConstants::INPUT_KEY_DB_NAME] === null) { + $options[ConfigOptionsListConstants::INPUT_KEY_DB_NAME] = + $deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_NAME + ); + } + + if ($options[ConfigOptionsListConstants::INPUT_KEY_DB_HOST] === null) { + $options[ConfigOptionsListConstants::INPUT_KEY_DB_HOST] = + $deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_HOST + ); + } + + if ($options[ConfigOptionsListConstants::INPUT_KEY_DB_USER] === null) { + $options[ConfigOptionsListConstants::INPUT_KEY_DB_USER] = + $deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_USER + ); + } + + if ($options[ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD] === null) { + $options[ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD] = + $deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_PASSWORD + ); + } + + return $options; + } + + /** + * Validates encryption key param + * + * @param array $options + * @return string[] + */ + private function validateEncryptionKey(array $options) + { + $errors = []; + + if (isset($options[ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY]) + && !$this->encryptionKeyValidator->isValid($options[ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY]) + ) { + $errors[] = 'Invalid encryption key. Encryption key must be 32 character string without any white space.'; + } + + return $errors; + } + + /** + * Validate http cache hosts + * + * @param string $option + * @return string[] + */ + private function validateHttpCacheHosts($option) + { + $errors = []; + if (!preg_match('/^[\-\w:,.]+$/', $option) + ) { + $errors[] = "Invalid http cache hosts '{$option}'"; + } + return $errors; + } + + /** + * Validate Db table prefix + * + * @param string $option + * @return string[] + */ + private function validateDbPrefix($option) + { + $errors = []; + try { + $this->dbValidator->checkDatabaseTablePrefix($option); + } catch (\InvalidArgumentException $exception) { + $errors[] = $exception->getMessage(); + } + return $errors; + } + + /** + * Validate Db settings + * + * @param array $options + * @param DeploymentConfig $deploymentConfig + * @return string[] + */ + private function validateDbSettings(array $options, DeploymentConfig $deploymentConfig) + { + $errors = []; + + if ($options[ConfigOptionsListConstants::INPUT_KEY_DB_NAME] !== null + || $options[ConfigOptionsListConstants::INPUT_KEY_DB_HOST] !== null + || $options[ConfigOptionsListConstants::INPUT_KEY_DB_USER] !== null + || $options[ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD] !== null + ) { + try { + $options = $this->getDbSettings($options, $deploymentConfig); + $driverOptions = $this->driverOptions->getDriverOptions($options); + + $this->dbValidator->checkDatabaseConnectionWithDriverOptions( + $options[ConfigOptionsListConstants::INPUT_KEY_DB_NAME], + $options[ConfigOptionsListConstants::INPUT_KEY_DB_HOST], + $options[ConfigOptionsListConstants::INPUT_KEY_DB_USER], + $options[ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD], + $driverOptions + ); + } catch (\Exception $exception) { + $errors[] = $exception->getMessage(); + } + } + return $errors; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Cache.php b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Cache.php new file mode 100644 index 0000000..43476f1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Cache.php @@ -0,0 +1,299 @@ + '127.0.0.1', + self::INPUT_KEY_CACHE_BACKEND_REDIS_DATABASE => '0', + self::INPUT_KEY_CACHE_BACKEND_REDIS_PORT => '6379', + self::INPUT_KEY_CACHE_BACKEND_REDIS_PASSWORD => '', + self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESS_DATA => '1', + self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESSION_LIB => '', + self::INPUT_KEY_CACHE_ALLOW_PARALLEL_CACHE_GENERATION => 'false', + ]; + + /** + * @var array + */ + private $validBackendCacheOptions = [ + self::INPUT_VALUE_CACHE_REDIS + ]; + + /** + * @var array + */ + private $inputKeyToConfigPathMap = [ + self::INPUT_KEY_CACHE_BACKEND_REDIS_SERVER => self::CONFIG_PATH_CACHE_BACKEND_SERVER, + self::INPUT_KEY_CACHE_BACKEND_REDIS_DATABASE => self::CONFIG_PATH_CACHE_BACKEND_DATABASE, + self::INPUT_KEY_CACHE_BACKEND_REDIS_PORT => self::CONFIG_PATH_CACHE_BACKEND_PORT, + self::INPUT_KEY_CACHE_BACKEND_REDIS_PASSWORD => self::CONFIG_PATH_CACHE_BACKEND_PASSWORD, + self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESS_DATA => self::CONFIG_PATH_CACHE_BACKEND_COMPRESS_DATA, + self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESSION_LIB => self::CONFIG_PATH_CACHE_BACKEND_COMPRESSION_LIB, + self::INPUT_KEY_CACHE_ALLOW_PARALLEL_CACHE_GENERATION => self::CONFIG_PATH_ALLOW_PARALLEL_CACHE_GENERATION, + ]; + + /** + * @var RedisConnectionValidator + */ + private $redisValidator; + + /** + * Construct the Cache ConfigOptionsList + * + * @param RedisConnectionValidator $redisValidator + */ + public function __construct(RedisConnectionValidator $redisValidator) + { + $this->redisValidator = $redisValidator; + } + + /** + * @inheritdoc + */ + public function getOptions() + { + return [ + new SelectConfigOption( + self::INPUT_KEY_CACHE_BACKEND, + SelectConfigOption::FRONTEND_WIZARD_SELECT, + $this->validBackendCacheOptions, + self::CONFIG_PATH_CACHE_BACKEND, + 'Default cache handler' + ), + new TextConfigOption( + self::INPUT_KEY_CACHE_BACKEND_REDIS_SERVER, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_CACHE_BACKEND_SERVER, + 'Redis server' + ), + new TextConfigOption( + self::INPUT_KEY_CACHE_BACKEND_REDIS_DATABASE, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_CACHE_BACKEND_DATABASE, + 'Database number for the cache' + ), + new TextConfigOption( + self::INPUT_KEY_CACHE_BACKEND_REDIS_PORT, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_CACHE_BACKEND_PORT, + 'Redis server listen port' + ), + new TextConfigOption( + self::INPUT_KEY_CACHE_BACKEND_REDIS_PASSWORD, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_CACHE_BACKEND_PASSWORD, + 'Redis server password' + ), + new TextConfigOption( + self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESS_DATA, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_CACHE_BACKEND_COMPRESS_DATA, + 'Set to 0 to disable compression (default is 1, enabled)' + ), + new TextConfigOption( + self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESSION_LIB, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_CACHE_BACKEND_COMPRESSION_LIB, + 'Compression lib to use [snappy,lzf,l4z,zstd,gzip] (leave blank to determine automatically)' + ), + new TextConfigOption( + self::INPUT_KEY_CACHE_ID_PREFIX, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_CACHE_ID_PREFIX, + 'ID prefix for cache keys' + ), + new FlagConfigOption( + self::INPUT_KEY_CACHE_ALLOW_PARALLEL_CACHE_GENERATION, + self::CONFIG_PATH_ALLOW_PARALLEL_CACHE_GENERATION, + 'Allow generate cache in non-blocking way' + ), + ]; + } + + /** + * @inheritdoc + */ + public function createConfig(array $options, DeploymentConfig $deploymentConfig) + { + $configData = new ConfigData(ConfigFilePool::APP_ENV); + if (isset($options[self::INPUT_KEY_CACHE_ID_PREFIX])) { + $configData->set(self::CONFIG_PATH_CACHE_ID_PREFIX, $options[self::INPUT_KEY_CACHE_ID_PREFIX]); + } elseif (!$deploymentConfig->get(self::CONFIG_PATH_CACHE_ID_PREFIX)) { + $configData->set(self::CONFIG_PATH_CACHE_ID_PREFIX, $this->generateCachePrefix()); + } + + if (isset($options[self::INPUT_KEY_CACHE_BACKEND])) { + if ($options[self::INPUT_KEY_CACHE_BACKEND] == self::INPUT_VALUE_CACHE_REDIS) { + $configData->set(self::CONFIG_PATH_CACHE_BACKEND, self::CONFIG_VALUE_CACHE_REDIS); + $this->setDefaultRedisConfig($deploymentConfig, $configData); + } else { + $configData->set(self::CONFIG_PATH_CACHE_BACKEND, $options[self::INPUT_KEY_CACHE_BACKEND]); + } + } + + foreach ($this->inputKeyToConfigPathMap as $inputKey => $configPath) { + if (isset($options[$inputKey])) { + $configData->set($configPath, $options[$inputKey]); + } + } + return $configData; + } + + /** + * @inheritdoc + */ + public function validate(array $options, DeploymentConfig $deploymentConfig) + { + $errors = []; + + $currentCacheBackend = $deploymentConfig->get(Cache::CONFIG_PATH_CACHE_BACKEND); + if (isset($options[self::INPUT_KEY_CACHE_BACKEND])) { + if ($options[self::INPUT_KEY_CACHE_BACKEND] == self::INPUT_VALUE_CACHE_REDIS) { + if (!$this->validateRedisConfig($options, $deploymentConfig)) { + $errors[] = 'Invalid Redis configuration. Could not connect to Redis server.'; + } + } + } elseif ($currentCacheBackend == self::CONFIG_VALUE_CACHE_REDIS) { + if (!$this->validateRedisConfig($options, $deploymentConfig)) { + $errors[] = 'Invalid Redis configuration. Could not connect to Redis server.'; + } + } + + if (isset($options[self::INPUT_KEY_CACHE_BACKEND]) + && !in_array($options[self::INPUT_KEY_CACHE_BACKEND], $this->validBackendCacheOptions) + ) { + $errors[] = "Invalid cache handler '{$options[self::INPUT_KEY_CACHE_BACKEND]}'"; + } + + return $errors; + } + + /** + * Validate that Redis connection succeeds for given configuration + * + * @param array $options + * @param DeploymentConfig $deploymentConfig + * @return bool + */ + private function validateRedisConfig(array $options, DeploymentConfig $deploymentConfig) + { + $config = []; + + $config['host'] = isset($options[self::INPUT_KEY_CACHE_BACKEND_REDIS_SERVER]) + ? $options[self::INPUT_KEY_CACHE_BACKEND_REDIS_SERVER] + : $deploymentConfig->get( + self::CONFIG_PATH_CACHE_BACKEND_SERVER, + $this->getDefaultConfigValue(self::INPUT_KEY_CACHE_BACKEND_REDIS_SERVER) + ); + + $config['port'] = isset($options[self::INPUT_KEY_CACHE_BACKEND_REDIS_PORT]) + ? $options[self::INPUT_KEY_CACHE_BACKEND_REDIS_PORT] + : $deploymentConfig->get( + self::CONFIG_PATH_CACHE_BACKEND_PORT, + $this->getDefaultConfigValue(self::INPUT_KEY_CACHE_BACKEND_REDIS_PORT) + ); + + $config['db'] = isset($options[self::INPUT_KEY_CACHE_BACKEND_REDIS_DATABASE]) + ? $options[self::INPUT_KEY_CACHE_BACKEND_REDIS_DATABASE] + : $deploymentConfig->get( + self::CONFIG_PATH_CACHE_BACKEND_DATABASE, + $this->getDefaultConfigValue(self::INPUT_KEY_CACHE_BACKEND_REDIS_DATABASE) + ); + + $config['password'] = isset($options[self::INPUT_KEY_CACHE_BACKEND_REDIS_PASSWORD]) + ? $options[self::INPUT_KEY_CACHE_BACKEND_REDIS_PASSWORD] + : $deploymentConfig->get( + self::CONFIG_PATH_CACHE_BACKEND_PASSWORD, + $this->getDefaultConfigValue(self::INPUT_KEY_CACHE_BACKEND_REDIS_PASSWORD) + ); + + return $this->redisValidator->isValidConnection($config); + } + + /** + * Set default values for the Redis configuration. + * + * @param DeploymentConfig $deploymentConfig + * @param ConfigData $configData + * @return ConfigData + */ + private function setDefaultRedisConfig(DeploymentConfig $deploymentConfig, ConfigData $configData) + { + foreach ($this->inputKeyToConfigPathMap as $inputKey => $configPath) { + $configData->set($configPath, $deploymentConfig->get($configPath, $this->getDefaultConfigValue($inputKey))); + } + + return $configData; + } + + /** + * Get default value for input key + * + * @param string $inputKey + * @return string + */ + private function getDefaultConfigValue($inputKey) + { + if (isset($this->defaultConfigValues[$inputKey])) { + return $this->defaultConfigValues[$inputKey]; + } else { + return ''; + } + } + + /** + * Generate default cache ID prefix based on installation dir + * + * @return string + */ + private function generateCachePrefix(): string + { + // phpcs:ignore Magento2.Functions.DiscouragedFunction + return substr(\hash('sha256', dirname(__DIR__, 6)), 0, 3) . '_'; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Directory.php b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Directory.php new file mode 100644 index 0000000..0e9cc65 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Directory.php @@ -0,0 +1,91 @@ +set( + self::CONFIG_PATH_DOCUMENT_ROOT_IS_PUB, + \filter_var($options[self::INPUT_KEY_DOCUMENT_ROOT_IS_PUB], FILTER_VALIDATE_BOOLEAN) + ); + } + + return $configData; + } + + /** + * Return options from Directory configuration. + * + * @return \Magento\Framework\Setup\Option\AbstractConfigOption[]|SelectConfigOption[] + */ + public function getOptions() + { + return [ + new SelectConfigOption( + self::INPUT_KEY_DOCUMENT_ROOT_IS_PUB, + SelectConfigOption::FRONTEND_WIZARD_SELECT, + $this->selectOptions, + self::CONFIG_PATH_DOCUMENT_ROOT_IS_PUB, + 'Flag to show is Pub is on root, can be true or false only', + true + ), + ]; + } + + /** + * Validate options. + * + * @param array $options + * @param DeploymentConfig $deploymentConfig + * @return array|string[] + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function validate(array $options, DeploymentConfig $deploymentConfig) + { + return []; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/DriverOptions.php b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/DriverOptions.php new file mode 100644 index 0000000..6d5235c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/DriverOptions.php @@ -0,0 +1,52 @@ + ConfigOptionsListConstants::INPUT_KEY_DB_SSL_KEY, + ConfigOptionsListConstants::KEY_MYSQL_SSL_CERT => ConfigOptionsListConstants::INPUT_KEY_DB_SSL_CERT, + ConfigOptionsListConstants::KEY_MYSQL_SSL_CA => ConfigOptionsListConstants::INPUT_KEY_DB_SSL_CA, + ConfigOptionsListConstants::KEY_MYSQL_SSL_VERIFY => ConfigOptionsListConstants::INPUT_KEY_DB_SSL_VERIFY + ]; + $driverOptions = []; + foreach ($driverOptionKeys as $configKey => $driverOptionKey) { + if ($this->optionExists($options, $driverOptionKey)) { + $driverOptions[$configKey] = $options[$driverOptionKey]; + } + } + return $driverOptions; + } + + /** + * Verify if option exists. + * + * @param array $options + * @param string $driverOptionKey + * @return bool + */ + private function optionExists($options, $driverOptionKey): bool + { + return isset($options[$driverOptionKey]) + && ($options[$driverOptionKey] === false || !empty($options[$driverOptionKey])); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Lock.php b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Lock.php new file mode 100644 index 0000000..76cd7aa --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Lock.php @@ -0,0 +1,340 @@ + [ + self::INPUT_KEY_LOCK_PROVIDER => self::CONFIG_PATH_LOCK_PROVIDER, + self::INPUT_KEY_LOCK_DB_PREFIX => self::CONFIG_PATH_LOCK_DB_PREFIX, + ], + LockBackendFactory::LOCK_ZOOKEEPER => [ + self::INPUT_KEY_LOCK_PROVIDER => self::CONFIG_PATH_LOCK_PROVIDER, + self::INPUT_KEY_LOCK_ZOOKEEPER_HOST => self::CONFIG_PATH_LOCK_ZOOKEEPER_HOST, + self::INPUT_KEY_LOCK_ZOOKEEPER_PATH => self::CONFIG_PATH_LOCK_ZOOKEEPER_PATH, + ], + LockBackendFactory::LOCK_CACHE => [ + self::INPUT_KEY_LOCK_PROVIDER => self::CONFIG_PATH_LOCK_PROVIDER, + ], + LockBackendFactory::LOCK_FILE => [ + self::INPUT_KEY_LOCK_PROVIDER => self::CONFIG_PATH_LOCK_PROVIDER, + self::INPUT_KEY_LOCK_FILE_PATH => self::CONFIG_PATH_LOCK_FILE_PATH, + ], + ]; + + /** + * The list of default values + * + * @var array + */ + private $defaultConfigValues = [ + self::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_DB, + self::INPUT_KEY_LOCK_ZOOKEEPER_PATH => ZookeeperLock::DEFAULT_PATH, + ]; + + /** + * @inheritdoc + */ + public function getOptions() + { + return [ + new SelectConfigOption( + self::INPUT_KEY_LOCK_PROVIDER, + SelectConfigOption::FRONTEND_WIZARD_SELECT, + $this->validLockProviders, + self::CONFIG_PATH_LOCK_PROVIDER, + 'Lock provider name', + LockBackendFactory::LOCK_DB + ), + new TextConfigOption( + self::INPUT_KEY_LOCK_DB_PREFIX, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_LOCK_DB_PREFIX, + 'Installation specific lock prefix to avoid lock conflicts' + ), + new TextConfigOption( + self::INPUT_KEY_LOCK_ZOOKEEPER_HOST, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_LOCK_ZOOKEEPER_HOST, + 'Host and port to connect to Zookeeper cluster. For example: 127.0.0.1:2181' + ), + new TextConfigOption( + self::INPUT_KEY_LOCK_ZOOKEEPER_PATH, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_LOCK_ZOOKEEPER_PATH, + 'The path where Zookeeper will save locks. The default path is: ' . ZookeeperLock::DEFAULT_PATH + ), + new TextConfigOption( + self::INPUT_KEY_LOCK_FILE_PATH, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_LOCK_FILE_PATH, + 'The path where file locks will be saved.' + ), + ]; + } + + /** + * @inheritdoc + */ + public function createConfig(array $options, DeploymentConfig $deploymentConfig) + { + $configData = new ConfigData(ConfigFilePool::APP_ENV); + $configData->setOverrideWhenSave(true); + $lockProvider = $this->getLockProvider($options, $deploymentConfig); + + $this->setDefaultConfiguration($configData, $deploymentConfig, $lockProvider); + + foreach ($this->mappingInputKeyToConfigPath[$lockProvider] as $input => $path) { + if (isset($options[$input])) { + $configData->set($path, $options[$input]); + } + } + + return $configData; + } + + /** + * @inheritdoc + */ + public function validate(array $options, DeploymentConfig $deploymentConfig) + { + $lockProvider = $this->getLockProvider($options, $deploymentConfig); + switch ($lockProvider) { + case LockBackendFactory::LOCK_ZOOKEEPER: + $errors = $this->validateZookeeperConfig($options, $deploymentConfig); + break; + case LockBackendFactory::LOCK_FILE: + $errors = $this->validateFileConfig($options, $deploymentConfig); + break; + case LockBackendFactory::LOCK_CACHE: + case LockBackendFactory::LOCK_DB: + $errors = []; + break; + default: + $errors[] = 'The lock provider ' . $lockProvider . ' does not exist.'; + } + + return $errors; + } + + /** + * Validates File locks configuration + * + * @param array $options + * @param DeploymentConfig $deploymentConfig + * @return array + */ + private function validateFileConfig(array $options, DeploymentConfig $deploymentConfig): array + { + $errors = []; + + $path = $options[self::INPUT_KEY_LOCK_FILE_PATH] + ?? $deploymentConfig->get( + self::CONFIG_PATH_LOCK_FILE_PATH, + $this->getDefaultValue(self::INPUT_KEY_LOCK_FILE_PATH) + ); + + if (!$path) { + $errors[] = 'The path needs to be a non-empty string.'; + } + + return $errors; + } + + /** + * Validates Zookeeper configuration + * + * @param array $options + * @param DeploymentConfig $deploymentConfig + * @return array + */ + private function validateZookeeperConfig(array $options, DeploymentConfig $deploymentConfig): array + { + $errors = []; + + if (!extension_loaded(LockBackendFactory::LOCK_ZOOKEEPER)) { + $errors[] = 'php extension Zookeeper is not installed.'; + } + + $host = $options[self::INPUT_KEY_LOCK_ZOOKEEPER_HOST] + ?? $deploymentConfig->get( + self::CONFIG_PATH_LOCK_ZOOKEEPER_HOST, + $this->getDefaultValue(self::INPUT_KEY_LOCK_ZOOKEEPER_HOST) + ); + $path = $options[self::INPUT_KEY_LOCK_ZOOKEEPER_PATH] + ?? $deploymentConfig->get( + self::CONFIG_PATH_LOCK_ZOOKEEPER_PATH, + $this->getDefaultValue(self::INPUT_KEY_LOCK_ZOOKEEPER_PATH) + ); + + if (!$path) { + $errors[] = 'Zookeeper path needs to be a non-empty string.'; + } + + if (!$host) { + $errors[] = 'Zookeeper host is should be set.'; + } + + return $errors; + } + + /** + * Returns the name of lock provider + * + * @param array $options + * @param DeploymentConfig $deploymentConfig + * @return string + */ + private function getLockProvider(array $options, DeploymentConfig $deploymentConfig): string + { + if (!isset($options[self::INPUT_KEY_LOCK_PROVIDER])) { + return (string) $deploymentConfig->get( + self::CONFIG_PATH_LOCK_PROVIDER, + $this->getDefaultValue(self::INPUT_KEY_LOCK_PROVIDER) + ); + } + + return (string) $options[self::INPUT_KEY_LOCK_PROVIDER]; + } + + /** + * Sets default configuration for locks + * + * @param ConfigData $configData + * @param DeploymentConfig $deploymentConfig + * @param string $lockProvider + * @return ConfigData + */ + private function setDefaultConfiguration( + ConfigData $configData, + DeploymentConfig $deploymentConfig, + string $lockProvider + ) { + foreach ($this->mappingInputKeyToConfigPath[$lockProvider] as $input => $path) { + // do not set default value null for lock db prefix + if ($input !== self::INPUT_KEY_LOCK_DB_PREFIX) { + $configData->set($path, $deploymentConfig->get($path, $this->getDefaultValue($input))); + } + } + + return $configData; + } + + /** + * Returns default value by input key + * + * If default value is not set returns null + * + * @param string $inputKey + * @return mixed|null + */ + private function getDefaultValue(string $inputKey) + { + return $this->defaultConfigValues[$inputKey] ?? null; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/PageCache.php b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/PageCache.php new file mode 100644 index 0000000..b8ca3dd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/PageCache.php @@ -0,0 +1,292 @@ + '127.0.0.1', + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE => '1', + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT => '6379', + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD => '', + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESS_DATA => '0', + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESSION_LIB => '', + ]; + + /** + * @var array + */ + private $validPageCacheOptions = [ + self::INPUT_VALUE_PAGE_CACHE_REDIS + ]; + + /** + * @var array + */ + private $inputKeyToConfigPathMap = [ + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER => self::CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER, + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE => self::CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE, + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT => self::CONFIG_PATH_PAGE_CACHE_BACKEND_PORT, + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD => self::CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD, + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESS_DATA => self::CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESS_DATA, + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESSION_LIB => + self::CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESSION_LIB, + ]; + + /** + * @var RedisConnectionValidator + */ + private $redisValidator; + + /** + * Construct the PageCache ConfigOptionsList + * + * @param RedisConnectionValidator $redisValidator + */ + public function __construct(RedisConnectionValidator $redisValidator) + { + $this->redisValidator = $redisValidator; + } + + /** + * @inheritdoc + */ + public function getOptions() + { + return [ + new SelectConfigOption( + self::INPUT_KEY_PAGE_CACHE_BACKEND, + SelectConfigOption::FRONTEND_WIZARD_SELECT, + $this->validPageCacheOptions, + self::CONFIG_PATH_PAGE_CACHE_BACKEND, + 'Default cache handler' + ), + new TextConfigOption( + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER, + 'Redis server' + ), + new TextConfigOption( + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE, + 'Database number for the cache' + ), + new TextConfigOption( + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_PAGE_CACHE_BACKEND_PORT, + 'Redis server listen port' + ), + new TextConfigOption( + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD, + 'Redis server password' + ), + new TextConfigOption( + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESS_DATA, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESS_DATA, + 'Set to 1 to compress the full page cache (use 0 to disable)' + ), + new TextConfigOption( + self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_COMPRESSION_LIB, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESSION_LIB, + 'Compression library to use [snappy,lzf,l4z,zstd,gzip] (leave blank to determine automatically)' + ), + new TextConfigOption( + self::INPUT_KEY_PAGE_CACHE_ID_PREFIX, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_PAGE_CACHE_ID_PREFIX, + 'ID prefix for cache keys' + ), + ]; + } + + /** + * @inheritdoc + */ + public function createConfig(array $options, DeploymentConfig $deploymentConfig) + { + $configData = new ConfigData(ConfigFilePool::APP_ENV); + if (isset($options[self::INPUT_KEY_PAGE_CACHE_ID_PREFIX])) { + $configData->set(self::CONFIG_PATH_PAGE_CACHE_ID_PREFIX, $options[self::INPUT_KEY_PAGE_CACHE_ID_PREFIX]); + } elseif (!$deploymentConfig->get(self::CONFIG_PATH_PAGE_CACHE_ID_PREFIX)) { + $configData->set(self::CONFIG_PATH_PAGE_CACHE_ID_PREFIX, $this->generateCachePrefix()); + } + + if (isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND])) { + if ($options[self::INPUT_KEY_PAGE_CACHE_BACKEND] == self::INPUT_VALUE_PAGE_CACHE_REDIS) { + $configData->set(self::CONFIG_PATH_PAGE_CACHE_BACKEND, self::CONFIG_VALUE_PAGE_CACHE_REDIS); + $this->setDefaultRedisConfig($deploymentConfig, $configData); + } else { + $configData->set(self::CONFIG_PATH_PAGE_CACHE_BACKEND, $options[self::INPUT_KEY_PAGE_CACHE_BACKEND]); + } + } + + foreach ($this->inputKeyToConfigPathMap as $inputKey => $configPath) { + if (isset($options[$inputKey])) { + $configData->set($configPath, $options[$inputKey]); + } + } + + return $configData; + } + + /** + * @inheritdoc + */ + public function validate(array $options, DeploymentConfig $deploymentConfig) + { + $errors = []; + + $currentCacheBackend = $deploymentConfig->get(PageCache::CONFIG_PATH_PAGE_CACHE_BACKEND); + if (isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND])) { + if ($options[self::INPUT_KEY_PAGE_CACHE_BACKEND] == self::INPUT_VALUE_PAGE_CACHE_REDIS) { + if (!$this->validateRedisConfig($options, $deploymentConfig)) { + $errors[] = 'Invalid Redis configuration. Could not connect to Redis server.'; + } + } + } elseif ($currentCacheBackend == self::CONFIG_VALUE_PAGE_CACHE_REDIS) { + if (!$this->validateRedisConfig($options, $deploymentConfig)) { + $errors[] = 'Invalid Redis configuration. Could not connect to Redis server.'; + } + } + + if (isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND]) + && !in_array($options[self::INPUT_KEY_PAGE_CACHE_BACKEND], $this->validPageCacheOptions) + ) { + $errors[] = "Invalid cache handler '{$options[self::INPUT_KEY_PAGE_CACHE_BACKEND]}'"; + } + + return $errors; + } + + /** + * Validate that Redis connection succeeds for given configuration + * + * @param array $options + * @param DeploymentConfig $deploymentConfig + * @return bool + */ + private function validateRedisConfig(array $options, DeploymentConfig $deploymentConfig) + { + $config = []; + + $config['host'] = isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER]) + ? $options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER] + : $deploymentConfig->get( + self::CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER, + $this->getDefaultConfigValue(self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_SERVER) + ); + + $config['port'] = isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT]) + ? $options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT] + : $deploymentConfig->get( + self::CONFIG_PATH_PAGE_CACHE_BACKEND_PORT, + $this->getDefaultConfigValue(self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PORT) + ); + + $config['db'] = isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE]) + ? $options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE] + : $deploymentConfig->get( + self::CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE, + $this->getDefaultConfigValue(self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_DATABASE) + ); + + $config['password'] = isset($options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD]) + ? $options[self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD] + : $deploymentConfig->get( + self::CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD, + $this->getDefaultConfigValue(self::INPUT_KEY_PAGE_CACHE_BACKEND_REDIS_PASSWORD) + ); + + return $this->redisValidator->isValidConnection($config); + } + + /** + * Set default values for Redis configuration + * + * @param DeploymentConfig $deploymentConfig + * @param ConfigData $configData + * @return ConfigData + */ + private function setDefaultRedisConfig(DeploymentConfig $deploymentConfig, ConfigData $configData) + { + foreach ($this->inputKeyToConfigPathMap as $inputKey => $configPath) { + $configData->set($configPath, $deploymentConfig->get($configPath, $this->getDefaultConfigValue($inputKey))); + } + + return $configData; + } + + /** + * Get the default value for input key + * + * @param string $inputKey + * @return string + */ + private function getDefaultConfigValue($inputKey) + { + if (isset($this->defaultConfigValues[$inputKey])) { + return $this->defaultConfigValues[$inputKey]; + } else { + return ''; + } + } + + /** + * Generate default cache ID prefix based on installation dir + * + * @return string + */ + private function generateCachePrefix(): string + { + // phpcs:ignore Magento2.Functions.DiscouragedFunction + return substr(\hash('sha256', dirname(__DIR__, 6)), 0, 3) . '_'; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Session.php b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Session.php new file mode 100644 index 0000000..4a3a02b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigOptionsList/Session.php @@ -0,0 +1,394 @@ + ConfigOptionsListConstants::SESSION_SAVE_FILES, + self::INPUT_KEY_SESSION_REDIS_HOST => '127.0.0.1', + self::INPUT_KEY_SESSION_REDIS_PORT => '6379', + self::INPUT_KEY_SESSION_REDIS_PASSWORD => '', + self::INPUT_KEY_SESSION_REDIS_TIMEOUT => '2.5', + self::INPUT_KEY_SESSION_REDIS_PERSISTENT_IDENTIFIER => '', + self::INPUT_KEY_SESSION_REDIS_DATABASE => '2', + self::INPUT_KEY_SESSION_REDIS_COMPRESSION_THRESHOLD => '2048', + self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY => 'gzip', + self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL => '1', + self::INPUT_KEY_SESSION_REDIS_MAX_CONCURRENCY => '6', + self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_FRONTEND => '5', + self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_ADMINHTML => '30', + self::INPUT_KEY_SESSION_REDIS_FIRST_LIFETIME => '600', + self::INPUT_KEY_SESSION_REDIS_BOT_FIRST_LIFETIME => '60', + self::INPUT_KEY_SESSION_REDIS_BOT_LIFETIME => '7200', + self::INPUT_KEY_SESSION_REDIS_DISABLE_LOCKING => '0', + self::INPUT_KEY_SESSION_REDIS_MIN_LIFETIME => '60', + self::INPUT_KEY_SESSION_REDIS_MAX_LIFETIME => '2592000', + self::INPUT_KEY_SESSION_REDIS_SENTINEL_VERIFY_MASTER => '0', + self::INPUT_KEY_SESSION_REDIS_SENTINEL_CONNECT_RETRIES => '5', + ]; + + /** + * @var array + */ + private $validSaveHandlers = [ + ConfigOptionsListConstants::SESSION_SAVE_FILES, + ConfigOptionsListConstants::SESSION_SAVE_DB, + ConfigOptionsListConstants::SESSION_SAVE_REDIS + ]; + + /** + * @var array + */ + private $validCompressionLibraries = ['gzip', 'lzf', 'lz4', 'snappy']; + + /** + * Associates input keys with config paths for Redis settings + * + * @var array + */ + private $redisInputKeyToConfigPathMap = [ + self::INPUT_KEY_SESSION_REDIS_HOST => self::CONFIG_PATH_SESSION_REDIS_HOST, + self::INPUT_KEY_SESSION_REDIS_PORT => self::CONFIG_PATH_SESSION_REDIS_PORT, + self::INPUT_KEY_SESSION_REDIS_PASSWORD => self::CONFIG_PATH_SESSION_REDIS_PASSWORD, + self::INPUT_KEY_SESSION_REDIS_TIMEOUT => self::CONFIG_PATH_SESSION_REDIS_TIMEOUT, + self::INPUT_KEY_SESSION_REDIS_PERSISTENT_IDENTIFIER => self::CONFIG_PATH_SESSION_REDIS_PERSISTENT_IDENTIFIER, + self::INPUT_KEY_SESSION_REDIS_DATABASE => self::CONFIG_PATH_SESSION_REDIS_DATABASE, + self::INPUT_KEY_SESSION_REDIS_COMPRESSION_THRESHOLD => self::CONFIG_PATH_SESSION_REDIS_COMPRESSION_THRESHOLD, + self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY => self::CONFIG_PATH_SESSION_REDIS_COMPRESSION_LIBRARY, + self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL => self::CONFIG_PATH_SESSION_REDIS_LOG_LEVEL, + self::INPUT_KEY_SESSION_REDIS_MAX_CONCURRENCY => self::CONFIG_PATH_SESSION_REDIS_MAX_CONCURRENCY, + self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_FRONTEND => self::CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_FRONTEND, + self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_ADMINHTML => self::CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_ADMINHTML, + self::INPUT_KEY_SESSION_REDIS_FIRST_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_FIRST_LIFETIME, + self::INPUT_KEY_SESSION_REDIS_BOT_FIRST_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_BOT_FIRST_LIFETIME, + self::INPUT_KEY_SESSION_REDIS_BOT_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_BOT_LIFETIME, + self::INPUT_KEY_SESSION_REDIS_DISABLE_LOCKING => self::CONFIG_PATH_SESSION_REDIS_DISABLE_LOCKING, + self::INPUT_KEY_SESSION_REDIS_MIN_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_MIN_LIFETIME, + self::INPUT_KEY_SESSION_REDIS_MAX_LIFETIME => self::CONFIG_PATH_SESSION_REDIS_MAX_LIFETIME, + self::INPUT_KEY_SESSION_REDIS_SENTINEL_MASTER => self::CONFIG_PATH_SESSION_REDIS_SENTINEL_MASTER, + self::INPUT_KEY_SESSION_REDIS_SENTINEL_SERVERS => self::CONFIG_PATH_SESSION_REDIS_SENTINEL_SERVERS, + self::INPUT_KEY_SESSION_REDIS_SENTINEL_CONNECT_RETRIES => + self::CONFIG_PATH_SESSION_REDIS_SENTINEL_CONNECT_RETRIES, + self::INPUT_KEY_SESSION_REDIS_SENTINEL_VERIFY_MASTER => self::CONFIG_PATH_SESSION_REDIS_SENTINEL_VERIFY_MASTER, + ]; + + /** + * @inheritdoc + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function getOptions() + { + return [ + new SelectConfigOption( + ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE, + SelectConfigOption::FRONTEND_WIZARD_SELECT, + $this->validSaveHandlers, + ConfigOptionsListConstants::CONFIG_PATH_SESSION_SAVE, + 'Session save handler', + $this->getDefaultConfigValue(ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE) + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_HOST, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_HOST, + 'Fully qualified host name, IP address, or absolute path if using UNIX sockets' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_PORT, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_PORT, + 'Redis server listen port' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_PASSWORD, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_PASSWORD, + 'Redis server password' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_TIMEOUT, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_TIMEOUT, + 'Connection timeout, in seconds' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_PERSISTENT_IDENTIFIER, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_PERSISTENT_IDENTIFIER, + 'Unique string to enable persistent connections' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_DATABASE, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_DATABASE, + 'Redis database number' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_COMPRESSION_THRESHOLD, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_COMPRESSION_THRESHOLD, + 'Redis compression threshold' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_COMPRESSION_LIBRARY, + $this->getCompressionLibDescription() + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_LOG_LEVEL, + 'Redis log level. Values: 0 (least verbose) to 7 (most verbose)' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_MAX_CONCURRENCY, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_MAX_CONCURRENCY, + 'Maximum number of processes that can wait for a lock on one session' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_FRONTEND, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_FRONTEND, + 'Number of seconds to wait before trying to break a lock for frontend session' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_BREAK_AFTER_ADMINHTML, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_BREAK_AFTER_ADMINHTML, + 'Number of seconds to wait before trying to break a lock for Admin session' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_FIRST_LIFETIME, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_FIRST_LIFETIME, + 'Lifetime, in seconds, of session for non-bots on the first write (use 0 to disable)' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_BOT_FIRST_LIFETIME, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_BOT_FIRST_LIFETIME, + 'Lifetime, in seconds, of session for bots on the first write (use 0 to disable)' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_BOT_LIFETIME, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_BOT_LIFETIME, + 'Lifetime of session for bots on subsequent writes (use 0 to disable)' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_DISABLE_LOCKING, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_DISABLE_LOCKING, + 'Redis disable locking. Values: false (default), true' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_MIN_LIFETIME, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_MIN_LIFETIME, + 'Redis min session lifetime, in seconds' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_MAX_LIFETIME, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_MAX_LIFETIME, + 'Redis max session lifetime, in seconds' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_SENTINEL_MASTER, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_SENTINEL_MASTER, + 'Redis Sentinel master' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_SENTINEL_SERVERS, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::INPUT_KEY_SESSION_REDIS_SENTINEL_SERVERS, + 'Redis Sentinel servers, comma separated' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_SENTINEL_VERIFY_MASTER, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_SENTINEL_VERIFY_MASTER, + 'Redis Sentinel verify master. Values: false (default), true' + ), + new TextConfigOption( + self::INPUT_KEY_SESSION_REDIS_SENTINEL_CONNECT_RETRIES, + TextConfigOption::FRONTEND_WIZARD_TEXT, + self::CONFIG_PATH_SESSION_REDIS_SENTINEL_CONNECT_RETRIES, + 'Redis Sentinel connect retries.' + ), + ]; + } + + /** + * @inheritdoc + */ + public function createConfig(array $options, DeploymentConfig $deploymentConfig) + { + $configData = new ConfigData(ConfigFilePool::APP_ENV); + + //Set session-save option + if (isset($options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE])) { + $configData->set( + ConfigOptionsListConstants::CONFIG_PATH_SESSION_SAVE, + $options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE] + ); + + if ($options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE] + == ConfigOptionsListConstants::SESSION_SAVE_REDIS + ) { + $this->setDefaultRedisConfig($deploymentConfig, $configData); + } + } + + //Set all Redis options that are specified + foreach ($this->redisInputKeyToConfigPathMap as $inputKey => $configPath) { + if (isset($options[$inputKey])) { + $configData->set($configPath, $options[$inputKey]); + } + } + + return $configData; + } + + /** + * @inheritdoc + */ + public function validate(array $options, DeploymentConfig $deploymentConfig) + { + $errors = []; + if (isset($options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE]) + && !in_array($options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE], $this->validSaveHandlers) + ) { + $errors[] = "Invalid session handler '{$options[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE]}'"; + } + + if (isset($options[self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY]) + && !in_array($options[self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY], $this->validCompressionLibraries) + ) { + $errors[] = "Invalid Redis compression library " + . "'{$options[self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY]}'"; + } + + if (isset($options[self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL])) { + $level = $options[self::INPUT_KEY_SESSION_REDIS_LOG_LEVEL]; + if (($level < 0) || ($level > 7)) { + $errors[] = "Invalid Redis log level '{$level}'. Valid range is 0-7, inclusive."; + } + } + + return $errors; + } + + /** + * Set the session Redis config based on defaults + * + * @param DeploymentConfig $deploymentConfig + * @param ConfigData $configData + * @return ConfigData + */ + private function setDefaultRedisConfig(DeploymentConfig $deploymentConfig, ConfigData $configData) + { + foreach ($this->redisInputKeyToConfigPathMap as $inputKey => $configPath) { + $configData->set($configPath, $deploymentConfig->get($configPath, $this->getDefaultConfigValue($inputKey))); + } + + return $configData; + } + + /** + * Get the default value for input key + * + * @param string $inputKey + * @return string + */ + private function getDefaultConfigValue($inputKey) + { + if (isset($this->defaultConfigValues[$inputKey])) { + return $this->defaultConfigValues[$inputKey]; + } else { + return ''; + } + } + + /** + * Format the description for compression lib option + * + * @return string + */ + private function getCompressionLibDescription() + { + $default = $this->getDefaultConfigValue(self::INPUT_KEY_SESSION_REDIS_COMPRESSION_LIBRARY); + $otherLibs = array_diff($this->validCompressionLibraries, [$default]); + + return 'Redis compression library. Values: ' . $default . ' (default), ' . implode(', ', $otherLibs); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ConfigOptionsListCollector.php b/magento/setup/src/Magento/Setup/Model/ConfigOptionsListCollector.php new file mode 100644 index 0000000..ec81e49 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ConfigOptionsListCollector.php @@ -0,0 +1,112 @@ +directoryList = $directoryList; + $this->filesystem = $filesystem; + $this->objectManagerProvider = $objectManagerProvider; + $this->serviceLocator = $serviceLocator; + $this->componentRegistrar = $componentRegistrar; + } + + /** + * Auto discover ConfigOptionsList class and collect them. + * + * These classes should reside in /Setup directories. + * + * @return ConfigOptionsListInterface[] + * @throws \Magento\Setup\Exception + */ + public function collectOptionsLists() + { + $optionsList = []; + + $modulePaths = $this->componentRegistrar->getPaths(ComponentRegistrar::MODULE); + foreach (array_keys($modulePaths) as $moduleName) { + $optionsClassName = str_replace('_', '\\', $moduleName) . '\Setup\ConfigOptionsList'; + if (class_exists($optionsClassName)) { + $optionsClass = $this->objectManagerProvider->get()->create($optionsClassName); + if ($optionsClass instanceof ConfigOptionsListInterface) { + $optionsList[$moduleName] = $optionsClass; + } + } + } + + // check Setup + $setupOptionsClassName = \Magento\Setup\Model\ConfigOptionsList::class; + if (class_exists($setupOptionsClassName)) { + $setupOptionsClass = $this->serviceLocator->get($setupOptionsClassName); + if ($setupOptionsClass instanceof ConfigOptionsListInterface) { + $optionsList['setup'] = $setupOptionsClass; + } + } + + return $optionsList; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/CryptKeyGenerator.php b/magento/setup/src/Magento/Setup/Model/CryptKeyGenerator.php new file mode 100644 index 0000000..5bd7646 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/CryptKeyGenerator.php @@ -0,0 +1,56 @@ +random = $random; + } + + /** + * Generates & returns a string to be used as crypt key. + * + * @return string + * @throws \Magento\Framework\Exception\LocalizedException + */ + public function generate() + { + // md5() here is not for cryptographic use. It used for generate encryption key itself + // and do not encrypt any passwords + // phpcs:ignore Magento2.Security.InsecureFunction + return md5($this->getRandomString()); + } + + /** + * Returns a random string. + * + * @return string + * @throws \Magento\Framework\Exception\LocalizedException + */ + private function getRandomString() + { + return $this->random->getRandomString(ConfigOptionsListConstants::STORE_KEY_RANDOM_STRING_SIZE); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/CryptKeyGeneratorInterface.php b/magento/setup/src/Magento/Setup/Model/CryptKeyGeneratorInterface.php new file mode 100644 index 0000000..f96f9b3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/CryptKeyGeneratorInterface.php @@ -0,0 +1,22 @@ +groupCollectionFactory = $groupCollectionFactory; + $this->addressDataGenerator = $addressDataGenerator; + $this->config = $config; + } + + /** + * Generate customer data by index + * + * @param int $customerId + * @return array + */ + public function generate($customerId) + { + return [ + 'customer' => [ + 'email' => sprintf('user_%s@example.com', $customerId), + 'group_id' => $this->getGroupIdForCustomer($customerId) + ], + + 'addresses' => $this->generateAddresses(), + ]; + } + + /** + * Get customer group id for customer + * @param int $customerId + * @return int + */ + private function getGroupIdForCustomer($customerId) + { + if (!$this->customerGroupIds) { + $this->customerGroupIds = $this->groupCollectionFactory->create()->getAllIds(); + } + + return $this->customerGroupIds[$customerId % count($this->customerGroupIds)]; + } + + /** + * Generate customer addresses with distribution + * 50% as shipping address + * 50% as billing address + * + * @return array + */ + private function generateAddresses() + { + $addresses = []; + $addressesCount = $this->config['addresses-count']; + + while ($addressesCount) { + $addresses[] = $this->addressDataGenerator->generateAddress(); + $addressesCount--; + } + + return $addresses; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Customer/CustomerDataGeneratorFactory.php b/magento/setup/src/Magento/Setup/Model/Customer/CustomerDataGeneratorFactory.php new file mode 100644 index 0000000..a86cc18 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Customer/CustomerDataGeneratorFactory.php @@ -0,0 +1,44 @@ +objectManager = $objectManager; + } + + /** + * Create CustomerGenerator instance with specified configuration + * + * @param array $config + * @return \Magento\Setup\Model\Customer\CustomerDataGenerator + */ + public function create(array $config) + { + return $this->objectManager->create( + \Magento\Setup\Model\Customer\CustomerDataGenerator::class, + [ + 'addressGenerator' => $this->objectManager->create( + \Magento\Setup\Model\Address\AddressDataGenerator::class + ), + 'config' => $config + ] + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/DataGenerator.php b/magento/setup/src/Magento/Setup/Model/DataGenerator.php new file mode 100644 index 0000000..09304e7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/DataGenerator.php @@ -0,0 +1,91 @@ +dictionaryFile = $dictionaryFile; + $this->readData(); + $this->generatedValues = []; + } + + /** + * Read data from file. + * + * @return void + */ + protected function readData() + { + $f = fopen($this->dictionaryFile, 'r'); + while (!feof($f) && is_array($line = fgetcsv($f))) { + $this->dictionaryData[] = $line[0]; + } + } + + /** + * Generate string of random word data. + * + * @param int $minAmountOfWords + * @param int $maxAmountOfWords + * @param string|null $key + * @return string + */ + public function generate($minAmountOfWords, $maxAmountOfWords, $key = null) + { + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $numberOfWords = mt_rand($minAmountOfWords, $maxAmountOfWords); + $result = ''; + + if ($key === null || !array_key_exists($key, $this->generatedValues)) { + for ($i = 0; $i < $numberOfWords; $i++) { + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $result .= ' ' . $this->dictionaryData[mt_rand(0, count($this->dictionaryData) - 1)]; + } + $result = trim($result); + + if ($key !== null) { + $this->generatedValues[$key] = $result; + } + } else { + $result = $this->generatedValues[$key]; + } + return $result; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/DateTime/DateTimeProvider.php b/magento/setup/src/Magento/Setup/Model/DateTime/DateTimeProvider.php new file mode 100644 index 0000000..e28c13f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/DateTime/DateTimeProvider.php @@ -0,0 +1,63 @@ +tzProvider = $tzProvider; + $this->objectManagerProvider = $objectManagerProvider; + } + + /** + * Get instance of DateTime + * + * @return \Magento\Framework\Stdlib\DateTime\DateTime + */ + public function get() + { + if (!$this->dateTime) { + $this->dateTime = $this->objectManagerProvider->get()->create( + \Magento\Framework\Stdlib\DateTime\DateTime::class, + ['localeDate' => $this->tzProvider->get()] + ); + } + return $this->dateTime; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/DateTime/TimeZoneProvider.php b/magento/setup/src/Magento/Setup/Model/DateTime/TimeZoneProvider.php new file mode 100644 index 0000000..048e6c1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/DateTime/TimeZoneProvider.php @@ -0,0 +1,55 @@ +objectManagerProvider = $objectManagerProvider; + } + + /** + * Get instance of Timezone + * + * @return \Magento\Framework\Stdlib\DateTime\Timezone + */ + public function get() + { + if (!$this->timezone) { + $this->timezone = $this->objectManagerProvider->get()->create( + \Magento\Framework\Stdlib\DateTime\Timezone::class, + ['scopeType' => ScopeConfigInterface::SCOPE_TYPE_DEFAULT] + ); + } + return $this->timezone; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/DeclarationInstaller.php b/magento/setup/src/Magento/Setup/Model/DeclarationInstaller.php new file mode 100644 index 0000000..4313b03 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/DeclarationInstaller.php @@ -0,0 +1,62 @@ +operationsExecutor = $operationsExecutor; + $this->schemaConfig = $schemaConfig; + $this->schemaDiff = $schemaDiff; + } + + /** + * Install Schema in declarative way. + * + * @param array $requestData -> Data params which comes from UI or from CLI. + * @return void + */ + public function installSchema(array $requestData) + { + $declarativeSchema = $this->schemaConfig->getDeclarationConfig(); + $dbSchema = $this->schemaConfig->getDbConfig(); + $diff = $this->schemaDiff->diff($declarativeSchema, $dbSchema); + $this->operationsExecutor->execute($diff, $requestData); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/DefaultDescriptionGenerator.php b/magento/setup/src/Magento/Setup/Model/DefaultDescriptionGenerator.php new file mode 100644 index 0000000..1be3178 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/DefaultDescriptionGenerator.php @@ -0,0 +1,34 @@ +defaultDescription = $defaultDescription; + } + + /** + * @param int $entityIndex + * @return string + */ + public function generate($entityIndex) + { + return sprintf($this->defaultDescription, $entityIndex); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/DescriptionGenerator.php b/magento/setup/src/Magento/Setup/Model/Description/DescriptionGenerator.php new file mode 100644 index 0000000..1424167 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/DescriptionGenerator.php @@ -0,0 +1,84 @@ +paragraphGenerator = $paragraphGenerator; + $this->mixinManager = $mixinManager; + $this->descriptionConfig = $descriptionConfig; + } + + /** + * Generate description and apply mixin to it + * + * @return string + */ + public function generate() + { + $description = $this->generateRawDescription(); + + if (isset($this->descriptionConfig['mixin'])) { + $description = $this->mixinManager->apply($description, $this->descriptionConfig['mixin']['tags']); + } + + return $description; + } + + /** + * Generate raw description without mixin + * + * @return string + */ + private function generateRawDescription() + { + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $paragraphsCount = mt_rand( + $this->descriptionConfig['paragraphs']['count-min'], + $this->descriptionConfig['paragraphs']['count-max'] + ); + $descriptionParagraphs = ''; + + while ($paragraphsCount) { + $descriptionParagraphs .= $this->paragraphGenerator->generate(); + $descriptionParagraphs .= PHP_EOL; + $paragraphsCount--; + } + + $descriptionParagraphs = rtrim($descriptionParagraphs); + + return $descriptionParagraphs; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/DescriptionParagraphGenerator.php b/magento/setup/src/Magento/Setup/Model/Description/DescriptionParagraphGenerator.php new file mode 100644 index 0000000..d7dab8d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/DescriptionParagraphGenerator.php @@ -0,0 +1,60 @@ +sentenceGenerator = $sentenceGenerator; + $this->paragraphConfig = $paragraphConfig; + } + + /** + * Generate paragraph for description + * + * @return string + */ + public function generate() + { + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $sentencesCount = mt_rand( + $this->paragraphConfig['sentences']['count-min'], + $this->paragraphConfig['sentences']['count-max'] + ); + $sentences = ''; + + while ($sentencesCount) { + $sentences .= $this->sentenceGenerator->generate(); + $sentences .= ' '; + $sentencesCount--; + } + + $sentences = rtrim($sentences); + + return $sentences; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/DescriptionSentenceGenerator.php b/magento/setup/src/Magento/Setup/Model/Description/DescriptionSentenceGenerator.php new file mode 100644 index 0000000..c20a8c9 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/DescriptionSentenceGenerator.php @@ -0,0 +1,58 @@ +dictionary = $dictionary; + $this->sentenceConfig = $sentenceConfig; + } + + /** + * Generate sentence for description + * + * @return string + */ + public function generate() + { + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $sentenceWordsCount = mt_rand( + $this->sentenceConfig['words']['count-min'], + $this->sentenceConfig['words']['count-max'] + ); + $sentence = ''; + + while ($sentenceWordsCount) { + $sentence .= $this->dictionary->getRandWord(); + $sentence .= ' '; + $sentenceWordsCount--; + } + + return ucfirst(rtrim($sentence)) . '.'; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/Mixin/BoldMixin.php b/magento/setup/src/Magento/Setup/Model/Description/Mixin/BoldMixin.php new file mode 100644 index 0000000..f60108c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/Mixin/BoldMixin.php @@ -0,0 +1,57 @@ +randomWordSelector = $randomWordSelector; + $this->wordWrapper = $wordWrapper; + } + + /** + * Add tag to text at random positions + * + * @param string $text + * @return string + */ + public function apply($text) + { + if (empty(strip_tags(trim($text)))) { + return $text; + } + + $rawText = strip_tags($text); + + return $this->wordWrapper->wrapWords( + $text, + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $this->randomWordSelector->getRandomWords($rawText, mt_rand(5, 8)), + '%s' + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/Mixin/BrakeMixin.php b/magento/setup/src/Magento/Setup/Model/Description/Mixin/BrakeMixin.php new file mode 100644 index 0000000..ad22db7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/Mixin/BrakeMixin.php @@ -0,0 +1,26 @@ + tag to text after each new line (\r\n) + * + * @param string $text + * @return string + */ + public function apply($text) + { + return implode( + PHP_EOL . '
' . PHP_EOL, + explode(PHP_EOL, trim($text)) + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/Mixin/DescriptionMixinInterface.php b/magento/setup/src/Magento/Setup/Model/Description/Mixin/DescriptionMixinInterface.php new file mode 100644 index 0000000..a9f8f4f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/Mixin/DescriptionMixinInterface.php @@ -0,0 +1,20 @@ + header with text before each new line (\r\n) + * + * @param string $text + * @return string + */ + public function apply($text) + { + $paragraphs = explode(PHP_EOL, trim($text)); + $magicLengthNumber = 10; + + foreach ($paragraphs as &$paragraph) { + $rawText = trim(strip_tags($paragraph)); + if (empty($rawText)) { + continue; + } + + $headerText = substr($rawText, 0, strpos($rawText, ' ', $magicLengthNumber)); + $paragraph = '

' . $headerText . '

' . PHP_EOL . $paragraph; + } + + return implode(PHP_EOL, $paragraphs); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/Mixin/Helper/RandomWordSelector.php b/magento/setup/src/Magento/Setup/Model/Description/Mixin/Helper/RandomWordSelector.php new file mode 100644 index 0000000..32a189f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/Mixin/Helper/RandomWordSelector.php @@ -0,0 +1,38 @@ +randomWordSelector = $randomWordSelector; + $this->wordWrapper = $wordWrapper; + } + + /** + * Add tag to text at random positions + * + * @param string $text + * @return string + */ + public function apply($text) + { + if (empty(strip_tags(trim($text)))) { + return $text; + } + + $rawText = strip_tags($text); + + return $this->wordWrapper->wrapWords( + $text, + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $this->randomWordSelector->getRandomWords($rawText, mt_rand(5, 8)), + '%s' + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/Mixin/MixinFactory.php b/magento/setup/src/Magento/Setup/Model/Description/Mixin/MixinFactory.php new file mode 100644 index 0000000..e9715f7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/Mixin/MixinFactory.php @@ -0,0 +1,76 @@ + SpanMixin::class, + self::BOLD_MIXIN => BoldMixin::class, + self::BRAKE_MIXIN => BrakeMixin::class, + self::PARAGRAPH_MIXIN => ParagraphMixin::class, + self::HEADER_MIXIN => HeaderMixin::class, + self::ITALIC_MIXIN => ItalicMixin::class, + ]; + + /** + * @var \Magento\Framework\ObjectManagerInterface + */ + private $objectManager; + + /** + * @param \Magento\Framework\ObjectManagerInterface $objectManager + * @throws \Magento\Setup\Exception + */ + public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Create mixin by type + * + * @param string $mixinType + * @return \Magento\Setup\Model\Description\Mixin\DescriptionMixinInterface + * @throws \InvalidArgumentException + */ + public function create($mixinType) + { + if (!isset($this->typeClassMap[$mixinType])) { + throw new \InvalidArgumentException(sprintf('Undefined mixin type: %s.', $mixinType)); + } + + $mixin = $this->objectManager->get($this->typeClassMap[$mixinType]); + + if (!$mixin instanceof \Magento\Setup\Model\Description\Mixin\DescriptionMixinInterface) { + throw new \InvalidArgumentException( + sprintf( + 'Class "%s" must implement \Magento\Setup\Model\Description\Mixin\DescriptionMixinInterface.', + get_class($mixin) + ) + ); + } + + return $mixin; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/Mixin/ParagraphMixin.php b/magento/setup/src/Magento/Setup/Model/Description/Mixin/ParagraphMixin.php new file mode 100644 index 0000000..7ed8716 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/Mixin/ParagraphMixin.php @@ -0,0 +1,28 @@ +

tags + * + * @param string $text + * @return string + */ + public function apply($text) + { + return '

' + . implode( + '

' . PHP_EOL . '

', + explode(PHP_EOL, trim($text)) + ) + . '

'; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/Mixin/SpanMixin.php b/magento/setup/src/Magento/Setup/Model/Description/Mixin/SpanMixin.php new file mode 100644 index 0000000..91cd0d0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/Mixin/SpanMixin.php @@ -0,0 +1,57 @@ +randomWordSelector = $randomWordSelector; + $this->wordWrapper = $wordWrapper; + } + + /** + * Add tag to text at random positions + * + * @param string $text + * @return string + */ + public function apply($text) + { + if (empty(strip_tags(trim($text)))) { + return $text; + } + + $rawText = strip_tags($text); + + return $this->wordWrapper->wrapWords( + $text, + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $this->randomWordSelector->getRandomWords($rawText, mt_rand(5, 8)), + '%s' + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Description/MixinManager.php b/magento/setup/src/Magento/Setup/Model/Description/MixinManager.php new file mode 100644 index 0000000..43e4a47 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Description/MixinManager.php @@ -0,0 +1,41 @@ +mixinFactory = $mixinFactory; + } + + /** + * Apply list of mixin to description + * + * @param string $description + * @param array $mixinList + * @return mixed + */ + public function apply($description, array $mixinList) + { + foreach ($mixinList as $mixinType) { + $description = $this->mixinFactory->create($mixinType)->apply($description); + } + + return $description; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/DescriptionGeneratorInterface.php b/magento/setup/src/Magento/Setup/Model/DescriptionGeneratorInterface.php new file mode 100644 index 0000000..960402d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/DescriptionGeneratorInterface.php @@ -0,0 +1,20 @@ +dictionaryFilePath = $dictionaryFilePath; + } + + /** + * Returns random word from dictionary + * + * @return string + */ + public function getRandWord() + { + if ($this->dictionary === null) { + $this->readDictionary(); + } + + // mt_rand() here is not for cryptographic use. + // phpcs:ignore Magento2.Security.InsecureFunction + $randIndex = mt_rand(0, count($this->dictionary) - 1); + return trim($this->dictionary[$randIndex]); + } + + /** + * Read dictionary file + * + * @return void + * @throws \Magento\Setup\Exception + */ + private function readDictionary() + { + if (!is_readable($this->dictionaryFilePath)) { + throw new \Magento\Setup\Exception( + sprintf('Description file %s not found or is not readable', $this->dictionaryFilePath) + ); + } + + $rows = file($this->dictionaryFilePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + + if ($rows === false) { + throw new \Magento\Setup\Exception( + sprintf('Error occurred while reading dictionary file %s', $this->dictionaryFilePath) + ); + } + + if (empty($rows)) { + throw new \Magento\Setup\Exception( + sprintf('Dictionary file %s is empty', $this->dictionaryFilePath) + ); + } + + $this->dictionary = \SplFixedArray::fromArray($rows); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/AutoIncrement.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/AutoIncrement.php new file mode 100644 index 0000000..605077d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/AutoIncrement.php @@ -0,0 +1,45 @@ +resource = $resource; + } + + /** + * Get value of auto_increment_increment variable. + * + * @return int + */ + public function getIncrement() + { + if ($this->incrementValue === null) { + $increment = $this->resource->getConnection()->fetchRow('SHOW VARIABLES LIKE "auto_increment_increment"'); + $this->incrementValue = !empty($increment['Value']) ? (int)$increment['Value'] : 1; + } + return $this->incrementValue; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/BundleProductGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/BundleProductGenerator.php new file mode 100644 index 0000000..df999f8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/BundleProductGenerator.php @@ -0,0 +1,252 @@ + simple product sku pattern, which will be used as configurable variation, + * '_bundle_options' => amount of options per bundle product, + * '_bundle_products_per_option' => amount of simple products per each option, + * ] + * @see ProductGenerator + * @see BundleProductTemplateGenerator + */ +class BundleProductGenerator +{ + /** + * @var array + */ + private $sequenceValues = [ + 'sequence_product_bundle_option' => null, + 'sequence_product_bundle_selection' => null + ]; + + /** + * @var ProductGeneratorFactory + */ + private $productGeneratorFactory; + + /** + * @var ResourceConnection + */ + private $resource; + + /** + * @param ProductGeneratorFactory $productGeneratorFactory + * @param ResourceConnection $resource|null + */ + public function __construct( + ProductGeneratorFactory $productGeneratorFactory, + ResourceConnection $resource = null + ) { + $this->productGeneratorFactory = $productGeneratorFactory; + + $this->resource = $resource ?: ObjectManager::getInstance()->get( + ResourceConnection::class + ); + } + + /** + * Generates bundle products. + * + * @param int $products + * @param array $fixtureMap + * + * @return void + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function generate($products, $fixtureMap) + { + $this->productGeneratorFactory->create([ + 'customTableMap' => [ + 'catalog_product_bundle_option' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['option_id'] = $this->generateOptionId( + $entityNumber, + $bind['option_id'], + $fixture + ); + + $bind['parent_id'] = $productId; + } + + return $binds; + }, + ], + 'sequence_product_bundle_option' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['sequence_value'] = $this->generateSequenceId( + 'sequence_product_bundle_option' + ); + } + + return $binds; + }, + ], + 'catalog_product_bundle_option_value' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['option_id'] = $this->generateOptionId( + $entityNumber, + $bind['option_id'], + $fixture + ); + + $bind['parent_product_id'] = $productId; + } + + return $binds; + }, + ], + 'catalog_product_bundle_selection' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['selection_id'] = $this->generateSelectionId( + $entityNumber, + $bind['selection_id'], + $fixture + ); + + $bind['parent_product_id'] = $productId; + + $bind['option_id'] = $this->generateOptionId( + $entityNumber, + $bind['option_id'], + $fixture + ); + + $bind['product_id'] = $this->generateSimpleProductId( + $bind['product_id'], + $entityNumber, + $fixture + ); + + $bind['selection_price_type'] = $fixture['priceType']($bind['product_id']); + $bind['selection_price_value'] = $fixture['price']($bind['product_id']); + } + + return $binds; + }, + ], + 'sequence_product_bundle_selection' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['sequence_value'] = $this->generateSequenceId( + 'sequence_product_bundle_selection' + ); + } + + return $binds; + }, + ], + 'catalog_product_relation' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['parent_id'] = $productId; + $bind['child_id'] = $this->generateSimpleProductId( + $bind['child_id'], + $entityNumber, + $fixture + ); + } + return $binds; + }, + ], + ] + ])->generate($products, $fixtureMap); + } + + /** + * Generates an option Id. + * + * @param int $entityNumber + * @param int $originalOptionId + * @param array $fixture + * + * @return int|null + */ + private function generateOptionId($entityNumber, $originalOptionId, array $fixture) + { + if ($originalOptionId) { + return $fixture['_bundle_options'] * ($entityNumber + 1) + $originalOptionId; + } + + return $originalOptionId; + } + + /** + * Generates a selection Id. + * + * @param int $entityNumber + * @param int $originalSelectionId + * @param array $fixture + * + * @return int|null + */ + private function generateSelectionId($entityNumber, $originalSelectionId, array $fixture) + { + if ($originalSelectionId) { + $selectionsPerProduct = $fixture['_bundle_products_per_option'] * $fixture['_bundle_options']; + + return $selectionsPerProduct * ($entityNumber + 1) + $originalSelectionId; + } + + return $originalSelectionId; + } + + /** + * Generates an Id for the given sequence table. + * + * @param string $tableName + * + * @return int + */ + private function generateSequenceId($tableName) + { + if (!$this->sequenceValues[$tableName]) { + $connection = $this->resource->getConnection(); + + $this->sequenceValues[$tableName] = $connection->fetchOne( + $connection->select()->from( + $this->resource->getTableName($tableName), + 'MAX(`sequence_value`)' + ) + ); + } + + return ++$this->sequenceValues[$tableName]; + } + + /** + * Generate value of simple product id which is used for $entityNumber bundle product as option item + * + * @param int $previousProductId + * @param int $entityNumber + * @param array $fixture + * @return mixed + */ + private function generateSimpleProductId($previousProductId, $entityNumber, array $fixture) + { + return $previousProductId + + $entityNumber * $fixture['_bundle_products_per_option'] * $fixture['_bundle_options']; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/BundleProductTemplateGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/BundleProductTemplateGenerator.php new file mode 100644 index 0000000..791ced0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/BundleProductTemplateGenerator.php @@ -0,0 +1,163 @@ +fixture = $fixture; + $this->productFactory = $productFactory; + $this->optionFactory = $optionFactory; + $this->linkFactory = $linkFactory; + } + + /** + * {@inheritdoc} + */ + public function generateEntity() + { + $product = $this->getProductTemplate( + $this->fixture['attribute_set_id'] + ); + $product->save(); + + return $product; + } + + /** + * Get product template + * + * @param int $attributeSet + * @return ProductInterface + */ + private function getProductTemplate($attributeSet) + { + $bundleOptions = $this->fixture['_bundle_options']; + $bundleProductsPerOption = $this->fixture['_bundle_products_per_option']; + $bundleVariationSkuPattern = $this->fixture['_bundle_variation_sku_pattern']; + $productRandomizerNumber = crc32(random_int(1, PHP_INT_MAX)); + $bundleProduct = $this->productFactory->create([ + 'data' => [ + 'attribute_set_id' => $attributeSet, + 'type_id' => Type::TYPE_BUNDLE, + 'name' => 'template name' . $productRandomizerNumber, + 'url_key' => 'template-url' . $productRandomizerNumber, + 'sku' => 'template_sku_bundle' . $productRandomizerNumber, + 'price' => 10, + 'visibility' => Visibility::VISIBILITY_BOTH, + 'status' => Status::STATUS_ENABLED, + 'website_ids' => [1], + 'category_ids' => isset($this->fixture['category_ids']) ? [2] : null, + 'weight' => 1, + 'description' => 'description', + 'short_description' => 'short description', + 'tax_class_id' => 2, //'taxable goods', + 'price_type' => \Magento\Bundle\Model\Product\Price::PRICE_TYPE_FIXED, + 'price_view' => 1, + 'stock_data' => [ + 'use_config_manage_stock' => 1, + 'qty' => 100500, + 'is_qty_decimal' => 0, + 'is_in_stock' => 1 + ], + 'can_save_bundle_selections' => true, + 'affect_bundle_product_selections' => true, + + ] + ]); + + $bundleProductOptions = []; + $variationN = 0; + for ($i = 1; $i <= $bundleOptions; $i++) { + $option = $this->optionFactory->create(['data' => [ + 'title' => 'Bundle Product Items ' . $i, + 'default_title' => 'Bundle Product Items ' . $i, + 'type' => 'select', + 'required' => 1, + 'delete' => '', + 'position' => $bundleOptions - $i, + 'option_id' => '', + ]]); + $option->setSku($bundleProduct->getSku()); + + $links = []; + for ($linkN = 1; $linkN <= $bundleProductsPerOption; $linkN++) { + $variationN++; + $link = $this->linkFactory->create(['data' => [ + 'sku' => sprintf($bundleVariationSkuPattern, $variationN), + 'qty' => 1, + 'can_change_qty' => 1, + 'position' => $linkN - 1, + 'price_type' => 0, + 'price' => 0.0, + 'option_id' => '', + 'is_default' => $linkN === 1, + ]]); + $links[] = $link; + } + $option->setProductLinks($links); + $bundleProductOptions[] = $option; + } + + $extension = $bundleProduct->getExtensionAttributes(); + $extension->setBundleProductOptions($bundleProductOptions); + $bundleProduct->setExtensionAttributes($extension); + // Need for set "has_options" field + $bundleProduct->setBundleOptionsData($bundleProductOptions); + $bundleSelections = array_map(function ($option) { + return array_map(function ($link) { + return $link->getData(); + }, $option->getProductLinks()); + }, $bundleProductOptions); + $bundleProduct->setBundleSelectionsData($bundleSelections); + + return $bundleProduct; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ConfigurableProductGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ConfigurableProductGenerator.php new file mode 100644 index 0000000..61a9035 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ConfigurableProductGenerator.php @@ -0,0 +1,129 @@ + simple product sku pattern, which will be used as configurable variation, + * '_attributes_count' => amount of attributes on which configurable product is based, + * '_variation_count' => amount of generated variations, + * '_attributes' => product attributes on which configurable product is based , + * ] + * @see ProductGenerator + * @see ConfigurableProductTemplateGenerator + */ +class ConfigurableProductGenerator +{ + /** + * @var ProductGeneratorFactory + */ + private $productGeneratorFactory; + + /** + * @var AutoIncrement + */ + private $autoIncrement; + + /** + * @param ProductGeneratorFactory $productGeneratorFactory + * @param AutoIncrement $autoIncrement + */ + public function __construct( + ProductGeneratorFactory $productGeneratorFactory, + AutoIncrement $autoIncrement + ) { + $this->productGeneratorFactory = $productGeneratorFactory; + $this->autoIncrement = $autoIncrement; + } + + /** + * Generate bundle products products + * + * @param int $products + * @param array $fixtureMap + * @return void + */ + public function generate($products, $fixtureMap) + { + $this->productGeneratorFactory->create([ + 'customTableMap' => [ + 'catalog_product_super_attribute_label' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['product_super_attribute_id'] = $this->generateSuperAttributeId( + $bind['product_super_attribute_id'], + $entityNumber, + $fixture + ); + } + return $binds; + }, + ], + 'catalog_product_super_link' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['parent_id'] = $productId; + $bind['product_id'] = $this->generateSimpleProductId( + $bind['product_id'], + $entityNumber, + $fixture + ); + } + return $binds; + }, + ], + 'catalog_product_relation' => [ + 'entity_id_field' => EntityGenerator::SKIP_ENTITY_ID_BINDING, + 'handler' => function ($productId, $entityNumber, $fixture, $binds) { + foreach ($binds as &$bind) { + $bind['parent_id'] = $productId; + $bind['child_id'] = $this->generateSimpleProductId( + $bind['child_id'], + $entityNumber, + $fixture + ); + } + return $binds; + }, + ], + ] + ])->generate($products, $fixtureMap); + } + + /** + * Generate value of option_id for $entityNumber bundle product based on previous option_id + * + * @param int $superAttributeId + * @param int $entityNumber + * @param array $fixture + * @return int + */ + private function generateSuperAttributeId($superAttributeId, $entityNumber, array $fixture) + { + return $superAttributeId + ($entityNumber + 1) * $fixture['_attributes_count'] + * $this->autoIncrement->getIncrement(); + } + + /** + * Generate value of simple product id which is used for $entityNumber bundle product as option item + * + * @param int $previousProductId + * @param int $entityNumber + * @param array $fixture + * @return mixed + */ + private function generateSimpleProductId($previousProductId, $entityNumber, array $fixture) + { + return $previousProductId + $entityNumber * $fixture['_variation_count']; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ConfigurableProductTemplateGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ConfigurableProductTemplateGenerator.php new file mode 100644 index 0000000..d70c21d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ConfigurableProductTemplateGenerator.php @@ -0,0 +1,162 @@ +fixture = $fixture; + $this->productFactory = $productFactory; + $this->optionFactory = $optionFactory; + $this->resourceConnection = $resourceConnection; + } + + /** + * {@inheritdoc} + */ + public function generateEntity() + { + $attributeSet = $this->fixture['attribute_set_id']; + $product = $this->getProductTemplate($attributeSet); + $product->save(); + + return $product; + } + + /** + * Get product template + * + * @param int $attributeSet + * @return ProductInterface + */ + private function getProductTemplate($attributeSet) + { + $productRandomizerNumber = crc32(random_int(1, PHP_INT_MAX)); + $product = $this->productFactory->create([ + 'data' => [ + 'attribute_set_id' => $attributeSet, + 'type_id' => Configurable::TYPE_CODE, + 'name' => 'template name' . $productRandomizerNumber, + 'url_key' => 'template-url' . $productRandomizerNumber, + 'sku' => 'template_sku_configurable' . $productRandomizerNumber, + 'meta_description' => 'Configurable Product', + 'meta_keyword' => $productRandomizerNumber, + 'meta_title' => $productRandomizerNumber, + 'price' => 10, + 'visibility' => Visibility::VISIBILITY_BOTH, + 'status' => Status::STATUS_ENABLED, + 'website_ids' => (array)$this->fixture['website_ids'](1, 0), + 'category_ids' => isset($this->fixture['category_ids']) ? [2] : null, + 'weight' => 1, + 'description' => 'description', + 'short_description' => 'short description', + 'tax_class_id' => 2, //'taxable goods', + 'stock_data' => [ + 'use_config_manage_stock' => 1, + 'qty' => 100500, + 'is_qty_decimal' => 0, + 'is_in_stock' => 1 + ], + // Need for set "has_options" field + 'can_save_configurable_attributes' => true, + 'configurable_attributes_data' => $this->fixture['_attributes'], + ] + ]); + + $attributes = []; + foreach ($this->fixture['_attributes'] as $index => $attribute) { + $attributeValues = []; + foreach ($attribute['values'] as $value) { + $attributeValues[] = [ + 'label' => $attribute['name'], + 'attribute_id' => $attribute['id'], + 'value_index' => $value + ]; + } + $attributes[] = [ + 'attribute_id' => $attribute['id'], + 'code' => $attribute['name'], + 'label' => $attribute['name'], + 'position' => $index, + 'values' => $attributeValues, + ]; + } + $configurableOptions = $this->optionFactory->create($attributes); + $extensionConfigurableAttributes = $product->getExtensionAttributes(); + $extensionConfigurableAttributes->setConfigurableProductOptions($configurableOptions); + $extensionConfigurableAttributes->setConfigurableProductLinks($this->getAssociatedProductIds()); + $product->setExtensionAttributes($extensionConfigurableAttributes); + + return $product; + } + + /** + * Get configurable variation ids. Retrieve first simple product id by sku pattern from DB and generate next values + * for all variations + * + * @return array + */ + private function getAssociatedProductIds() + { + $associatedProductIds = []; + $connection = $this->resourceConnection->getConnection(); + $firstSimpleProductId = $connection->fetchRow( + $connection->select() + ->from($this->resourceConnection->getTableName('catalog_product_entity')) + ->where('sku = ?', $this->fixture['_variation_sku_pattern']) + )['entity_id']; + + for ($i = 0; $i < $this->fixture['_variation_count']; $i++) { + $associatedProductIds[] = $firstSimpleProductId + $i; + } + + return $associatedProductIds; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/CustomerGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/CustomerGenerator.php new file mode 100644 index 0000000..f20060e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/CustomerGenerator.php @@ -0,0 +1,165 @@ +entityGeneratorFactory = $entityGeneratorFactory; + $this->customerTemplateGenerator = $customerTemplateGenerator; + $this->resourceConnection = $resourceConnection; + } + + /** + * Generate entities + * + * @param int $customers + * @param array $fixtureMap + * @return void + */ + public function generate($customers, array $fixtureMap) + { + $this->entityGeneratorFactory + ->create([ + 'entityType' => CustomerInterface::class, + 'customTableMap' => [ + 'customer_entity' => [ + 'handler' => $this->getCustomerEntityHandler() + ], + + 'customer_address_entity' => [ + 'handler' => $this->getCustomerAddressEntityHandler() + ] + ], + ])->generate( + $this->customerTemplateGenerator, + $customers, + function ($customerId) use ($fixtureMap) { + $fixtureMap['customer_data'] = call_user_func($fixtureMap['customer_data'], $customerId); + return $fixtureMap; + } + ); + + $this->addDefaultAddresses(); + } + + /** + * Creates closure that is used + * to replace default customer data with data from fixture + * + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * @return \Closure + */ + private function getCustomerEntityHandler() + { + return function ($entityId, $entityNumber, $fixtureMap, $binds) { + return array_map( + 'array_merge', + $binds, + array_fill(0, count($binds), $fixtureMap['customer_data']['customer']) + ); + }; + } + + /** + * Creates closure that is used + * to replace default customer address data with data from fixture + * + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * @return \Closure + */ + private function getCustomerAddressEntityHandler() + { + return function ($entityId, $entityNumber, $fixtureMap, $binds) { + return array_map( + 'array_merge', + array_fill(0, count($fixtureMap['customer_data']['addresses']), reset($binds)), + $fixtureMap['customer_data']['addresses'] + ); + }; + } + + /** + * Set default billing and shipping addresses for customer + * + * @return void + */ + private function addDefaultAddresses() + { + $batchSize = 10000; + $customerTableName = $this->resourceConnection->getTableName('customer_entity'); + $customerAddressTableName = $this->resourceConnection->getTableName('customer_address_entity'); + $customerMaxId = $this->getConnection()->fetchOne("select max(entity_id) from `$customerTableName`"); + for ($i = 1; $i < $customerMaxId; $i += $batchSize) { + $this->getConnection()->query( + " + update `$customerTableName` customer + join ( + select + parent_id, min(entity_id) as min, max(entity_id) as max + from `$customerAddressTableName` + group by parent_id + ) customer_address on customer_address.parent_id = customer.entity_id + set + customer.default_billing = customer_address.min, + customer.default_shipping = customer_address.max + where entity_id between :min and :max + ", + [ + 'min' => $i, + 'max' => $i + $batchSize + ] + ); + } + } + + /** + * @return \Magento\Framework\DB\Adapter\AdapterInterface + */ + private function getConnection() + { + if (null === $this->connection) { + $this->connection = $this->resourceConnection->getConnection(); + } + + return $this->connection; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/CustomerTemplateGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/CustomerTemplateGenerator.php new file mode 100644 index 0000000..4ecbfd3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/CustomerTemplateGenerator.php @@ -0,0 +1,160 @@ +customerFactory = $customerFactory; + $this->addressFactory = $addressFactory; + $this->storeManager = $storeManager; + $this->regionsCollectionFactory = $regionsCollectionFactory ?: ObjectManager::getInstance()->get( + RegionCollectionFactory::class + ); + } + + /** + * @inheritdoc + */ + public function generateEntity() + { + $customer = $this->getCustomerTemplate(); + $customer->save(); + $address = $this->getAddressTemplate($customer->getId()); + $address->save(); + + return $customer; + } + + /** + * Get customer template + * + * @return Customer + */ + private function getCustomerTemplate() + { + $customerRandomizerNumber = crc32(random_int(1, PHP_INT_MAX)); + + $now = new \DateTime(); + + return $this->customerFactory->create([ + 'data' => [ + 'email' => sprintf('user_%s@example.com', $customerRandomizerNumber), + 'confirmation' => null, + 'created_at' => $now->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT), + 'created_in' => 'Default', + 'default_billing' => '1', + 'default_shipping' => '1', + 'disable_auto_group_change' => '0', + 'dob' => '12-10-1991', + 'firstname' => 'Firstname', + 'gender' => 1, + 'group_id' => '1', + 'lastname' => 'Lastname', + 'middlename' => '', + 'password_hash' => '', + 'prefix' => null, + 'rp_token' => null, + 'rp_token_created_at' => null, + 'store_id' => $this->storeManager->getDefaultStoreView()->getId(), + 'suffix' => null, + 'taxvat' => null, + 'website_id' => $this->storeManager->getDefaultStoreView()->getWebsiteId(), + 'password' => '123123q', + ] + ]); + } + + /** + * Get address template. + * + * @param int $customerId + * @return Address + */ + private function getAddressTemplate($customerId) + { + return $this->addressFactory->create([ + 'data' => [ + 'parent_id' => $customerId, + 'attribute_set_id' => 2, + 'telephone' => 3468676, + 'postcode' => 75477, + 'country_id' => 'US', + 'city' => 'CityM', + 'company' => 'CompanyName', + 'street' => 'Green str, 67', + 'lastname' => 'Smith', + 'firstname' => 'John', + 'region_id' => $this->getFirstRegionId(), + 'fax' => '04040404', + 'middlename' => '', + 'prefix' => '', + 'region' => 'Arkansas', + 'suffix' => '', + 'vat_id' => '', + 'default_billing_' => '1', + 'default_shipping_' => '1', + ] + ]); + } + + /** + * Get first region id. + * + * @return mixed + */ + private function getFirstRegionId() + { + $regionsCollection = $this->regionsCollectionFactory->create(); + $regionsCollection->unshiftOrder('region_id', 'ASC'); + $region = $regionsCollection->getFirstItem(); + + return $region->getRegionId(); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/EntityGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/EntityGenerator.php new file mode 100644 index 0000000..cd9fd76 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/EntityGenerator.php @@ -0,0 +1,498 @@ + entity if field name which linked to entity table primary key + * or SKIP_ENTITY_ID_BINDING for do not set entity_id during generation + * 'handler' => function($entityId, $fixture, $binds) callback for process binding for custom table + * 'fields' => [key name in fixture for process custom bindings, ...] + * ] + */ + private $customTableMap; + + /** + * entity table class name + * + * @var string + */ + private $entityType; + + /** + * @var \Magento\Setup\Model\FixtureGenerator\SqlCollector + */ + private $sqlCollector; + + /** + * @var \Magento\Framework\App\ResourceConnection + */ + private $resourceConnection; + + /** + * @var \Magento\Eav\Model\ResourceModel\AttributeLoader + */ + private $attributeLoader; + + /** + * @var \Magento\Eav\Api\Data\AttributeInterface[] + */ + private $attributes; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface + */ + private $connection; + + /** + * @var array + */ + private $tableToEntityIdMap; + + /** + * @var string + */ + private $entityTable; + + /** + * List of tables where entity id information is stored + * + * @var array + */ + private $primaryEntityIdTables; + + /** + * @var \Magento\Framework\EntityManager\MetadataPool + */ + private $metadataPool; + + /** + * @var \Magento\Framework\EntityManager\EntityMetadataInterface + */ + private $entityMetadata; + + /** + * @var \Magento\Framework\EntityManager\Sequence\SequenceRegistry + */ + private $sequenceRegistry; + + /** + * @var bool + */ + private $isMappingInitialized = false; + + /** + * @var int + */ + private $bunchSize; + + /** + * @param SqlCollector $sqlCollector + * @param \Magento\Eav\Model\ResourceModel\AttributeLoader $attributeLoader + * @param \Magento\Framework\App\ResourceConnection $resourceConnection + * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool + * @param \Magento\Framework\EntityManager\Sequence\SequenceRegistry $sequenceRegistry + * @param string $entityType + * @param array $customTableMap + * @param int $bunchSize + */ + public function __construct( + \Magento\Setup\Model\FixtureGenerator\SqlCollector $sqlCollector, + \Magento\Eav\Model\ResourceModel\AttributeLoader $attributeLoader, + \Magento\Framework\App\ResourceConnection $resourceConnection, + \Magento\Framework\EntityManager\MetadataPool $metadataPool, + \Magento\Framework\EntityManager\Sequence\SequenceRegistry $sequenceRegistry, + $entityType, + $customTableMap = [], + $bunchSize = self::SQL_DEFAULT_BUNCH_AMOUNT + ) { + $this->sqlCollector = $sqlCollector; + $this->resourceConnection = $resourceConnection; + $this->attributeLoader = $attributeLoader; + $this->metadataPool = $metadataPool; + $this->sequenceRegistry = $sequenceRegistry; + $this->customTableMap = $customTableMap; + $this->entityType = $entityType; + $this->bunchSize = (int)$bunchSize; + } + + /** + * Generate entities + * + * @param TemplateEntityGeneratorInterface $entityGenerator + * @param int $entitiesAmount + * @param callable $fixture + * @throws LocalizedException + * @return void + */ + public function generate(TemplateEntityGeneratorInterface $entityGenerator, $entitiesAmount, callable $fixture) + { + $this->getConnection()->beginTransaction(); + try { + $this->sqlCollector->enable(); + $entity = $entityGenerator->generateEntity(); + $this->sqlCollector->disable(); + $entity->delete(); + $this->getConnection()->commit(); + } catch (\Exception $e) { + $this->getConnection()->rollBack(); + throw new LocalizedException( + __('Cannot generate entities - error occurred during template creation: %1', $e->getMessage()), + $e + ); + } + + $map = []; + $processed = 0; + $entitiesAmount = (int)$entitiesAmount; + gc_disable(); + for ($entityNumber = 0; $entityNumber < $entitiesAmount; $entityNumber++) { + $processed++; + $map = array_merge_recursive($map, $this->getSqlQueries($entity, $entityNumber, $fixture)); + + if ($processed % $this->bunchSize === 0 || $entityNumber === ($entitiesAmount - 1)) { + $this->saveEntities($map); + } + } + gc_enable(); + } + + /** + * Provide list of sql queries for create a new entity + * + * @param object $entity + * @param int $entityNumber + * @param callable $fixtureMap + * @return array + */ + private function getSqlQueries($entity, $entityNumber, callable $fixtureMap) + { + $metadata = $this->getEntityMetadata(); + $this->initializeMapping(); + + $entityId = $entity->getData($metadata->getIdentifierField()) + $entityNumber; + $entityLinkId = $entity->getData($metadata->getLinkField()) + $entityNumber; + $fixtureMap = $fixtureMap($entityId, $entityNumber); + + $sql = []; + foreach ($this->sqlCollector->getSql() as $pattern) { + list($binds, $table) = $pattern; + + if (!isset($sql[$table])) { + $sql[$table] = []; + } + + foreach ($binds as &$bind) { + if ($table === $this->getEntityTable()) { + $bind[$metadata->getLinkField()] = $entityLinkId; + $bind[$metadata->getIdentifierField()] = $entityId; + } + + if ($bind) { + $this->setNewBindValue($entityId, $entityNumber, $table, $bind, $fixtureMap); + } + if (self::SKIP_ENTITY_ID_BINDING === $this->getEntityIdField($table)) { + continue; + } + if ($this->getEntityIdField($table) === $metadata->getLinkField()) { + $bind[$this->getEntityIdField($table)] = $entityLinkId; + } else { + $bind[$this->getEntityIdField($table)] = $entityId; + } + } + + $binds = $this->bindWithCustomHandler($table, $entityId, $entityNumber, $fixtureMap, $binds); + $sql[$table] = array_merge($sql[$table], $binds); + } + + return $sql; + } + + /** + * If custom handler passed for table then override binds with it + * + * @param string $table + * @param int $entityId + * @param int $entityNumber + * @param array $fixtureMap + * @param array $binds + * @return array + */ + private function bindWithCustomHandler($table, $entityId, $entityNumber, $fixtureMap, $binds) + { + if (isset($this->customTableMap[$table]['handler']) + && is_callable($this->customTableMap[$table]['handler']) + ) { + $binds = $this->customTableMap[$table]['handler']($entityId, $entityNumber, $fixtureMap, $binds); + } + + return $binds; + } + + /** + * Save entities to DB and reset entities holder + * + * @param array $map + * @return void + * @throws LocalizedException + */ + private function saveEntities(array &$map) + { + $this->getConnection()->beginTransaction(); + try { + foreach ($map as $table => $data) { + $this->getConnection()->insertMultiple($table, $data); + } + $this->getConnection()->commit(); + } catch (\Exception $e) { + $this->getConnection()->rollBack(); + throw new LocalizedException( + __('Cannot save entity. Error occurred: %1', $e->getMessage()), + $e + ); + } + + $map = []; + } + + /** + * @return \Magento\Framework\DB\Adapter\AdapterInterface + */ + private function getConnection() + { + if (null === $this->connection) { + $this->connection = $this->resourceConnection->getConnection(); + } + + return $this->connection; + } + + /** + * @return \Magento\Framework\EntityManager\EntityMetadataInterface + */ + private function getEntityMetadata() + { + if (null === $this->entityMetadata) { + $this->entityMetadata = $this->metadataPool->getMetadata($this->entityType); + } + + return $this->entityMetadata; + } + + /** + * Get entity table name + * + * @return string + */ + private function getEntityTable() + { + if (null === $this->entityTable) { + $this->entityTable = $this->getEntityMetadata()->getEntityTable(); + } + + return $this->entityTable; + } + + /** + * Get field name for specific table where stored link to primary key of entity table + * Find field by FK to entity table + * + * @param string $table + * @return string + * @throws ValidatorException + */ + private function getEntityIdField($table) + { + if (!isset($this->tableToEntityIdMap[$table])) { + $foreignKey = null; + foreach ($this->primaryEntityIdTables as $primaryTable) { + $foreignKey = array_filter( + $this->getConnection()->getForeignKeys($table), + function ($ddl) use ($primaryTable) { + return $ddl['REF_TABLE_NAME'] === $primaryTable + && $ddl['REF_COLUMN_NAME'] === $this->getEntityIdField($primaryTable); + } + ); + if ($foreignKey) { + break; + } + } + if (!$foreignKey) { + throw new ValidatorException( + __('The entity ID field for the "%1" table wasn\'t found. Verify the field and try again.', $table) + ); + } + $this->tableToEntityIdMap[$table] = current($foreignKey)['COLUMN_NAME']; + } + + return $this->tableToEntityIdMap[$table]; + } + + /** + * Initialize map between table and entity id and convert table name to valid table name + * + * @return void + * @throws ValidatorException + */ + private function initializeMapping() + { + if (!$this->isMappingInitialized) { + $this->isMappingInitialized = true; + + $this->initCustomTables(); + + $this->primaryEntityIdTables = [ + $this->getEntityMetadata()->getEntityTable() + ]; + $entitySequence = $this->sequenceRegistry->retrieve($this->entityType); + if (isset($entitySequence['sequenceTable'])) { + $this->primaryEntityIdTables[] = $this->resourceConnection->getTableName( + $entitySequence['sequenceTable'] + ); + } + + foreach ($this->primaryEntityIdTables as $table) { + $ddl = array_filter( + $this->getConnection()->describeTable($table), + function ($data) { + return $data['PRIMARY'] === true; + } + ); + if (!$ddl) { + throw new ValidatorException( + __('The primary key for the "%1" table wasn\'t found. Verify the key and try again.', $table) + ); + } + $this->tableToEntityIdMap[$table] = current($ddl)['COLUMN_NAME']; + } + } + } + + /** + * Rebind table name with real name, initialize table map for tables without foreign key to entity table + * + * @return void + */ + private function initCustomTables() + { + $customTableData = [ + 'entity_id_field' => null, + 'handler' => null, + 'fields' => [], + ]; + $customTableMap = []; + foreach ($this->customTableMap as $table => $data) { + $table = $this->resourceConnection->getTableName($table); + $data = array_merge($customTableData, $data); + $customTableMap[$table] = $data; + if ($data['entity_id_field']) { + $this->tableToEntityIdMap[$table] = $data['entity_id_field']; + } + } + $this->customTableMap = $customTableMap; + } + + /** + * Get EAV attributes metadata for non-static attributes + * + * @return array + */ + private function getAttributesMetadata() + { + if (null === $this->attributes) { + foreach ($this->attributeLoader->getAttributes($this->entityType) as $attribute) { + if ($attribute->isStatic()) { + continue; + } + $this->attributes[$attribute->getBackendTable()][$attribute->getAttributeCode()] = [ + 'value_field' => 'value', + 'link_field' => 'attribute_id', + 'attribute_id' => $attribute->getAttributeId(), + ]; + } + } + + return $this->attributes; + } + + /** + * Set new bind value for new record + * + * @param int $entityId + * @param int $entityNumber + * @param string $table + * @param array $bind + * @param array $fixtureMap + * + * @return void + */ + private function setNewBindValue($entityId, $entityNumber, $table, array &$bind, array $fixtureMap) + { + $attributes = $this->getAttributesMetadata(); + if (isset($attributes[$table])) { + // Process binding new value for eav attributes + foreach ($fixtureMap as $fixtureField => $fixture) { + if (!isset($attributes[$table][$fixtureField])) { + continue; + } + $attribute = $attributes[$table][$fixtureField]; + + if (isset($bind[$attribute['link_field']]) + && $bind[$attribute['link_field']] === $attribute[$attribute['link_field']] + ) { + $bind[$attribute['value_field']] = $this->getBindValue($fixture, $entityId, $entityNumber); + break; + } + } + } elseif (isset($this->customTableMap[$table])) { + foreach ($this->customTableMap[$table]['fields'] as $field => $fixtureField) { + $bind[$field] = $this->getFixtureValue($fixtureField, $entityId, $entityNumber, $fixtureMap); + } + } + } + + /** + * @param string $fixtureField + * @param int $entityId + * @param int $entityNumber + * @param array $fixtureMap + * @return mixed|string + */ + private function getFixtureValue($fixtureField, $entityId, $entityNumber, array $fixtureMap) + { + $fixture = isset($fixtureMap[$fixtureField]) ? $fixtureMap[$fixtureField] : null; + return $fixture ? $this->getBindValue($fixture, $entityId, $entityNumber) : ''; + } + + /** + * @param callable|mixed $fixture + * @param int $entityId + * @param int $entityNumber + * @return string + */ + private function getBindValue($fixture, $entityId, $entityNumber) + { + $bindValue = is_callable($fixture) + ? call_user_func($fixture, $entityId, $entityNumber) + : $fixture; + + return is_array($bindValue) ? array_shift($bindValue) : $bindValue; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ProductGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ProductGenerator.php new file mode 100644 index 0000000..613572b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ProductGenerator.php @@ -0,0 +1,360 @@ + function ($entityId, $entityIndex) {return 'Product Name' . $entityIndex}, + * 'sku' => function ($entityId, $entityIndex) {return 'Product Sku' . $entityIndex}, + * ] + * And optional parameters (by default will be populated with default values) + * [ + * 'attribute_set_id' => value or callback in format function ($entityId, $entityIndex) {return attribute_id} + * 'additional_attributes' => callback in format function ($entityId, $entityIndex) {return [attribute => value]} + * 'url_key' => callback in format function ($entityId, $entityIndex) {return url_key} + * 'website_ids' => callback in format function ($entityId, $entityIndex) {return [website_id]} + * 'status' => value or callback in format function ($entityId, $entityIndex) {return status} + * 'price' => value or callback in format function ($entityId, $entityIndex) {return price} + * 'description' => value or callback in format function ($entityId, $entityIndex) {return description} + * 'short_description' => value or callback in format function ($entityId, $entityIndex) {return short_description} + * 'category_ids' => callback in format function ($entityId, $entityIndex) {return category_ids} + * 'type_id' => value or callback in format function ($entityId, $entityIndex) {return type_id} + * 'meta_keyword' => value or callback in format function ($entityId, $entityIndex) {return meta_keyword} + * 'meta_title' => value or callback in format function ($entityId, $entityIndex) {return meta_title} + * ] + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class ProductGenerator +{ + /** + * @var ProductFactory + */ + private $productFactory; + + /** + * @var CategoryCollectionFactory + */ + private $categoryCollectionFactory; + + /** + * @var UrlRewriteFactory + */ + private $urlRewriteFactory; + + /** + * @var StoreCollectionFactory + */ + private $storeCollectionFactory; + + /** + * @var array + */ + private $categories = []; + + /** + * @var array + */ + private $storesPerWebsite = []; + + /** + * @var EntityGeneratorFactory + */ + private $entityGeneratorFactory; + + /** + * @var StoreManagerInterface + */ + private $storeManager; + + /** + * @var ProductTemplateGeneratorFactory + */ + private $productTemplateGeneratorFactory; + + /** + * @var array + */ + private $productUrlSuffix = []; + + /** + * @var ScopeConfigInterface + */ + private $scopeConfig; + + /** + * @var array + */ + private $customTableMap; + + /** + * @param ProductFactory $productFactory + * @param CategoryCollectionFactory $categoryCollectionFactory + * @param UrlRewriteFactory $urlRewriteFactory + * @param StoreCollectionFactory $storeCollectionFactory + * @param EntityGeneratorFactory $entityGeneratorFactory + * @param StoreManagerInterface $storeManager + * @param ProductTemplateGeneratorFactory $productTemplateGeneratorFactory + * @param ScopeConfigInterface $scopeConfig + * @param array $customTableMap + */ + public function __construct( + ProductFactory $productFactory, + CategoryCollectionFactory $categoryCollectionFactory, + UrlRewriteFactory $urlRewriteFactory, + StoreCollectionFactory $storeCollectionFactory, + EntityGeneratorFactory $entityGeneratorFactory, + StoreManagerInterface $storeManager, + ProductTemplateGeneratorFactory $productTemplateGeneratorFactory, + ScopeConfigInterface $scopeConfig, + $customTableMap = [] + ) { + $this->productFactory = $productFactory; + $this->categoryCollectionFactory = $categoryCollectionFactory; + $this->urlRewriteFactory = $urlRewriteFactory; + $this->storeCollectionFactory = $storeCollectionFactory; + $this->entityGeneratorFactory = $entityGeneratorFactory; + $this->storeManager = $storeManager; + $this->productTemplateGeneratorFactory = $productTemplateGeneratorFactory; + $this->scopeConfig = $scopeConfig; + $this->customTableMap = $customTableMap; + } + + /** + * Generate simple products + * + * @param int $products + * @param array $fixtureMap + * @return void + */ + public function generate($products, $fixtureMap) + { + $this->initializeFixtureDefaultValues($fixtureMap); + $attributeSets = []; + // prepare attribute sets distribution for save products per attribute set + for ($productNumber = 1; $productNumber <= $products; $productNumber++) { + $attributeSetId = $this->getFixtureValue('attribute_set_id', $productNumber, $productNumber, $fixtureMap); + if (!isset($attributeSets[$attributeSetId])) { + $attributeSets[$attributeSetId] = 0; + } + $attributeSets[$attributeSetId]++; + } + + $customTableMap = [ + 'url_rewrite' => [ + 'entity_id_field' => 'entity_id', + 'handler' => function ($productId, $entityNumber, $fixture) { + return $this->urlRewriteHandler($productId, $entityNumber, $fixture); + }, + ], + 'catalog_category_product' => [ + 'fields' => [ + 'category_id' => 'category_ids', + ], + ], + 'catalog_product_entity' => [ + 'fields' => [ + 'attribute_set_id' => 'attribute_set_id', + 'sku' => 'sku', + ], + ], + ]; + $websiteIdsFixtures = $fixtureMap['website_ids'](1, 0); + if (is_array($websiteIdsFixtures) && count($websiteIdsFixtures) === 1) { + // Get website id from fixture in case when one site is assigned per product + $customTableMap['catalog_product_website'] = [ + 'fields' => [ + 'website_id' => 'website_ids', + ] + ]; + } + $generator = $this->entityGeneratorFactory->create( + [ + 'entityType' => ProductInterface::class, + 'customTableMap' => array_merge($customTableMap, $this->customTableMap) + ] + ); + foreach ($attributeSets as $attributeSetId => $productsAmount) { + $fixtureMap = array_merge($fixtureMap, ['attribute_set_id' => $attributeSetId]); + $generator->generate( + $this->productTemplateGeneratorFactory->create($fixtureMap), + $productsAmount, + function ($productNumber, $entityNumber) use ($attributeSetId, $fixtureMap) { + // add additional attributes to fixture for fulfill it during product generation + return array_merge( + $fixtureMap, + $fixtureMap['additional_attributes']($attributeSetId, $productNumber, $entityNumber) + ); + } + ); + } + } + + /** + * Initialize fixture default values + * + * @param array $fixture + * @return void + */ + private function initializeFixtureDefaultValues(array &$fixture) + { + $defaultValues = [ + 'attribute_set_id' => function () { + return $this->productFactory->create()->getDefaultAttributeSetId(); + }, + 'additional_attributes' => function () { + return []; + }, + 'url_key' => function ($productId, $entityNumber) use ($fixture) { + return strtolower(str_replace(' ', '-', $fixture['sku']($productId, $entityNumber))); + }, + 'website_ids' => function () { + return $this->storeManager->getDefaultStoreView()->getWebsiteId(); + }, + 'status' => Status::STATUS_ENABLED, + ]; + foreach ($defaultValues as $fixtureKey => $value) { + if (!isset($fixture[$fixtureKey])) { + $fixture[$fixtureKey] = $value; + } + } + } + + /** + * Get fixture value + * + * @param string $fixtureKey + * @param int $productId + * @param int $entityNumber + * @param array $fixtureMap + * @return mixed|string + */ + private function getFixtureValue($fixtureKey, $productId, $entityNumber, $fixtureMap) + { + $fixtureValue = isset($fixtureMap[$fixtureKey]) ? $fixtureMap[$fixtureKey] : null; + return $fixtureValue ? $this->getBindValue($fixtureValue, $productId, $entityNumber) : ''; + } + + /** + * Get bind value + * + * @param callable|mixed $fixtureValue + * @param int $productId + * @param int $entityNumber + * @return mixed + */ + private function getBindValue($fixtureValue, $productId, $entityNumber) + { + return is_callable($fixtureValue) + ? $fixtureValue($productId, $entityNumber) + : $fixtureValue; + } + + /** + * Handle generation sql query for url rewrite + * + * @param int $productId + * @param int $entityNumber + * @param array $fixtureMap + * @return array + * @throws LocalizedException + */ + private function urlRewriteHandler($productId, $entityNumber, $fixtureMap) + { + $binds = []; + $websiteIds = $fixtureMap['website_ids']($productId, $entityNumber); + $websiteIds = is_array($websiteIds) ? $websiteIds : [$websiteIds]; + + $bindPerStore = []; + $requestPath = $this->getFixtureValue('url_key', $productId, $entityNumber, $fixtureMap); + $targetPath = 'catalog/product/view/id/' . $productId; + $urlRewrite = $this->urlRewriteFactory + ->create() + ->setRequestPath($requestPath) + ->setTargetPath($targetPath) + ->setEntityId($productId) + ->setEntityType('product'); + $binds[] = $urlRewrite->toArray(); + + if (isset($fixtureMap['category_ids']) && $this->isCategoryProductUrlRewriteGenerationEnabled()) { + $categoryId = $fixtureMap['category_ids']($productId, $entityNumber); + if (!isset($this->categories[$categoryId])) { + $this->categories[$categoryId] = $this->categoryCollectionFactory + ->create() + ->addIdFilter($categoryId) + ->addAttributeToSelect('url_path') + ->getFirstItem() + ->getUrlPath(); + } + $urlRewrite->setMetadata(['category_id' => $categoryId]) + ->setRequestPath($this->categories[$categoryId] . '/' . $requestPath) + ->setTargetPath($targetPath . '/category/' . $categoryId); + $binds[] = $urlRewrite->toArray(); + } + + foreach ($websiteIds as $websiteId) { + if (!isset($this->storesPerWebsite[$websiteId])) { + $this->storesPerWebsite[$websiteId] = $this->storeCollectionFactory + ->create() + ->addWebsiteFilter($websiteId) + ->getAllIds(); + } + foreach ($binds as $bind) { + foreach ($this->storesPerWebsite[$websiteId] as $storeId) { + $bindWithStore = $bind; + $bindWithStore['store_id'] = $storeId; + $bindWithStore['request_path'] .= $this->getUrlSuffix($storeId); + $bindPerStore[] = $bindWithStore; + } + } + } + + return $bindPerStore; + } + + /** + * Get url suffix per store for product + * + * @param int $storeId + * @return string + */ + private function getUrlSuffix($storeId) + { + if (!isset($this->productUrlSuffix[$storeId])) { + $this->productUrlSuffix[$storeId] = $this->scopeConfig->getValue( + ProductUrlPathGenerator::XML_PATH_PRODUCT_URL_SUFFIX, + ScopeInterface::SCOPE_STORE, + $storeId + ); + } + return $this->productUrlSuffix[$storeId]; + } + + /** + * Check config value of generate_category_product_rewrites + * + * @return bool + */ + private function isCategoryProductUrlRewriteGenerationEnabled() + { + return (bool)$this->scopeConfig->getValue('catalog/seo/generate_category_product_rewrites'); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ProductTemplateGeneratorFactory.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ProductTemplateGeneratorFactory.php new file mode 100644 index 0000000..b8c4d08 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/ProductTemplateGeneratorFactory.php @@ -0,0 +1,58 @@ + SimpleProductTemplateGenerator::class, + BundleType::TYPE_CODE => BundleProductTemplateGenerator::class, + Configurable::TYPE_CODE => ConfigurableProductTemplateGenerator::class, + ]; + + /** + * @param ObjectManagerInterface $objectManager + */ + public function __construct(ObjectManagerInterface $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * @param array $fixture + * @return TemplateEntityGeneratorInterface + * @throws \InvalidArgumentException + */ + public function create(array $fixture) + { + $type = isset($fixture['type_id']) ? $fixture['type_id'] : Type::TYPE_SIMPLE; + if (!isset($this->templateEntityMap[$type])) { + throw new \InvalidArgumentException(sprintf( + 'Cannot instantiate product template generator. Wrong type_id "%s" passed', + $type + )); + } + + return $this->objectManager->create($this->templateEntityMap[$type], ['fixture' => $fixture]); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/SimpleProductTemplateGenerator.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/SimpleProductTemplateGenerator.php new file mode 100644 index 0000000..662bd4c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/SimpleProductTemplateGenerator.php @@ -0,0 +1,97 @@ +fixture = $fixture; + $this->productFactory = $productFactory; + } + + /** + * {@inheritdoc} + */ + public function generateEntity() + { + $attributeSet = $this->fixture['attribute_set_id']; + $product = $this->getProductTemplate( + $attributeSet, + $this->fixture['additional_attributes']($attributeSet, 0, 0) + ); + $product->save(); + + return $product; + } + + /** + * Get product template + * + * @param int $attributeSet + * @param array $additionalAttributes + * @return ProductInterface + */ + private function getProductTemplate($attributeSet, $additionalAttributes = []) + { + $productRandomizerNumber = crc32(random_int(1, PHP_INT_MAX)); + $product = $this->productFactory->create([ + 'data' => [ + 'attribute_set_id' => $attributeSet, + 'type_id' => Type::TYPE_SIMPLE, + 'name' => 'template name' . $productRandomizerNumber, + 'url_key' => 'template-url' . $productRandomizerNumber, + 'sku' => 'template_sku_simple' . $productRandomizerNumber, + 'price' => 10, + 'visibility' => Visibility::VISIBILITY_BOTH, + 'status' => Status::STATUS_ENABLED, + 'website_ids' => (array)$this->fixture['website_ids'](1, 0), + 'category_ids' => isset($this->fixture['category_ids']) ? [2] : null, + 'weight' => 1, + 'description' => 'description', + 'short_description' => 'short description', + 'tax_class_id' => 2, //'taxable goods', + 'stock_data' => [ + 'use_config_manage_stock' => 1, + 'qty' => 100500, + 'is_qty_decimal' => 0, + 'is_in_stock' => 1 + ], + ] + ]); + + foreach ($additionalAttributes as $attributeCode => $attributeValue) { + $product->setData($attributeCode, $attributeValue); + } + + return $product; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/SqlCollector.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/SqlCollector.php new file mode 100644 index 0000000..5e34db4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/SqlCollector.php @@ -0,0 +1,154 @@ +resourceConnection = $resourceConnection; + } + + /** + * @param string $sql + * @param array $bind + * @return void + */ + private function addSql($sql, $bind) + { + preg_match('~(?:INSERT|REPLACE)\s+(?:IGNORE)?\s*INTO `(.*)` \((.*)\) VALUES (\(.*\))+~', $sql, $queryMatches); + if ($queryMatches) { + $table = $queryMatches[1]; + $fields = preg_replace('~[\s+`]+~', '', $queryMatches[2]); + $fields = $fields ? explode(',', $fields) : []; + $sqlBindGroupAmount = count(explode('), (', $queryMatches[3])); + preg_match(' ~\((.*?)\)~', $queryMatches[3], $sqlBind); + $sqlBind = preg_replace(['~,\s*~', '~\'~'], [',', ''], $sqlBind[1]); + $sqlBind = $sqlBind ? explode(',', $sqlBind) : []; + $binds = []; + + // process multi queries + if ($sqlBindGroupAmount > 1) { + $valuesCount = count($bind)/$sqlBindGroupAmount; + for ($i = 0; $i < $sqlBindGroupAmount; $i++) { + $binds[] = array_combine( + $fields, + $this->handleBindValues($sqlBind, $bind, $i * $valuesCount) + ); + } + } else { + $sqlBind = $this->handleBindValues($sqlBind, $bind); + $binds[] = array_combine($fields, $sqlBind); + } + $this->sql[] = [$binds, $table]; + } + } + + /** + * @param array $sqlBind + * @param array $bind + * @param int $bindPosition + * @return array + */ + private function handleBindValues(array $sqlBind, array $bind, $bindPosition = 0) + { + $bind = array_values($bind); + foreach ($sqlBind as $i => $fieldValue) { + if ($fieldValue === '?') { + $sqlBind[$i] = $bind[$bindPosition]; + $bindPosition++; + } + } + + return $sqlBind; + } + + /** + * @return array + */ + public function getSql() + { + return $this->sql; + } + + /** + * Enable sql parsing + * + * @return void + */ + public function enable() + { + $this->sql = []; + $this->getProfiler()->clear(); + $this->getProfiler()->setEnabled(true); + } + + /** + * Disable sql parsing and collect all queries from profiler + * + * @return void + */ + public function disable() + { + $this->getProfiler()->setEnabled(false); + $queries = $this->getProfiler()->getQueryProfiles() ?: []; + foreach ($queries as $query) { + if ($query->getQueryType() === Profiler::INSERT || $this->isReplaceQuery($query)) { + // For generator we do not care about REPLACE query and can use INSERT instead + // due to it's not support parallel execution + $this->addSql($query->getQuery(), $query->getQueryParams()); + } + } + } + + /** + * Detect "REPLACE INTO ..." query. + * + * @param Profiler $query + * @return bool + */ + private function isReplaceQuery($query) + { + return $query->getQueryType() === Profiler::QUERY && 0 === stripos(ltrim($query->getQuery()), 'replace'); + } + + /** + * @return \Zend_Db_Profiler + */ + private function getProfiler() + { + if ($this->profiler === null) { + $this->profiler = $this->resourceConnection->getConnection()->getProfiler(); + } + + return $this->profiler; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/FixtureGenerator/TemplateEntityGeneratorInterface.php b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/TemplateEntityGeneratorInterface.php new file mode 100644 index 0000000..d4bc5c8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/FixtureGenerator/TemplateEntityGeneratorInterface.php @@ -0,0 +1,18 @@ + $value) { + if (is_callable($value) || is_string($value) && (false !== strpos($value, '%s'))) { + $this->_dynamicColumns[$key] = $value; + } + } + $this->_pattern = $rowPattern; + $this->_limit = (int)$limit; + parent::__construct(array_keys($rowPattern)); + } + + /** + * Whether limit of generated elements is reached (according to "Iterator" interface) + * + * @return bool + */ + public function valid() + { + return $this->_key + 1 <= $this->_limit; + } + + /** + * Render next row + * + * Return array or false on error + * + * @return array|false + */ + protected function _getNextRow() + { + $row = $this->_pattern; + foreach ($this->_dynamicColumns as $key => $dynamicValue) { + $index = $this->_key + 1; + if (is_callable($dynamicValue)) { + $row[$key] = call_user_func($dynamicValue, $index); + } else { + $row[$key] = str_replace('%s', $index, $dynamicValue); + } + } + return $row; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Installer.php b/magento/setup/src/Magento/Setup/Model/Installer.php new file mode 100644 index 0000000..d1f65cf --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Installer.php @@ -0,0 +1,1816 @@ +filePermissions = $filePermissions; + $this->deploymentConfigWriter = $deploymentConfigWriter; + $this->deploymentConfigReader = $deploymentConfigReader; + $this->moduleList = $moduleList; + $this->moduleLoader = $moduleLoader; + $this->adminAccountFactory = $adminAccountFactory; + $this->log = $log; + $this->connectionFactory = $connectionFactory; + $this->maintenanceMode = $maintenanceMode; + $this->filesystem = $filesystem; + $this->installInfo[self::INFO_MESSAGE] = []; + $this->deploymentConfig = $deploymentConfig; + $this->objectManagerProvider = $objectManagerProvider; + $this->context = $context; + $this->setupConfigModel = $setupConfigModel; + $this->cleanupFiles = $cleanupFiles; + $this->dbValidator = $dbValidator; + $this->setupFactory = $setupFactory; + $this->dataSetupFactory = $dataSetupFactory; + $this->sampleDataState = $sampleDataState; + $this->componentRegistrar = $componentRegistrar; + $this->phpReadinessCheck = $phpReadinessCheck; + $this->schemaPersistor = $this->objectManagerProvider->get()->get(SchemaPersistor::class); + $this->triggerCleaner = $this->objectManagerProvider->get()->get(TriggerCleaner::class); + } + + /** + * Install Magento application + * + * @param \ArrayObject|array $request + * @return void + * @throws FileSystemException + * @throws LocalizedException + * @throws RuntimeException + */ + public function install($request) + { + $script[] = ['File permissions check...', 'checkInstallationFilePermissions', []]; + $script[] = ['Required extensions check...', 'checkExtensions', []]; + $script[] = ['Enabling Maintenance Mode...', 'setMaintenanceMode', [1]]; + $script[] = ['Installing deployment configuration...', 'installDeploymentConfig', [$request]]; + if (!empty($request[InstallCommand::INPUT_KEY_CLEANUP_DB])) { + $script[] = ['Cleaning up database...', 'cleanupDb', []]; + } + $script[] = ['Installing database schema:', 'installSchema', [$request]]; + $script[] = ['Installing search configuration...', 'installSearchConfiguration', [$request]]; + $script[] = [ + 'Validating remote storage configuration...', + 'validateRemoteStorageConfiguration', + [$request] + ]; + $script[] = ['Installing user configuration...', 'installUserConfig', [$request]]; + $script[] = ['Enabling caches:', 'updateCaches', [true]]; + $script[] = ['Installing data...', 'installDataFixtures', [$request]]; + if (!empty($request[InstallCommand::INPUT_KEY_SALES_ORDER_INCREMENT_PREFIX])) { + $script[] = [ + 'Creating sales order increment prefix...', + 'installOrderIncrementPrefix', + [$request[InstallCommand::INPUT_KEY_SALES_ORDER_INCREMENT_PREFIX]], + ]; + } + if ($this->isAdminDataSet($request)) { + $script[] = ['Installing admin user...', 'installAdminUser', [$request]]; + } + + if (!$this->isDryRun($request)) { + $script[] = ['Caches clearing:', 'cleanCaches', [$request]]; + } + $script[] = ['Disabling Maintenance Mode:', 'setMaintenanceMode', [0]]; + $script[] = ['Post installation file permissions check...', 'checkApplicationFilePermissions', []]; + $script[] = ['Write installation date...', 'writeInstallationDate', []]; + $estimatedModules = $this->createModulesConfig($request, true); + $total = count($script) + 4 * count(array_filter($estimatedModules)); + $this->progress = new Installer\Progress($total, 0); + + $this->log->log('Starting Magento installation:'); + + foreach ($script as $item) { + list($message, $method, $params) = $item; + $this->log->log($message); + try { + // phpcs:ignore Magento2.Functions.DiscouragedFunction + call_user_func_array([$this, $method], $params); + } catch (RuntimeException | DriverException $e) { + $this->revertRemoteStorageConfiguration(); + throw $e; + } + $this->logProgress(); + } + $this->log->logSuccess('Magento installation complete.'); + $this->log->logSuccess( + 'Magento Admin URI: /' + . $this->deploymentConfig->get(BackendConfigOptionsList::CONFIG_PATH_BACKEND_FRONTNAME) + ); + + if ($this->progress->getCurrent() != $this->progress->getTotal()) { + throw new \LogicException('Installation progress did not finish properly.'); + } + if ($this->sampleDataState->hasError()) { + $this->log->log('Sample Data is installed with errors. See log file for details'); + } + } + + /** + * Get declaration installer. For upgrade process it must be created after deployment config update. + * + * @return DeclarationInstaller + * @throws Exception + */ + private function getDeclarationInstaller() + { + if (!$this->declarationInstaller) { + $this->declarationInstaller = $this->objectManagerProvider->get()->get( + DeclarationInstaller::class + ); + } + return $this->declarationInstaller; + } + + /** + * Writes installation date to the configuration + * + * @return void + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) Called by install() via callback. + * @throws FileSystemException + */ + private function writeInstallationDate() + { + $dateData = new ConfigData(ConfigFilePool::APP_ENV); + $dateData->set(ConfigOptionsListConstants::CONFIG_PATH_INSTALL_DATE, date('r')); + $configData = [$dateData->getFileKey() => $dateData->getData()]; + $this->deploymentConfigWriter->saveConfig($configData); + } + + /** + * Create modules deployment configuration segment + * + * @param \ArrayObject|array $request + * @param bool $dryRun + * @return array + * @throws FileSystemException + * @throws LocalizedException + * @throws RuntimeException + */ + private function createModulesConfig($request, $dryRun = false) + { + $all = array_keys($this->moduleLoader->load()); + $deploymentConfig = $this->deploymentConfigReader->load(); + $currentModules = isset($deploymentConfig[ConfigOptionsListConstants::KEY_MODULES]) + ? $deploymentConfig[ConfigOptionsListConstants::KEY_MODULES] : []; + $enable = $this->readListOfModules($all, $request, InstallCommand::INPUT_KEY_ENABLE_MODULES); + $disable = $this->readListOfModules($all, $request, InstallCommand::INPUT_KEY_DISABLE_MODULES); + $result = []; + foreach ($all as $module) { + if (isset($currentModules[$module]) && !$currentModules[$module]) { + $result[$module] = 0; + } else { + $result[$module] = 1; + } + if (in_array($module, $disable)) { + $result[$module] = 0; + } + if (in_array($module, $enable)) { + $result[$module] = 1; + } + } + if (!$dryRun) { + $this->deploymentConfigWriter->saveConfig([ConfigFilePool::APP_CONFIG => ['modules' => $result]], true); + } + return $result; + } + + /** + * Determines list of modules from request based on list of all modules + * + * @param string[] $all + * @param array $request + * @param string $key + * @return string[] + * @throws \LogicException + */ + private function readListOfModules($all, $request, $key) + { + $result = []; + if (!empty($request[$key])) { + if ($request[$key] == 'all') { + $result = $all; + } else { + $result = explode(',', $request[$key]); + foreach ($result as $module) { + if (!in_array($module, $all)) { + throw new \LogicException("Unknown module in the requested list: '{$module}'"); + } + } + } + } + return $result; + } + + /** + * Logs progress + * + * @return void + */ + private function logProgress() + { + if (!$this->progress) { + return; + } + $this->progress->setNext(); + $this->log->logMeta( + sprintf(self::PROGRESS_LOG_RENDER, $this->progress->getCurrent(), $this->progress->getTotal()) + ); + } + + /** + * Check permissions of directories that are expected to be writable for installation + * + * @return void + * @throws \Exception + */ + public function checkInstallationFilePermissions() + { + $this->throwExceptionForNotWritablePaths( + $this->filePermissions->getMissingWritablePathsForInstallation() + ); + } + + /** + * Check required extensions for installation + * + * @return void + * @throws \Exception + */ + public function checkExtensions() + { + $phpExtensionsCheckResult = $this->phpReadinessCheck->checkPhpExtensions(); + if ($phpExtensionsCheckResult['responseType'] === ResponseTypeInterface::RESPONSE_TYPE_ERROR + && isset($phpExtensionsCheckResult['data']['missing']) + ) { + $errorMsg = "Missing following extensions: '" + . implode("' '", $phpExtensionsCheckResult['data']['missing']) . "'"; + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new \Exception($errorMsg); + } + } + + /** + * Check permissions of directories that are expected to be non-writable for application + * + * @return void + */ + public function checkApplicationFilePermissions() + { + $results = $this->filePermissions->getUnnecessaryWritableDirectoriesForApplication(); + if ($results) { + $errorMsg = "For security, remove write permissions from these directories: '" + . implode("' '", $results) . "'"; + $this->log->log($errorMsg); + $this->installInfo[self::INFO_MESSAGE][] = $errorMsg; + } + } + + /** + * Installs deployment configuration + * + * @param \ArrayObject|array $data + * @return void + * @throws FileSystemException + * @throws LocalizedException + * @throws RuntimeException + */ + public function installDeploymentConfig($data) + { + $this->checkInstallationFilePermissions(); + $this->createModulesConfig($data); + $userData = is_array($data) ? $data : $data->getArrayCopy(); + $this->setupConfigModel->process($userData); + $deploymentConfigData = $this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY); + if (isset($deploymentConfigData)) { + $this->installInfo[ConfigOptionsListConstants::KEY_ENCRYPTION_KEY] = $deploymentConfigData; + } + // reset object manager now that there is a deployment config + $this->objectManagerProvider->reset(); + } + + /** + * Set up setup_module table to register modules' versions, skip this process if it already exists + * + * @param SchemaSetupInterface $setup + * @return void + * @throws \Zend_Db_Exception + */ + private function setupModuleRegistry(SchemaSetupInterface $setup) + { + $connection = $setup->getConnection(); + + if (!$connection->isTableExists($setup->getTable('setup_module'))) { + /** + * Create table 'setup_module' + */ + $table = $connection->newTable($setup->getTable('setup_module')) + ->addColumn( + 'module', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 50, + ['nullable' => false, 'primary' => true], + 'Module' + )->addColumn( + 'schema_version', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 50, + [], + 'Schema Version' + )->addColumn( + 'data_version', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 50, + [], + 'Data Version' + )->setComment('Module versions registry'); + $connection->createTable($table); + } + } + + /** + * Set up core tables + * + * @param SchemaSetupInterface $setup + * @return void + */ + private function setupCoreTables(SchemaSetupInterface $setup) + { + /* @var $connection AdapterInterface */ + $connection = $setup->getConnection(); + $setup->startSetup(); + + $this->setupSessionTable($setup, $connection); + $this->setupCacheTable($setup, $connection); + $this->setupCacheTagTable($setup, $connection); + $this->setupFlagTable($setup, $connection); + + $setup->endSetup(); + } + + /** + * Create table 'session' + * + * @param SchemaSetupInterface $setup + * @param AdapterInterface $connection + * @return void + */ + private function setupSessionTable( + SchemaSetupInterface $setup, + AdapterInterface $connection + ) { + if (!$connection->isTableExists($setup->getTable('session'))) { + $table = $connection->newTable( + $setup->getTable('session') + )->addColumn( + 'session_id', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 255, + ['nullable' => false, 'primary' => true], + 'Session Id' + )->addColumn( + 'session_expires', + \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, + null, + ['unsigned' => true, 'nullable' => false, 'default' => '0'], + 'Date of Session Expiration' + )->addColumn( + 'session_data', + \Magento\Framework\DB\Ddl\Table::TYPE_BLOB, + '2M', + ['nullable' => false], + 'Session Data' + )->setComment( + 'Database Sessions Storage' + ); + $connection->createTable($table); + } + } + + /** + * Create table 'cache' + * + * @param SchemaSetupInterface $setup + * @param AdapterInterface $connection + * @return void + * @throws \Zend_Db_Exception + */ + private function setupCacheTable( + SchemaSetupInterface $setup, + AdapterInterface $connection + ) { + if (!$connection->isTableExists($setup->getTable('cache'))) { + $table = $connection->newTable( + $setup->getTable('cache') + )->addColumn( + 'id', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 200, + ['nullable' => false, 'primary' => true], + 'Cache Id' + )->addColumn( + 'data', + \Magento\Framework\DB\Ddl\Table::TYPE_BLOB, + '2M', + [], + 'Cache Data' + )->addColumn( + 'create_time', + \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, + null, + [], + 'Cache Creation Time' + )->addColumn( + 'update_time', + \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, + null, + [], + 'Time of Cache Updating' + )->addColumn( + 'expire_time', + \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, + null, + [], + 'Cache Expiration Time' + )->addIndex( + $setup->getIdxName('cache', ['expire_time']), + ['expire_time'] + )->setComment( + 'Caches' + ); + $connection->createTable($table); + } + } + + /** + * Create table 'cache_tag' + * + * @param SchemaSetupInterface $setup + * @param AdapterInterface $connection + * @return void + * @throws \Zend_Db_Exception + */ + private function setupCacheTagTable( + SchemaSetupInterface $setup, + AdapterInterface $connection + ) { + if (!$connection->isTableExists($setup->getTable('cache_tag'))) { + $table = $connection->newTable( + $setup->getTable('cache_tag') + )->addColumn( + 'tag', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 100, + ['nullable' => false, 'primary' => true], + 'Tag' + )->addColumn( + 'cache_id', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 200, + ['nullable' => false, 'primary' => true], + 'Cache Id' + )->addIndex( + $setup->getIdxName('cache_tag', ['cache_id']), + ['cache_id'] + )->setComment( + 'Tag Caches' + ); + $connection->createTable($table); + } + } + + /** + * Create table 'flag' + * + * @param SchemaSetupInterface $setup + * @param AdapterInterface $connection + * @return void + * @throws \Zend_Db_Exception + */ + private function setupFlagTable( + SchemaSetupInterface $setup, + AdapterInterface $connection + ) { + $tableName = $setup->getTable('flag'); + if (!$connection->isTableExists($tableName)) { + $table = $connection->newTable( + $tableName + )->addColumn( + 'flag_id', + \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, + null, + ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], + 'Flag Id' + )->addColumn( + 'flag_code', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + 255, + ['nullable' => false], + 'Flag Code' + )->addColumn( + 'state', + \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + null, + ['unsigned' => true, 'nullable' => false, 'default' => '0'], + 'Flag State' + )->addColumn( + 'flag_data', + \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, + '16m', + [], + 'Flag Data' + )->addColumn( + 'last_update', + \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, + null, + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], + 'Date of Last Flag Update' + )->addIndex( + $setup->getIdxName('flag', ['last_update']), + ['last_update'] + )->setComment( + 'Flag' + ); + $connection->createTable($table); + } else { + $this->updateColumnType($connection, $tableName, 'flag_data', 'mediumtext'); + } + } + + /** + * Install Magento if declaration mode was enabled. + * + * @param array $request + * @return void + * @throws Exception + */ + public function declarativeInstallSchema(array $request) + { + $this->getDeclarationInstaller()->installSchema($request); + } + + /** + * Clear memory tables + * + * Memory tables that used in old versions of Magento for indexing purposes should be cleaned + * Otherwise some supported DB solutions like Galeracluster may have replication error + * when memory engine will be switched to InnoDb + * + * @param SchemaSetupInterface $setup + * @return void + */ + private function cleanMemoryTables(SchemaSetupInterface $setup) + { + $connection = $setup->getConnection(); + $tables = $connection->getTables(); + foreach ($tables as $table) { + $tableData = $connection->showTableStatus($table); + if (isset($tableData['Engine']) && $tableData['Engine'] === 'MEMORY') { + $connection->truncateTable($table); + } + } + } + + /** + * Installs DB schema + * + * @param array $request + * @return void + * @throws Exception + * @throws \Magento\Framework\Setup\Exception + * @throws \Zend_Db_Exception + */ + public function installSchema(array $request) + { + /** @var \Magento\Framework\Registry $registry */ + $registry = $this->objectManagerProvider->get()->get(\Magento\Framework\Registry::class); + //For backward compatibility in install and upgrade scripts with enabled parallelization. + $registry->register('setup-mode-enabled', true); + + $this->assertDbConfigExists(); + $this->assertDbAccessible(); + $setup = $this->setupFactory->create($this->context->getResources()); + $this->setupModuleRegistry($setup); + $this->setupCoreTables($setup); + $this->cleanMemoryTables($setup); + $this->log->log('Schema creation/updates:'); + $this->declarativeInstallSchema($request); + $this->handleDBSchemaData($setup, 'schema', $request); + /** @var Mysql $adapter */ + $adapter = $setup->getConnection(); + $schemaListener = $adapter->getSchemaListener(); + + if ($this->convertationOfOldScriptsIsAllowed($request)) { + $schemaListener->setResource('default'); + $this->schemaPersistor->persist($schemaListener); + } + + $registry->unregister('setup-mode-enabled'); + } + + /** + * Check whether all scripts will converted or not + * + * @param array $request + * @return bool + */ + private function convertationOfOldScriptsIsAllowed(array $request) + { + return isset($request[InstallCommand::CONVERT_OLD_SCRIPTS_KEY]) && + $request[InstallCommand::CONVERT_OLD_SCRIPTS_KEY]; + } + + /** + * Installs data fixtures + * + * @param array $request + * @param boolean $keepCacheStatuses + * @return void + * @throws Exception + * @throws \Magento\Framework\Setup\Exception + */ + public function installDataFixtures(array $request = [], $keepCacheStatuses = false) + { + $frontendCaches = [ + PageCache::TYPE_IDENTIFIER, + BlockCache::TYPE_IDENTIFIER, + LayoutCache::TYPE_IDENTIFIER, + ]; + + if ($keepCacheStatuses) { + $disabledCaches = $this->getDisabledCacheTypes($frontendCaches); + + $frontendCaches = array_diff($frontendCaches, $disabledCaches); + } + + /** @var \Magento\Framework\Registry $registry */ + $registry = $this->objectManagerProvider->get()->get(\Magento\Framework\Registry::class); + //For backward compatibility in install and upgrade scripts with enabled parallelization. + $registry->register('setup-mode-enabled', true); + + $this->assertDbConfigExists(); + $this->assertDbAccessible(); + $setup = $this->dataSetupFactory->create(); + $this->checkFilePermissionsForDbUpgrade(); + $this->log->log('Data install/update:'); + + if ($frontendCaches) { + $this->log->log('Disabling caches:'); + $this->updateCaches(false, $frontendCaches); + } + + try { + $this->handleDBSchemaData($setup, 'data', $request); + } finally { + if ($frontendCaches) { + $this->log->log('Enabling caches:'); + $this->updateCaches(true, $frontendCaches); + } + } + + $registry->unregister('setup-mode-enabled'); + } + + /** + * Check permissions of directories that are expected to be writable for database upgrade + * + * @return void + * @throws \Exception If some of the required directories isn't writable + */ + public function checkFilePermissionsForDbUpgrade() + { + $this->throwExceptionForNotWritablePaths( + $this->filePermissions->getMissingWritableDirectoriesForDbUpgrade() + ); + } + + /** + * Throws exception with appropriate message if given not empty array of paths that requires writing permission + * + * @param array $paths List of not writable paths + * @return void + * @throws \Exception If given not empty array of not writable paths + */ + private function throwExceptionForNotWritablePaths(array $paths) + { + if ($paths) { + $errorMsg = "Missing write permissions to the following paths:" . PHP_EOL . implode(PHP_EOL, $paths); + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new \Exception($errorMsg); + } + } + + /** + * Handle database schema and data (install/upgrade/backup/uninstall etc) + * + * @param SchemaSetupInterface|ModuleDataSetupInterface $setup + * @param string $type + * @param array $request + * @return void + * @throws \Magento\Framework\Setup\Exception + * @throws Exception + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + private function handleDBSchemaData($setup, $type, array $request) + { + if ($type !== 'schema' && $type !== 'data') { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new Exception("Unsupported operation type $type is requested"); + } + $resource = $this->getModuleResource(); + $verType = $type . '-version'; + $installType = $type . '-install'; + $upgradeType = $type . '-upgrade'; + $moduleNames = $this->moduleList->getNames(); + $moduleContextList = $this->generateListOfModuleContext($resource, $verType); + /** @var Mysql $adapter */ + $adapter = $setup->getConnection(); + $schemaListener = $adapter->getSchemaListener(); + $this->patchApplierFactory = $this->objectManagerProvider->get()->create( + PatchApplierFactory::class, + [ + 'objectManager' => $this->objectManagerProvider->get() + ] + ); + + $patchApplierParams = $type === 'schema' ? + ['schemaSetup' => $setup] : + ['moduleDataSetup' => $setup, 'objectManager' => $this->objectManagerProvider->get()]; + + /** @var PatchApplier $patchApplier */ + $patchApplier = $this->patchApplierFactory->create($patchApplierParams); + + foreach ($moduleNames as $moduleName) { + if ($this->isDryRun($request)) { + $this->log->log("Module '{$moduleName}':"); + $this->logProgress(); + continue; + } + $schemaListener->setModuleName($moduleName); + $this->log->log("Module '{$moduleName}':"); + $configVer = $this->moduleList->getOne($moduleName)['setup_version']; + $currentVersion = $moduleContextList[$moduleName]->getVersion(); + // Schema/Data is installed + if ($configVer !== null && $currentVersion !== '') { + $status = version_compare($configVer, $currentVersion); + if ($status == \Magento\Framework\Setup\ModuleDataSetupInterface::VERSION_COMPARE_GREATER) { + $upgrader = $this->getSchemaDataHandler($moduleName, $upgradeType); + if ($upgrader) { + $this->log->logInline("Upgrading $type.. "); + $upgrader->upgrade($setup, $moduleContextList[$moduleName]); + if ($type === 'schema') { + $resource->setDbVersion($moduleName, $configVer); + } elseif ($type === 'data') { + $resource->setDataVersion($moduleName, $configVer); + } + } + } + } elseif ($configVer) { + $installer = $this->getSchemaDataHandler($moduleName, $installType); + if ($installer) { + $this->log->logInline("Installing $type... "); + $installer->install($setup, $moduleContextList[$moduleName]); + } + $upgrader = $this->getSchemaDataHandler($moduleName, $upgradeType); + if ($upgrader) { + $this->log->logInline("Upgrading $type... "); + $upgrader->upgrade($setup, $moduleContextList[$moduleName]); + } + } + + if ($configVer) { + if ($type === 'schema') { + $resource->setDbVersion($moduleName, $configVer); + } elseif ($type === 'data') { + $resource->setDataVersion($moduleName, $configVer); + } + } + + /** + * Applying data patches after old upgrade data scripts + */ + if ($type === 'schema') { + $patchApplier->applySchemaPatch($moduleName); + } elseif ($type === 'data') { + $patchApplier->applyDataPatch($moduleName); + } + + $this->logProgress(); + } + + if ($type === 'schema') { + $this->log->log('Schema post-updates:'); + } elseif ($type === 'data') { + $this->log->log('Data post-updates:'); + } + $handlerType = $type === 'schema' ? 'schema-recurring' : 'data-recurring'; + + foreach ($moduleNames as $moduleName) { + if ($this->isDryRun($request)) { + $this->log->log("Module '{$moduleName}':"); + $this->logProgress(); + continue; + } + $this->log->log("Module '{$moduleName}':"); + $modulePostUpdater = $this->getSchemaDataHandler($moduleName, $handlerType); + if ($modulePostUpdater) { + $this->log->logInline('Running ' . str_replace('-', ' ', $handlerType) . '...'); + $modulePostUpdater->install($setup, $moduleContextList[$moduleName]); + } + $this->logProgress(); + } + } + + /** + * Get a module Resource object + * + * @return ModuleResource + */ + public function getModuleResource(): ModuleResource + { + return new ModuleResource($this->context); + } + + /** + * Assert DbConfigExists + * + * @return void + * @throws Exception + * @throws FileSystemException + * @throws RuntimeException + */ + private function assertDbConfigExists() + { + $config = $this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT); + if (!$config) { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new Exception( + "Can't run this operation: configuration for DB connection is absent." + ); + } + } + + /** + * Check whether Magento setup is run in dry-run mode + * + * @param array $request + * @return bool + */ + private function isDryRun(array $request) + { + return isset($request[DryRunLogger::INPUT_KEY_DRY_RUN_MODE]) && + $request[DryRunLogger::INPUT_KEY_DRY_RUN_MODE]; + } + + /** + * Installs user configuration + * + * @param \ArrayObject|array $data + * @return void + * @throws Exception + * @throws LocalizedException + */ + public function installUserConfig($data) + { + if ($this->isDryRun($data)) { + return; + } + $userConfig = new StoreConfigurationDataMapper(); + /** @var \Magento\Framework\App\State $appState */ + $appState = $this->objectManagerProvider->get()->get(\Magento\Framework\App\State::class); + $appState->setAreaCode(\Magento\Framework\App\Area::AREA_GLOBAL); + $configData = $userConfig->getConfigData($data); + if (count($configData) === 0) { + return; + } + + /** @var \Magento\Config\Model\Config\Factory $configFactory */ + $configFactory = $this->objectManagerProvider->get()->create(\Magento\Config\Model\Config\Factory::class); + foreach ($configData as $key => $val) { + $configModel = $configFactory->create(); + $configModel->setDataByPath($key, $val); + $configModel->save(); + } + } + + /** + * Configure search engine on install + * + * @param \ArrayObject|array $data + * @return void + * @throws ValidationException + * @throws Exception + */ + public function installSearchConfiguration($data) + { + /** @var SearchConfig $searchConfig */ + $searchConfig = $this->objectManagerProvider->get()->get(SearchConfig::class); + $searchConfig->saveConfiguration($data); + } + + /** + * Validate remote storage on install. Since it is a deployment-based configuration, the config is already present, + * but this function confirms it can connect after Object Manager + * has all necessary dependencies loaded to do so. + * + * @param array $data + * @throws ValidationException + * @throws Exception + */ + public function validateRemoteStorageConfiguration(array $data) + { + try { + $remoteStorageValidator = $this->objectManagerProvider->get()->get(RemoteStorageValidator::class); + } catch (ReflectionException $e) { // RemoteStorage module is not available; return early + return; + } + + $validationErrors = $remoteStorageValidator->validate($data, $this->deploymentConfig); + + if (!empty($validationErrors)) { + $this->revertRemoteStorageConfiguration(); + throw new ValidationException(__(implode(PHP_EOL, $validationErrors))); + } + } + + /** + * Create data handler + * + * @param string $className + * @param string $interfaceName + * @return mixed|null + * @throws Exception + */ + protected function createSchemaDataHandler($className, $interfaceName) + { + if (class_exists($className)) { + if (!is_subclass_of($className, $interfaceName) && $className !== $interfaceName) { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new Exception($className . ' must implement \\' . $interfaceName); + } else { + return $this->objectManagerProvider->get()->create($className); + } + } + return null; + } + + /** + * Create store order increment prefix configuration + * + * @param string $orderIncrementPrefix Value to use for order increment prefix + * @return void + * + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) Called by install() via callback. + */ + private function installOrderIncrementPrefix($orderIncrementPrefix) + { + $setup = $this->setupFactory->create($this->context->getResources()); + $dbConnection = $setup->getConnection(); + + // get entity_type_id for order + $select = $dbConnection->select() + ->from($setup->getTable('eav_entity_type'), 'entity_type_id') + ->where('entity_type_code = \'order\''); + $entityTypeId = $dbConnection->fetchOne($select); + + // See if row already exists + $incrementRow = $dbConnection->fetchRow( + 'SELECT * FROM ' . $setup->getTable('eav_entity_store') . ' WHERE entity_type_id = ? AND store_id = ?', + [$entityTypeId, Store::DISTRO_STORE_ID] + ); + + if (!empty($incrementRow)) { + // row exists, update it + $entityStoreId = $incrementRow['entity_store_id']; + $dbConnection->update( + $setup->getTable('eav_entity_store'), + ['increment_prefix' => $orderIncrementPrefix], + ['entity_store_id' => $entityStoreId] + ); + } else { + // add a row to the store's eav table, setting the increment_prefix + $rowData = [ + 'entity_type_id' => $entityTypeId, + 'store_id' => Store::DISTRO_STORE_ID, + 'increment_prefix' => $orderIncrementPrefix, + ]; + $dbConnection->insert($setup->getTable('eav_entity_store'), $rowData); + } + } + + /** + * Create admin account + * + * @param \ArrayObject|array $data + * @return void + * @throws Exception + * @throws FileSystemException + * @throws RuntimeException + */ + public function installAdminUser($data) + { + if ($this->isDryRun($data)) { + return; + } + + $adminUserModuleIsInstalled = (bool)$this->deploymentConfig->get('modules/Magento_User'); + //Admin user data is not system data, so we need to install it only if schema for admin user was installed + if ($adminUserModuleIsInstalled) { + $this->assertDbConfigExists(); + $data += ['db-prefix' => $this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_DB_PREFIX)]; + $setup = $this->setupFactory->create($this->context->getResources()); + $adminAccount = $this->adminAccountFactory->create($setup->getConnection(), (array)$data); + $adminAccount->save(); + } + } + + /** + * Updates modules in deployment configuration + * + * @param bool $keepGeneratedFiles Cleanup generated classes and view files and reset ObjectManager + * @return void + * @throws Exception + */ + public function updateModulesSequence($keepGeneratedFiles = false) + { + $config = $this->deploymentConfig->get(ConfigOptionsListConstants::KEY_MODULES); + if (!$config) { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new Exception( + "Can't run this operation: deployment configuration is absent." + . " Run 'magento setup:config:set --help' for options." + ); + } + $this->flushCaches([ConfigCache::TYPE_IDENTIFIER]); + $this->cleanCaches(); + if (!$keepGeneratedFiles) { + $this->cleanupGeneratedFiles(); + } + $this->log->log('Updating modules:'); + $this->createModulesConfig([]); + } + + /** + * Get the modules config as Magento sees it + * + * @return array + * @throws \LogicException + */ + public function getModulesConfig() + { + return $this->createModulesConfig([], true); + } + + /** + * Uninstall Magento application + * + * @return void + */ + public function uninstall() + { + $this->log->log('Starting Magento uninstallation:'); + + try { + $this->cleanCaches(); + } catch (\Exception $e) { + $this->log->log( + 'Can\'t clear cache due to the following error: ' + . $e->getMessage() . PHP_EOL + . 'To fully clean up your uninstallation, you must manually clear your cache.' + ); + } + + $this->cleanupDb(); + + $this->log->log('File system cleanup:'); + $messages = $this->cleanupFiles->clearAllFiles(); + foreach ($messages as $message) { + $this->log->log($message); + } + + $this->deleteDeploymentConfig(); + + $this->log->logSuccess('Magento uninstallation complete.'); + } + + /** + * Enable or disable caches for specific types that are available + * + * If no types are specified then it will enable or disable all available types + * Note this is called by install() via callback. + * + * @param bool $isEnabled + * @param array $types + * @return void + * @throws Exception + */ + private function updateCaches($isEnabled, $types = []) + { + /** @var Manager $cacheManager */ + $cacheManager = $this->objectManagerProvider->get()->create(Manager::class); + + $availableTypes = $cacheManager->getAvailableTypes(); + $types = empty($types) ? $availableTypes : array_intersect($availableTypes, $types); + $enabledTypes = $cacheManager->setEnabled($types, $isEnabled); + if ($isEnabled) { + $cacheManager->clean($enabledTypes); + } + + // Only get statuses of specific cache types + $cacheStatus = array_filter( + $cacheManager->getStatus(), + function (string $key) use ($types) { + return in_array($key, $types); + }, + ARRAY_FILTER_USE_KEY + ); + + $this->log->log('Current status:'); + foreach ($cacheStatus as $cache => $status) { + $this->log->log(sprintf('%s: %d', $cache, $status)); + } + } + + /** + * Clean caches after installing application + * + * @return void + * + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) Called by install() via callback. + * @throws Exception + */ + private function cleanCaches() + { + /** @var Manager $cacheManager */ + $cacheManager = $this->objectManagerProvider->get()->get(Manager::class); + $types = $cacheManager->getAvailableTypes(); + $cacheManager->clean($types); + $this->log->log('Cache cleared successfully'); + } + + /** + * Flush caches for specific types or all available types + * + * @param array $types + * @return void + * + * @throws Exception + */ + private function flushCaches($types = []) + { + /** @var Manager $cacheManager */ + $cacheManager = $this->objectManagerProvider->get()->get(Manager::class); + $types = empty($types) ? $cacheManager->getAvailableTypes() : $types; + $cacheManager->flush($types); + $this->log->log('Cache types ' . implode(',', $types) . ' flushed successfully'); + } + + /** + * Enables or disables maintenance mode for Magento application + * + * @param int $value + * @return void + * + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) Called by install() via callback. + */ + private function setMaintenanceMode($value) + { + $this->maintenanceMode->set($value); + } + + /** + * Return messages + * + * @return array + */ + public function getInstallInfo() + { + return $this->installInfo; + } + + /** + * Deletes the database and creates it again + * + * @return void + */ + public function cleanupDb() + { + $cleanedUpDatabases = []; + $connections = $this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTIONS, []); + //Do database cleanup for all shards + foreach ($connections as $config) { + try { + $connection = $this->connectionFactory->create($config); + if (!$connection) { + $this->log->log("Can't create connection to database - skipping database cleanup"); + } + } catch (\Exception $e) { + $this->log->log($e->getMessage() . ' - skipping database cleanup'); + return; + } + + $dbName = $connection->quoteIdentifier($config[ConfigOptionsListConstants::KEY_NAME]); + //If for different shards one database was specified - no need to clean it few times + if (!in_array($dbName, $cleanedUpDatabases)) { + $this->log->log("Cleaning up database {$dbName}"); + // phpcs:ignore Magento2.SQL.RawQuery + $connection->query("DROP DATABASE IF EXISTS {$dbName}"); + // phpcs:ignore Magento2.SQL.RawQuery + $connection->query("CREATE DATABASE IF NOT EXISTS {$dbName}"); + $cleanedUpDatabases[] = $dbName; + } + } + + if (empty($config)) { + $this->log->log('No database connection defined - skipping database cleanup'); + } + } + + /** + * Removes deployment configuration + * + * @return void + * @throws FileSystemException + */ + private function deleteDeploymentConfig() + { + $configDir = $this->filesystem->getDirectoryWrite(DirectoryList::CONFIG); + $configFiles = $this->deploymentConfigReader->getFiles(); + foreach ($configFiles as $configFile) { + $absolutePath = $configDir->getAbsolutePath($configFile); + if (!$configDir->isFile($configFile)) { + $this->log->log("The file '{$absolutePath}' doesn't exist - skipping cleanup"); + continue; + } + try { + $this->log->log($absolutePath); + $configDir->delete($configFile); + } catch (FileSystemException $e) { + $this->log->log($e->getMessage()); + } + } + } + + /** + * Validates that MySQL is accessible and MySQL version is supported + * + * @return void + * @throws Exception + * @throws FileSystemException + * @throws RuntimeException + */ + private function assertDbAccessible() + { + $driverOptionKeys = [ + ConfigOptionsListConstants::KEY_MYSQL_SSL_KEY => + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT_DRIVER_OPTIONS . '/' . + ConfigOptionsListConstants::KEY_MYSQL_SSL_KEY, + + ConfigOptionsListConstants::KEY_MYSQL_SSL_CERT => + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT_DRIVER_OPTIONS . '/' . + ConfigOptionsListConstants::KEY_MYSQL_SSL_CERT, + + ConfigOptionsListConstants::KEY_MYSQL_SSL_CA => + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT_DRIVER_OPTIONS . '/' . + ConfigOptionsListConstants::KEY_MYSQL_SSL_CA, + + ConfigOptionsListConstants::KEY_MYSQL_SSL_VERIFY => + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT_DRIVER_OPTIONS . '/' . + ConfigOptionsListConstants::KEY_MYSQL_SSL_VERIFY + ]; + $driverOptions = []; + foreach ($driverOptionKeys as $driverOptionKey => $driverOptionConfig) { + $config = $this->deploymentConfig->get($driverOptionConfig); + if ($config !== null) { + $driverOptions[$driverOptionKey] = $config; + } + } + + $this->dbValidator->checkDatabaseConnectionWithDriverOptions( + $this->deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_NAME + ), + $this->deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_HOST + ), + $this->deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_USER + ), + $this->deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_PASSWORD + ), + $driverOptions + ); + $prefix = $this->deploymentConfig->get( + ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . + '/' . ConfigOptionsListConstants::KEY_PREFIX + ); + if (null !== $prefix) { + $this->dbValidator->checkDatabaseTablePrefix($prefix); + } + } + + /** + * Get handler for schema or data install/upgrade/backup/uninstall etc. + * + * @param string $moduleName + * @param string $type + * @return InstallSchemaInterface | UpgradeSchemaInterface | InstallDataInterface | UpgradeDataInterface | null + * @throws Exception + */ + private function getSchemaDataHandler($moduleName, $type) + { + $className = str_replace('_', '\\', $moduleName) . '\Setup'; + switch ($type) { + case 'schema-install': + $className .= '\InstallSchema'; + $interface = self::SCHEMA_INSTALL; + break; + case 'schema-upgrade': + $className .= '\UpgradeSchema'; + $interface = self::SCHEMA_UPGRADE; + break; + case 'schema-recurring': + $className .= '\Recurring'; + $interface = self::SCHEMA_INSTALL; + break; + case 'data-install': + $className .= '\InstallData'; + $interface = self::DATA_INSTALL; + break; + case 'data-upgrade': + $className .= '\UpgradeData'; + $interface = self::DATA_UPGRADE; + break; + case 'data-recurring': + $className .= '\RecurringData'; + $interface = self::DATA_INSTALL; + break; + default: + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new Exception("$className does not exist"); + } + + return $this->createSchemaDataHandler($className, $interface); + } + + /** + * Generates list of ModuleContext + * + * @param ModuleResource $resource + * @param string $type + * @return ModuleContext[] + * @throws Exception + */ + private function generateListOfModuleContext($resource, $type) + { + $moduleContextList = []; + foreach ($this->moduleList->getNames() as $moduleName) { + if ($type === 'schema-version') { + $dbVer = $resource->getDbVersion($moduleName); + } elseif ($type === 'data-version') { + $dbVer = $resource->getDataVersion($moduleName); + } else { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new Exception("Unsupported version type $type is requested"); + } + if ($dbVer !== false) { + $moduleContextList[$moduleName] = new ModuleContext($dbVer); + } else { + $moduleContextList[$moduleName] = new ModuleContext(''); + } + } + return $moduleContextList; + } + + /** + * Clear generated/code and reset object manager + * + * @return void + */ + private function cleanupGeneratedFiles() + { + $this->log->log('File system cleanup:'); + $messages = $this->cleanupFiles->clearCodeGeneratedFiles(); + + // unload Magento autoloader because it may be using compiled definition + foreach (spl_autoload_functions() as $autoloader) { + if (is_array($autoloader) && $autoloader[0] instanceof \Magento\Framework\Code\Generator\Autoloader) { + spl_autoload_unregister([$autoloader[0], $autoloader[1]]); + break; + } + } + + // Corrected Magento autoloader will be loaded upon next get() call on $this->objectManagerProvider + $this->objectManagerProvider->reset(); + + foreach ($messages as $message) { + $this->log->log($message); + } + } + + /** + * Checks that admin data is not empty in request array + * + * @param \ArrayObject|array $request + * @return bool + */ + private function isAdminDataSet($request) + { + $adminData = array_filter( + $request, + function ($value, $key) { + return in_array( + $key, + [ + AdminAccount::KEY_EMAIL, + AdminAccount::KEY_FIRST_NAME, + AdminAccount::KEY_LAST_NAME, + AdminAccount::KEY_USER, + AdminAccount::KEY_PASSWORD, + ] + ) && $value !== null; + }, + ARRAY_FILTER_USE_BOTH + ); + + return !empty($adminData); + } + + /** + * Update flag_data column data type to maintain consistency. + * + * @param AdapterInterface $connection + * @param string $tableName + * @param string $columnName + * @param string $typeName + */ + private function updateColumnType( + AdapterInterface $connection, + string $tableName, + string $columnName, + string $typeName + ): void { + $tableDescription = $connection->describeTable($tableName); + if ($tableDescription[$columnName]['DATA_TYPE'] !== $typeName) { + $connection->modifyColumn( + $tableName, + $columnName, + $typeName + ); + } + } + + /** + * Remove unused triggers from db + * + * @throws \Exception + */ + public function removeUnusedTriggers(): void + { + $this->triggerCleaner->removeTriggers(); + $this->cleanCaches(); + } + + /** + * Returns list of disabled cache types + * + * @param array $cacheTypesToCheck + * @return array + */ + private function getDisabledCacheTypes(array $cacheTypesToCheck): array + { + $disabledCaches = []; + + /** @var CacheManager $cacheManager */ + $cacheManager = $this->objectManagerProvider->get()->create(CacheManager::class); + $cacheStatus = $cacheManager->getStatus(); + + foreach ($cacheTypesToCheck as $cacheType) { + if (isset($cacheStatus[$cacheType]) && $cacheStatus[$cacheType] === 0) { + $disabledCaches[] = $cacheType; + } + } + + return $disabledCaches; + } + + /** + * Revert remote storage configuration back to local file driver + */ + private function revertRemoteStorageConfiguration() + { + if (!$this->deploymentConfigWriter->checkIfWritable()) { + return; + } + + $remoteStorageData = new ConfigData(ConfigFilePool::APP_ENV); + $remoteStorageData->set('remote_storage', ['driver' => 'file']); + $configData = [$remoteStorageData->getFileKey() => $remoteStorageData->getData()]; + $this->deploymentConfigWriter->saveConfig($configData, true); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/Installer/Progress.php b/magento/setup/src/Magento/Setup/Model/Installer/Progress.php new file mode 100644 index 0000000..b6a2e02 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/Installer/Progress.php @@ -0,0 +1,109 @@ +validate($total, $current); + $this->total = $total; + $this->current = $current; + } + + /** + * Increments current counter + * + * @return void + */ + public function setNext() + { + $this->validate($this->total, $this->current + 1); + $this->current++; + } + + /** + * Sets current counter to the end + * + * @return void + */ + public function finish() + { + $this->current = $this->total; + } + + /** + * Gets the current counter + * + * @return int + */ + public function getCurrent() + { + return $this->current; + } + + /** + * Gets the total number + * + * @return int + */ + public function getTotal() + { + return $this->total; + } + + /** + * Gets ratio of current to total + * + * @return float + */ + public function getRatio() + { + return $this->current / $this->total; + } + + /** + * Asserts invariants + * + * @param int $total + * @param int $current + * @return void + * @throws \LogicException + */ + private function validate($total, $current) + { + if (empty($total) || 0 >= $total) { + throw new \LogicException('Total number must be more than zero.'); + } + if ($current > $total) { + throw new \LogicException('Current cannot exceed total number.'); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Model/InstallerFactory.php b/magento/setup/src/Magento/Setup/Model/InstallerFactory.php new file mode 100644 index 0000000..aeb5be9 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/InstallerFactory.php @@ -0,0 +1,96 @@ +serviceLocator = $serviceLocator; + $this->resourceFactory = $resourceFactory; + // For Setup Wizard we are using our customized error handler + $handler = new ErrorHandler(); + set_error_handler([$handler, 'handler']); + } + + /** + * Factory method for installer object + * + * @param LoggerInterface $log + * @return Installer + * @throws \Magento\Setup\Exception + */ + public function create(LoggerInterface $log) + { + return new Installer( + $this->serviceLocator->get(\Magento\Framework\Setup\FilePermissions::class), + $this->serviceLocator->get(\Magento\Framework\App\DeploymentConfig\Writer::class), + $this->serviceLocator->get(\Magento\Framework\App\DeploymentConfig\Reader::class), + $this->serviceLocator->get(\Magento\Framework\App\DeploymentConfig::class), + $this->serviceLocator->get(\Magento\Framework\Module\ModuleList::class), + $this->serviceLocator->get(\Magento\Framework\Module\ModuleList\Loader::class), + $this->serviceLocator->get(\Magento\Setup\Model\AdminAccountFactory::class), + $log, + $this->serviceLocator->get(\Magento\Setup\Module\ConnectionFactory::class), + $this->serviceLocator->get(\Magento\Framework\App\MaintenanceMode::class), + $this->serviceLocator->get(\Magento\Framework\Filesystem::class), + $this->serviceLocator->get(\Magento\Setup\Model\ObjectManagerProvider::class), + new \Magento\Framework\Model\ResourceModel\Db\Context( + $this->getResource(), + $this->serviceLocator->get(\Magento\Framework\Model\ResourceModel\Db\TransactionManager::class), + $this->serviceLocator->get(\Magento\Framework\Model\ResourceModel\Db\ObjectRelationProcessor::class) + ), + $this->serviceLocator->get(\Magento\Setup\Model\ConfigModel::class), + $this->serviceLocator->get(\Magento\Framework\App\State\CleanupFiles::class), + $this->serviceLocator->get(\Magento\Setup\Validator\DbValidator::class), + $this->serviceLocator->get(\Magento\Setup\Module\SetupFactory::class), + $this->serviceLocator->get(\Magento\Setup\Module\DataSetupFactory::class), + $this->serviceLocator->get(\Magento\Framework\Setup\SampleData\State::class), + new \Magento\Framework\Component\ComponentRegistrar(), + $this->serviceLocator->get(\Magento\Setup\Model\PhpReadinessCheck::class) + ); + } + + /** + * Create Resource Factory + * + * @return Resource + */ + private function getResource() + { + $deploymentConfig = $this->serviceLocator->get(\Magento\Framework\App\DeploymentConfig::class); + return $this->resourceFactory->create($deploymentConfig); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/License.php b/magento/setup/src/Magento/Setup/Model/License.php new file mode 100644 index 0000000..a133c65 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/License.php @@ -0,0 +1,65 @@ +dir = $filesystem->getDirectoryRead(DirectoryList::ROOT); + } + + /** + * Returns contents of License file. + * + * @return string|boolean + */ + public function getContents() + { + if ($this->dir->isFile(self::LICENSE_FILENAME)) { + return $this->dir->readFile(self::LICENSE_FILENAME); + } elseif ($this->dir->isFile(self::DEFAULT_LICENSE_FILENAME)) { + return $this->dir->readFile(self::DEFAULT_LICENSE_FILENAME); + } else { + return false; + } + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ModuleContext.php b/magento/setup/src/Magento/Setup/Model/ModuleContext.php new file mode 100644 index 0000000..e17c321 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ModuleContext.php @@ -0,0 +1,41 @@ +version = $version; + } + + /** + * {@inheritdoc} + */ + public function getVersion() + { + return $this->version; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ModuleRegistryUninstaller.php b/magento/setup/src/Magento/Setup/Model/ModuleRegistryUninstaller.php new file mode 100644 index 0000000..bb01ce3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ModuleRegistryUninstaller.php @@ -0,0 +1,105 @@ +dataSetupFactory = $dataSetupFactory; + $this->deploymentConfig = $deploymentConfig; + $this->writer = $writer; + $this->loader = $loader; + } + + /** + * Removes module from setup_module table + * + * @param OutputInterface $output + * @param string[] $modules + * @return void + */ + public function removeModulesFromDb(OutputInterface $output, array $modules) + { + $output->writeln( + 'Removing ' . implode(', ', $modules) . ' from module registry in database' + ); + /** @var \Magento\Framework\Setup\ModuleDataSetupInterface $setup */ + $setup = $this->dataSetupFactory->create(); + foreach ($modules as $module) { + $setup->deleteTableRow('setup_module', 'module', $module); + } + } + + /** + * Removes module from deployment configuration + * + * @param OutputInterface $output + * @param string[] $modules + * @return void + */ + public function removeModulesFromDeploymentConfig(OutputInterface $output, array $modules) + { + $output->writeln( + 'Removing ' . implode(', ', $modules) . ' from module list in deployment configuration' + ); + $configuredModules = $this->deploymentConfig->getConfigData( + \Magento\Framework\Config\ConfigOptionsListConstants::KEY_MODULES + ); + $existingModules = $this->loader->load($modules); + $newModules = []; + foreach (array_keys($existingModules) as $module) { + $newModules[$module] = isset($configuredModules[$module]) ? $configuredModules[$module] : 0; + } + $this->writer->saveConfig( + [ + \Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG => + [\Magento\Framework\Config\ConfigOptionsListConstants::KEY_MODULES => $newModules] + ], + true + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ModuleUninstaller.php b/magento/setup/src/Magento/Setup/Model/ModuleUninstaller.php new file mode 100644 index 0000000..55b8666 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ModuleUninstaller.php @@ -0,0 +1,116 @@ +objectManager = $objectManagerProvider->get(); + $this->remove = $remove; + $this->collector = $collector; + $this->setupFactory = $setupFactory; + } + + /** + * @return PatchApplier + */ + private function getPatchApplier() + { + if (!$this->patchApplier) { + $this->patchApplier = $this->objectManager->get(PatchApplier::class); + } + + return $this->patchApplier; + } + + /** + * Invoke remove data routine in each specified module + * + * @param OutputInterface $output + * @param array $modules + * @return void + */ + public function uninstallData(OutputInterface $output, array $modules) + { + $uninstalls = $this->collector->collectUninstall($modules); + $setupModel = $this->setupFactory->create(); + $resource = $this->objectManager->get(\Magento\Framework\Module\ModuleResource::class); + foreach ($modules as $module) { + if (isset($uninstalls[$module])) { + $output->writeln("Removing data of $module"); + $uninstalls[$module]->uninstall( + $setupModel, + new ModuleContext($resource->getDbVersion($module) ?: '') + ); + } + + $this->getPatchApplier()->revertDataPatches($module); + } + } + + /** + * Run 'composer remove' to remove code + * + * @param OutputInterface $output + * @param array $modules + * @return void + */ + public function uninstallCode(OutputInterface $output, array $modules) + { + $output->writeln('Removing code from Magento codebase:'); + $packages = []; + /** @var \Magento\Framework\Module\PackageInfo $packageInfo */ + $packageInfo = $this->objectManager->get(\Magento\Framework\Module\PackageInfoFactory::class)->create(); + foreach ($modules as $module) { + $packages[] = $packageInfo->getPackageName($module); + } + $this->remove->remove($packages); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ObjectManagerProvider.php b/magento/setup/src/Magento/Setup/Model/ObjectManagerProvider.php new file mode 100644 index 0000000..022f89f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ObjectManagerProvider.php @@ -0,0 +1,119 @@ +serviceLocator = $serviceLocator; + $this->bootstrap = $bootstrap; + } + + /** + * Retrieve object manager. + * + * @return ObjectManagerInterface + * @throws \Magento\Setup\Exception + */ + public function get() + { + if (null === $this->objectManager) { + $initParams = $this->serviceLocator->get(InitParamListener::BOOTSTRAP_PARAM); + $factory = $this->getObjectManagerFactory($initParams); + $this->objectManager = $factory->create($initParams); + if (PHP_SAPI == 'cli') { + $this->createCliCommands(); + } + } + return $this->objectManager; + } + + /** + * Creates cli commands and initialize them with application instance + * + * @return void + */ + private function createCliCommands() + { + /** @var CommandListInterface $commandList */ + $commandList = $this->objectManager->create(CommandListInterface::class); + $application = $this->serviceLocator->get(Application::class); + foreach ($commandList->getCommands() as $command) { + $application->add($command); + } + } + + /** + * Causes object manager to be reinitialized the next time it is retrieved. + * + * @return void + */ + public function reset() + { + $this->objectManager = null; + } + + /** + * Sets object manager + * + * @param ObjectManagerInterface $objectManager + * @return void + */ + public function setObjectManager(ObjectManagerInterface $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Returns ObjectManagerFactory + * + * @param array $initParams + * @return \Magento\Framework\App\ObjectManagerFactory + */ + public function getObjectManagerFactory($initParams = []) + { + return $this->bootstrap->createObjectManagerFactory( + BP, + $initParams + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/PackagesAuth.php b/magento/setup/src/Magento/Setup/Model/PackagesAuth.php new file mode 100644 index 0000000..619521d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/PackagesAuth.php @@ -0,0 +1,32 @@ +current) { + $this->current = array_map(function ($ext) { + return str_replace(' ', '-', strtolower($ext)); + }, get_loaded_extensions()); + } + return $this->current; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/PhpReadinessCheck.php b/magento/setup/src/Magento/Setup/Model/PhpReadinessCheck.php new file mode 100644 index 0000000..86a377c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/PhpReadinessCheck.php @@ -0,0 +1,362 @@ +composerInformation = $composerInformation; + $this->phpInformation = $phpInformation; + $this->versionParser = $versionParser; + $this->dataSize = $dataSize; + } + + /** + * Checks PHP version + * + * @return array + */ + public function checkPhpVersion() + { + try { + $requiredVersion = $this->composerInformation->getRequiredPhpVersion(); + } catch (\Exception $e) { + return [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => [ + 'error' => 'phpVersionError', + 'message' => 'Cannot determine required PHP version: ' . $e->getMessage() + ], + ]; + } + $multipleConstraints = $this->versionParser->parseConstraints($requiredVersion); + $normalizedPhpVersion = $this->getNormalizedCurrentPhpVersion(PHP_VERSION); + $currentPhpVersion = $this->versionParser->parseConstraints($normalizedPhpVersion); + $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; + if (!$multipleConstraints->matches($currentPhpVersion)) { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; + } + return [ + 'responseType' => $responseType, + 'data' => [ + 'required' => $requiredVersion, + 'current' => PHP_VERSION, + ], + ]; + } + + /** + * Checks PHP settings + * + * @return array + */ + public function checkPhpSettings() + { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; + + $settings = array_merge( + $this->checkXDebugNestedLevel(), + $this->checkPopulateRawPostSetting(), + $this->checkFunctionsExistence() + ); + + foreach ($settings as $setting) { + if ($setting['error']) { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; + } + } + + return [ + 'responseType' => $responseType, + 'data' => $settings + ]; + } + + /** + * Checks PHP settings for cron + * + * @return array + */ + public function checkPhpCronSettings() + { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; + + $settings = array_merge( + $this->checkXDebugNestedLevel(), + $this->checkMemoryLimit() + ); + + foreach ($settings as $setting) { + if ($setting['error']) { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; + } + } + + return [ + 'responseType' => $responseType, + 'data' => $settings + ]; + } + + /** + * Checks PHP extensions + * + * @return array + */ + public function checkPhpExtensions() + { + try { + $required = $this->composerInformation->getRequiredExtensions(); + $current = $this->phpInformation->getCurrent(); + } catch (\Exception $e) { + return [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => [ + 'error' => 'phpExtensionError', + 'message' => 'Cannot determine required PHP extensions: ' . $e->getMessage() + ], + ]; + } + $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; + $missing = array_values(array_diff($required, $current)); + if ($missing) { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; + } + return [ + 'responseType' => $responseType, + 'data' => [ + 'required' => $required, + 'missing' => $missing, + ], + ]; + } + + /** + * Checks php memory limit + * + * @return array + */ + public function checkMemoryLimit() + { + $data = []; + $warning = false; + $error = false; + $message = ''; + $minimumRequiredMemoryLimit = '756M'; + $recommendedForUpgradeMemoryLimit = '2G'; + + $currentMemoryLimit = ini_get('memory_limit'); + + $currentMemoryInteger = (int)$currentMemoryLimit; + + if ($currentMemoryInteger > 0 + && $this->dataSize->convertSizeToBytes($currentMemoryLimit) + < $this->dataSize->convertSizeToBytes($minimumRequiredMemoryLimit) + ) { + $error = true; + $message = sprintf( + 'Your current PHP memory limit is %s. + Magento 2 requires it to be set to %s or more. + As a user with root privileges, edit your php.ini file to increase memory_limit. + (The command php --ini tells you where it is located.) + After that, restart your web server and try again.', + $currentMemoryLimit, + $minimumRequiredMemoryLimit + ); + } elseif ($currentMemoryInteger > 0 + && $this->dataSize->convertSizeToBytes($currentMemoryLimit) + < $this->dataSize->convertSizeToBytes($recommendedForUpgradeMemoryLimit) + ) { + $warning = true; + $message = sprintf( + 'Your current PHP memory limit is %s. + We recommend it to be set to %s or more to use Setup Wizard. + As a user with root privileges, edit your php.ini file to increase memory_limit. + (The command php --ini tells you where it is located.) + After that, restart your web server and try again.', + $currentMemoryLimit, + $recommendedForUpgradeMemoryLimit + ); + } + + $data['memory_limit'] = [ + 'message' => $message, + 'error' => $error, + 'warning' => $warning, + ]; + + return $data; + } + + /** + * Checks if xdebug.max_nesting_level is set 200 or more + * + * @return array + */ + private function checkXDebugNestedLevel() + { + $data = []; + $error = false; + + $currentExtensions = $this->phpInformation->getCurrent(); + if (in_array('xdebug', $currentExtensions)) { + $currentXDebugNestingLevel = (int)ini_get('xdebug.max_nesting_level'); + $minimumRequiredXDebugNestedLevel = $this->phpInformation->getRequiredMinimumXDebugNestedLevel(); + + if ($minimumRequiredXDebugNestedLevel > $currentXDebugNestingLevel) { + $error = true; + } + + $message = sprintf( + 'Your current setting of xdebug.max_nesting_level=%d. + Magento 2 requires it to be set to %d or more. + Edit your config, restart web server, and try again.', + $currentXDebugNestingLevel, + $minimumRequiredXDebugNestedLevel + ); + + $data['xdebug_max_nesting_level'] = [ + 'message' => $message, + 'error' => $error + ]; + } + + return $data; + } + + /** + * Checks if PHP version >= 5.6.0 and always_populate_raw_post_data is set to -1 + * + * Beginning PHP 7.0, support for 'always_populate_raw_post_data' is going to removed. + * And beginning PHP 5.6, a deprecated message is displayed if 'always_populate_raw_post_data' + * is set to a value other than -1. + * + * @return array + */ + private function checkPopulateRawPostSetting() + { + // HHVM and PHP 7does not support 'always_populate_raw_post_data' to be set to -1 + if (version_compare(PHP_VERSION, '7.0.0-beta') >= 0 || defined('HHVM_VERSION')) { + return []; + } + + $data = []; + $error = false; + $iniSetting = (int)ini_get('always_populate_raw_post_data'); + + $checkVersionConstraint = $this->versionParser->parseConstraints('~5.6.0'); + $normalizedPhpVersion = $this->getNormalizedCurrentPhpVersion(PHP_VERSION); + $currentVersion = $this->versionParser->parseConstraints($normalizedPhpVersion); + if ($checkVersionConstraint->matches($currentVersion) && $iniSetting !== -1) { + $error = true; + } + + $message = sprintf( + 'Your PHP Version is %s, but always_populate_raw_post_data = %d. + $HTTP_RAW_POST_DATA is deprecated from PHP 5.6 onwards and will be removed in PHP 7.0. + This will stop the installer from running. + Please open your php.ini file and set always_populate_raw_post_data to -1. + If you need more help please call your hosting provider.', + PHP_VERSION, + (int)ini_get('always_populate_raw_post_data') + ); + + $data['always_populate_raw_post_data'] = [ + 'message' => $message, + 'helpUrl' => 'http://php.net/manual/en/ini.core.php#ini.always-populate-settings-data', + 'error' => $error + ]; + + return $data; + } + + /** + * Check whether all special functions exists + * + * @return array + */ + private function checkFunctionsExistence() + { + $data = []; + $requiredFunctions = [ + [ + 'name' => 'imagecreatefromjpeg', + 'message' => 'You must have installed GD library with --with-jpeg-dir=DIR option.', + 'helpUrl' => 'http://php.net/manual/en/image.installation.php', + ], + ]; + + foreach ($requiredFunctions as $function) { + $data['missed_function_' . $function['name']] = [ + 'message' => $function['message'], + 'helpUrl' => $function['helpUrl'], + 'error' => !function_exists($function['name']), + ]; + } + + return $data; + } + + /** + * Normalize PHP Version + * + * @param string $version + * @return string + */ + private function getNormalizedCurrentPhpVersion($version) + { + try { + $normalizedPhpVersion = $this->versionParser->normalize($version); + } catch (\UnexpectedValueException $e) { + $prettyVersion = preg_replace('#^([^~+-]+).*$#', '$1', $version); + $normalizedPhpVersion = $this->versionParser->normalize($prettyVersion); + } + return $normalizedPhpVersion; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/SearchConfig.php b/magento/setup/src/Magento/Setup/Model/SearchConfig.php new file mode 100644 index 0000000..5aac234 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/SearchConfig.php @@ -0,0 +1,121 @@ +searchConfigOptionsList = $searchConfigOptionsList; + $this->searchValidator = $searchValidator; + $this->installConfig = $installConfig; + } + + /** + * Save the search engine configuration + * + * @param array $inputOptions + * @throws SetupException + * @throws ValidationException + */ + public function saveConfiguration(array $inputOptions) + { + $searchConfigOptions = $this->extractSearchOptions($inputOptions); + if (!empty($searchConfigOptions[SearchConfigOptionsList::INPUT_KEY_SEARCH_ENGINE])) { + $this->validateSearchEngineSelection($searchConfigOptions); + } + try { + $this->installConfig->configure($searchConfigOptions); + } catch (\Exception $e) { + throw new SetupException($e->getMessage()); + } + $this->validateSearchEngine(); + } + + /** + * Validate search engine + * + * @throws ValidationException + */ + public function validateSearchEngine() + { + $validationErrors = $this->searchValidator->validate(); + if (!empty($validationErrors)) { + throw new ValidationException(__(implode(PHP_EOL, $validationErrors))); + } + } + + /** + * Validate the selected search engine + * + * @param array $searchOptions + * @throws SetupException + */ + private function validateSearchEngineSelection(array $searchOptions) + { + if (isset($searchOptions[SearchConfigOptionsList::INPUT_KEY_SEARCH_ENGINE])) { + $selectedEngine = $searchOptions[SearchConfigOptionsList::INPUT_KEY_SEARCH_ENGINE]; + $availableEngines = $this->searchConfigOptionsList->getAvailableSearchEngineList(); + if (!isset($availableEngines[$selectedEngine])) { + throw new SetupException("Search engine '{$selectedEngine}' is not an available search engine."); + } + } + } + + /** + * Extract configuration options for search + * + * @param array $inputOptions + * @return array + */ + private function extractSearchOptions(array $inputOptions): array + { + $searchOptions = []; + $installOptions = $this->searchConfigOptionsList->getOptionsList(); + /** @var AbstractConfigOption $option */ + foreach ($installOptions as $option) { + $optionName = $option->getName(); + if (isset($inputOptions[$optionName])) { + $searchOptions[$optionName] = $inputOptions[$optionName]; + } + } + return $searchOptions; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/SearchConfigFactory.php b/magento/setup/src/Magento/Setup/Model/SearchConfigFactory.php new file mode 100644 index 0000000..4cf3467 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/SearchConfigFactory.php @@ -0,0 +1,38 @@ +objectManagerProvider = $objectManagerProvider; + } + + /** + * Create SearchConfig instance + * + * @return SearchConfig + * @throws \Magento\Setup\Exception + */ + public function create(): SearchConfig + { + return $this->objectManagerProvider->get()->create(SearchConfig::class); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/SearchConfigOptionsList.php b/magento/setup/src/Magento/Setup/Model/SearchConfigOptionsList.php new file mode 100644 index 0000000..88e72fd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/SearchConfigOptionsList.php @@ -0,0 +1,104 @@ +getAvailableSearchEngineList()), + '', + 'Search engine. Values: ' . implode(', ', array_keys($this->getAvailableSearchEngineList())) + ), + new TextConfigOption( + self::INPUT_KEY_ELASTICSEARCH_HOST, + TextConfigOption::FRONTEND_WIZARD_TEXT, + '', + 'Elasticsearch server host.' + ), + new TextConfigOption( + self::INPUT_KEY_ELASTICSEARCH_PORT, + TextConfigOption::FRONTEND_WIZARD_TEXT, + '', + 'Elasticsearch server port.' + ), + new TextConfigOption( + self::INPUT_KEY_ELASTICSEARCH_ENABLE_AUTH, + TextConfigOption::FRONTEND_WIZARD_TEXT, + '', + 'Set to 1 to enable authentication. (default is 0, disabled)' + ), + new TextConfigOption( + self::INPUT_KEY_ELASTICSEARCH_USERNAME, + TextConfigOption::FRONTEND_WIZARD_TEXT, + '', + 'Elasticsearch username. Only applicable if HTTP auth is enabled' + ), + new TextConfigOption( + self::INPUT_KEY_ELASTICSEARCH_PASSWORD, + TextConfigOption::FRONTEND_WIZARD_PASSWORD, + '', + 'Elasticsearch password. Only applicable if HTTP auth is enabled' + ), + new TextConfigOption( + self::INPUT_KEY_ELASTICSEARCH_INDEX_PREFIX, + TextConfigOption::FRONTEND_WIZARD_TEXT, + '', + 'Elasticsearch index prefix.' + ), + new TextConfigOption( + self::INPUT_KEY_ELASTICSEARCH_TIMEOUT, + TextConfigOption::FRONTEND_WIZARD_TEXT, + '', + 'Elasticsearch server timeout.' + ) + ]; + } + + /** + * Get UI friendly list of available search engines + * + * @return array + */ + public function getAvailableSearchEngineList(): array + { + return [ + 'elasticsearch5' => 'Elasticsearch 5.x (deprecated)', + 'elasticsearch6' => 'Elasticsearch 6.x', + 'elasticsearch7' => 'Elasticsearch 7.x' + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/SearchTermDescriptionGenerator.php b/magento/setup/src/Magento/Setup/Model/SearchTermDescriptionGenerator.php new file mode 100644 index 0000000..168cf92 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/SearchTermDescriptionGenerator.php @@ -0,0 +1,71 @@ +descriptionGenerator = $descriptionGenerator; + $this->searchTermManager = $searchTermManager; + } + + /** + * Generate description with search terms + * + * @param int $currentProductIndex + * @return string + */ + public function generate($currentProductIndex) + { + $description = $this->getDescription(); + $this->searchTermManager->applySearchTermsToDescription($description, (int) $currentProductIndex); + + return $description; + } + + /** + * Generate new description or use cached one + * + * @param bool $useCachedDescription + * @return string + */ + private function getDescription($useCachedDescription = true) + { + if ($useCachedDescription !== true || $this->cachedDescription === null) { + $this->cachedDescription = $this->descriptionGenerator->generate(); + } + + return $this->cachedDescription; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/SearchTermDescriptionGeneratorFactory.php b/magento/setup/src/Magento/Setup/Model/SearchTermDescriptionGeneratorFactory.php new file mode 100644 index 0000000..d2506f4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/SearchTermDescriptionGeneratorFactory.php @@ -0,0 +1,188 @@ +objectManager = $objectManager; + $this->fixtureConfig = $fixtureConfig; + $this->sentenceGeneratorFactory = $descriptionSentenceGeneratorFactory + ?: $objectManager->get(DescriptionSentenceGeneratorFactory::class); + $this->paragraphGeneratorFactory = $descriptionParagraphGeneratorFactory + ?: $objectManager->get(DescriptionParagraphGeneratorFactory::class); + $this->descriptionGeneratorFactory = $descriptionGeneratorFactory + ?: $objectManager->get(DescriptionGeneratorFactory::class); + $this->dictionaryFactory = $dictionaryFactory + ?: $objectManager->get(DictionaryFactory::class); + $this->searchTermManagerFactory = $searchTermManagerFactory + ?: $objectManager->get(SearchTermManagerFactory::class); + } + + /** + * Search term description factory + * + * @param array|null $descriptionConfig + * @param array|null $searchTermsConfig + * @param int $totalProductsCount + * @param string $defaultDescription + * @return DescriptionGeneratorInterface + */ + public function create( + $descriptionConfig, + $searchTermsConfig, + $totalProductsCount, + $defaultDescription = '' + ) { + $this->updateSearchTermConfig($searchTermsConfig); + if (empty($descriptionConfig) || empty($searchTermsConfig)) { + return $this->objectManager->create( + DefaultDescriptionGenerator::class, + ['defaultDescription' => $defaultDescription] + ); + } + return $this->objectManager->create(\Magento\Setup\Model\SearchTermDescriptionGenerator::class, [ + 'descriptionGenerator' => $this->buildDescriptionGenerator($descriptionConfig), + 'searchTermManager' => $this->buildSearchTermManager($searchTermsConfig, $totalProductsCount) + ]); + } + + /** + * Update search terms distribution to be almost the same per each website + * + * @param array|null $searchTermsConfig + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * @return void + */ + private function updateSearchTermConfig(&$searchTermsConfig) + { + if (null !== $searchTermsConfig) { + $websitesCount = (bool)$this->fixtureConfig->getValue('assign_entities_to_all_websites', false) + ? 1 + : (int)$this->fixtureConfig->getValue('websites', 1); + array_walk( + $searchTermsConfig, + function (&$searchTerm, $key, $websitesCount) { + $searchTerm['count'] *= $websitesCount; + }, + $websitesCount + ); + } + } + + /** + * Builder for DescriptionGenerator + * + * @param array $descriptionConfig + * @return \Magento\Setup\Model\Description\DescriptionGenerator + */ + private function buildDescriptionGenerator(array $descriptionConfig) + { + $sentenceGenerator = $this->sentenceGeneratorFactory->create([ + 'dictionary' => $this->dictionaryFactory->create([ + 'dictionaryFilePath' => realpath(__DIR__ . '/../Fixtures/_files/dictionary.csv') + ]), + 'sentenceConfig' => $descriptionConfig['paragraphs']['sentences'] + ]); + + $paragraphGenerator = $this->paragraphGeneratorFactory->create([ + 'sentenceGenerator' => $sentenceGenerator, + 'paragraphConfig' => $descriptionConfig['paragraphs'] + ]); + + $descriptionGenerator = $this->descriptionGeneratorFactory->create([ + 'paragraphGenerator' => $paragraphGenerator, + 'mixinManager' => $this->objectManager->create(\Magento\Setup\Model\Description\MixinManager::class), + 'descriptionConfig' => $descriptionConfig + ]); + + return $descriptionGenerator; + } + + /** + * Builder for SearchTermManager + * + * @param array $searchTermsConfig + * @param int $totalProductsCount + * @return \Magento\Setup\Model\SearchTermManager + */ + private function buildSearchTermManager(array $searchTermsConfig, $totalProductsCount) + { + return $this->searchTermManagerFactory->create( + [ + 'searchTerms' => $searchTermsConfig, + 'totalProductsCount' => $totalProductsCount + ] + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/SearchTermManager.php b/magento/setup/src/Magento/Setup/Model/SearchTermManager.php new file mode 100644 index 0000000..5b1dfae --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/SearchTermManager.php @@ -0,0 +1,82 @@ +searchTerms = $searchTerms; + $this->totalProductsCount = (int) $totalProductsCount; + } + + /** + * Apply search terms to product description + * based on search terms use distribution + * + * @param string $description + * @param int $currentProductIndex + * @return void + */ + public function applySearchTermsToDescription(&$description, $currentProductIndex) + { + if ($this->searchTermsUseRate === null) { + $this->calculateSearchTermsUseRate(); + } + + foreach ($this->searchTerms as &$searchTerm) { + if ($this->searchTermsUseRate[$searchTerm['term']]['use_rate'] > 0 + && $currentProductIndex % $this->searchTermsUseRate[$searchTerm['term']]['use_rate'] === 0 + && $this->searchTermsUseRate[$searchTerm['term']]['used'] < $searchTerm['count'] + ) { + $description .= ' ' . $searchTerm['term']; + $this->searchTermsUseRate[$searchTerm['term']]['used'] += 1; + } + } + } + + /** + * Calculates search terms use distribution + * based on total amount of products that will be generated + * and number of each search term + * + * @return void; + */ + private function calculateSearchTermsUseRate() + { + foreach ($this->searchTerms as $searchTerm) { + $this->searchTermsUseRate[$searchTerm['term']] = [ + 'use_rate' => floor($this->totalProductsCount / $searchTerm['count']), + 'used' => 0 + ]; + } + } +} diff --git a/magento/setup/src/Magento/Setup/Model/StoreConfigurationDataMapper.php b/magento/setup/src/Magento/Setup/Model/StoreConfigurationDataMapper.php new file mode 100644 index 0000000..45006ec --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/StoreConfigurationDataMapper.php @@ -0,0 +1,89 @@ + self::KEY_USE_SEF_URL, + Store::XML_PATH_UNSECURE_BASE_URL => self::KEY_BASE_URL, + Store::XML_PATH_SECURE_BASE_URL => self::KEY_BASE_URL_SECURE, + Data::XML_PATH_DEFAULT_LOCALE => self::KEY_LANGUAGE, + Store::XML_PATH_SECURE_IN_FRONTEND => self::KEY_IS_SECURE, + Store::XML_PATH_SECURE_IN_ADMINHTML => self::KEY_IS_SECURE_ADMIN, + Data::XML_PATH_DEFAULT_TIMEZONE => self::KEY_TIMEZONE, + Currency::XML_PATH_CURRENCY_BASE => self::KEY_CURRENCY, + Currency::XML_PATH_CURRENCY_DEFAULT => self::KEY_CURRENCY, + Currency::XML_PATH_CURRENCY_ALLOW => self::KEY_CURRENCY, + Url::XML_PATH_USE_SECURE_KEY => self::KEY_ADMIN_USE_SECURITY_KEY, + UiConfig::XML_PATH_LOGGING => self::KEY_JS_LOGGING + ]; + + /** + * Gets All Configuration Data + * + * @param array $installParamData + * @return array + */ + public function getConfigData($installParamData) + { + $configData = []; + + foreach ($this->pathDataMap as $path => $key) { + $configData = $this->addParamToConfigData($configData, $installParamData, $key, $path); + } + return $configData; + } + + /** + * Adds an install parameter value to the configData structure + * + * @param array $configData + * @param array $installParamData + * @param string $key + * @param string $path + * @return array + */ + private function addParamToConfigData($configData, $installParamData, $key, $path) + { + if (isset($installParamData[$key])) { + if (($key === self::KEY_BASE_URL) || ($key === self::KEY_BASE_URL_SECURE)) { + $installParamData[$key] = rtrim($installParamData[$key], '/') . '/'; + } + $configData[$path] = $installParamData[$key]; + } + return $configData; + } +} diff --git a/magento/setup/src/Magento/Setup/Model/ThemeDependencyCheckerFactory.php b/magento/setup/src/Magento/Setup/Model/ThemeDependencyCheckerFactory.php new file mode 100644 index 0000000..37ee79a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/ThemeDependencyCheckerFactory.php @@ -0,0 +1,40 @@ +objectManagerProvider = $objectManagerProvider; + } + + /** + * Creates ThemeDependencyChecker object + * + * @return ThemeDependencyChecker + */ + public function create() + { + return $this->objectManagerProvider->get()->get(\Magento\Theme\Model\Theme\ThemeDependencyChecker::class); + } +} diff --git a/magento/setup/src/Magento/Setup/Model/UninstallCollector.php b/magento/setup/src/Magento/Setup/Model/UninstallCollector.php new file mode 100644 index 0000000..94ef033 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Model/UninstallCollector.php @@ -0,0 +1,74 @@ +objectManager = $objectManagerProvider->get(); + $this->dataSetupFactory = $dataSetupFactory; + } + + /** + * Collect Uninstall classes from modules + * + * @param array $filterModules + * @return UninstallInterface[] + */ + public function collectUninstall($filterModules = []) + { + $uninstallList = []; + /** @var \Magento\Setup\Module\DataSetup $setup */ + $setup = $this->dataSetupFactory->create(); + $result = $setup->getConnection()->select()->from($setup->getTable('setup_module'), ['module']); + if (isset($filterModules) && count($filterModules) > 0) { + $result->where('module in( ? )', $filterModules); + } + // go through modules + foreach ($setup->getConnection()->fetchAll($result) as $row) { + $uninstallClassName = str_replace('_', '\\', $row['module']) . '\Setup\Uninstall'; + if (class_exists($uninstallClassName)) { + $uninstallClass = $this->objectManager->create($uninstallClassName); + if (is_subclass_of($uninstallClass, \Magento\Framework\Setup\UninstallInterface::class)) { + $uninstallList[$row['module']] = $uninstallClass; + } + } + } + + return $uninstallList; + } +} diff --git a/magento/setup/src/Magento/Setup/Module.php b/magento/setup/src/Magento/Setup/Module.php new file mode 100644 index 0000000..ec87d73 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module.php @@ -0,0 +1,83 @@ +getApplication(); + /** @var EventManager $events */ + $events = $application->getEventManager(); + /** @var \Laminas\EventManager\SharedEventManager $sharedEvents */ + $sharedEvents = $events->getSharedManager(); + + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($events); + + // Override Laminas\Mvc\View\Http\InjectTemplateListener + // to process templates by Vendor/Module + $injectTemplateListener = new InjectTemplateListener(); + $sharedEvents->attach( + DispatchableInterface::class, + MvcEvent::EVENT_DISPATCH, + [$injectTemplateListener, 'injectTemplate'], + -89 + ); + $response = $e->getResponse(); + if ($response instanceof \Laminas\Http\Response) { + $headers = $response->getHeaders(); + if ($headers) { + $headers->addHeaderLine('Cache-Control', 'no-cache, no-store, must-revalidate'); + $headers->addHeaderLine('Pragma', 'no-cache'); + $headers->addHeaderLine('Expires', '1970-01-01'); + $headers->addHeaderLine('X-Frame-Options: SAMEORIGIN'); + $headers->addHeaderLine('X-Content-Type-Options: nosniff'); + /** @var \Laminas\Http\Header\UserAgent $userAgentHeader */ + $userAgentHeader = $e->getRequest()->getHeader('User-Agent'); + $xssHeaderValue = $userAgentHeader && $userAgentHeader->getFieldValue() + && strpos($userAgentHeader->getFieldValue(), XssProtection::IE_8_USER_AGENT) === false + ? XssProtection::HEADER_ENABLED : XssProtection::HEADER_DISABLED; + $headers->addHeaderLine('X-XSS-Protection: ' . $xssHeaderValue); + } + } + } + + /** + * @inheritDoc + */ + public function getConfig() + { + // phpcs:disable + $result = array_merge_recursive( + include __DIR__ . '/../../../config/module.config.php', + include __DIR__ . '/../../../config/di.config.php', + ); + // phpcs:enable + return $result; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/ConnectionFactory.php b/magento/setup/src/Magento/Setup/Module/ConnectionFactory.php new file mode 100644 index 0000000..dafab58 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/ConnectionFactory.php @@ -0,0 +1,104 @@ +serviceLocator = $serviceLocator; + } + + /** + * @inheritDoc + */ + public function create(array $connectionConfig) + { + $quote = new \Magento\Framework\DB\Platform\Quote(); + $selectFactory = new \Magento\Framework\DB\SelectFactory( + new \Magento\Framework\DB\Select\SelectRenderer( + [ + 'distinct' => [ + 'renderer' => new \Magento\Framework\DB\Select\DistinctRenderer(), + 'sort' => 100, + 'part' => 'distinct' + ], + 'columns' => [ + 'renderer' => new \Magento\Framework\DB\Select\ColumnsRenderer($quote), + 'sort' => 200, + 'part' => 'columns' + ], + 'union' => [ + 'renderer' => new \Magento\Framework\DB\Select\UnionRenderer(), + 'sort' => 300, + 'part' => 'union' + ], + 'from' => [ + 'renderer' => new \Magento\Framework\DB\Select\FromRenderer($quote), + 'sort' => 400, + 'part' => 'from' + ], + 'where' => [ + 'renderer' => new \Magento\Framework\DB\Select\WhereRenderer(), + 'sort' => 500, + 'part' => 'where' + ], + 'group' => [ + 'renderer' => new \Magento\Framework\DB\Select\GroupRenderer($quote), + 'sort' => 600, + 'part' => 'group' + ], + 'having' => [ + 'renderer' => new \Magento\Framework\DB\Select\HavingRenderer(), + 'sort' => 700, + 'part' => 'having' + ], + 'order' => [ + 'renderer' => new \Magento\Framework\DB\Select\OrderRenderer($quote), + 'sort' => 800, + 'part' => 'order' + ], + 'limit' => [ + 'renderer' => new \Magento\Framework\DB\Select\LimitRenderer(), + 'sort' => 900, + 'part' => 'limitcount' + ], + 'for_update' => [ + 'renderer' => new \Magento\Framework\DB\Select\ForUpdateRenderer(), + 'sort' => 1000, + 'part' => 'forupdate' + ], + ] + ) + ); + $objectManagerProvider = $this->serviceLocator->get(\Magento\Setup\Model\ObjectManagerProvider::class); + $mysqlFactory = new \Magento\Framework\DB\Adapter\Pdo\MysqlFactory($objectManagerProvider->get()); + $resourceInstance = new Mysql($connectionConfig, $mysqlFactory); + return $resourceInstance->getConnection( + $this->serviceLocator->get(\Magento\Framework\DB\Logger\Quiet::class), + $selectFactory + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/DataSetup.php b/magento/setup/src/Magento/Setup/Module/DataSetup.php new file mode 100644 index 0000000..e64a850 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/DataSetup.php @@ -0,0 +1,206 @@ +getResourceModel(), $connectionName); + $this->_eventManager = $context->getEventManager(); + $this->_logger = $context->getLogger(); + $this->_migrationFactory = $context->getMigrationFactory(); + $this->filesystem = $context->getFilesystem(); + $this->setupCache = new SetupCache(); + } + + /** + * {@inheritdoc} + */ + public function getSetupCache() + { + return $this->setupCache; + } + + /** + * Retrieve row or field from table by id or string and parent id + * + * @param string $table + * @param string $idField + * @param string|integer $rowId + * @param string|null $field + * @param string|null $parentField + * @param string|integer $parentId + * @return mixed + */ + public function getTableRow($table, $idField, $rowId, $field = null, $parentField = null, $parentId = 0) + { + $table = $this->getTable($table); + if (!$this->setupCache->has($table, $parentId, $rowId)) { + $connection = $this->getConnection(); + $bind = ['id_field' => $rowId]; + $select = $connection->select() + ->from($table) + ->where($connection->quoteIdentifier($idField) . '= :id_field'); + if (null !== $parentField) { + $select->where($connection->quoteIdentifier($parentField) . '= :parent_id'); + $bind['parent_id'] = $parentId; + } + $this->setupCache->setRow($table, $parentId, $rowId, $connection->fetchRow($select, $bind)); + } + + return $this->setupCache->get($table, $parentId, $rowId, $field); + } + + /** + * Delete table row + * + * @param string $table + * @param string $idField + * @param string|int $rowId + * @param null|string $parentField + * @param int|string $parentId + * @return $this + */ + public function deleteTableRow($table, $idField, $rowId, $parentField = null, $parentId = 0) + { + $table = $this->getTable($table); + $connection = $this->getConnection(); + $where = [$connection->quoteIdentifier($idField) . '=?' => $rowId]; + if (null !== $parentField) { + $where[$connection->quoteIdentifier($parentField) . '=?'] = $parentId; + } + + $connection->delete($table, $where); + + $this->setupCache->remove($table, $parentId, $rowId); + + return $this; + } + + /** + * Update one or more fields of table row + * + * @param string $table + * @param string $idField + * @param string|integer $rowId + * @param string|array $field + * @param mixed|null $value + * @param string $parentField + * @param string|integer $parentId + * @return $this + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function updateTableRow($table, $idField, $rowId, $field, $value = null, $parentField = null, $parentId = 0) + { + $table = $this->getTable($table); + if (is_array($field)) { + $data = $field; + } else { + $data = [$field => $value]; + } + + $connection = $this->getConnection(); + $where = [$connection->quoteIdentifier($idField) . '=?' => $rowId]; + $connection->update($table, $data, $where); + + if (is_array($field)) { + $oldRow = $this->setupCache->has($table, $parentId, $rowId) ? + $this->setupCache->get($table, $parentId, $rowId) : + []; + $newRowData = array_merge($oldRow, $field); + $this->setupCache->setRow($table, $parentId, $rowId, $newRowData); + } else { + $this->setupCache->setField($table, $parentId, $rowId, $field, $value); + } + + return $this; + } + + /** + * Gets event manager + * + * @return \Magento\Framework\Event\ManagerInterface + */ + public function getEventManager() + { + return $this->_eventManager; + } + + /** + * Gets filesystem + * + * @return \Magento\Framework\Filesystem + */ + public function getFilesystem() + { + return $this->filesystem; + } + + /** + * Create migration setup + * + * @param array $data + * @return \Magento\Framework\Module\Setup\Migration + */ + public function createMigrationSetup(array $data = []) + { + $data['setup'] = $this; + return $this->_migrationFactory->create($data); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/DataSetupFactory.php b/magento/setup/src/Magento/Setup/Module/DataSetupFactory.php new file mode 100644 index 0000000..b19defb --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/DataSetupFactory.php @@ -0,0 +1,41 @@ +objectManagerProvider = $objectManagerProvider; + } + + /** + * Creates DataSetup + * + * @return DataSetup + */ + public function create() + { + $objectManager = $this->objectManagerProvider->get(); + return new DataSetup($objectManager->get(\Magento\Framework\Module\Setup\Context::class)); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Circular.php b/magento/setup/src/Magento/Setup/Module/Dependency/Circular.php new file mode 100644 index 0000000..a10d275 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Circular.php @@ -0,0 +1,142 @@ +init($dependencies); + + foreach (array_keys($this->dependencies) as $vertex) { + $this->expandDependencies($vertex); + } + + $circulars = $this->graph->findCycle(null, false); + foreach ($circulars as $circular) { + array_shift($circular); + $this->buildCircular($circular); + } + + return $this->divideByModules($this->circularDependencies); + } + + /** + * Init data before building + * + * @param array $dependencies + * @return void + */ + protected function init($dependencies) + { + $this->dependencies = $dependencies; + $this->circularDependencies = []; + $this->graph = new Graph(array_keys($this->dependencies), []); + } + + /** + * Expand modules dependencies from chain + * + * @param string $vertex + * @param array $path nesting path + * @return void + */ + protected function expandDependencies($vertex, $path = []) + { + if (!$this->dependencies[$vertex]) { + return; + } + + $path[] = $vertex; + foreach ($this->dependencies[$vertex] as $dependency) { + if (!isset($this->dependencies[$dependency])) { + // dependency vertex is not described in basic definition + continue; + } + $relations = $this->graph->getRelations(); + if (isset($relations[$vertex][$dependency])) { + continue; + } + $this->graph->addRelation($vertex, $dependency); + + $searchResult = array_search($dependency, $path); + + if (false !== $searchResult) { + $this->buildCircular(array_slice($path, $searchResult)); + break; + } else { + $this->expandDependencies($dependency, $path); + } + } + } + + /** + * Build all circular dependencies based on chain + * + * @param array $modules + * @return void + */ + protected function buildCircular($modules) + { + $path = '/' . implode('/', $modules); + if (isset($this->circularDependencies[$path])) { + return; + } + $this->circularDependencies[$path] = $modules; + $modules[] = array_shift($modules); + $this->buildCircular($modules); + } + + /** + * Divide dependencies by modules + * + * @param array $circularDependencies + * @return array + */ + protected function divideByModules($circularDependencies) + { + $dependenciesByModule = []; + foreach ($circularDependencies as $circularDependency) { + $module = $circularDependency[0]; + $circularDependency[] = $module; + $dependenciesByModule[$module][] = $circularDependency; + } + + return $dependenciesByModule; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Code.php b/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Code.php new file mode 100644 index 0000000..10b3b4f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Code.php @@ -0,0 +1,110 @@ +checkOptions($options); + + $this->declaredNamespaces = $options['declared_namespaces']; + + $pattern = '#\b((?(' . implode( + '[\\\\]|', + $this->declaredNamespaces + ) . '[\\\\])[a-zA-Z0-9]+)[a-zA-Z0-9_\\\\]*)\b#'; + + $modules = []; + foreach ($options['files_for_parse'] as $file) { + $content = file_get_contents($file); + $module = $this->extractModuleName($file); + + // also collect modules without dependencies + if (!isset($modules[$module])) { + $modules[$module] = ['name' => $module, 'dependencies' => []]; + } + + if (preg_match_all($pattern, $content, $matches)) { + $dependencies = array_count_values($matches['module']); + foreach ($dependencies as $dependency => $count) { + if ($module == $dependency) { + continue; + } + if (isset($modules[$module]['dependencies'][$dependency])) { + $modules[$module]['dependencies'][$dependency]['count'] += $count; + } else { + $modules[$module]['dependencies'][$dependency] = [ + 'lib' => $dependency, + 'count' => $count, + ]; + } + } + } + } + return $modules; + } + + /** + * Template method. Check passed options step + * + * @param array $options + * @return void + * @throws \InvalidArgumentException + */ + protected function checkOptions($options) + { + if (!isset( + $options['files_for_parse'] + ) || !is_array( + $options['files_for_parse'] + ) || !$options['files_for_parse'] + ) { + throw new \InvalidArgumentException('Parse error: Option "files_for_parse" is wrong.'); + } + + if (!isset( + $options['declared_namespaces'] + ) || !is_array( + $options['declared_namespaces'] + ) || !$options['declared_namespaces'] + ) { + throw new \InvalidArgumentException('Parse error: Option "declared_namespaces" is wrong.'); + } + } + + /** + * Extract module name form file path + * + * @param string $file + * @return string + */ + protected function extractModuleName($file) + { + $pattern = '#code/(?' . $this->declaredNamespaces[0] . ')[/_\\\\]?(?[^/]+)/#'; + if (preg_match($pattern, $file, $matches)) { + return $matches['namespace'] . '\\' . $matches['module']; + } + return ''; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Composer/Json.php b/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Composer/Json.php new file mode 100644 index 0000000..e3d4ebd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Composer/Json.php @@ -0,0 +1,117 @@ +checkOptions($options); + + $modules = []; + foreach ($options['files_for_parse'] as $file) { + $package = $this->getModuleComposerPackage($file); + $modules[] = [ + 'name' => $this->extractModuleName($package), + 'dependencies' => $this->extractDependencies($package), + ]; + } + return $modules; + } + + /** + * Template method. Check passed options step + * + * @param array $options + * @return void + * @throws \InvalidArgumentException + */ + protected function checkOptions($options) + { + if (!isset( + $options['files_for_parse'] + ) || !is_array( + $options['files_for_parse'] + ) || !$options['files_for_parse'] + ) { + throw new \InvalidArgumentException('Parse error: Option "files_for_parse" is wrong.'); + } + } + + /** + * Template method. Extract module step + * + * @param Package $package + * @return string + */ + protected function extractModuleName($package) + { + return $this->prepareModuleName((string)$package->get('name')); + } + + /** + * Template method. Extract dependencies step + * + * @param Package $package + * @return array + */ + protected function extractDependencies($package) + { + $dependencies = []; + $requires = $package->get('require', '/.+\/module-/'); + if ($requires) { + foreach ($requires as $key => $value) { + $dependencies[] = [ + 'module' => $this->prepareModuleName($key), + 'type' => 'hard', + ]; + } + } + + $suggests = $package->get('suggest', '/.+\/module-/'); + if ($suggests) { + foreach ($suggests as $key => $value) { + $dependencies[] = [ + 'module' => $this->prepareModuleName($key), + 'type' => 'soft', + ]; + } + } + + return $dependencies; + } + + /** + * Template method. Load module config step + * + * @param string $file + * @return Package + */ + protected function getModuleComposerPackage($file) + { + return new Package(json_decode(file_get_contents($file))); + } + + /** + * Prepare module name + * + * @param string $name + * @return string + */ + protected function prepareModuleName($name) + { + return $name; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Config/Xml.php b/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Config/Xml.php new file mode 100644 index 0000000..09836ea --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Parser/Config/Xml.php @@ -0,0 +1,83 @@ +checkOptions($options); + + $modules = []; + foreach ($options['files_for_parse'] as $file) { + $config = $this->getModuleConfig($file); + $modules[] = $this->extractModuleName($config); + } + return $modules; + } + + /** + * Template method. Check passed options step + * + * @param array $options + * @return void + * @throws \InvalidArgumentException + */ + protected function checkOptions($options) + { + if (!isset( + $options['files_for_parse'] + ) || !is_array( + $options['files_for_parse'] + ) || !$options['files_for_parse'] + ) { + throw new \InvalidArgumentException('Parse error: Option "files_for_parse" is wrong.'); + } + } + + /** + * Template method. Extract module step + * + * @param \SimpleXMLElement $config + * @return string + */ + protected function extractModuleName($config) + { + return $this->prepareModuleName((string)$config->attributes()->name); + } + + /** + * Template method. Load module config step + * + * @param string $file + * @return \SimpleXMLElement + */ + protected function getModuleConfig($file) + { + return \simplexml_load_file($file)->xpath('/config/module')[0]; + } + + /** + * Prepare module name + * + * @param string $name + * @return string + */ + protected function prepareModuleName($name) + { + return str_replace('_', '\\', $name); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/ParserInterface.php b/magento/setup/src/Magento/Setup/Module/Dependency/ParserInterface.php new file mode 100644 index 0000000..cc21b6f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/ParserInterface.php @@ -0,0 +1,20 @@ +dependenciesParser = $dependenciesParser; + $this->reportWriter = $reportWriter; + } + + /** + * Template method. Main algorithm + * + * {@inheritdoc} + */ + public function build(array $options) + { + $this->checkOptions($options); + $this->options = $options; + + $config = $this->buildData($this->dependenciesParser->parse($options['parse'])); + $this->reportWriter->write($options['write'], $config); + } + + /** + * Template method. Check passed options step + * + * @param array $options + * @return void + * @throws \InvalidArgumentException + */ + protected function checkOptions($options) + { + if (!isset($options['parse']) || empty($options['parse'])) { + throw new \InvalidArgumentException('Passed option section "parse" is wrong.'); + } + + if (!isset($options['write']) || empty($options['write'])) { + throw new \InvalidArgumentException('Passed option section "write" is wrong.'); + } + } + + /** + * Template method. Prepare data for writer step + * + * @param array $modulesData + * @return \Magento\Setup\Module\Dependency\Report\Data\ConfigInterface + */ + abstract protected function buildData($modulesData); +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/BuilderInterface.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/BuilderInterface.php new file mode 100644 index 0000000..55d6860 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/BuilderInterface.php @@ -0,0 +1,20 @@ +circularBuilder = $circularBuilder; + } + + /** + * Template method. Prepare data for writer step + * + * @param array $modulesData + * @return \Magento\Setup\Module\Dependency\Report\Circular\Data\Config + */ + protected function buildData($modulesData) + { + $modules = []; + foreach ($this->buildCircularDependencies($modulesData) as $moduleName => $modulesChains) { + $chains = []; + foreach ($modulesChains as $modulesChain) { + $chains[] = new Data\Chain($modulesChain); + } + $modules[] = new Data\Module($moduleName, $chains); + } + return new Data\Config($modules); + } + + /** + * Build circular dependencies data by dependencies data + * + * @param array $modulesData + * @return array + */ + protected function buildCircularDependencies($modulesData) + { + $dependencies = []; + foreach ($modulesData as $moduleData) { + foreach ($moduleData['dependencies'] as $dependencyData) { + $dependencies[$moduleData['name']][] = $dependencyData['module']; + } + } + return $this->circularBuilder->buildCircularDependencies($dependencies); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Chain.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Chain.php new file mode 100644 index 0000000..38e200a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Chain.php @@ -0,0 +1,37 @@ +modules = $modules; + } + + /** + * Get modules + * + * @return array + */ + public function getModules() + { + return $this->modules; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Config.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Config.php new file mode 100644 index 0000000..f8fe950 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Config.php @@ -0,0 +1,28 @@ +getModules() as $module) { + $dependenciesCount += $module->getChainsCount(); + } + return $dependenciesCount; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Module.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Module.php new file mode 100644 index 0000000..d8f7cb7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Data/Module.php @@ -0,0 +1,68 @@ +name = $name; + $this->chains = $chains; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get circular dependencies chains + * + * @return \Magento\Setup\Module\Dependency\Report\Circular\Data\Chain[] + */ + public function getChains() + { + return $this->chains; + } + + /** + * Get circular dependencies chains count + * + * @return int + */ + public function getChainsCount() + { + return count($this->chains); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Writer.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Writer.php new file mode 100644 index 0000000..b23bc57 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Circular/Writer.php @@ -0,0 +1,46 @@ +'; + + /** + * Template method. Prepare data step + * + * @param \Magento\Setup\Module\Dependency\Report\Circular\Data\Config $config + * @return array + */ + protected function prepareData($config) + { + $data[] = ['Circular dependencies:', 'Total number of chains']; + $data[] = ['', $config->getDependenciesCount()]; + $data[] = []; + + if ($config->getDependenciesCount()) { + $data[] = ['Circular dependencies for each module:', '']; + foreach ($config->getModules() as $module) { + $data[] = [$module->getName(), $module->getChainsCount()]; + foreach ($module->getChains() as $chain) { + $data[] = [implode(self::MODULES_SEPARATOR, $chain->getModules())]; + } + $data[] = []; + } + } + array_pop($data); + + return $data; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Data/Config/AbstractConfig.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Data/Config/AbstractConfig.php new file mode 100644 index 0000000..700e6fd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Data/Config/AbstractConfig.php @@ -0,0 +1,44 @@ +modules = $modules; + } + + /** + * {@inheritdoc} + */ + public function getModules() + { + return $this->modules; + } + + /** + * {@inheritdoc} + */ + abstract public function getDependenciesCount(); +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Data/ConfigInterface.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Data/ConfigInterface.php new file mode 100644 index 0000000..e1ac923 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Data/ConfigInterface.php @@ -0,0 +1,26 @@ +getHardDependenciesCount() + $this->getSoftDependenciesCount(); + } + + /** + * Get hard dependencies count + * + * @return int + */ + public function getHardDependenciesCount() + { + $dependenciesCount = 0; + foreach ($this->getModules() as $module) { + $dependenciesCount += $module->getHardDependenciesCount(); + } + return $dependenciesCount; + } + + /** + * Get soft dependencies count + * + * @return int + */ + public function getSoftDependenciesCount() + { + $dependenciesCount = 0; + foreach ($this->getModules() as $module) { + $dependenciesCount += $module->getSoftDependenciesCount(); + } + return $dependenciesCount; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Dependency.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Dependency.php new file mode 100644 index 0000000..9c3e978 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Dependency.php @@ -0,0 +1,84 @@ +module = $module; + + $this->type = self::TYPE_SOFT == $type ? self::TYPE_SOFT : self::TYPE_HARD; + } + + /** + * Get module + * + * @return string + */ + public function getModule() + { + return $this->module; + } + + /** + * Get type + * + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Check is hard dependency + * + * @return bool + */ + public function isHard() + { + return self::TYPE_HARD == $this->getType(); + } + + /** + * Check is soft dependency + * + * @return bool + */ + public function isSoft() + { + return self::TYPE_SOFT == $this->getType(); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Module.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Module.php new file mode 100644 index 0000000..775d76e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Data/Module.php @@ -0,0 +1,100 @@ +name = $name; + $this->dependencies = $dependencies; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get dependencies + * + * @return \Magento\Setup\Module\Dependency\Report\Dependency\Data\Dependency[] + */ + public function getDependencies() + { + return $this->dependencies; + } + + /** + * Get total dependencies count + * + * @return int + */ + public function getDependenciesCount() + { + return count($this->dependencies); + } + + /** + * Get hard dependencies count + * + * @return int + */ + public function getHardDependenciesCount() + { + $dependenciesCount = 0; + foreach ($this->getDependencies() as $dependency) { + if ($dependency->isHard()) { + $dependenciesCount++; + } + } + return $dependenciesCount; + } + + /** + * Get soft dependencies count + * + * @return int + */ + public function getSoftDependenciesCount() + { + $dependenciesCount = 0; + foreach ($this->getDependencies() as $dependency) { + if ($dependency->isSoft()) { + $dependenciesCount++; + } + } + return $dependenciesCount; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Writer.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Writer.php new file mode 100644 index 0000000..e3b5bd9 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Dependency/Writer.php @@ -0,0 +1,58 @@ +getDependenciesCount(), + $config->getHardDependenciesCount(), + $config->getSoftDependenciesCount(), + ]; + $data[] = []; + + if ($config->getDependenciesCount()) { + $data[] = ['Dependencies for each module:', 'All', 'Hard', 'Soft']; + foreach ($config->getModules() as $module) { + if ($module->getDependenciesCount()) { + $data[] = [ + $module->getName(), + $module->getDependenciesCount(), + $module->getHardDependenciesCount(), + $module->getSoftDependenciesCount(), + ]; + foreach ($module->getDependencies() as $dependency) { + $data[] = [ + ' -- ' . $dependency->getModule(), + '', + (int)$dependency->isHard(), + (int)(!$dependency->isHard()), + ]; + } + $data[] = []; + } + } + } + array_pop($data); + + return $data; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Builder.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Builder.php new file mode 100644 index 0000000..105ef09 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Builder.php @@ -0,0 +1,89 @@ +configParser = $configParser; + } + + /** + * Template method. Check passed options step + * + * @param array $options + * @return void + * @throws \InvalidArgumentException + */ + protected function checkOptions($options) + { + parent::checkOptions($options); + + if (!isset($options['parse']['config_files']) || empty($options['parse']['config_files'])) { + throw new \InvalidArgumentException('Parse error. Passed option "config_files" is wrong.'); + } + } + + /** + * Template method. Prepare data for writer step + * + * @param array $modulesData + * @return \Magento\Setup\Module\Dependency\Report\Framework\Data\Config + */ + protected function buildData($modulesData) + { + $allowedModules = $this->getAllowedModules(); + + $modules = []; + foreach ($modulesData as $moduleData) { + $dependencies = []; + foreach ($moduleData['dependencies'] as $dependencyData) { + if (!in_array($dependencyData['lib'], $allowedModules)) { + $dependencies[] = new Data\Dependency($dependencyData['lib'], $dependencyData['count']); + } + } + $modules[] = new Data\Module($moduleData['name'], $dependencies); + } + return new Data\Config($modules); + } + + /** + * Get allowed modules + * + * @return array + */ + protected function getAllowedModules() + { + return $this->configParser->parse(['files_for_parse' => $this->options['parse']['config_files']]); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Config.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Config.php new file mode 100644 index 0000000..7c0d38f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Config.php @@ -0,0 +1,28 @@ +getModules() as $module) { + $dependenciesCount += $module->getDependenciesCount(); + } + return $dependenciesCount; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Dependency.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Dependency.php new file mode 100644 index 0000000..ec05137 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Dependency.php @@ -0,0 +1,58 @@ +lib = $lib; + $this->count = $count; + } + + /** + * Get lib + * + * @return string + */ + public function getLib() + { + return $this->lib; + } + + /** + * Get count + * + * @return int + */ + public function getCount() + { + return $this->count; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Module.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Module.php new file mode 100644 index 0000000..e9fd7cd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Data/Module.php @@ -0,0 +1,68 @@ +name = $name; + $this->dependencies = $dependencies; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get dependencies + * + * @return \Magento\Setup\Module\Dependency\Report\Framework\Data\Dependency[] + */ + public function getDependencies() + { + return $this->dependencies; + } + + /** + * Get total dependencies count + * + * @return int + */ + public function getDependenciesCount() + { + return count($this->dependencies); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Writer.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Writer.php new file mode 100644 index 0000000..48abb2c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Framework/Writer.php @@ -0,0 +1,41 @@ +getDependenciesCount()]; + $data[] = []; + + if ($config->getDependenciesCount()) { + $data[] = ['Dependencies for each module:', '']; + foreach ($config->getModules() as $module) { + $data[] = [$module->getName(), $module->getDependenciesCount()]; + foreach ($module->getDependencies() as $dependency) { + $data[] = [' -- ' . $dependency->getLib(), $dependency->getCount()]; + } + $data[] = []; + } + } + array_pop($data); + + return $data; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/Writer/Csv/AbstractWriter.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Writer/Csv/AbstractWriter.php new file mode 100644 index 0000000..05d3327 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/Writer/Csv/AbstractWriter.php @@ -0,0 +1,78 @@ +writer = $writer; + } + + /** + * Template method. Main algorithm + * + * {@inheritdoc} + */ + public function write(array $options, ConfigInterface $config) + { + $this->checkOptions($options); + + $this->writeToFile($options['report_filename'], $this->prepareData($config)); + } + + /** + * Template method. Check passed options step + * + * @param array $options + * @return void + * @throws \InvalidArgumentException + */ + protected function checkOptions($options) + { + if (!isset($options['report_filename']) || empty($options['report_filename'])) { + throw new \InvalidArgumentException('Writing error: Passed option "report_filename" is wrong.'); + } + } + + /** + * Template method. Prepare data step + * + * @param \Magento\Setup\Module\Dependency\Report\Data\ConfigInterface $config + * @return array + */ + abstract protected function prepareData($config); + + /** + * Template method. Write to file step + * + * @param string $filename + * @param array $data + * @return void + */ + protected function writeToFile($filename, $data) + { + $this->writer->saveData($filename, $data); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Dependency/Report/WriterInterface.php b/magento/setup/src/Magento/Setup/Module/Dependency/Report/WriterInterface.php new file mode 100644 index 0000000..6100995 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Dependency/Report/WriterInterface.php @@ -0,0 +1,23 @@ +operationFactory = $operationFactory; + } + + /** + * Adds operations to task + * + * @param string $operationCode + * @param mixed $arguments + * @return void + */ + public function addOperation($operationCode, $arguments = null) + { + $this->operationsList[] = $this->operationFactory->create($operationCode, $arguments); + } + + /** + * Processes list of operations + * + * @param callable $beforeCallback + * @param callable $afterCallback + * @return void + */ + public function process(\Closure $beforeCallback = null, \Closure $afterCallback = null) + { + /** @var OperationInterface $operation */ + foreach ($this->operationsList as $operation) { + if (is_callable($beforeCallback)) { + $beforeCallback($operation); + } + + $operation->doOperation(); + + if (is_callable($afterCallback)) { + $afterCallback($operation); + } + } + $this->operationsList = []; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/AppActionListGenerator.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/AppActionListGenerator.php new file mode 100644 index 0000000..8829def --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/AppActionListGenerator.php @@ -0,0 +1,59 @@ +moduleReader = $moduleReader; + $this->configWriter = $configWriter; + } + + /** + * @inheritDoc + */ + public function doOperation() + { + $actionList = $this->moduleReader->getActionFiles(); + + // sort configuration to have it in the same order on every build + ksort($actionList); + + $this->configWriter->write('app_action_list', $actionList); + } + + /** + * @inheritDoc + */ + public function getName() + { + return 'App action list generation'; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php new file mode 100644 index 0000000..ee54588 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php @@ -0,0 +1,111 @@ +data = $data; + $this->classesScanner = $classesScanner; + $this->phpScanner = $phpScanner; + $this->directoryScanner = $directoryScanner; + } + + /** + * @inheritdoc + */ + public function doOperation() + { + if (array_diff(array_keys($this->data), ['filePatterns', 'paths', 'excludePatterns']) + !== array_diff(['filePatterns', 'paths', 'excludePatterns'], array_keys($this->data))) { + return; + } + + foreach ($this->data['paths'] as $paths) { + if (!is_array($paths)) { + $paths = (array)$paths; + } + + $files = $this->getFiles($paths); + + $entities = $this->phpScanner->collectEntities($files['php'] ?? []); + foreach ($entities as $entityName) { + class_exists($entityName); + } + } + } + + /** + * Returns operation name + * + * @return string + */ + public function getName() + { + return 'Application code generator'; + } + + /** + * Get list if files. + * + * @param string[] $paths + * @return array + * @throws FileSystemException + */ + private function getFiles(array $paths): array + { + $files = []; + + foreach ($paths as $path) { + $this->classesScanner->getList($path); + + $files[] = $this->directoryScanner->scan( + $path, + $this->data['filePatterns'], + $this->data['excludePatterns'] + ); + } + + return array_merge_recursive([], ...$files); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/Area.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/Area.php new file mode 100644 index 0000000..8cb830a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/Area.php @@ -0,0 +1,145 @@ +areaList = $areaList; + $this->areaInstancesNamesList = $areaInstancesNamesList; + $this->configReader = $configReader; + $this->configWriter = $configWriter; + $this->data = $data; + $this->modificationChain = $modificationChain; + } + + /** + * @inheritdoc + */ + public function doOperation() + { + if (empty($this->data)) { + return; + } + + $definitionsCollection = new DefinitionsCollection(); + foreach ($this->data as $paths) { + if (!is_array($paths)) { + $paths = (array)$paths; + } + foreach ($paths as $path) { + $definitionsCollection->addCollection($this->getDefinitionsCollection($path)); + } + } + + $this->sortDefinitions($definitionsCollection); + + $areaCodes = array_merge([App\Area::AREA_GLOBAL], $this->areaList->getCodes()); + foreach ($areaCodes as $areaCode) { + $config = $this->configReader->generateCachePerScope($definitionsCollection, $areaCode); + $config = $this->modificationChain->modify($config); + + // sort configuration to have it in the same order on every build + ksort($config['arguments']); + ksort($config['preferences']); + ksort($config['instanceTypes']); + + $this->configWriter->write($areaCode, $config); + } + } + + /** + * Returns definitions collection + * + * @param string $path + * @return DefinitionsCollection + */ + protected function getDefinitionsCollection($path) + { + $definitions = new DefinitionsCollection(); + foreach ($this->areaInstancesNamesList->getList($path) as $className => $constructorArguments) { + $definitions->addDefinition($className, $constructorArguments); + } + return $definitions; + } + + /** + * Returns operation name + * + * @return string + */ + public function getName() + { + return 'Area configuration aggregation'; + } + + /** + * Sort definitions to make reproducible result + * + * @param DefinitionsCollection $definitionsCollection + */ + private function sortDefinitions(DefinitionsCollection $definitionsCollection): void + { + $definitions = $definitionsCollection->getCollection(); + + ksort($definitions); + + $definitionsCollection->initialize($definitions); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/Interception.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/Interception.php new file mode 100644 index 0000000..505bc04 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/Interception.php @@ -0,0 +1,112 @@ +interceptionConfigurationBuilder = $interceptionConfigurationBuilder; + $this->areaList = $areaList; + $this->data = $data; + $this->classesScanner = $classesScanner; + $this->generatorFactory = $generatorFactory; + } + + /** + * @inheritdoc + */ + public function doOperation() + { + if (empty($this->data)) { + return; + } + $this->interceptionConfigurationBuilder->addAreaCode(App\Area::AREA_GLOBAL); + + foreach ($this->areaList->getCodes() as $areaCode) { + $this->interceptionConfigurationBuilder->addAreaCode($areaCode); + } + + $classesList = []; + foreach ($this->data['intercepted_paths'] as $paths) { + if (!is_array($paths)) { + $paths = (array)$paths; + } + foreach ($paths as $path) { + $classesList[] = $this->classesScanner->getList($path); + } + } + $classesList = array_merge([], ...$classesList); + + $generatorIo = new Io(new File(), $this->data['path_to_store']); + $generator = $this->generatorFactory->create( + [ + 'ioObject' => $generatorIo, + 'generatedEntities' => [ + Interceptor::ENTITY_TYPE => \Magento\Setup\Module\Di\Code\Generator\Interceptor::class, + ] + ] + ); + $configuration = $this->interceptionConfigurationBuilder->getInterceptionConfiguration($classesList); + $generator->generateList($configuration); + } + + /** + * Returns operation name + * + * @return string + */ + public function getName() + { + return 'Interceptors generation'; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/InterceptionCache.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/InterceptionCache.php new file mode 100644 index 0000000..383a7a1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/InterceptionCache.php @@ -0,0 +1,79 @@ +configInterface = $configInterface; + $this->interceptionsInstancesNamesList = $interceptionsInstancesNamesList; + $this->data = $data; + } + + /** + * Flushes interception cached configuration and generates a new one + * + * @return void + */ + public function doOperation() + { + if (empty($this->data)) { + return; + } + + $definitions = []; + foreach ($this->data as $paths) { + if (!is_array($paths)) { + $paths = (array)$paths; + } + foreach ($paths as $path) { + $definitions[] = $this->interceptionsInstancesNamesList->getList($path); + } + } + + $definitions = array_merge([], ...$definitions); + + $this->configInterface->initialize($definitions); + } + + /** + * Returns operation name + * + * @return string + */ + public function getName() + { + return 'Interception cache generation'; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/PluginListGenerator.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/PluginListGenerator.php new file mode 100644 index 0000000..63db48b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/PluginListGenerator.php @@ -0,0 +1,63 @@ +scopeConfig = $scopeConfig; + $this->configWriter = $configWriter; + } + + /** + * @inheritDoc + */ + public function doOperation() + { + $scopes = $this->scopeConfig->getAllScopes(); + // remove primary scope for production mode as it is only called in developer mode + $scopes = array_diff($scopes, ['primary']); + + // sort configuration to have it in the same order on every build + ksort($scopes); + + $this->configWriter->write($scopes); + } + + /** + * @inheritDoc + */ + public function getName() + { + return 'Plugin list generation'; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ProxyGenerator.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ProxyGenerator.php new file mode 100644 index 0000000..ab1ee15 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ProxyGenerator.php @@ -0,0 +1,67 @@ +proxyScanner = $proxyScanner; + $this->data = $data; + $this->configurationScanner = $configurationScanner; + } + + /** + * Processes operation task + * + * @return void + */ + public function doOperation() + { + $files = $this->configurationScanner->scan('di.xml'); + $proxies = $this->proxyScanner->collectEntities($files); + foreach ($proxies as $entityName) { + class_exists($entityName); + } + } + + /** + * Returns operation name + * + * @return string + */ + public function getName() + { + return 'Proxies code generation'; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/RepositoryGenerator.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/RepositoryGenerator.php new file mode 100644 index 0000000..aef8fd2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/RepositoryGenerator.php @@ -0,0 +1,80 @@ +repositoryScanner = $repositoryScanner; + $this->data = $data; + $this->classesScanner = $classesScanner; + $this->configurationScanner = $configurationScanner; + } + + /** + * Processes operation task + * + * @return void + */ + public function doOperation() + { + foreach ($this->data['paths'] as $path) { + $this->classesScanner->getList($path); + } + $this->repositoryScanner->setUseAutoload(false); + $files = $this->configurationScanner->scan('di.xml'); + $repositories = $this->repositoryScanner->collectEntities($files); + foreach ($repositories as $entityName) { + class_exists($entityName); + } + } + + /** + * Returns operation name + * + * @return string + */ + public function getName() + { + return 'Repositories code generation'; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ServiceDataAttributesGenerator.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ServiceDataAttributesGenerator.php new file mode 100644 index 0000000..e2bd543 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ServiceDataAttributesGenerator.php @@ -0,0 +1,72 @@ +serviceDataAttributesScanner = $serviceDataAttributesScanner; + $this->data = $data; + $this->configurationScanner = $configurationScanner; + } + + /** + * Processes operation task + * + * @return void + */ + public function doOperation() + { + $files = $this->configurationScanner->scan('extension_attributes.xml'); + $entities = $this->serviceDataAttributesScanner->collectEntities($files); + foreach ($entities as $entityName) { + class_exists($entityName); + } + } + + /** + * Returns operation name + * + * @return string + */ + public function getName() + { + return 'Service data attributes generation'; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationException.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationException.php new file mode 100644 index 0000000..b0bfa98 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationException.php @@ -0,0 +1,14 @@ + + \Magento\Setup\Module\Di\App\Task\Operation\ServiceDataAttributesGenerator::class, + self::AREA_CONFIG_GENERATOR => \Magento\Setup\Module\Di\App\Task\Operation\Area::class, + self::APPLICATION_CODE_GENERATOR => \Magento\Setup\Module\Di\App\Task\Operation\ApplicationCodeGenerator::class, + self::INTERCEPTION => \Magento\Setup\Module\Di\App\Task\Operation\Interception::class, + self::INTERCEPTION_CACHE => \Magento\Setup\Module\Di\App\Task\Operation\InterceptionCache::class, + self::REPOSITORY_GENERATOR => \Magento\Setup\Module\Di\App\Task\Operation\RepositoryGenerator::class, + self::PROXY_GENERATOR => \Magento\Setup\Module\Di\App\Task\Operation\ProxyGenerator::class, + self::APPLICATION_ACTION_LIST_GENERATOR => AppActionListGenerator::class, + self::PLUGIN_LIST_GENERATOR => PluginListGenerator::class, + ]; + + /** + * @param \Magento\Setup\Model\ObjectManagerProvider $objectManagerProvider + */ + public function __construct(\Magento\Setup\Model\ObjectManagerProvider $objectManagerProvider) + { + $this->objectManager = $objectManagerProvider->get(); + } + + /** + * Creates operation + * + * @param string $operationAlias + * @param mixed $arguments + * @return OperationInterface + * @throws OperationException + */ + public function create($operationAlias, $arguments = null) + { + if (!array_key_exists($operationAlias, $this->operationsDefinitions)) { + throw new OperationException( + sprintf('Unrecognized operation "%s"', $operationAlias), + OperationException::UNAVAILABLE_OPERATION + ); + } + + return $this->objectManager->create($this->operationsDefinitions[$operationAlias], ['data' => $arguments]); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationInterface.php b/magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationInterface.php new file mode 100644 index 0000000..93cb2ec --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/App/Task/OperationInterface.php @@ -0,0 +1,27 @@ +setObjectManager($objectManagerInterface); + } + + /** + * Create entity generator + * + * @param string $generatorClass + * @param string $entityName + * @param string $className + * @return \Magento\Framework\Code\Generator\EntityAbstract + */ + protected function createGeneratorInstance($generatorClass, $entityName, $className) + { + $generatorClass = parent::createGeneratorInstance($generatorClass, $entityName, $className); + $generatorClass->setInterceptedMethods($this->classMethods); + return $generatorClass; + } + + /** + * Generates list of classes + * + * @param array $classesToGenerate + * @throws \Magento\Framework\Exception\LocalizedException + * @return void + */ + public function generateList($classesToGenerate) + { + foreach ($classesToGenerate as $class => $methods) { + $this->setClassMethods($methods); + $this->generateClass($class . '\\Interceptor'); + $this->clearClassMethods(); + } + } + + /** + * Sets class methods + * + * @param array $methods + * @return void + */ + private function setClassMethods($methods) + { + $this->classMethods = $methods; + } + + /** + * Clear class methods + * @return void + */ + private function clearClassMethods() + { + $this->classMethods = []; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php new file mode 100644 index 0000000..61fdf58 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/InterceptionConfigurationBuilder.php @@ -0,0 +1,212 @@ +interceptionConfig = $interceptionConfig; + $this->pluginList = $pluginList; + $this->typeReader = $typeReader; + $this->cacheManager = $cacheManager; + $this->interceptableValidator = $interceptableValidator; + } + + /** + * Adds area code + * + * @param string $areaCode + * @return void + */ + public function addAreaCode($areaCode) + { + if (empty($this->areaCodesList[$areaCode])) { + $this->areaCodesList[] = $areaCode; + } + } + + /** + * Builds interception configuration for all defined classes + * + * @param array $definedClasses + * @return array + */ + public function getInterceptionConfiguration($definedClasses) + { + $interceptedInstances = $this->getInterceptedClasses($definedClasses); + $inheritedConfig = $this->getPluginsList($interceptedInstances); + $mergedAreaPlugins = $this->mergeAreaPlugins($inheritedConfig); + $interceptedMethods = $this->getInterceptedMethods($mergedAreaPlugins); + + return $interceptedMethods; + } + + /** + * Get intercepted instances from defined class list + * + * @param array $definedClasses + * @return array + */ + private function getInterceptedClasses($definedClasses) + { + $intercepted = []; + foreach ($definedClasses as $definedClass) { + if ($this->interceptionConfig->hasPlugins($definedClass) && $this->typeReader->isConcrete($definedClass) + && $this->interceptableValidator->validate($definedClass) + ) { + $intercepted[] = $definedClass; + } + } + return $intercepted; + } + + /** + * Returns plugin list: + * ['concrete class name' => ['plugin name' => [instance => 'instance name', 'order' => 'Order Number']]] + * + * @param array $interceptedInstances + * @return array + */ + private function getPluginsList($interceptedInstances) + { + $this->cacheManager->setEnabled([CompiledConfig::TYPE_IDENTIFIER], true); + $this->pluginList->setInterceptedClasses($interceptedInstances); + + $inheritedConfig = []; + foreach ($this->areaCodesList as $areaKey) { + $scopePriority = [Area::AREA_GLOBAL]; + $pluginListCloned = clone $this->pluginList; + if ($areaKey != Area::AREA_GLOBAL) { + $scopePriority[] = $areaKey; + $pluginListCloned->setScopePriorityScheme($scopePriority); + } + $key = implode('', $scopePriority); + $inheritedConfig[$key] = $this->filterNullInheritance($pluginListCloned->getPluginsConfig()); + } + return $inheritedConfig; + } + + /** + * Filters plugin inheritance list for instances without plugins, and abstract/interface + * + * @param array $pluginInheritance + * @return array + */ + private function filterNullInheritance($pluginInheritance) + { + $filteredData = []; + foreach ($pluginInheritance as $instance => $plugins) { + if ($plugins === null || !$this->typeReader->isConcrete($instance)) { + continue; + } + + $pluginInstances = []; + foreach ($plugins as $plugin) { + if (in_array($plugin['instance'], $pluginInstances)) { + continue; + } + $pluginInstances[] = $plugin['instance']; + } + $filteredData[$instance] = $pluginInstances; + } + + return $filteredData; + } + + /** + * Merge plugins in areas + * + * @param array $inheritedConfig + * @return array + */ + private function mergeAreaPlugins($inheritedConfig) + { + $mergedConfig = []; + foreach ($inheritedConfig as $configuration) { + $mergedConfig = array_merge_recursive($mergedConfig, $configuration); + } + foreach ($mergedConfig as &$plugins) { + $plugins = array_unique($plugins); + } + + return $mergedConfig; + } + + /** + * Returns interception configuration with plugin methods + * + * @param array $interceptionConfiguration + * @return array + */ + private function getInterceptedMethods($interceptionConfiguration) + { + $pluginDefinitionList = new \Magento\Framework\Interception\Definition\Runtime(); + foreach ($interceptionConfiguration as &$plugins) { + $pluginsMethods = []; + foreach ($plugins as $plugin) { + $pluginsMethods = array_unique( + array_merge($pluginsMethods, array_keys($pluginDefinitionList->getMethodList($plugin))) + ); + } + $plugins = $pluginsMethods; + } + return $interceptionConfiguration; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/Interceptor.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/Interceptor.php new file mode 100644 index 0000000..66b704b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/Interceptor.php @@ -0,0 +1,44 @@ +getName(), $this->interceptedMethods); + } + + /** + * Sets list of intercepted methods + * + * @param array $interceptedMethods + * + * @return void + */ + public function setInterceptedMethods($interceptedMethods) + { + $this->interceptedMethods = $interceptedMethods; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php new file mode 100644 index 0000000..e2d23eb --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php @@ -0,0 +1,74 @@ +_loadScopedData(); + + return $this->_inherited; + } + + /** + * Sets scope priority scheme + * + * @param array $areaCodes + * @return void + */ + public function setScopePriorityScheme($areaCodes) + { + $this->_scopePriorityScheme = $areaCodes; + } + + /** + * Whether scope code is current scope code + * + * @param string $scopeCode + * + * @return bool + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + protected function isCurrentScope($scopeCode) + { + return false; + } + + /** + * @param array $interceptedClasses + * @return void + */ + public function setInterceptedClasses($interceptedClasses) + { + $this->interceptedClasses = $interceptedClasses; + } + + /** + * Returns class definitions + * + * @return array + */ + protected function getClassDefinitions() + { + return $this->interceptedClasses; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/GeneratorFactory.php b/magento/setup/src/Magento/Setup/Module/Di/Code/GeneratorFactory.php new file mode 100644 index 0000000..9748995 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/GeneratorFactory.php @@ -0,0 +1,35 @@ +objectManager = $objectManager; + } + + /** + * Creates operation + * + * @param array $arguments + * @return Generator + */ + public function create($arguments = []) + { + return $this->objectManager->create(\Magento\Setup\Module\Di\Code\Generator::class, $arguments); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassReaderDecorator.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassReaderDecorator.php new file mode 100644 index 0000000..73cc2b6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassReaderDecorator.php @@ -0,0 +1,64 @@ +classReader = $classReader; + } + + /** + * Read class constructor signature + * + * @param string $className + * @return ConstructorArgument[]|null + * @throws \ReflectionException + */ + public function getConstructor($className) + { + $unmappedArguments = $this->classReader->getConstructor($className); + if ($unmappedArguments === null) { + return $unmappedArguments; + } + + $arguments = []; + foreach ($unmappedArguments as $argument) { + $arguments[] = new ConstructorArgument($argument); + } + + return $arguments; + } + + /** + * Retrieve parent relation information for type in a following format + * array( + * 'Parent_Class_Name', + * 'Interface_1', + * 'Interface_2', + * ... + * ) + * + * @param string $className + * @return string[] + */ + public function getParents($className) + { + return $this->classReader->getParents($className); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScanner.php new file mode 100644 index 0000000..ae957ad --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScanner.php @@ -0,0 +1,161 @@ +excludePatterns = $excludePatterns; + if ($directoryList === null) { + $directoryList = ObjectManager::getInstance()->get(DirectoryList::class); + } + $this->generationDirectory = $directoryList->getPath(DirectoryList::GENERATION); + } + + /** + * Adds exclude patterns + * + * @param array $excludePatterns + * @return void + */ + public function addExcludePatterns(array $excludePatterns) + { + $this->excludePatterns = array_merge($this->excludePatterns, $excludePatterns); + } + + /** + * Retrieves list of classes for given path + * + * @param string $path + * @return array + * @throws FileSystemException + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + public function getList($path) + { + // phpcs:ignore + $realPath = realpath($path); + $isGeneration = strpos($realPath, $this->generationDirectory) === 0; + + // Generation folders should not have their results cached since they may actually change during compile + if (!$isGeneration && isset($this->fileResults[$realPath])) { + return $this->fileResults[$realPath]; + } + if (!(bool)$realPath) { + throw new FileSystemException( + new \Magento\Framework\Phrase('The "%1" path is invalid. Verify the path and try again.', [$path]) + ); + } + $recursiveIterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($realPath, \FilesystemIterator::FOLLOW_SYMLINKS), + \RecursiveIteratorIterator::SELF_FIRST + ); + + $classes = $this->extract($recursiveIterator); + if (!$isGeneration) { + $this->fileResults[$realPath] = $classes; + } + return $classes; + } + + /** + * Extracts all the classes from the recursive iterator + * + * @param \RecursiveIteratorIterator $recursiveIterator + * @return array + */ + private function extract(\RecursiveIteratorIterator $recursiveIterator) + { + $classes = []; + foreach ($recursiveIterator as $fileItem) { + /** @var $fileItem \SplFileInfo */ + if ($fileItem->isDir() || $fileItem->getExtension() !== 'php' || $fileItem->getBasename()[0] == '.') { + continue; + } + $fileItemPath = $fileItem->getRealPath(); + foreach ($this->excludePatterns as $excludePatterns) { + if ($this->isExclude($fileItemPath, $excludePatterns)) { + continue 2; + } + } + $fileScanner = new FileClassScanner($fileItemPath); + $className = $fileScanner->getClassName(); + if (!empty($className)) { + $this->includeClass($className, $fileItemPath); + $classes[] = $className; + } + } + + return $classes; + } + + /** + * Include class from file path. + * + * @param string $className + * @param string $fileItemPath + * @return bool Whether the class is included or not + */ + private function includeClass(string $className, string $fileItemPath): bool + { + if (!class_exists($className)) { + // phpcs:ignore + require_once $fileItemPath; + return true; + } + return false; + } + + /** + * Find out if file should be excluded + * + * @param string $fileItemPath + * @param string $patterns + * @return bool + */ + private function isExclude($fileItemPath, $patterns) + { + if (!is_array($patterns)) { + $patterns = (array)$patterns; + } + foreach ($patterns as $pattern) { + if (preg_match($pattern, str_replace('\\', '/', $fileItemPath))) { + return true; + } + } + return false; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScannerInterface.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScannerInterface.php new file mode 100644 index 0000000..01e9956 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScannerInterface.php @@ -0,0 +1,23 @@ +classReaderDecorator = $classReaderDecorator; + $this->classesScanner = $classesScanner; + } + + /** + * Retrieves list of classes for given path + * + * @param string $path path to dir with files + * + * @return array + * @throws FileSystemException + */ + public function getList($path) + { + $classes = []; + foreach ($this->classesScanner->getList($path) as $className) { + $classes[$className] = $this->classReaderDecorator->getConstructor($className); + } + + return $classes; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Directory.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Directory.php new file mode 100644 index 0000000..0c508b8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Directory.php @@ -0,0 +1,121 @@ +log = $log; + $this->classReader = $classReader; + $this->classesScanner = $classesScanner; + $this->validator = $validator; + $this->generationDir = $generationDir; + + set_error_handler([$this, 'errorHandler'], E_STRICT); + } + + /** + * ErrorHandler for logging + * + * @param int $errorNumber + * @param string $msg + * + * @return void + */ + public function errorHandler($errorNumber, $msg) + { + $this->log->add(Log::COMPILATION_ERROR, $this->current, '#' . $errorNumber . ' ' . $msg); + } + + /** + * Retrieves list of classes for given path + * + * @param string $path path to dir with files + * + * @return array + */ + public function getList($path) + { + foreach ($this->classesScanner->getList($path) as $className) { + $this->current = $className; // for errorHandler function + try { + if ($path != $this->generationDir) { // validate all classes except classes in generation dir + $this->validator->validate($className); + } + $this->relations[$className] = $this->classReader->getParents($className); + } catch (\Magento\Framework\Exception\ValidatorException $exception) { + $this->log->add(Log::COMPILATION_ERROR, $className, $exception->getMessage()); + } catch (\ReflectionException $e) { + $this->log->add(Log::COMPILATION_ERROR, $className, $e->getMessage()); + } + } + + return $this->relations; + } + + /** + * @return array + */ + public function getRelations() + { + return $this->relations; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Interceptions.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Interceptions.php new file mode 100644 index 0000000..d46b5d7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/Decorator/Interceptions.php @@ -0,0 +1,89 @@ +classReader = $classReader; + $this->classesScanner = $classesScanner; + $this->validator = $validator; + $this->log = $log; + + $this->validator->add($constructorIntegrityValidator); + } + + /** + * Retrieves list of classes for given path + * + * @param string $path path to dir with files + * + * @return array + */ + public function getList($path) + { + $nameList = []; + foreach ($this->classesScanner->getList($path) as $className) { + try { + // validate all classes except classes in generated/code dir + $generatedCodeDir = DirectoryList::getDefaultConfig()[DirectoryList::GENERATED_CODE]; + if (strpos($path, $generatedCodeDir[DirectoryList::PATH]) === false) { + $this->validator->validate($className); + } + $nameList[] = $className; + } catch (\Magento\Framework\Exception\ValidatorException $exception) { + $this->log->add(Log::COMPILATION_ERROR, $className, $exception->getMessage()); + } catch (\ReflectionException $e) { + $this->log->add(Log::COMPILATION_ERROR, $className, $e->getMessage()); + } + } + + $this->log->report(); + + return $nameList; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php new file mode 100644 index 0000000..1fb460a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php @@ -0,0 +1,206 @@ + true, + T_STRING => true, + T_NS_SEPARATOR => true, + // PHP 8 compatibility. + T_NAME_QUALIFIED => true, + T_NAME_FULLY_QUALIFIED => true, + ]; + + private const ALLOWED_OPEN_BRACES_TOKENS = [ + T_CURLY_OPEN => true, + T_DOLLAR_OPEN_CURLY_BRACES => true, + T_STRING_VARNAME => true + ]; + + /** + * The filename of the file to introspect + * + * @var string + */ + private $filename; + + /** + * The class name found in the file. + * + * @var string|bool + */ + private $className = false; + + /** + * @var array + */ + private $tokens; + + /** + * Constructor for the file class scanner. Requires the filename + * + * @param string $filename + */ + public function __construct($filename) + { + // phpcs:ignore + $filename = realpath($filename); + // phpcs:ignore + if (!file_exists($filename) || !\is_file($filename)) { + throw new InvalidFileException( + sprintf( + 'The file "%s" does not exist or is not a file', + $filename + ) + ); + } + $this->filename = $filename; + } + + /** + * Retrieves the contents of a file. Mostly here for Mock injection + * + * @return string + */ + public function getFileContents() + { + // phpcs:ignore + return file_get_contents($this->filename); + } + + /** + * Retrieves the first class found in a file. + * + * @return string + */ + public function getClassName(): string + { + if ($this->className === false) { + $this->className = $this->extract(); + } + return $this->className; + } + + /** + * Extracts the fully qualified class name from a file. + * + * It only searches for the first match and stops looking as soon as it enters the class definition itself. + * + * Warnings are suppressed for this method due to a micro-optimization that only really shows up when this logic + * is called several millions of times, which can happen quite easily with even moderately sized codebases. + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) + * + * @return string + */ + private function extract(): string + { + $namespaceParts = []; + $class = ''; + $triggerClass = false; + $triggerNamespace = false; + $braceLevel = 0; + $bracedNamespace = false; + $namespace = ''; + + // phpcs:ignore + $this->tokens = token_get_all($this->getFileContents()); + foreach ($this->tokens as $index => $token) { + $tokenIsArray = is_array($token); + // Is either a literal brace or an interpolated brace with a variable + if ($token === '{' || ($tokenIsArray && isset(self::ALLOWED_OPEN_BRACES_TOKENS[$token[0]]))) { + $braceLevel++; + } elseif ($token === '}') { + $braceLevel--; + } + // The namespace keyword was found in the last loop + if ($triggerNamespace) { + // A string ; or a discovered namespace that looks like "namespace name { }" + if (!$tokenIsArray || ($namespaceParts && $token[0] === T_WHITESPACE)) { + $triggerNamespace = false; + $namespaceParts[] = '\\'; + continue; + } + $namespaceParts[] = $token[1]; + + // `class` token is not used with a valid class name + } elseif ($triggerClass && !$tokenIsArray) { + $triggerClass = false; + // The class keyword was found in the last loop + } elseif ($triggerClass && $token[0] === T_STRING) { + $triggerClass = false; + $class = $token[1]; + } + + switch ($token[0]) { + case T_NAMESPACE: + // Current loop contains the namespace keyword. Between this and the semicolon is the namespace + $triggerNamespace = true; + $namespaceParts = []; + $bracedNamespace = $this->isBracedNamespace($index); + break; + + // PHP 8 + case T_NAME_QUALIFIED: + case T_NAME_FULLY_QUALIFIED: + if ($triggerNamespace) { + $namespace = $token[1]; + } + break; + + case T_TRAIT: + case T_CLASS: + // Current loop contains the class keyword. Next loop will have the class name itself. + if ($braceLevel === 0 || ($bracedNamespace && $braceLevel === 1)) { + $triggerClass = true; + } + break; + } + + // We have a class name, let's concatenate and return it! + if ($class !== '') { + $fqClassName = $namespace ? (trim($namespace) . '\\' . trim($class)) + : (trim(implode('', $namespaceParts)) . trim($class)); + return $fqClassName; + } + } + return $class; + } + + /** + * Looks forward from the current index to determine if the namespace is nested in {} or terminated with ; + * + * @param integer $index + * @return bool + */ + private function isBracedNamespace($index) + { + $len = count($this->tokens); + while ($index++ < $len) { + if (!is_array($this->tokens[$index])) { + if ($this->tokens[$index] === ';') { + return false; + } elseif ($this->tokens[$index] === '{') { + return true; + } + continue; + } + + if (!isset(self::NAMESPACE_TOKENS[$this->tokens[$index][0]])) { + throw new InvalidFileException('Namespace not defined properly'); + } + } + throw new InvalidFileException('Could not find namespace termination'); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/FileScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/FileScanner.php new file mode 100644 index 0000000..7a98a76 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/FileScanner.php @@ -0,0 +1,467 @@ +file = $file; + // phpcs:ignore Magento2.Functions.DiscouragedFunction + if (!file_exists($file)) { + throw new InvalidArgumentException(sprintf( + 'File "%s" not found', + $file + )); + } + // phpcs:ignore Magento2.Functions.DiscouragedFunction + $tokens = token_get_all(file_get_contents($file)); + $this->tokens = $tokens; + } + + /** + * @inheritDoc + */ + protected function scan() + { + if ($this->isScanned) { + return; + } + + if (!$this->tokens) { + throw new RuntimeException('No tokens were provided'); + } + + /** + * Define PHP 5.4 'trait' token constant. + */ + if (!defined('T_TRAIT')) { + define('T_TRAIT', 42001); + } + + $namespaceContentTokenTypes = [ + T_NS_SEPARATOR => T_NS_SEPARATOR, + T_STRING => T_STRING, + T_NAME_QUALIFIED => T_NAME_QUALIFIED, + T_NAME_FULLY_QUALIFIED => T_NAME_FULLY_QUALIFIED + ]; + + /** + * Variables & Setup + */ + + $tokens = &$this->tokens; // localize + $infos = &$this->infos; // localize + $tokenIndex = null; + $token = null; + $this->tokenType = null; + $tokenContent = null; + $tokenLine = null; + $namespace = null; + $docCommentIndex = false; + $infoIndex = 0; + + /* + * MACRO creation + */ + $macroTokenAdvance = function () use (&$tokens, &$tokenIndex, &$token, &$tokenContent, &$tokenLine) { + $tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1; + if (!isset($tokens[$tokenIndex])) { + $token = false; + $tokenContent = false; + $this->tokenType = false; + $tokenLine = false; + + return false; + } + if (is_string($tokens[$tokenIndex]) && $tokens[$tokenIndex] === '"') { + do { + $tokenIndex++; + } while (!(is_string($tokens[$tokenIndex]) && $tokens[$tokenIndex] === '"')); + } + $token = $tokens[$tokenIndex]; + if (is_array($token)) { + list($this->tokenType, $tokenContent, $tokenLine) = $token; + } else { + $this->tokenType = null; + $tokenContent = $token; + } + + return $tokenIndex; + }; + $macroTokenLogicalStartIndex = function () use (&$tokenIndex, &$docCommentIndex) { + return ($docCommentIndex === false) ? $tokenIndex : $docCommentIndex; + }; + $macroDocCommentStart = function () use (&$tokenIndex, &$docCommentIndex) { + $docCommentIndex = $tokenIndex; + + return $docCommentIndex; + }; + $macroDocCommentValidate = function () use (&$docCommentIndex) { + static $validTrailingTokens = null; + if ($validTrailingTokens === null) { + $validTrailingTokens = [T_WHITESPACE, T_FINAL, T_ABSTRACT, T_INTERFACE, T_CLASS, T_FUNCTION]; + } + if ($docCommentIndex !== false && !in_array($this->tokenType, $validTrailingTokens)) { + $docCommentIndex = false; + } + + return $docCommentIndex; + }; + $macroInfoAdvance = function () use (&$infoIndex, &$infos, &$tokenIndex, &$tokenLine) { + $infos[$infoIndex]['tokenEnd'] = $tokenIndex; + $infos[$infoIndex]['lineEnd'] = $tokenLine; + $infoIndex++; + + return $infoIndex; + }; + + // phpcs:disable + /** + * START FINITE STATE MACHINE FOR SCANNING TOKENS + */ + + // Initialize token + $macroTokenAdvance(); + + SCANNER_TOP: + + if ($token === false) { + goto SCANNER_END; + } + + // Validate current doc comment index + $macroDocCommentValidate(); + + switch ($this->tokenType) { + case T_DOC_COMMENT: + $macroDocCommentStart(); + goto SCANNER_CONTINUE; + //goto no break needed + + case T_NAMESPACE: + $infos[$infoIndex] = [ + 'type' => 'namespace', + 'tokenStart' => $macroTokenLogicalStartIndex(), + 'tokenEnd' => null, + 'lineStart' => $token[2], + 'lineEnd' => null, + 'namespace' => null, + ]; + + // start processing with next token + if ($macroTokenAdvance() === false) { + goto SCANNER_END; + } + + SCANNER_NAMESPACE_TOP: + + if ($this->tokenType === null && $tokenContent === ';' || $tokenContent === '{') { + goto SCANNER_NAMESPACE_END; + } + + if ($this->tokenType === T_WHITESPACE) { + goto SCANNER_NAMESPACE_CONTINUE; + } + if (isset($namespaceContentTokenTypes[$this->tokenType])) { + $infos[$infoIndex]['namespace'] .= $tokenContent; + } + + SCANNER_NAMESPACE_CONTINUE: + + if ($macroTokenAdvance() === false) { + goto SCANNER_END; + } + goto SCANNER_NAMESPACE_TOP; + + SCANNER_NAMESPACE_END: + + $namespace = $infos[$infoIndex]['namespace']; + + $macroInfoAdvance(); + goto SCANNER_CONTINUE; + //goto no break needed + + case T_USE: + $infos[$infoIndex] = [ + 'type' => 'use', + 'tokenStart' => $macroTokenLogicalStartIndex(), + 'tokenEnd' => null, + 'lineStart' => $tokens[$tokenIndex][2], + 'lineEnd' => null, + 'namespace' => $namespace, + 'statements' => [0 => ['use' => null, 'as' => null]], + ]; + + $useStatementIndex = 0; + $useAsContext = false; + + // start processing with next token + if ($macroTokenAdvance() === false) { + goto SCANNER_END; + } + + SCANNER_USE_TOP: + + if ($this->tokenType === null) { + if ($tokenContent === ';') { + goto SCANNER_USE_END; + } elseif ($tokenContent === ',') { + $useAsContext = false; + $useStatementIndex++; + $infos[$infoIndex]['statements'][$useStatementIndex] = ['use' => null, 'as' => null]; + } + } + + // ANALYZE + if ($this->tokenType !== null) { + if ($this->tokenType == T_AS) { + $useAsContext = true; + goto SCANNER_USE_CONTINUE; + } + + if (\array_key_exists($this->tokenType, $namespaceContentTokenTypes)) { + if ($useAsContext == false) { + $infos[$infoIndex]['statements'][$useStatementIndex]['use'] .= $tokenContent; + } else { + $infos[$infoIndex]['statements'][$useStatementIndex]['as'] = $tokenContent; + } + } + } + + SCANNER_USE_CONTINUE: + + if ($macroTokenAdvance() === false) { + goto SCANNER_END; + } + goto SCANNER_USE_TOP; + + SCANNER_USE_END: + + $macroInfoAdvance(); + goto SCANNER_CONTINUE; + //goto no break needed + + case T_INCLUDE: + case T_INCLUDE_ONCE: + case T_REQUIRE: + case T_REQUIRE_ONCE: + // Static for performance + static $includeTypes = [ + T_INCLUDE => 'include', + T_INCLUDE_ONCE => 'include_once', + T_REQUIRE => 'require', + T_REQUIRE_ONCE => 'require_once' + ]; + + $infos[$infoIndex] = [ + 'type' => 'include', + 'tokenStart' => $macroTokenLogicalStartIndex(), + 'tokenEnd' => null, + 'lineStart' => $tokens[$tokenIndex][2], + 'lineEnd' => null, + 'includeType' => $includeTypes[$tokens[$tokenIndex][0]], + 'path' => '', + ]; + + // start processing with next token + if ($macroTokenAdvance() === false) { + goto SCANNER_END; + } + + SCANNER_INCLUDE_TOP: + + if ($this->tokenType === null && $tokenContent === ';') { + goto SCANNER_INCLUDE_END; + } + + $infos[$infoIndex]['path'] .= $tokenContent; + + SCANNER_INCLUDE_CONTINUE: + + if ($macroTokenAdvance() === false) { + goto SCANNER_END; + } + goto SCANNER_INCLUDE_TOP; + + SCANNER_INCLUDE_END: + + $macroInfoAdvance(); + goto SCANNER_CONTINUE; + //goto no break needed + + case T_FUNCTION: + case T_FINAL: + case T_ABSTRACT: + case T_CLASS: + case T_INTERFACE: + case T_TRAIT: + $infos[$infoIndex] = [ + 'type' => ($this->tokenType === T_FUNCTION) ? 'function' : 'class', + 'tokenStart' => $macroTokenLogicalStartIndex(), + 'tokenEnd' => null, + 'lineStart' => $tokens[$tokenIndex][2], + 'lineEnd' => null, + 'namespace' => $namespace, + 'uses' => $this->getUsesNoScan($namespace), + 'name' => null, + 'shortName' => null, + ]; + + $classBraceCount = 0; + + // start processing with current token + + SCANNER_CLASS_TOP: + + // process the name + if ($infos[$infoIndex]['shortName'] == '' + && (($this->tokenType === T_CLASS + || $this->tokenType === T_INTERFACE + || $this->tokenType === T_TRAIT + ) + && $infos[$infoIndex]['type'] === 'class' && $tokens[$tokenIndex - 1][0] !== T_DOUBLE_COLON + || ($this->tokenType === T_FUNCTION && $infos[$infoIndex]['type'] === 'function')) + ) { + $infos[$infoIndex]['shortName'] = $tokens[$tokenIndex + 2][1]; + $infos[$infoIndex]['name'] = (($namespace !== null) + ? $namespace . '\\' + : '') . $infos[$infoIndex]['shortName']; + } + + if ($this->tokenType === null) { + if ($tokenContent === '{') { + $classBraceCount++; + } + if ($tokenContent === '}') { + $classBraceCount--; + if ($classBraceCount === 0) { + goto SCANNER_CLASS_END; + } + } + } + + SCANNER_CLASS_CONTINUE: + + if ($macroTokenAdvance() === false) { + goto SCANNER_END; + } + goto SCANNER_CLASS_TOP; + + SCANNER_CLASS_END: + + $macroInfoAdvance(); + goto SCANNER_CONTINUE; + } + + SCANNER_CONTINUE: + + if ($macroTokenAdvance() === false) { + goto SCANNER_END; + } + goto SCANNER_TOP; + + SCANNER_END: + + /** + * END FINITE STATE MACHINE FOR SCANNING TOKENS + */ + $this->isScanned = true; + // phpcs:enable + } + + /** + * Copied from laminas-code 3.5.1 + * + * @param string|null $namespace + * + * @return array|null + */ + public function getUses(string $namespace = null): ?array + { + $this->scan(); + + return $this->getUsesNoScan($namespace); + } + + /** + * Copied from laminas-code 3.5.1 + * + * @param string|null $namespace + * + * @return array|null + */ + protected function getUsesNoScan(string $namespace = null): ?array + { + $namespaces = []; + foreach ($this->infos as $info) { + if ($info['type'] === 'namespace') { + $namespaces[] = $info['namespace']; + } + } + + if ($namespace === null) { + $namespace = array_shift($namespaces); + } elseif (!in_array($namespace, $namespaces, true)) { + return null; + } + + $uses = []; + foreach ($this->infos as $info) { + if ($info['type'] !== 'use') { + continue; + } + foreach ($info['statements'] as $statement) { + if ($info['namespace'] === $namespace) { + $uses[] = $statement; + } + } + } + + return $uses; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/InvalidFileException.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/InvalidFileException.php new file mode 100644 index 0000000..b8ddeb3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Reader/InvalidFileException.php @@ -0,0 +1,12 @@ +isAbstract() && !$instance->isInterface(); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ArrayScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ArrayScanner.php new file mode 100644 index 0000000..dc01292 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ArrayScanner.php @@ -0,0 +1,27 @@ +_children[$type] = $scanner; + } + + /** + * Scan files + * + * @param array $files + * @return array + */ + public function collectEntities(array $files) + { + $output = []; + foreach ($this->_children as $type => $scanner) { + if (!isset($files[$type]) || !is_array($files[$type])) { + continue; + } + $output[$type] = array_unique($scanner->collectEntities($files[$type])); + } + return $output; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ConfigurationScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ConfigurationScanner.php new file mode 100644 index 0000000..76071ca --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ConfigurationScanner.php @@ -0,0 +1,58 @@ +fileResolver = $fileResolver; + $this->areaList = $areaList; + } + + /** + * Scan configuration files + * + * @param string $fileName + * + * @return array of paths to the configuration files + */ + public function scan($fileName) + { + $files = []; + $areaCodes = array_merge( + ['primary', Area::AREA_GLOBAL], + $this->areaList->getCodes() + ); + foreach ($areaCodes as $area) { + $files = array_merge_recursive( + $files, + $this->fileResolver->get($fileName, $area)->toArray() + ); + } + return array_keys($files); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/DirectoryScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/DirectoryScanner.php new file mode 100644 index 0000000..fd045c3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/DirectoryScanner.php @@ -0,0 +1,47 @@ +isDir()) { + continue; + } + + $filePath = str_replace('\\', '/', $file->getRealPath()); + if (!empty($excludePatterns)) { + foreach ($excludePatterns as $excludePattern) { + if (preg_match($excludePattern, $filePath)) { + continue 2; + } + } + } + foreach ($patterns as $type => $pattern) { + if (preg_match($pattern, $filePath)) { + $output[$type][] = $filePath; + break; + } + } + } + return $output; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/InheritanceInterceptorScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/InheritanceInterceptorScanner.php new file mode 100644 index 0000000..abf1a14 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/InheritanceInterceptorScanner.php @@ -0,0 +1,69 @@ +interceptableValidator = $interceptableValidator; + } + + /** + * Get intercepted class names + * + * @param array $classes + * @param array $interceptedEntities + * @return array + */ + public function collectEntities(array $classes, array $interceptedEntities = []) + { + $output = []; + foreach ($classes as $class) { + foreach ($interceptedEntities as $interceptorClass) { + $interceptedEntity = substr($interceptorClass, 0, -12); + if (is_subclass_of($class, $interceptedEntity) && $this->interceptableValidator->validate($class)) { + $reflectionClass = new \ReflectionClass($class); + if (!$reflectionClass->isAbstract() && !$reflectionClass->isFinal()) { + $output[] = $class . '\\Interceptor'; + } + } + } + } + $output = array_merge($this->filterOutAbstractClasses($interceptedEntities), $output); + $output = array_unique($output); + return $output; + } + + /** + * Filter out Interceptors defined for abstract classes + * + * @param string[] $interceptedEntities + * @return string[] + */ + private function filterOutAbstractClasses($interceptedEntities) + { + $interceptedEntitiesFiltered = []; + foreach ($interceptedEntities as $interceptorClass) { + $interceptedEntity = substr($interceptorClass, 0, -12); + $reflectionInterceptedEntity = new \ReflectionClass($interceptedEntity); + if (!$reflectionInterceptedEntity->isAbstract() && !$reflectionInterceptedEntity->isFinal()) { + $interceptedEntitiesFiltered[] = $interceptorClass; + } + } + return $interceptedEntitiesFiltered; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/InterceptedInstancesScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/InterceptedInstancesScanner.php new file mode 100644 index 0000000..5e02315 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/InterceptedInstancesScanner.php @@ -0,0 +1,43 @@ +loadXML(file_get_contents($fileName)); + $xpath = new \DOMXPath($dom); + /** @var $node \DOMNode */ + foreach ($xpath->query('//type/plugin|//virtualType/plugin') as $node) { + $parentTypeNode = $node->parentNode->attributes->getNamedItem('name'); + if ($parentTypeNode === null) { + continue; + } + + if (!isset($interceptedInstances[$parentTypeNode->nodeValue])) { + $interceptedInstances[$parentTypeNode->nodeValue] = []; + } + + $pluginTypeNode = $node->attributes->getNamedItem('type'); + if ($pluginTypeNode !== null) { + $interceptedInstances[$parentTypeNode->nodeValue][] = $pluginTypeNode->nodeValue; + } + } + } + return $interceptedInstances; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php new file mode 100644 index 0000000..78a8a73 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php @@ -0,0 +1,300 @@ +_log = $log; + $this->typeProcessor = $typeProcessor + ?: \Magento\Framework\App\ObjectManager::getInstance()->get(TypeProcessor::class); + } + + /** + * Find classes which are used as parameters types of the specified method and are not declared. + * + * @param string $file + * @param \ReflectionClass $classReflection + * @param string $methodName + * @param string $entityType + * @return string[] + */ + private function findMissingFactories($file, $classReflection, $methodName, $entityType) + { + $missingClasses = []; + if (!$classReflection->hasMethod($methodName)) { + return $missingClasses; + } + + $factorySuffix = '\\' . ucfirst(FactoryGenerator::ENTITY_TYPE); + $constructor = $classReflection->getMethod($methodName); + $parameters = $constructor->getParameters(); + /** @var $parameter \ReflectionParameter */ + foreach ($parameters as $parameter) { + preg_match('/\[\s\<\w+?>\s\??([\w\\\\]+)/s', $parameter->__toString(), $matches); + if (isset($matches[1]) && substr($matches[1], -strlen($entityType)) == $entityType) { + $missingClassName = $matches[1]; + if ($this->shouldGenerateClass($missingClassName, $entityType, $file)) { + + if (substr($missingClassName, -strlen($factorySuffix)) == $factorySuffix) { + $entityName = rtrim(substr($missingClassName, 0, -strlen($factorySuffix)), '\\'); + $this->_log->add( + Log::CONFIGURATION_ERROR, + $missingClassName, + 'Invalid Factory declaration for class ' . $entityName . ' in file ' . $file + ); + } else { + $missingClasses[] = $missingClassName; + } + } + } + } + return $missingClasses; + } + + /** + * Identify source class name for the provided class. + * + * @param string $missingClassName + * @param string $entityType + * @return string + */ + protected function getSourceClassName($missingClassName, $entityType) + { + $sourceClassName = rtrim(substr($missingClassName, 0, -strlen($entityType)), '\\'); + $entityType = lcfirst($entityType); + if ($entityType == ExtensionAttributesInterfaceGenerator::ENTITY_TYPE + || $entityType == ExtensionAttributesGenerator::ENTITY_TYPE + ) { + /** Process special cases for extension class and extension interface */ + return $sourceClassName . 'Interface'; + } elseif ($entityType == FactoryGenerator::ENTITY_TYPE) { + $extensionAttributesSuffix = ucfirst(ExtensionAttributesGenerator::ENTITY_TYPE); + if (substr($sourceClassName, -strlen($extensionAttributesSuffix)) == $extensionAttributesSuffix) { + /** Process special case for extension factories */ + $extensionAttributesClass = substr( + $sourceClassName, + 0, + -strlen(ExtensionAttributesGenerator::ENTITY_TYPE) + ); + $sourceClassName = $extensionAttributesClass . 'Interface'; + } + } + return $sourceClassName; + } + + /** + * Fetch factories from class constructor + * + * @param \ReflectionClass $reflectionClass + * @param string $file + * @return string[] + */ + protected function _fetchFactories($reflectionClass, $file) + { + $absentFactories = $this->findMissingFactories( + $file, + $reflectionClass, + '__construct', + ucfirst(FactoryGenerator::ENTITY_TYPE) + ); + return $absentFactories; + } + + /** + * Find missing extension attributes related classes, interfaces and factories. + * + * @param \ReflectionClass $reflectionClass + * @param string $file + * @return string[] + */ + protected function _fetchMissingExtensionAttributesClasses($reflectionClass, $file) + { + $missingExtensionInterfaces = []; + $methodName = 'getExtensionAttributes'; + $entityType = ucfirst(\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::ENTITY_TYPE); + if ($reflectionClass->hasMethod($methodName) && $reflectionClass->isInterface()) { + $returnType = $this->typeProcessor->getGetterReturnType( + (new \Laminas\Code\Reflection\ClassReflection($reflectionClass->getName()))->getMethod($methodName) + ); + $missingClassName = $returnType['type']; + if ($this->shouldGenerateClass($missingClassName, $entityType, $file)) { + $missingExtensionInterfaces[] = $missingClassName; + + $extension = rtrim(substr($missingClassName, 0, -strlen('Interface')), '\\'); + if (!class_exists($extension)) { + $missingExtensionInterfaces[] = $extension; + } + $extensionFactory = $extension . 'Factory'; + if (!class_exists($extensionFactory)) { + $missingExtensionInterfaces[] = $extensionFactory; + } + } + } + + return $missingExtensionInterfaces; + } + + /** + * Get array of class names + * + * @param array $files + * @return array + * @throws \ReflectionException + */ + public function collectEntities(array $files) + { + $output = []; + foreach ($files as $file) { + $classes = $this->getDeclaredClasses($file); + foreach ($classes as $className) { + $reflectionClass = new \ReflectionClass($className); + $output[] = $this->_fetchFactories($reflectionClass, $file); + $output[] = $this->_fetchMissingExtensionAttributesClasses($reflectionClass, $file); + } + } + return array_unique(array_merge([], ...$output)); + } + + /** + * Fetch namespaces from tokenized PHP file + * + * @param int $tokenIterator + * @param int $count + * @param array $tokens + * @return string + */ + protected function _fetchNamespace($tokenIterator, $count, $tokens) + { + $namespaceParts = []; + for ($tokenOffset = $tokenIterator + 1; $tokenOffset < $count; ++$tokenOffset) { + if ($tokens[$tokenOffset][0] === T_NAME_QUALIFIED) { + $namespaceParts[] = $tokens[$tokenOffset][1]; + } + if ($tokens[$tokenOffset][0] === T_STRING) { + $namespaceParts[] = "\\"; + $namespaceParts[] = $tokens[$tokenOffset][1]; + } elseif ($tokens[$tokenOffset] === '{' || $tokens[$tokenOffset] === ';') { + break; + } + } + return implode('', $namespaceParts); + } + + /** + * Fetches class name from tokenized PHP file. + * + * @param string $namespace + * @param int $tokenIterator + * @param int $count + * @param array $tokens + * @return string|null + */ + private function fetchClass($namespace, $tokenIterator, $count, $tokens):? string + { + // anonymous classes should be omitted + if (is_array($tokens[$tokenIterator - 2]) && $tokens[$tokenIterator - 2][0] === T_NEW) { + return null; + } + + for ($tokenOffset = $tokenIterator + 1; $tokenOffset < $count; ++$tokenOffset) { + if ($tokens[$tokenOffset] !== '{') { + continue; + } + + return $namespace . "\\" . $tokens[$tokenIterator + 2][1]; + } + + return null; + } + + /** + * Get classes and interfaces declared in the file + * + * @param string $file + * @return array + */ + private function getDeclaredClasses($file): array + { + $classes = []; + $namespaceParts = []; + // phpcs:ignore + $tokens = token_get_all(file_get_contents($file)); + $count = count($tokens); + + for ($tokenIterator = 0; $tokenIterator < $count; $tokenIterator++) { + if ($tokens[$tokenIterator][0] == T_NAMESPACE) { + $namespaceParts[] = $this->_fetchNamespace($tokenIterator, $count, $tokens); + } + + if (($tokens[$tokenIterator][0] == T_CLASS || $tokens[$tokenIterator][0] == T_INTERFACE) + && $tokens[$tokenIterator - 1][0] != T_DOUBLE_COLON + ) { + $class = $this->fetchClass(join('', $namespaceParts), $tokenIterator, $count, $tokens); + if ($class !== null && !in_array($class, $classes)) { + $classes[] = $class; + } + } + } + return $classes; + } + + /** + * Check if specified class is missing and if it can be generated. + * + * @param string $missingClassName + * @param string $entityType + * @param string $file + * @return bool + */ + private function shouldGenerateClass($missingClassName, $entityType, $file) + { + try { + if (class_exists($missingClassName)) { + return false; + } + } catch (\RuntimeException $e) { //phpcs:ignore + } + $sourceClassName = $this->getSourceClassName($missingClassName, $entityType); + if (!class_exists($sourceClassName) && !interface_exists($sourceClassName)) { + $this->_log->add( + Log::CONFIGURATION_ERROR, + $missingClassName, + "Invalid {$entityType} for nonexistent class {$sourceClassName} in file {$file}" + ); + return false; + } + return true; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/PluginScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/PluginScanner.php new file mode 100644 index 0000000..81b0b54 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/PluginScanner.php @@ -0,0 +1,33 @@ +loadXML(file_get_contents($fileName)); + $xpath = new \DOMXPath($dom); + /** @var $node \DOMNode */ + foreach ($xpath->query('//type/plugin|//virtualType/plugin') as $node) { + $pluginTypeNode = $node->attributes->getNamedItem('type'); + if ($pluginTypeNode !== null) { + $pluginClassNames[] = $pluginTypeNode->nodeValue; + } + } + } + return $pluginClassNames; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/RepositoryScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/RepositoryScanner.php new file mode 100644 index 0000000..81bca0f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/RepositoryScanner.php @@ -0,0 +1,68 @@ +loadXML(file_get_contents($fileName)); + $xpath = new \DOMXPath($dom); + /** @var $node \DOMNode */ + foreach ($xpath->query('//preference') as $node) { + $forType = $node->attributes->getNamedItem('for'); + $replacementType = $node->attributes->getNamedItem('type'); + if ($forType !== null + && $replacementType !== null + && (substr($forType->nodeValue, -19) == 'RepositoryInterface') + ) { + if (!class_exists($replacementType->nodeValue, false) + && !AutoloaderRegistry::getAutoloader()->loadClass($replacementType->nodeValue)) { + $persistor = str_replace('\\Repository', 'InterfacePersistor', $replacementType->nodeValue); + $factory = str_replace('\\Repository', 'InterfaceFactory', $replacementType->nodeValue); + $searchResultFactory + = str_replace('\\Repository', 'SearchResultInterfaceFactory', $replacementType->nodeValue); + $repositoryClassNames[$persistor] = $persistor; + $repositoryClassNames[$factory] = $factory; + $repositoryClassNames[$searchResultFactory] = $searchResultFactory; + $repositoryClassNames[$replacementType->nodeValue] = $replacementType->nodeValue; + } + } + } + } + return $repositoryClassNames; + } + + /** + * Sets autoload flag + * + * @param boolean $useAutoload + * @return void + */ + public function setUseAutoload($useAutoload) + { + $this->useAutoload = $useAutoload; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ScannerInterface.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ScannerInterface.php new file mode 100644 index 0000000..83d0b32 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/ScannerInterface.php @@ -0,0 +1,21 @@ +loadXML(file_get_contents($fileName)); + $xpath = new \DOMXPath($dom); + /** @var $node \DOMNode */ + foreach ($xpath->query('//extension_attributes') as $node) { + $forType = $node->attributes->getNamedItem('for')->nodeValue; + $extensionClasses[] = str_replace('Interface', 'ExtensionInterface', $forType); + $extensionClasses[] = str_replace('Interface', 'Extension', $forType); + } + } + return $extensionClasses; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/XmlInterceptorScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/XmlInterceptorScanner.php new file mode 100644 index 0000000..75c6e11 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/XmlInterceptorScanner.php @@ -0,0 +1,106 @@ +_collectEntitiesFromString(file_get_contents($file))); + } + $output = array_unique($output); + $output = $this->_filterEntities($output); + return $output; + } + + /** + * Collect entities from XML string + * + * + * @param string $content + * @return array + */ + protected function _collectEntitiesFromString($content) + { + $output = []; + $dom = new \DOMDocument(); + $dom->loadXML($content); + $xpath = new \DOMXPath($dom); + /** @var $entityNode \DOMNode */ + foreach ($xpath->query('//type[plugin]|//virtualType[plugin]') as $entityNode) { + $attributes = $entityNode->attributes; + $type = $attributes->getNamedItem('type'); + if ($type !== null) { + $output[] = $type->nodeValue; + } else { + $output[] = $attributes->getNamedItem('name')->nodeValue; + } + } + return $output; + } + + /** + * Filter found entities if needed + * + * @param array $output + * @return array + */ + protected function _filterEntities(array $output) + { + $filteredEntities = []; + foreach ($output as $entityName) { + // @todo the controller handling logic below must be removed when controllers become PSR-0 compliant + $controllerSuffix = 'Controller'; + $pathParts = explode('_', $entityName); + if (strrpos( + $entityName, + $controllerSuffix + ) === strlen( + $entityName + ) - strlen( + $controllerSuffix + ) && isset( + $pathParts[2] + ) && !in_array( + $pathParts[2], + ['Block', 'Helper', 'Model'] + ) + ) { + $this->_handleControllerClassName($entityName); + } + if (class_exists($entityName) || interface_exists($entityName)) { + $filteredEntities[] = $entityName . '\\Interceptor'; + } + } + return $filteredEntities; + } + + /** + * Include file with controller declaration if needed + * + * @param string $className + * @return void + */ + protected function _handleControllerClassName($className) + { + if (!class_exists($className)) { + $className = preg_replace('/[^a-zA-Z0-9_]/', '', $className); + $className = preg_replace('/^([0-9A-Za-z]*)_([0-9A-Za-z]*)/', '\\1_\\2_controllers', $className); + $filePath = stream_resolve_include_path(str_replace('_', '/', $className) . '.php'); + if (file_exists($filePath)) { + require_once $filePath; + } + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/XmlScanner.php b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/XmlScanner.php new file mode 100644 index 0000000..a606c26 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Code/Scanner/XmlScanner.php @@ -0,0 +1,119 @@ +_log = $log; + } + + /** + * Get array of class names + * + * @param array $files + * @return array + */ + public function collectEntities(array $files) + { + $virtualTypes = []; + $output = []; + $factoriesOutput = []; + foreach ($files as $file) { + $dom = new \DOMDocument(); + $dom->load($file); + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace("php", "http://php.net/xpath"); + $xpath->registerPhpFunctions('preg_match'); + $virtualTypeQuery = "//virtualType/@name"; + + foreach ($xpath->query($virtualTypeQuery) as $virtualNode) { + $virtualTypes[] = $virtualNode->nodeValue; + } + + $regex = '/^(.*)\\\(.*)Proxy$/'; + $query = "/config/preference[ php:functionString('preg_match', '{$regex}', @type) > 0]/@type | " . + "//argument[@xsi:type='object' and php:functionString('preg_match', '{$regex}', text()) > 0] |" . + "//item[@xsi:type='object' and php:functionString('preg_match', '{$regex}', text()) > 0] |" . + "/config/virtualType[ php:functionString('preg_match', '{$regex}', @type) > 0]/@type"; + /** @var \DOMNode $node */ + foreach ($xpath->query($query) as $node) { + $output[] = $node->nodeValue; + } + + $factoriesOutput = array_merge($factoriesOutput, $this->scanFactories($xpath)); + } + + $output = array_unique($output); + $factoriesOutput = array_unique($factoriesOutput); + $factoriesOutput = array_diff($factoriesOutput, $virtualTypes); + return array_merge($this->_filterEntities($output), $factoriesOutput); + } + + /** + * Scan factories from all di.xml and retrieve non virtual one + * + * @param \DOMXPath $domXpath + * @return array + */ + private function scanFactories(\DOMXPath $domXpath) + { + $output = []; + $regex = '/^(.*)Factory$/'; + $query = "//argument[@xsi:type='object' and php:functionString('preg_match', '{$regex}', text()) > 0] |" . + "//item[@xsi:type='object' and php:functionString('preg_match', '{$regex}', text()) > 0]"; + foreach ($domXpath->query($query) as $node) { + $output[] = $node->nodeValue; + } + + return $output; + } + + /** + * Filter found entities if needed + * + * @param array $output + * @return array + */ + protected function _filterEntities(array $output) + { + $entitySuffix = '\\' . ucfirst(ProxyGenerator::ENTITY_TYPE); + $filteredEntities = []; + foreach ($output as $className) { + $entityName = substr($className, -strlen($entitySuffix)) === $entitySuffix + ? substr($className, 0, -strlen($entitySuffix)) + : $className; + $isClassExists = false; + try { + $isClassExists = class_exists($className); + } catch (\RuntimeException $e) { + } + if (false === $isClassExists) { + if (class_exists($entityName) || interface_exists($entityName)) { + $filteredEntities[] = $className; + } else { + $this->_log->add( + \Magento\Setup\Module\Di\Compiler\Log\Log::CONFIGURATION_ERROR, + $className, + 'Invalid proxy class for ' . substr($className, 0, -5) + ); + } + } + } + return $filteredEntities; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/ArgumentsResolver.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/ArgumentsResolver.php new file mode 100644 index 0000000..7a6d34f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/ArgumentsResolver.php @@ -0,0 +1,289 @@ + null, + ]; + + /** + * Instance argument pattern used for configuration + * + * @var array + */ + private $notSharedInstancePattern = [ + '_ins_' => null, + ]; + + /** + * Value argument pattern used for configuration + * + * @var array + */ + private $valuePattern = [ + '_v_' => null, + ]; + + /** + * Value null argument pattern used for configuration + * + * @var array + */ + private $nullValuePattern = [ + '_vn_' => true, + ]; + + /** + * Value configured array argument pattern used for configuration + * + * @var array + */ + private $configuredArrayValuePattern = [ + '_vac_' => true, + ]; + + /** + * Configured argument pattern used for configuration + * + * @var array + */ + private $configuredPattern = [ + '_a_' => null, + '_d_' => null + ]; + + /** + * @param \Magento\Framework\ObjectManager\ConfigInterface $diContainerConfig + */ + public function __construct(\Magento\Framework\ObjectManager\ConfigInterface $diContainerConfig) + { + $this->diContainerConfig = $diContainerConfig; + } + + /** + * Returns resolved constructor arguments for given instance type + * + * @param string $instanceType + * @param ConstructorArgument[] $constructor + * @return array|null + */ + public function getResolvedConstructorArguments($instanceType, $constructor) + { + if (!$constructor) { + return null; + } + $configuredArguments = $this->getConfiguredArguments($instanceType); + + $arguments = []; + /** @var ConstructorArgument $constructorArgument */ + foreach ($constructor as $constructorArgument) { + $argument = $this->getNonObjectArgument(null); + if (!$constructorArgument->isRequired()) { + $argument = $this->getNonObjectArgument($constructorArgument->getDefaultValue()); + } elseif ($constructorArgument->getType()) { + $argument = $this->getInstanceArgument($constructorArgument->getType()); + } + + if (isset($configuredArguments[$constructorArgument->getName()])) { + $argument = $this->getConfiguredArgument( + $configuredArguments[$constructorArgument->getName()], + $constructorArgument + ); + } + $arguments[$constructorArgument->getName()] = $argument; + } + return $arguments; + } + + /** + * Returns formatted configured argument + * + * @param array $configuredArgument + * @param ConstructorArgument $constructorArgument + * @return mixed + */ + private function getConfiguredArgument($configuredArgument, ConstructorArgument $constructorArgument) + { + if ($constructorArgument->getType()) { + $argument = $this->getConfiguredInstanceArgument($configuredArgument); + return $argument; + } elseif (isset($configuredArgument['argument'])) { + return $this->getGlobalArgument($configuredArgument['argument'], $constructorArgument->getDefaultValue()); + } + + return $this->getNonObjectArgument($configuredArgument); + } + + /** + * Returns configured array attribute + * + * @param array $array + * @return mixed + */ + private function getConfiguredArrayAttribute($array) + { + foreach ($array as $key => $value) { + if (!is_array($value)) { + continue; + } + + if (isset($value['instance'])) { + $array[$key] = $this->getConfiguredInstanceArgument($value); + continue; + } + + if (isset($value['argument'])) { + $array[$key] = $this->getGlobalArgument($value['argument'], null); + continue; + } + + $array[$key] = $this->getConfiguredArrayAttribute($value); + } + + return $array; + } + + /** + * Returns configured instance argument + * + * @param array $config + * @return array|mixed + */ + private function getConfiguredInstanceArgument(array $config) + { + $argument = $this->getInstanceArgument($config['instance']); + if (isset($config['shared'])) { + if ($config['shared']) { + $pattern = $this->sharedInstancePattern; + $pattern['_i_'] = current($argument); + } else { + $pattern = $this->notSharedInstancePattern; + $pattern['_ins_'] = current($argument); + } + $argument = $pattern; + } + return $argument; + } + + /** + * Return configured arguments + * + * @param string $instanceType + * @return array + */ + private function getConfiguredArguments($instanceType) + { + $configuredArguments = $this->diContainerConfig->getArguments($instanceType); + return array_map( + function ($type) { + if (isset($type['instance'])) { + $type['instance'] = ltrim($type['instance'], '\\'); + } + + return $type; + }, + $configuredArguments + ); + } + + /** + * Returns instance argument + * + * @param string $instanceType + * @return array|mixed + */ + private function getInstanceArgument($instanceType) + { + if ($this->diContainerConfig->isShared($instanceType)) { + $argument = $this->sharedInstancePattern; + $argument['_i_'] = $instanceType; + } else { + $argument = $this->notSharedInstancePattern; + $argument['_ins_'] = $instanceType; + } + return $argument; + } + + /** + * Returns non object argument + * + * @param mixed $value + * @return array + */ + private function getNonObjectArgument($value) + { + if ($value === null) { + return $this->nullValuePattern; + } + + $argument = $this->valuePattern; + if (is_array($value)) { + if ($this->isConfiguredArray($value)) { + $value = $this->getConfiguredArrayAttribute($value); + $argument = $this->configuredArrayValuePattern; + $argument['_vac_'] = $value; + return $argument; + } + } + + $argument['_v_'] = $value; + return $argument; + } + + /** + * Whether array is configurable + * + * @param array $value + * @return bool + */ + private function isConfiguredArray($value) + { + foreach ($value as $configuredValue) { + if (!is_array($configuredValue)) { + continue; + } + + if (array_key_exists('instance', $configuredValue) || array_key_exists('argument', $configuredValue)) { + return true; + } + + if ($this->isConfiguredArray($configuredValue)) { + return true; + } + } + + return false; + } + + /** + * Returns global argument + * + * @param string $value + * @param string $default + * @return array + */ + private function getGlobalArgument($value, $default) + { + $argument = $this->configuredPattern; + $argument['_a_'] = $value; + $argument['_d_'] = $default; + return $argument; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/ArgumentsResolverFactory.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/ArgumentsResolverFactory.php new file mode 100644 index 0000000..752f5ad --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/ArgumentsResolverFactory.php @@ -0,0 +1,40 @@ +_objectManager = $objectManager; + } + + /** + * Create class instance with config + * + * @param \Magento\Framework\ObjectManager\ConfigInterface $diContainerConfig + * @return \Magento\Setup\Module\Di\Compiler\ArgumentsResolver + */ + public function create(\Magento\Framework\ObjectManager\ConfigInterface $diContainerConfig) + { + return new ArgumentsResolver($diContainerConfig); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/ArgumentsSerialization.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/ArgumentsSerialization.php new file mode 100644 index 0000000..be9abc5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/ArgumentsSerialization.php @@ -0,0 +1,59 @@ +serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class); + } + + /** + * Modifies input config + * + * @param array $config + * @return array + */ + public function modify(array $config) + { + if (!isset($config['arguments'])) { + return $config; + } + + foreach ($config['arguments'] as $key => $value) { + if ($value !== null) { + $config['arguments'][$key] = $this->serializer->serialize($value); + } + } + + return $config; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/BackslashTrim.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/BackslashTrim.php new file mode 100644 index 0000000..ce0fa5d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/BackslashTrim.php @@ -0,0 +1,80 @@ + true, // shared instance of a class or interface + '_ins_' => true // non-shared instance of a class or interface + ]; + + /** + * Modifies input config + * + * @param array $config + * @return array + */ + public function modify(array $config) + { + if (!isset($config['arguments'])) { + return $config; + } + + $config['arguments'] = $this->resolveInstancesNames($config['arguments']); + $this->resolveArguments($config['arguments']); + + return $config; + } + + /** + * Resolves instances names + * + * @param array $arguments + * @return array + */ + private function resolveInstancesNames(array $arguments) + { + $resolvedInstances = []; + foreach ($arguments as $instance => $constructor) { + $resolvedInstances[ltrim($instance, '\\')] = $constructor; + } + + return $resolvedInstances; + } + + /** + * Resolves instances arguments + * + * @param array $argument + */ + private function resolveArguments(&$argument) + { + if (!is_array($argument)) { + return; + } + + foreach ($argument as $key => &$value) { + if (isset(self::RECURSIVE_ARGUMENT_KEYS[$key])) { + $value = ltrim($value, '\\'); + continue; + } + + $this->resolveArguments($value); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/InterceptorSubstitution.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/InterceptorSubstitution.php new file mode 100644 index 0000000..66cd7b1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/InterceptorSubstitution.php @@ -0,0 +1,83 @@ +getInterceptorsList($config['arguments']); + + $config['arguments'] = array_diff_key($config['arguments'], array_flip($interceptors)); + + foreach ($interceptors as $originalName => $interceptor) { + if (isset($config['arguments'][$originalName])) { + $config['arguments'][$interceptor] = $config['arguments'][$originalName]; + unset($config['arguments'][$originalName]); + } + } + + $config['preferences'] = $this->resolvePreferences($config['preferences'], $interceptors); + $config['preferences'] = array_merge($interceptors, $config['preferences']); + $config['instanceTypes'] = $this->resolvePreferences($config['instanceTypes'], $interceptors); + + return $config; + } + + /** + * Returns list of intercepted types and their interceptors + * + * @param array $arguments + * @return array + */ + private function getInterceptorsList(array $arguments) + { + $interceptors = []; + + foreach (array_keys($arguments) as $instanceName) { + if (substr($instanceName, -12) === '\Interceptor') { + $originalName = substr($instanceName, 0, strlen($instanceName) - 12); + $interceptors[$originalName] = $instanceName; + } + } + + return $interceptors; + } + + /** + * Resolves config preferences + * + * @param array $preferences + * @param array $interceptors + * @return array + */ + private function resolvePreferences(array $preferences, array $interceptors) + { + foreach ($preferences as &$preference) { + if (isset($interceptors[$preference])) { + $preference = $interceptors[$preference]; + } + } + return $preferences; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/PreferencesResolving.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/PreferencesResolving.php new file mode 100644 index 0000000..d902c0c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/PreferencesResolving.php @@ -0,0 +1,79 @@ + true, // shared instance of a class or interface + '_ins_' => true // non-shared instance of a class or interface + ]; + + /** + * Modifies input config + * + * @param array $config + * @return array + */ + public function modify(array $config) + { + if (!isset($config['arguments'], $config['preferences'])) { + return $config; + } + + $this->resolvePreferences($config['arguments'], $config['preferences']); + + return $config; + } + + /** + * Replaces interfaces to their concrete implementations in scope of current config + * + * @param array $argument + * @param array $preferences + */ + private function resolvePreferences(&$argument, &$preferences) + { + if (!is_array($argument)) { + return; + } + + foreach ($argument as $key => &$value) { + if (isset(self::RECURSIVE_ARGUMENT_KEYS[$key])) { + $value = $this->resolvePreferenceRecursive($value, $preferences); + continue; + } + + $this->resolvePreferences($value, $preferences); + } + } + + /** + * Resolves preference recursively + * + * @param string $value + * @param array $preferences + * + * @return string + */ + private function resolvePreferenceRecursive(&$value, &$preferences) + { + return isset($preferences[$value]) + ? $this->resolvePreferenceRecursive($preferences[$value], $preferences) + : $value; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/ModificationChain.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/ModificationChain.php new file mode 100644 index 0000000..fc0294f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/ModificationChain.php @@ -0,0 +1,46 @@ +modificationsList = $modificationsList; + } + + /** + * Modifies input config + * + * @param array $config + * @return array + */ + public function modify(array $config) + { + $outputConfig = $config; + foreach ($this->modificationsList as $modification) { + $outputConfig = $modification->modify($outputConfig); + } + return $outputConfig; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/ModificationInterface.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/ModificationInterface.php new file mode 100644 index 0000000..6c2e7ca --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/ModificationInterface.php @@ -0,0 +1,22 @@ +diContainerConfig = $diContainerConfig; + $this->configLoader = $configLoader; + $this->argumentsResolverFactory = $argumentsResolverFactory; + $this->classReaderDecorator = $classReaderDecorator; + $this->typeReader = $typeReader; + } + + /** + * Generates config per scope and returns it + * + * @param DefinitionsCollection $definitionsCollection + * @param string $areaCode + * + * @return array + */ + public function generateCachePerScope( + DefinitionsCollection $definitionsCollection, + $areaCode + ) { + $areaConfig = clone $this->diContainerConfig; + if ($areaCode !== App\Area::AREA_GLOBAL) { + $areaConfig->extend($this->configLoader->load($areaCode)); + } + + $config = []; + + $this->fillThirdPartyInterfaces($areaConfig, $definitionsCollection); + $config['arguments'] = $this->getConfigForScope($definitionsCollection, $areaConfig); + + foreach ($definitionsCollection->getInstancesNamesList() as $instanceName) { + $preference = $areaConfig->getPreference($instanceName); + if ($instanceName !== $preference) { + $config['preferences'][$instanceName] = $preference; + } + } + + foreach (array_keys($areaConfig->getVirtualTypes()) as $virtualType) { + $config['instanceTypes'][$virtualType] = $areaConfig->getInstanceType($virtualType); + } + + return $config; + } + + /** + * Returns constructor with defined arguments + * + * @param DefinitionsCollection $definitionsCollection + * @param ConfigInterface $config + * @return array|mixed + * @throws \ReflectionException + */ + private function getConfigForScope(DefinitionsCollection $definitionsCollection, ConfigInterface $config) + { + $constructors = []; + $argumentsResolver = $this->argumentsResolverFactory->create($config); + foreach ($definitionsCollection->getCollection() as $instanceType => $constructor) { + if (!$this->typeReader->isConcrete($instanceType)) { + continue; + } + $constructors[$instanceType] = $argumentsResolver->getResolvedConstructorArguments( + $instanceType, + $constructor + ); + } + foreach (array_keys($config->getVirtualTypes()) as $instanceType) { + $originalType = $config->getInstanceType($instanceType); + if (!$definitionsCollection->hasInstance($originalType)) { + if (!$this->typeReader->isConcrete($originalType)) { + continue; + } + $constructor = $this->classReaderDecorator->getConstructor($originalType); + } else { + $constructor = $definitionsCollection->getInstanceArguments($originalType); + } + $constructors[$instanceType] = $argumentsResolver->getResolvedConstructorArguments( + $instanceType, + $constructor + ); + } + return $constructors; + } + + /** + * Returns preferences for third party code + * + * @param ConfigInterface $config + * @param DefinitionsCollection $definitionsCollection + * + * @return void + */ + private function fillThirdPartyInterfaces(ConfigInterface $config, DefinitionsCollection $definitionsCollection) + { + $definedInstances = $definitionsCollection->getCollection(); + $newInstances = array_fill_keys(array_keys($config->getPreferences()), []); + $newCollection = array_merge($newInstances, $definedInstances); + $definitionsCollection->initialize($newCollection); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php new file mode 100644 index 0000000..953dc04 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php @@ -0,0 +1,64 @@ +directoryList = $directoryList; + } + + /** + * Writes config in storage + * + * @param string $key + * @param array $config + * @return void + */ + public function write($key, array $config) + { + $this->initialize(); + $configuration = sprintf('directoryList->getPath(DirectoryList::GENERATED_METADATA) . '/' . $key . '.php', + $configuration + ); + } + + /** + * Initializes writer + * + * @return void + */ + private function initialize() + { + if (!file_exists($this->directoryList->getPath(DirectoryList::GENERATED_METADATA))) { + mkdir($this->directoryList->getPath(DirectoryList::GENERATED_METADATA)); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/WriterInterface.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/WriterInterface.php new file mode 100644 index 0000000..1ff5524 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Config/WriterInterface.php @@ -0,0 +1,25 @@ +name = $configuration[0]; + $this->type = $configuration[1]; + $this->isRequired = $configuration[2]; + $this->defaultValue = $configuration[3]; + } + + /** + * Returns attribute name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Returns attribute type + * + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Whether attribute is required + * + * @return bool + */ + public function isRequired() + { + return $this->isRequired; + } + + /** + * Returns attribute default value + * + * @return mixed + */ + public function getDefaultValue() + { + return $this->defaultValue; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Log/Log.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Log/Log.php new file mode 100644 index 0000000..a757cda --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Log/Log.php @@ -0,0 +1,110 @@ +_successWriter = $successWriter; + $this->_errorWriter = $errorWriter; + $this->_successEntries[self::GENERATION_SUCCESS] = []; + $this->_errorEntries = [ + self::CONFIGURATION_ERROR => [], + self::GENERATION_ERROR => [], + self::COMPILATION_ERROR => [], + ]; + } + + /** + * Add log message + * + * @param string $type + * @param string $key + * @param string $message + * @return void + */ + public function add($type, $key, $message = '') + { + if (array_key_exists($type, $this->_successEntries)) { + $this->_successEntries[$type][$key][] = $message; + } else { + $this->_errorEntries[$type][$key][] = $message; + } + } + + /** + * Write entries + * + * @return void + * @throws \Magento\Framework\Validator\Exception + */ + public function report() + { + $this->_successWriter->write($this->_successEntries); + $this->_errorWriter->write($this->_errorEntries); + //do not take into account empty items since they are initialized in constructor. + $errors = array_filter($this->_errorEntries); + if (count($errors) > 0) { + throw new \Magento\Framework\Validator\Exception(__('Error during compilation')); + } + } + + /** + * Check whether error exists + * + * @return bool + */ + public function hasError() + { + foreach ($this->_errorEntries as $data) { + if (count($data)) { + return true; + } + } + return false; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Compiler/Log/Writer/Console.php b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Log/Writer/Console.php new file mode 100644 index 0000000..8589ed9 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Compiler/Log/Writer/Console.php @@ -0,0 +1,105 @@ + 'Generated classes:', + Log::GENERATION_ERROR => 'Errors during class generation:', + Log::COMPILATION_ERROR => 'Errors during compilation:', + Log::CONFIGURATION_ERROR => 'Errors during configuration scanning:', + ]; + + /** + * Console + * + * @var OutputInterface + */ + protected $console; + + /** + * @param OutputInterface $output + */ + public function __construct(OutputInterface $output) + { + $this->console = $output; + } + + /** + * Output log data + * + * @param array $data + * @return void + */ + public function write(array $data) + { + $errorsCount = 0; + foreach ($data as $type => $classes) { + if (!count($classes)) { + continue; + } + $this->console->writeln($this->getStartTag($type) . $this->_messages[$type] . $this->getEndTag($type)); + foreach ($classes as $className => $messages) { + if (count($messages)) { + $this->console->writeln($this->getStartTag($type) . "\t" . $className . $this->getEndTag($type)); + foreach ($messages as $message) { + if ($message) { + $this->console->writeln( + $this->getStartTag($type) . "\t\t" . $message . $this->getEndTag($type) + ); + if ($type != Log::GENERATION_SUCCESS) { + $errorsCount++; + } + } + } + } + } + } + + if ($errorsCount) { + $this->console->writeln('' . 'Total Errors Count: ' . $errorsCount . ''); + } + } + + /** + * Retrieve starting output tag + * + * @param string $type + * @return string + */ + private function getStartTag($type) + { + if ($type === Log::GENERATION_SUCCESS) { + return ''; + } else { + return ''; + } + } + + /** + * Retrieve ending output tag + * + * @param string $type + * @return string + */ + private function getEndTag($type) + { + if ($type === Log::GENERATION_SUCCESS) { + return ''; + } else { + return ''; + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Di/Definition/Collection.php b/magento/setup/src/Magento/Setup/Module/Di/Definition/Collection.php new file mode 100644 index 0000000..559cafb --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Di/Definition/Collection.php @@ -0,0 +1,96 @@ + list of arguments] + * + * @return array + */ + public function getCollection() + { + return $this->definitions; + } + + /** + * Initializes collection with array of definitions + * + * @param array $definitions + * + * @return void + */ + public function initialize(array $definitions) + { + $this->definitions = $definitions; + } + + /** + * Adds collection to current collection + * + * @param Collection $collection + * + * @return void + */ + public function addCollection(Collection $collection) + { + $this->initialize(array_merge($this->getCollection(), $collection->getCollection())); + } + + /** + * Add new definition for instance + * + * @param string $instance + * @param array|null $arguments + * + * @return void + */ + public function addDefinition($instance, $arguments = []) + { + $this->definitions[$instance] = $arguments; + } + + /** + * Returns instance arguments + * + * @param string $instanceName + * @return null|array + */ + public function getInstanceArguments($instanceName) + { + return isset($this->definitions[$instanceName]) ? $this->definitions[$instanceName] : null; + } + + /** + * Returns instances names list + * + * @return array + */ + public function getInstancesNamesList() + { + return array_keys($this->getCollection()); + } + + /** + * Whether instance defined + * + * @param string $instanceName + * @return bool + */ + public function hasInstance($instanceName) + { + return isset($this->definitions[$instanceName]); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Context.php b/magento/setup/src/Magento/Setup/Module/I18n/Context.php new file mode 100644 index 0000000..fd69022 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Context.php @@ -0,0 +1,115 @@ +componentRegistrar = $componentRegistrar; + } + + /** + * Get context from file path in array(, ) format + * - for module: _ + * - for theme: / + * - for pub: relative path to file + * + * @param string $path + * @return array + * @throws \InvalidArgumentException + */ + public function getContextByPath($path) + { + if ($value = $this->getComponentName(ComponentRegistrar::MODULE, $path)) { + $type = self::CONTEXT_TYPE_MODULE; + } elseif ($value = $this->getComponentName(ComponentRegistrar::THEME, $path)) { + $type = self::CONTEXT_TYPE_THEME; + } elseif ($value = strstr($path, '/lib/web/')) { + $type = self::CONTEXT_TYPE_LIB; + $value = ltrim($value, '/'); + } else { + throw new \InvalidArgumentException(sprintf('Invalid path given: "%s".', $path)); + } + return [$type, $value]; + } + + /** + * Try to get component name by path, return false if not found + * + * @param string $componentType + * @param string $path + * @return bool|string + */ + private function getComponentName($componentType, $path) + { + foreach ($this->componentRegistrar->getPaths($componentType) as $componentName => $componentDir) { + $componentDir .= '/'; + if (strpos($path, $componentDir) !== false) { + return $componentName; + } + } + return false; + } + + /** + * Get paths by context + * + * @param string $type + * @param array $value + * @return string|null + * @throws \InvalidArgumentException + */ + public function buildPathToLocaleDirectoryByContext($type, $value) + { + switch ($type) { + case self::CONTEXT_TYPE_MODULE: + $path = $this->componentRegistrar->getPath(ComponentRegistrar::MODULE, $value); + break; + case self::CONTEXT_TYPE_THEME: + $path = $this->componentRegistrar->getPath(ComponentRegistrar::THEME, $value); + break; + case self::CONTEXT_TYPE_LIB: + $path = BP . '/lib/web'; + break; + default: + throw new \InvalidArgumentException(sprintf('Invalid context given: "%s".', $type)); + } + + return (null === $path) ? null : $path . '/' . self::LOCALE_DIRECTORY . '/'; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary.php new file mode 100644 index 0000000..42c0646 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary.php @@ -0,0 +1,67 @@ +_phrases[] = $phrase; + $this->_phrasesByKey[$phrase->getKey()][] = $phrase; + } + + /** + * Get phrases + * + * @return Phrase[] + */ + public function getPhrases() + { + return $this->_phrases; + } + + /** + * Get duplicates in container + * + * @return array + */ + public function getDuplicates() + { + return array_values( + array_filter( + $this->_phrasesByKey, + function ($phrases) { + return count($phrases) > 1; + } + ) + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Generator.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Generator.php new file mode 100644 index 0000000..4788fe1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Generator.php @@ -0,0 +1,117 @@ +parser = $parser; + $this->contextualParser = $contextualParser; + $this->factory = $factory; + $this->optionResolverFactory = $optionsResolver; + } + + /** + * Generate dictionary + * + * @param string $directory + * @param string $outputFilename + * @param bool $withContext + * @throws \UnexpectedValueException + * @return void + */ + public function generate($directory, $outputFilename, $withContext = false) + { + $optionResolver = $this->optionResolverFactory->create($directory, $withContext); + + $parser = $this->getActualParser($withContext); + $parser->parse($optionResolver->getOptions()); + + $phraseList = $parser->getPhrases(); + if (!count($phraseList)) { + throw new \UnexpectedValueException('No phrases found in the specified dictionary file.'); + } + foreach ($phraseList as $phrase) { + $this->getDictionaryWriter($outputFilename)->write($phrase); + } + $this->writer = null; + } + + /** + * @param string $outputFilename + * @return WriterInterface + */ + protected function getDictionaryWriter($outputFilename) + { + if (null === $this->writer) { + $this->writer = $this->factory->createDictionaryWriter($outputFilename); + } + return $this->writer; + } + + /** + * Get actual parser + * + * @param bool $withContext + * @return \Magento\Setup\Module\I18n\ParserInterface + */ + protected function getActualParser($withContext) + { + return $withContext ? $this->contextualParser : $this->parser; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/File/AbstractFile.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/File/AbstractFile.php new file mode 100644 index 0000000..19d6d89 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/File/AbstractFile.php @@ -0,0 +1,135 @@ +_factory = $factory; + } + + /** + * {@inheritdoc} + */ + public function load($file) + { + $this->_openFile($file); + $dictionary = $this->_createDictionary(); + + $this->_position = 0; + while ($data = $this->_readFile()) { + $this->_position++; + $data = array_pad($data, 4, null); + $dictionary->addPhrase( + $this->_createPhrase( + [ + 'phrase' => $data[0], + 'translation' => $data[1], + 'context_type' => $data[2], + 'context_value' => $data[3], + ] + ) + ); + } + $this->_closeFile(); + + return $dictionary; + } + + /** + * Init file handler + * + * @param string $file + * @return void + * @throws \InvalidArgumentException + */ + protected function _openFile($file) + { + if (false === ($this->_fileHandler = @fopen($file, 'r'))) { + throw new \InvalidArgumentException(sprintf('Cannot open dictionary file: "%s".', $file)); + } + } + + /** + * Read file. Template method + * + * @return array + */ + abstract protected function _readFile(); + + /** + * Close file handler + * + * @return void + */ + protected function _closeFile() + { + fclose($this->_fileHandler); + } + + /** + * Create dictionary + * + * @return \Magento\Setup\Module\I18n\Dictionary + */ + protected function _createDictionary() + { + return $this->_factory->createDictionary(); + } + + /** + * Create phrase + * + * @param array $data + * @return \Magento\Setup\Module\I18n\Dictionary\Phrase + * @throws \RuntimeException + */ + protected function _createPhrase($data) + { + try { + return $this->_factory->createPhrase($data); + } catch (\DomainException $e) { + throw new \RuntimeException( + sprintf('Invalid row #%d: "%s".', $this->_position, $e->getMessage()) + . "\n" + . 'Each row has to consist of 4 columns: original phrase, translation, context type, context value' + ); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/File/Csv.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/File/Csv.php new file mode 100644 index 0000000..5751e84 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/File/Csv.php @@ -0,0 +1,22 @@ +_fileHandler, null, ',', '"'); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/FileInterface.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/FileInterface.php new file mode 100644 index 0000000..20cd4ff --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Loader/FileInterface.php @@ -0,0 +1,21 @@ +componentRegistrar = $componentRegistrar; + $this->directory = $directory; + $this->withContext = $withContext; + } + + /** + * @return array + */ + public function getOptions() + { + if (null === $this->options) { + if ($this->withContext) { + $directory = rtrim($this->directory, '\\/'); + $this->directory = ($directory == '.' || $directory == '..') ? BP : realpath($directory); + $moduleDirs = $this->getComponentDirectories(ComponentRegistrar::MODULE); + $themeDirs = $this->getComponentDirectories(ComponentRegistrar::THEME); + + $this->options = [ + [ + 'type' => 'php', + 'paths' => array_merge($moduleDirs, $themeDirs), + 'fileMask' => '/\.(php|phtml)$/', + ], + [ + 'type' => 'html', + 'paths' => array_merge($moduleDirs, $themeDirs), + 'fileMask' => '/\.html$/', + ], + [ + 'type' => 'js', + 'paths' => array_merge( + $moduleDirs, + $themeDirs, + [ + $this->directory . '/lib/web/mage/', + $this->directory . '/lib/web/varien/', + ] + ), + 'fileMask' => '/\.(js|phtml)$/' + ], + [ + 'type' => 'xml', + 'paths' => array_merge($moduleDirs, $themeDirs), + 'fileMask' => '/\.xml$/' + ], + ]; + } else { + $this->options = [ + ['type' => 'php', 'paths' => [$this->directory], 'fileMask' => '/\.(php|phtml)$/'], + ['type' => 'html', 'paths' => [$this->directory], 'fileMask' => '/\.html/'], + ['type' => 'js', 'paths' => [$this->directory], 'fileMask' => '/\.(js|phtml)$/'], + ['type' => 'xml', 'paths' => [$this->directory], 'fileMask' => '/\.xml$/'], + ]; + } + foreach ($this->options as $option) { + $this->isValidPaths($option['paths']); + } + } + return $this->options; + } + + /** + * @param array $directories + * @return void + * @throws \InvalidArgumentException + */ + protected function isValidPaths($directories) + { + foreach ($directories as $path) { + if (!is_dir($path)) { + if ($this->withContext) { + throw new \InvalidArgumentException('Specified path is not a Magento root directory'); + } else { + throw new \InvalidArgumentException('Specified path doesn\'t exist'); + } + } + } + } + + /** + * Get the given type component directories + * + * @param string $componentType + * @return array + */ + private function getComponentDirectories($componentType) + { + $dirs = []; + foreach ($this->componentRegistrar->getPaths($componentType) as $componentDir) { + $dirs[] = $componentDir . '/'; + } + return $dirs; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/ResolverFactory.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/ResolverFactory.php new file mode 100644 index 0000000..6efbc57 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/ResolverFactory.php @@ -0,0 +1,47 @@ +resolverClass = $resolverClass; + } + + /** + * @param string $directory + * @param bool $withContext + * @return ResolverInterface + * @throws \InvalidArgumentException + */ + public function create($directory, $withContext) + { + $resolver = new $this->resolverClass(new ComponentRegistrar(), $directory, $withContext); + if (!$resolver instanceof ResolverInterface) { + throw new \InvalidArgumentException($this->resolverClass . ' doesn\'t implement ResolverInterface'); + } + return $resolver; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/ResolverInterface.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/ResolverInterface.php new file mode 100644 index 0000000..561a81b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Options/ResolverInterface.php @@ -0,0 +1,17 @@ +setPhrase($phrase); + $this->setTranslation($translation); + $this->setContextType($contextType); + $this->setContextValue($contextValue); + $this->setQuote($quote); + } + + /** + * Set phrase + * + * @param string $phrase + * @return void + * @throws \DomainException + */ + public function setPhrase($phrase) + { + if (!$phrase) { + throw new \DomainException('Missed phrase'); + } + $this->_phrase = $phrase; + } + + /** + * Get phrase + * + * @return string + */ + public function getPhrase() + { + return $this->_phrase; + } + + /** + * Set quote type + * + * @param string $quote + * @return void + */ + public function setQuote($quote) + { + if (in_array($quote, [self::QUOTE_SINGLE, self::QUOTE_DOUBLE])) { + $this->_quote = $quote; + } + } + + /** + * Get quote type + * + * @return string + */ + public function getQuote() + { + return $this->_quote; + } + + /** + * Set translation + * + * @param string $translation + * @return void + * @throws \DomainException + */ + public function setTranslation($translation) + { + if (!$translation) { + throw new \DomainException('Missed translation'); + } + $this->_translation = $translation; + } + + /** + * Get translation + * + * @return string + */ + public function getTranslation() + { + return $this->_translation; + } + + /** + * Set context type + * + * @param string $contextType + * @return void + */ + public function setContextType($contextType) + { + $this->_contextType = $contextType; + } + + /** + * Get context type + * + * @return string + */ + public function getContextType() + { + return $this->_contextType; + } + + /** + * Add context value + * + * @param string $contextValue + * @return void + * @throws \DomainException + */ + public function addContextValue($contextValue) + { + if (empty($contextValue)) { + throw new \DomainException('Context value is empty'); + } + if (!in_array($contextValue, $this->_contextValue)) { + $this->_contextValue[] = $contextValue; + } + } + + /** + * Set context type + * + * @param string $contextValue + * @return void + * @throws \DomainException + */ + public function setContextValue($contextValue) + { + if (is_string($contextValue)) { + $contextValue = explode(',', $contextValue); + } elseif (null == $contextValue) { + $contextValue = []; + } elseif (!is_array($contextValue)) { + throw new \DomainException('Wrong context type'); + } + $this->_contextValue = $contextValue; + } + + /** + * Get context value + * + * @return array + */ + public function getContextValue() + { + return $this->_contextValue; + } + + /** + * Get context value as string + * + * @param string $separator + * @return string + */ + public function getContextValueAsString($separator = ',') + { + return implode($separator, $this->_contextValue); + } + + /** + * Get VO identifier key + * + * @return string + */ + public function getKey() + { + return $this->getPhrase() . '::' . $this->getContextType(); + } + + /** + * Compile PHP string based on quotes type it enclosed with + * + * @return string + */ + public function getCompiledPhrase() + { + return $this->getCompiledString($this->getPhrase()); + } + + /** + * Compile PHP string based on quotes type it enclosed with + * + * @return string + */ + public function getCompiledTranslation() + { + return $this->getCompiledString($this->getTranslation()); + } + + /** + * Compile PHP string (escaping unescaped quotes and processing concatenation) + * + * @param string $string + * @return string + */ + private function getCompiledString($string) + { + $encloseQuote = $this->getQuote() == Phrase::QUOTE_DOUBLE ? Phrase::QUOTE_DOUBLE : Phrase::QUOTE_SINGLE; + /* Find all occurrences of ' and ", with no \ before it for concatenation */ + preg_match_all('/[^\\\\]' . $encloseQuote . '|' . $encloseQuote . '[^\\\\]/', $string, $matches); + if (count($matches[0])) { + $string = preg_replace('/([^\\\\])' . $encloseQuote . ' ?\. ?' . $encloseQuote . '/', '$1', $string); + } + /* Remove all occurrences of escaped quotes because it is not desirable in csv file. + Translation for such phrases will use translation for phrase without escaped quote. */ + $string = str_replace('\"', '"', $string); + $string = str_replace("\\'", "'", $string); + return $string; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Writer/Csv.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Writer/Csv.php new file mode 100644 index 0000000..4399144 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Writer/Csv.php @@ -0,0 +1,64 @@ +_fileHandler = $fileHandler; + } + + /** + * {@inheritdoc} + */ + public function write(Phrase $phrase) + { + $fields = [$phrase->getCompiledPhrase(), $phrase->getCompiledTranslation()]; + if (($contextType = $phrase->getContextType()) && ($contextValue = $phrase->getContextValueAsString())) { + $fields[] = $contextType; + $fields[] = $contextValue; + } + + fputcsv($this->_fileHandler, $fields, ',', '"'); + } + + /** + * Destructor for closing resource + * + * @return void + */ + public function __destruct() + { + if ($this->_fileHandler !== STDOUT && is_resource($this->_fileHandler)) { + fclose($this->_fileHandler); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Writer/Csv/Stdo.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Writer/Csv/Stdo.php new file mode 100644 index 0000000..1b606f8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/Writer/Csv/Stdo.php @@ -0,0 +1,33 @@ +_fileHandler = STDOUT; + } + + /** + * Overriding parent as we can not close globally used resource + * + * @return void + */ + public function __destruct() + { + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/WriterInterface.php b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/WriterInterface.php new file mode 100644 index 0000000..0c053b3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Dictionary/WriterInterface.php @@ -0,0 +1,20 @@ +_getIterator($path, $fileMask) as $file) { + $files[] = (string)$file; + } + } + sort($files); + return $files; + } + + /** + * Get files iterator + * + * @param string $path + * @param bool $fileMask + * @return \RecursiveIteratorIterator|\RegexIterator + * @throws \InvalidArgumentException + */ + protected function _getIterator($path, $fileMask = false) + { + try { + $directoryIterator = new \RecursiveDirectoryIterator( + $path, + \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS | \FilesystemIterator::FOLLOW_SYMLINKS + ); + $iterator = new \RecursiveIteratorIterator($directoryIterator); + } catch (\UnexpectedValueException $valueException) { + throw new \InvalidArgumentException(sprintf('Cannot read directory for parse phrase: "%s".', $path)); + } + if ($fileMask) { + $iterator = new \RegexIterator($iterator, $fileMask); + } + return $iterator; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Locale.php b/magento/setup/src/Magento/Setup/Module/I18n/Locale.php new file mode 100644 index 0000000..5a61929 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Locale.php @@ -0,0 +1,48 @@ +_locale = $locale; + } + + /** + * Return locale string + * + * @return string + */ + public function __toString() + { + return $this->_locale; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Pack/Generator.php b/magento/setup/src/Magento/Setup/Module/I18n/Pack/Generator.php new file mode 100644 index 0000000..d1da0a1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Pack/Generator.php @@ -0,0 +1,109 @@ +dictionaryLoader = $dictionaryLoader; + $this->packWriter = $packWriter; + $this->factory = $factory; + } + + /** + * Generate language pack + * + * @param string $dictionaryPath + * @param string $locale + * @param string $mode One of const of WriterInterface::MODE_ + * @param bool $allowDuplicates + * @return void + * @throws \RuntimeException + */ + public function generate( + $dictionaryPath, + $locale, + $mode = WriterInterface::MODE_REPLACE, + $allowDuplicates = false + ) { + $locale = $this->factory->createLocale($locale); + $dictionary = $this->dictionaryLoader->load($dictionaryPath); + + $phrases = $dictionary->getPhrases(); + if (!is_array($phrases) || !count($phrases)) { + throw new \UnexpectedValueException('No phrases have been found by the specified path.'); + } + + if (!$allowDuplicates && ($duplicates = $dictionary->getDuplicates())) { + throw new \RuntimeException( + "Duplicated translation is found, but it is not allowed.\n" + . $this->createDuplicatesPhrasesError($duplicates) + ); + } + + $this->packWriter->writeDictionary($dictionary, $locale, $mode); + } + + /** + * Get duplicates error + * + * @param array $duplicates + * @return string + */ + protected function createDuplicatesPhrasesError($duplicates) + { + $error = ''; + foreach ($duplicates as $phrases) { + /** @var \Magento\Setup\Module\I18n\Dictionary\Phrase $phrase */ + $phrase = $phrases[0]; + $error .= sprintf( + "The phrase \"%s\" is translated in %d places.\n", + $phrase->getPhrase(), + count($phrases) + ); + } + return $error; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Pack/Writer/File/AbstractFile.php b/magento/setup/src/Magento/Setup/Module/I18n/Pack/Writer/File/AbstractFile.php new file mode 100644 index 0000000..89b526c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Pack/Writer/File/AbstractFile.php @@ -0,0 +1,160 @@ +_context = $context; + $this->_dictionaryLoader = $dictionaryLoader; + $this->_factory = $factory; + } + + /** + * {@inheritdoc} + */ + public function write(Dictionary $dictionary, $packPath, Locale $locale, $mode = self::MODE_REPLACE) + { + $this->writeDictionary($dictionary, $locale, $mode); + } + + /** + * {@inheritdoc} + */ + public function writeDictionary(Dictionary $dictionary, Locale $locale, $mode = self::MODE_REPLACE) + { + $this->_locale = $locale; + $this->_mode = $mode; + + foreach ($this->_buildPackFilesData($dictionary) as $file => $phrases) { + $this->_createDirectoryIfNotExist(dirname($file)); + $this->_writeFile($file, $phrases); + } + } + + /** + * Create one pack file. Template method + * + * @param string $file + * @param array $phrases + * @return void + * @throws \RuntimeException + */ + abstract public function _writeFile($file, $phrases); + + /** + * Build pack files data + * + * @param Dictionary $dictionary + * @return array + * @throws \RuntimeException + */ + protected function _buildPackFilesData(Dictionary $dictionary) + { + $files = []; + foreach ($dictionary->getPhrases() as $key => $phrase) { + if (!$phrase->getContextType() || !$phrase->getContextValue()) { + throw new \RuntimeException( + sprintf('Missed context in row #%d.', $key + 1) + . "\n" + . 'Each row has to consist of 4 columns: original phrase, translation, context type, context value' + ); + } + foreach ($phrase->getContextValue() as $context) { + try { + $path = $this->_context->buildPathToLocaleDirectoryByContext($phrase->getContextType(), $context); + } catch (\InvalidArgumentException $e) { + throw new \InvalidArgumentException($e->getMessage() . ' Row #' . ($key + 1) . '.'); + } + + if (null === $path) { + continue; + } + + $filename = $path . $this->_locale . '.' . $this->_getFileExtension(); + $files[$filename][$phrase->getPhrase()] = $phrase; + } + } + return $files; + } + + /** + * Get file extension + * + * @return string + */ + abstract protected function _getFileExtension(); + + /** + * Create directory if not exists + * + * @param string $destinationPath + * @param int $mode + * @param bool $recursive Allows the creation of nested directories specified in the $destinationPath + * @return void + */ + protected function _createDirectoryIfNotExist($destinationPath, $mode = 0777, $recursive = true) + { + if (!is_dir($destinationPath)) { + mkdir($destinationPath, $mode, $recursive); + if ($mode) { + chmod($destinationPath, $mode); + } + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Pack/Writer/File/Csv.php b/magento/setup/src/Magento/Setup/Module/I18n/Pack/Writer/File/Csv.php new file mode 100644 index 0000000..baeb232 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Pack/Writer/File/Csv.php @@ -0,0 +1,69 @@ +_mode) { + $phrases = $this->_mergeDictionaries($file, $phrases); + } + + $writer = $this->_factory->createDictionaryWriter($file); + /** @var \Magento\Setup\Module\I18n\Dictionary\Phrase $phrase */ + foreach ($phrases as $phrase) { + $phrase->setContextType(null); + $phrase->setContextValue(null); + + $writer->write($phrase); + } + } + + /** + * Merge dictionaries + * + * @param string $file + * @param array $phrases + * @return array + */ + protected function _mergeDictionaries($file, $phrases) + { + if (!file_exists($file)) { + return $phrases; + } + $dictionary = $this->_dictionaryLoader->load($file); + + $merged = []; + foreach ($dictionary->getPhrases() as $phrase) { + $merged[$phrase->getPhrase()] = $phrase; + } + /** @var \Magento\Setup\Module\I18n\Dictionary\Phrase $phrase */ + foreach ($phrases as $phrase) { + $merged[$phrase->getPhrase()] = $phrase; + } + return $merged; + } + + /** + * {@inheritdoc} + */ + protected function _getFileExtension() + { + return self::FILE_EXTENSION; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Pack/WriterInterface.php b/magento/setup/src/Magento/Setup/Module/I18n/Pack/WriterInterface.php new file mode 100644 index 0000000..7fbe60b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Pack/WriterInterface.php @@ -0,0 +1,47 @@ +_filesCollector = $filesCollector; + $this->_factory = $factory; + } + + /** + * Add parser + * + * @param string $type + * @param AdapterInterface $adapter + * @return void + */ + public function addAdapter($type, AdapterInterface $adapter) + { + $this->_adapters[$type] = $adapter; + } + + /** + * {@inheritdoc} + */ + public function parse(array $parseOptions) + { + $this->_validateOptions($parseOptions); + + foreach ($parseOptions as $typeOptions) { + $this->_parseByTypeOptions($typeOptions); + } + return $this->_phrases; + } + + /** + * Parse one type + * + * @param array $options + * @return void + */ + abstract protected function _parseByTypeOptions($options); + + /** + * Validate options + * + * @param array $parseOptions + * @return void + * @throws \InvalidArgumentException + */ + protected function _validateOptions($parseOptions) + { + foreach ($parseOptions as $parserOptions) { + if (empty($parserOptions['type'])) { + throw new \InvalidArgumentException('Missed "type" in parser options.'); + } + if (!isset($this->_adapters[$parserOptions['type']])) { + throw new \InvalidArgumentException( + sprintf('Adapter is not set for type "%s".', $parserOptions['type']) + ); + } + if (!isset($parserOptions['paths']) || !is_array($parserOptions['paths'])) { + throw new \InvalidArgumentException('"paths" in parser options must be array.'); + } + } + } + + /** + * Get files for parsing + * + * @param array $options + * @return array + */ + protected function _getFiles($options) + { + $fileMask = isset($options['fileMask']) ? $options['fileMask'] : ''; + + return $this->_filesCollector->getFiles($options['paths'], $fileMask); + } + + /** + * {@inheritdoc} + */ + public function getPhrases() + { + return $this->_phrases; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/AbstractAdapter.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/AbstractAdapter.php new file mode 100644 index 0000000..6f2f005 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/AbstractAdapter.php @@ -0,0 +1,140 @@ +_phrases = []; + $this->_file = $file; + $this->_parse(); + } + + /** + * Template method + * + * @return void + */ + abstract protected function _parse(); + + /** + * {@inheritdoc} + */ + public function getPhrases() + { + return array_values($this->_phrases); + } + + /** + * Add phrase + * + * @param string $phrase + * @param string|int $line + * @return void + * @throws \InvalidArgumentException + */ + protected function _addPhrase($phrase, $line = '') + { + if (!$phrase) { + return; + } + if (!isset($this->_phrases[$phrase])) { + $enclosureCharacter = $this->getEnclosureCharacter($phrase); + if (!empty($enclosureCharacter)) { + $phrase = $this->trimEnclosure($phrase); + } + + $this->_phrases[$phrase] = [ + 'phrase' => $phrase, + 'file' => $this->_file, + 'line' => $line, + 'quote' => $enclosureCharacter, + ]; + } + } + + /** + * Prepare phrase + * + * @param string $phrase + * @return string + */ + protected function _stripFirstAndLastChar($phrase) + { + return substr($phrase, 1, strlen($phrase) - 2); + } + + /** + * Check if first and last char is quote + * + * @param string $phrase + * @return bool + */ + protected function _isFirstAndLastCharIsQuote($phrase) + { + $firstCharacter = $phrase[0]; + $lastCharacter = $phrase[strlen($phrase) - 1]; + return $this->isQuote($firstCharacter) && $firstCharacter == $lastCharacter; + } + + /** + * Get enclosing character if any + * + * @param string $phrase + * @return string + */ + protected function getEnclosureCharacter($phrase) + { + $quote = ''; + if ($this->_isFirstAndLastCharIsQuote($phrase)) { + $quote = $phrase[0]; + } + + return $quote; + } + + /** + * @param string $phrase + * @return string + */ + protected function trimEnclosure($phrase) + { + return $this->_stripFirstAndLastChar($phrase); + } + + /** + * @param string $char + * @return bool + */ + protected function isQuote($char) + { + return in_array($char, [Phrase::QUOTE_DOUBLE, Phrase::QUOTE_SINGLE]); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Html.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Html.php new file mode 100644 index 0000000..d70e5c6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Html.php @@ -0,0 +1,88 @@ + + * + * @deprecated Not used anymore because of newly introduced constants + * @see self::REGEX_I18N_BINDING and self::REGEX_TRANSLATE_TAG_OR_ATTR + */ + const HTML_FILTER = "/i18n:\s?'(?[^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/"; + + /** + * Covers + * + * + */ + public const REGEX_I18N_BINDING = '/i18n:\s?\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/'; + + /** + * Covers + * + * + */ + public const REGEX_TRANSLATE_TAG_OR_ATTR = '/translate( args|)=\"\'([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\'\"/'; + + /** + * @inheritdoc + */ + protected function _parse() + { + // phpcs:ignore Magento2.Functions.DiscouragedFunction + $data = file_get_contents($this->_file); + if ($data === false) { + // phpcs:ignore Magento2.Exceptions.DirectThrow + throw new Exception('Failed to load file from disk.'); + } + + $results = []; + preg_match_all(Filter::CONSTRUCTION_PATTERN, $data, $results, PREG_SET_ORDER); + for ($i = 0, $count = count($results); $i < $count; $i++) { + if ($results[$i][1] === Filter::TRANS_DIRECTIVE_NAME) { + $directive = []; + if (preg_match(Filter::TRANS_DIRECTIVE_REGEX, $results[$i][2], $directive) !== 1) { + continue; + } + + $quote = $directive[1]; + $this->_addPhrase($quote . $directive[2] . $quote); + } + } + + $this->extractPhrases(self::REGEX_I18N_BINDING, $data, 2, 1); + $this->extractPhrases(self::REGEX_TRANSLATE_TAG_OR_ATTR, $data, 3, 2); + $this->extractPhrases(Js::REGEX_TRANSLATE_FUNCTION, $data, 3, 2); + } + + /** + * @param string $regex + * @param string $data + * @param int $expectedGroupsCount + * @param int $valueGroupIndex + */ + protected function extractPhrases(string $regex, string $data, int $expectedGroupsCount, int $valueGroupIndex): void + { + preg_match_all($regex, $data, $results, PREG_SET_ORDER); + + for ($i = 0, $count = count($results); $i < $count; $i++) { + if (count($results[$i]) === $expectedGroupsCount && !empty($results[$i][$valueGroupIndex])) { + $this->_addPhrase($results[$i][$valueGroupIndex]); + } + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Js.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Js.php new file mode 100644 index 0000000..02a09a5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Js.php @@ -0,0 +1,58 @@ +
+ * + * Double quotes are not handled correctly in the `attr` binding. Move phrase to the UI component property if needed + */ + public const REGEX_TRANSLATE_FUNCTION = '/\\$t\(\s*([\'"])(.*?[^\\\])\1.*?[),]/'; + + /** + * @inheritdoc + */ + protected function _parse() + { + $fileHandle = @fopen($this->_file, 'r'); + $lineNumber = 0; + while (!feof($fileHandle)) { + $lineNumber++; + $fileRow = fgets($fileHandle, 4096); + $results = []; + $regexes = [ + static::REGEX_MAGE_TRANSLATE, + static::REGEX_TRANSLATE_FUNCTION + ]; + + foreach ($regexes as $regex) { + preg_match_all($regex, $fileRow, $results, PREG_SET_ORDER); + for ($i = 0, $count = count($results); $i < $count; $i++) { + if (isset($results[$i][2])) { + $quote = $results[$i][1]; + $this->_addPhrase($quote . $results[$i][2] . $quote, $lineNumber); + } + } + } + } + fclose($fileHandle); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php.php new file mode 100644 index 0000000..74736d5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php.php @@ -0,0 +1,44 @@ +_phraseCollector = $phraseCollector; + } + + /** + * {@inheritdoc} + */ + protected function _parse() + { + $this->_phraseCollector->setIncludeObjects(); + $this->_phraseCollector->parse($this->_file); + + foreach ($this->_phraseCollector->getPhrases() as $phrase) { + $this->_addPhrase($phrase['phrase'], $phrase['line']); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer.php new file mode 100644 index 0000000..98c94da --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer.php @@ -0,0 +1,221 @@ +_tokens = token_get_all(file_get_contents($filePath)); + $this->_tokensCount = count($this->_tokens); + } + + /** + * Checks if the next set of tokens is a valid class identifier and it matches passed class name + * + * @param string $className + * @return bool + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + public function isMatchingClass($className) + { + /* + * 1 - beginning, class identifier can begin either with identifier or with namespace separator + * 2 - after namespace separator, identifier is expected + * 3 - after identifier, namespace separator or open brace is expected + * 4 - ending, tells that class identifier is valid + */ + $state = 1; + $classString = ''; + while ($token = $this->getNextRealToken()) { + if ($token->isFullQualifiedName()) { + // In PHP 8.0, it can be already a full name e.g. \Magento\Framework\Phrase. + $classString = $token->getValue(); + $state = 3; + } elseif ($token->isNamespaceSeparator() && $state != 2) { + $classString .= $token->getValue(); + $state = 2; + } elseif ($token->isIdentifier() && $state != 3) { + $classString .= $token->getValue(); + $state = 3; + } elseif ($token->isOpenBrace() && $state == 3) { + $state = 4; + break; + } else { + return false; + } + } + if ($state == 4 && $className == substr($classString, -strlen($className))) { + return true; + } + return false; + } + + /** + * Get arguments tokens of function + * + * @return array + */ + public function getFunctionArgumentsTokens() + { + $arguments = []; + try { + $this->_openBrackets = 1; + $this->_closeBrackets = 0; + $argumentNumber = 0; + while (true) { + $token = $this->getNextToken(); + if ($token->isSemicolon()) { + break; + } + if ($token->isOpenBrace()) { + $this->_skipInnerArgumentInvoke(); + continue; + } + if ($token->isCloseBrace()) { + $this->_closeBrackets++; + } + $arguments[$argumentNumber][] = $token; + if ($token->isComma() && $this->_isInnerArgumentClosed()) { + array_pop($arguments[$argumentNumber]); + $argumentNumber++; + } + if ($this->_openBrackets == $this->_closeBrackets) { + break; + } + } + } catch (\Exception $e) { + return []; + } + return $arguments; + } + + /** + * Whenever inner argument closed + * + * @return bool + */ + private function _isInnerArgumentClosed() + { + return $this->_openBrackets - 1 == $this->_closeBrackets; + } + + /** + * Skip invoke the inner argument of function + * + * @return void + */ + private function _skipInnerArgumentInvoke() + { + $this->_openBrackets++; + while (!$this->getNextToken()->isCloseBrace()) { + if ($this->getCurrentToken()->isCloseBrace()) { + $this->_closeBrackets++; + } + if ($this->getCurrentToken()->isOpenBrace()) { + $this->_openBrackets++; + } + } + $this->_closeBrackets++; + } + + /** + * Get current token + * + * @return \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token + */ + public function getCurrentToken() + { + return $this->_createToken(current($this->_tokens)); + } + + /** + * Get next token + * + * @return bool|\Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token + */ + public function getNextToken() + { + return ($token = next($this->_tokens)) ? $this->_createToken($token) : false; + } + + /** + * Get next token skipping all whitespaces + * + * @return \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token|false + */ + public function getNextRealToken() + { + do { + $token = $this->getNextToken(); + } while ($token && $token->isWhitespace()); + return $token; + } + + /** + * Check if it is end of loop + * + * @return bool + */ + public function isEndOfLoop() + { + return key($this->_tokens) === null; + } + + /** + * Create token from array|string + * + * @param array|string $tokenData + * @return \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token + */ + private function _createToken($tokenData) + { + if (is_array($tokenData)) { + return new Tokenizer\Token($tokenData[0], $tokenData[1], $tokenData[2]); + } else { + return new Tokenizer\Token($tokenData, $tokenData); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollector.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollector.php new file mode 100644 index 0000000..21f087b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollector.php @@ -0,0 +1,188 @@ +_tokenizer = $tokenizer; + $this->includeObjects = $includeObjects; + $this->className = $className; + } + + /** + * Get phrases for given file + * + * @return array + */ + public function getPhrases() + { + return $this->_phrases; + } + + /** + * Parse given files for phrase + * + * @param string $file + * @return void + */ + public function parse($file) + { + $this->_phrases = []; + $this->_file = $file; + $this->_tokenizer->parse($file); + while (!$this->_tokenizer->isEndOfLoop()) { + $this->_extractPhrases(); + } + } + + /** + * Extract phrases from given tokens. e.g.: __('phrase', ...) + * + * @return void + */ + protected function _extractPhrases() + { + if ($firstToken = $this->_tokenizer->getNextRealToken()) { + if (!$this->extractMethodPhrase($firstToken) && $this->includeObjects) { + $this->extractObjectPhrase($firstToken); + } + } + } + + /** + * @param Token $firstToken + * @return bool + */ + protected function extractMethodPhrase(Token $firstToken) + { + if ($firstToken->isEqualFunction('__')) { + $secondToken = $this->_tokenizer->getNextRealToken(); + if ($secondToken && $secondToken->isOpenBrace()) { + $arguments = $this->_tokenizer->getFunctionArgumentsTokens(); + $phrase = $this->_collectPhrase(array_shift($arguments)); + if (null !== $phrase) { + $this->_addPhrase($phrase, count($arguments), $this->_file, $firstToken->getLine()); + return true; + } + } + } + return false; + } + + /** + * @param Token $firstToken + * @return bool + */ + protected function extractObjectPhrase(Token $firstToken) + { + if ($firstToken->isNew() && $this->_tokenizer->isMatchingClass($this->className)) { + $arguments = $this->_tokenizer->getFunctionArgumentsTokens(); + $phrase = $this->_collectPhrase(array_shift($arguments)); + if (null !== $phrase) { + $this->_addPhrase($phrase, count($arguments), $this->_file, $firstToken->getLine()); + return true; + } + } + return false; + } + + /** + * Collect all phrase parts into string. Return null if phrase is a variable + * + * @param array $phraseTokens + * @return string|null + */ + protected function _collectPhrase($phraseTokens) + { + $phrase = []; + if ($phraseTokens) { + /** @var \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token $phraseToken */ + foreach ($phraseTokens as $phraseToken) { + if ($phraseToken->isConstantEncapsedString() || $phraseToken->isConcatenateOperator()) { + $phrase[] = $phraseToken->getValue(); + } + } + if ($phrase) { + return implode(' ', $phrase); + } + } + return null; + } + + /** + * Add phrase + * + * @param string $phrase + * @param int $argumentsAmount + * @param \SplFileInfo $file + * @param int $line + * @return void + */ + protected function _addPhrase($phrase, $argumentsAmount, $file, $line) + { + $this->_phrases[] = [ + 'phrase' => $phrase, + 'arguments' => $argumentsAmount, + 'file' => $file, + 'line' => $line, + ]; + } + + /** + * @param bool $includeObjects + * @return $this + */ + public function setIncludeObjects($includeObjects = true) + { + $this->includeObjects = (bool)$includeObjects; + return $this; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Token.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Token.php new file mode 100644 index 0000000..b51c4ca --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Token.php @@ -0,0 +1,209 @@ +_name = $name; + $this->_value = $value; + $this->_line = $line; + } + + /** + * Get token name + * + * @return int|string + */ + public function getName() + { + return $this->_name; + } + + /** + * Get token value + * + * @return int|string + */ + public function getValue() + { + return $this->_value; + } + + /** + * Get line of token beginning + * + * @return int + */ + public function getLine() + { + return $this->_line; + } + + /** + * Is "new" operator + * + * @return bool + */ + public function isNew() + { + return $this->getName() == T_NEW; + } + + /** + * Check if a token has a Qualified Name type, which was introduced in PHP 8. + * + * @return bool + */ + public function isFullQualifiedName(): bool + { + return $this->getName() === T_NAME_FULLY_QUALIFIED; + } + + /** + * Whenever token is equal function + * + * @param string $functionName + * @return bool + */ + public function isEqualFunction($functionName) + { + return $this->getName() == T_STRING && $this->getValue() == $functionName; + } + + /** + * Is object operator + * + * @return bool + */ + public function isObjectOperator() + { + return $this->getName() == T_OBJECT_OPERATOR; + } + + /** + * Is whitespace + * + * @return bool + */ + public function isWhitespace() + { + return $this->getName() == T_WHITESPACE; + } + + /** + * Is constant encapsed string + * + * @return bool + */ + public function isConstantEncapsedString() + { + return $this->getName() == T_CONSTANT_ENCAPSED_STRING; + } + + /** + * Is open brace + * + * @return bool + */ + public function isOpenBrace() + { + return $this->getValue() == '('; + } + + /** + * Is close brace + * + * @return bool + */ + public function isCloseBrace() + { + return $this->getValue() == ')'; + } + + /** + * Is comma + * + * @return bool + */ + public function isComma() + { + return $this->getValue() == ','; + } + + /** + * Is semicolon + * + * @return bool + */ + public function isSemicolon() + { + return $this->getValue() == ';'; + } + + /** + * Checks value if this is concatenation operator + * + * @return bool + */ + public function isConcatenateOperator() + { + return $this->getValue() == '.'; + } + + /** + * Is namespace separator + * + * @return bool + */ + public function isNamespaceSeparator() + { + return $this->getName() == T_NS_SEPARATOR; + } + + /** + * Is identifier + * + * @return bool + */ + public function isIdentifier() + { + return $this->getName() == T_STRING; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Translate/MethodCollector.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Translate/MethodCollector.php new file mode 100644 index 0000000..1ee5e5b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Translate/MethodCollector.php @@ -0,0 +1,44 @@ +_tokenizer->getNextRealToken(); + if ($token && $token->isObjectOperator()) { + $phraseStartToken = $this->_tokenizer->getNextRealToken(); + if ($phraseStartToken && $this->_isTranslateFunction($phraseStartToken)) { + $arguments = $this->_tokenizer->getFunctionArgumentsTokens(); + $phrase = $this->_collectPhrase(array_shift($arguments)); + $this->_addPhrase($phrase, count($arguments), $this->_file, $phraseStartToken->getLine()); + } + } + } + + /** + * Check if token is translated function + * + * @param \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token $token + * @return bool + */ + protected function _isTranslateFunction($token) + { + $nextToken = $this->_tokenizer->getNextRealToken(); + return $nextToken && $token->isEqualFunction('__') && $nextToken->isOpenBrace(); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Xml.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Xml.php new file mode 100644 index 0000000..dd87fa4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Xml.php @@ -0,0 +1,81 @@ +_getNodes($this->_file) as $element) { + if (!$element instanceof \SimpleXMLElement) { + continue; + } + $attributes = $element->attributes(); + if ((string)$attributes['translate'] === 'true' || (string)$attributes['translatable'] === 'true') { + $this->_addPhrase((string)$element); + } else { + $this->parseTranslatableNodes($attributes, $element); + } + } + } + + /** + * Get nodes with translation + * + * @param string $file + * @return array + */ + protected function _getNodes($file) + { + libxml_use_internal_errors(true); + $xml = simplexml_load_file($file); + libxml_use_internal_errors(false); + if ($xml) { + $nodes = $xml->xpath('//*[@translate|@translatable]'); + unset($xml); + + return is_array($nodes) ? $nodes : []; + } + + return []; + } + + /** + * Parse nodes pointed out in attribute "translate" and add phrases from them. + * + * @param \SimpleXMLElement $attributes + * @param \SimpleXMLElement $element + * @return void + */ + private function parseTranslatableNodes(\SimpleXMLElement $attributes, \SimpleXMLElement $element) + { + $nodesDelimiter = strpos($attributes['translate'], ' ') === false ? ',' : ' '; + foreach (explode($nodesDelimiter, $attributes['translate']) as $value) { + $phrase = trim((string)$element->{$value}); + if ($phrase) { + $this->_addPhrase($phrase); + } + $elementAttributes = $element->attributes(); + if (isset($elementAttributes[$value])) { + $phrase = (string)$elementAttributes[$value]; + if ($phrase) { + $this->_addPhrase($phrase); + } + } + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/AdapterInterface.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/AdapterInterface.php new file mode 100644 index 0000000..974e2c2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/AdapterInterface.php @@ -0,0 +1,27 @@ +_context = $context; + + parent::__construct($filesCollector, $factory); + } + + /** + * Parse one type + * + * @param array $options + * @return void + */ + protected function _parseByTypeOptions($options) + { + foreach ($this->_getFiles($options) as $file) { + $adapter = $this->_adapters[$options['type']]; + $adapter->parse($file); + + list($contextType, $contextValue) = $this->_context->getContextByPath($file); + + foreach ($adapter->getPhrases() as $phraseData) { + $this->_addPhrase($phraseData, $contextType, $contextValue); + } + } + } + + /** + * Add phrase with context + * + * @param array $phraseData + * @param string $contextType + * @param string $contextValue + * @return void + */ + protected function _addPhrase($phraseData, $contextType, $contextValue) + { + $phraseKey = $contextType . $contextValue. stripslashes($phraseData['phrase']); + + if (isset($this->_phrases[$phraseKey])) { + /** @var \Magento\Setup\Module\I18n\Dictionary\Phrase $phrase */ + $phrase = $this->_phrases[$phraseKey]; + $phrase->addContextValue($contextValue); + } else { + $this->_phrases[$phraseKey] = $this->_factory->createPhrase( + [ + 'phrase' => $phraseData['phrase'], + 'translation' => $phraseData['phrase'], + 'context_type' => $contextType, + 'context_value' => [$contextValue], + 'quote' => $phraseData['quote'], + ] + ); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/Parser/Parser.php b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Parser.php new file mode 100644 index 0000000..a6c65cd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/Parser/Parser.php @@ -0,0 +1,54 @@ +_getFiles($options) as $file) { + $adapter = $this->_adapters[$options['type']]; + $adapter->parse($file); + + foreach ($adapter->getPhrases() as $phraseData) { + $this->_addPhrase($phraseData); + } + } + } + + /** + * Add phrase + * + * @param array $phraseData + * @return void + */ + protected function _addPhrase($phraseData) + { + try { + $phrase = $this->_factory->createPhrase([ + 'phrase' => $phraseData['phrase'], + 'translation' => $phraseData['phrase'], + 'quote' => $phraseData['quote'], + ]); + $this->_phrases[$phrase->getCompiledPhrase()] = $phrase; + } catch (\DomainException $e) { + throw new \DomainException( + "{$e->getMessage()} in {$phraseData['file']}:{$phraseData['line']}", + $e->getCode(), + $e + ); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/I18n/ParserInterface.php b/magento/setup/src/Magento/Setup/Module/I18n/ParserInterface.php new file mode 100644 index 0000000..57f1e22 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/I18n/ParserInterface.php @@ -0,0 +1,27 @@ + new Parser\Adapter\Php($phraseCollector), + 'html' => new Parser\Adapter\Html(), + 'js' => new Parser\Adapter\Js(), + 'xml' => new Parser\Adapter\Xml(), + ]; + + $parser = new Parser\Parser($filesCollector, self::_getFactory()); + $parserContextual = new Parser\Contextual($filesCollector, self::_getFactory(), self::_getContext()); + foreach ($adapters as $type => $adapter) { + $parser->addAdapter($type, $adapter); + $parserContextual->addAdapter($type, $adapter); + } + + self::$_dictionaryGenerator = new Dictionary\Generator( + $parser, + $parserContextual, + self::_getFactory(), + new Dictionary\Options\ResolverFactory() + ); + } + return self::$_dictionaryGenerator; + } + + /** + * Get pack generator + * + * @return \Magento\Setup\Module\I18n\Pack\Generator + */ + public static function getPackGenerator() + { + if (null === self::$_packGenerator) { + $dictionaryLoader = new Dictionary\Loader\File\Csv(self::_getFactory()); + $packWriter = new Pack\Writer\File\Csv(self::_getContext(), $dictionaryLoader, self::_getFactory()); + + self::$_packGenerator = new Pack\Generator($dictionaryLoader, $packWriter, self::_getFactory()); + } + return self::$_packGenerator; + } + + /** + * Get factory + * + * @return \Magento\Setup\Module\I18n\Factory + */ + private static function _getFactory() + { + if (null === self::$_factory) { + self::$_factory = new \Magento\Setup\Module\I18n\Factory(); + } + return self::$_factory; + } + + /** + * Get context + * + * @return \Magento\Setup\Module\I18n\Context + */ + private static function _getContext() + { + if (null === self::$_context) { + self::$_context = new Context(new ComponentRegistrar()); + } + return self::$_context; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/ResourceFactory.php b/magento/setup/src/Magento/Setup/Module/ResourceFactory.php new file mode 100644 index 0000000..0948542 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/ResourceFactory.php @@ -0,0 +1,51 @@ +serviceLocator = $serviceLocator; + } + + /** + * Create object + * + * @param DeploymentConfig $deploymentConfig + * @return ResourceConnection + */ + public function create(DeploymentConfig $deploymentConfig) + { + $connectionFactory = $this->serviceLocator->get(ConnectionFactory::class); + $resource = new ResourceConnection( + new ResourceConfig(), + $connectionFactory, + $deploymentConfig + ); + + return $resource; + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Setup.php b/magento/setup/src/Magento/Setup/Module/Setup.php new file mode 100644 index 0000000..5c5d9a6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Setup.php @@ -0,0 +1,58 @@ +getConnection($connectionName)->getIndexName($this->getTable($tableName), $fields, $indexType); + } + + /** + * Retrieve 32bit UNIQUE HASH for a Table foreign key + * + * @param string $priTableName the target table name + * @param string $priColumnName the target table column name + * @param string $refTableName the reference table name + * @param string $refColumnName the reference table column name + * @param string $connectionName + * @return string + */ + public function getFkName( + $priTableName, + $priColumnName, + $refTableName, + $refColumnName, + $connectionName = ResourceConnection::DEFAULT_CONNECTION + ) { + return $this->getConnection($connectionName)->getForeignKeyName( + $this->getTable($priTableName), + $priColumnName, + $refTableName, + $refColumnName + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Module/Setup/ResourceConfig.php b/magento/setup/src/Magento/Setup/Module/Setup/ResourceConfig.php new file mode 100644 index 0000000..7645045 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/Setup/ResourceConfig.php @@ -0,0 +1,20 @@ +data[$table][$parentId][$rowId] = $value; + } + + /** + * @inheritdoc + */ + public function setField($table, $parentId, $rowId, $field, $value) + { + $this->data[$table][$parentId][$rowId][$field] = $value; + } + + /** + * @inheritdoc + */ + public function get($table, $parentId, $rowId, $field = null) + { + if (null === $field) { + return $this->data[$table][$parentId][$rowId] ?? false; + } else { + return $this->data[$table][$parentId][$rowId][$field] ?? false; + } + } + + /** + * @inheritdoc + */ + public function remove($table, $parentId, $rowId) + { + if (isset($this->data[$table][$parentId][$rowId])) { + unset($this->data[$table][$parentId][$rowId]); + } + } + + /** + * @inheritdoc + */ + public function has($table, $parentId, $rowId, $field = null) + { + if (null === $field) { + return !empty($this->data[$table][$parentId][$rowId]); + } else { + return !empty($this->data[$table][$parentId][$rowId][$field]); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Module/SetupFactory.php b/magento/setup/src/Magento/Setup/Module/SetupFactory.php new file mode 100644 index 0000000..6f1063a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Module/SetupFactory.php @@ -0,0 +1,47 @@ +objectManagerProvider = $objectManagerProvider; + } + + /** + * Creates setup + * + * @param ResourceConnection $appResource + * @return Setup + */ + public function create(ResourceConnection $appResource = null) + { + $objectManager = $this->objectManagerProvider->get(); + if ($appResource === null) { + $appResource = $objectManager->get(\Magento\Framework\App\ResourceConnection::class); + } + return new Setup($appResource); + } +} diff --git a/magento/setup/src/Magento/Setup/Mvc/Bootstrap/InitParamListener.php b/magento/setup/src/Magento/Setup/Mvc/Bootstrap/InitParamListener.php new file mode 100644 index 0000000..6bd8017 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Mvc/Bootstrap/InitParamListener.php @@ -0,0 +1,199 @@ +getSharedManager(); + $sharedEvents->attach( + Application::class, + MvcEvent::EVENT_BOOTSTRAP, + [$this, 'onBootstrap'], + $priority + ); + + $this->listeners = $sharedEvents->getListeners([Application::class], MvcEvent::EVENT_BOOTSTRAP); + } + + /** + * @inheritdoc + * + * @param EventManagerInterface $events + * @return void + */ + public function detach(EventManagerInterface $events) + { + foreach ($this->listeners as $index => $listener) { + $events->detach($listener); + unset($this->listeners[$index]); + } + } + + /** + * An event subscriber that initializes DirectoryList and Filesystem objects in ZF application bootstrap + * + * @param MvcEvent $e + * @return void + */ + public function onBootstrap(MvcEvent $e) + { + /** @var Application $application */ + $application = $e->getApplication(); + $initParams = $application->getServiceManager()->get(self::BOOTSTRAP_PARAM); + $directoryList = $this->createDirectoryList($initParams); + $serviceManager = $application->getServiceManager(); + $serviceManager->setService(\Magento\Framework\App\Filesystem\DirectoryList::class, $directoryList); + $serviceManager->setService(\Magento\Framework\Filesystem::class, $this->createFilesystem($directoryList)); + } + + /** + * Create service. Proxy to the __invoke method + * + * @deprecared use the __invoke method instead + * + * @param ServiceLocatorInterface $serviceLocator + * @return array + * @throws \Interop\Container\Exception\ContainerException + */ + public function createService(ServiceLocatorInterface $serviceLocator) + { + return $this($serviceLocator, 'Application'); + } + + /** + * @inheritdoc + */ + public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + { + return $this->extractInitParameters($container->get('Application')); + } + + /** + * Collects init params configuration from multiple sources + * + * Each next step overwrites previous, whenever data is available, in the following order: + * 1: ZF application config + * 2: environment + * 3: CLI parameters (if the application is running in CLI mode) + * + * @param Application $application + * @return array + */ + private function extractInitParameters(Application $application) + { + $result = []; + $config = $application->getConfig(); + if (isset($config[self::BOOTSTRAP_PARAM])) { + $result = $config[self::BOOTSTRAP_PARAM]; + } + foreach ([State::PARAM_MODE, AppBootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] as $initKey) { + if (isset($_SERVER[$initKey])) { + $result[$initKey] = $_SERVER[$initKey]; + } + } + + if (!isset($result['argv']) || !is_array($result['argv'])) { + return $result; + } + + return array_replace_recursive($result, $this->extractFromCli($result['argv'])); + } + + /** + * Extracts the directory paths from a CLI request + * + * Uses format of a URL query + * + * @param array $argv + * @return array + */ + private function extractFromCli(array $argv): array + { + $bootstrapParam = new ComplexParameter(self::BOOTSTRAP_PARAM); + foreach ($argv as $paramStr) { + $result = $bootstrapParam->getFromString($paramStr); + if (!empty($result)) { + return $result; + } + } + return []; + } + + /** + * Initializes DirectoryList service + * + * @param array $initParams + * @return DirectoryList + * @throws \LogicException + */ + public function createDirectoryList($initParams) + { + if (!isset($initParams[AppBootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS][DirectoryList::ROOT])) { + throw new \LogicException('Magento root directory is not specified.'); + } + $config = $initParams[AppBootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS]; + $rootDir = $config[DirectoryList::ROOT][DirectoryList::PATH]; + return new DirectoryList($rootDir, $config); + } + + /** + * Initializes Filesystem service + * + * @param DirectoryList $directoryList + * @return Filesystem + */ + public function createFilesystem(DirectoryList $directoryList) + { + $driverPool = new Filesystem\DriverPool(); + return new Filesystem( + $directoryList, + new Filesystem\Directory\ReadFactory($driverPool), + new Filesystem\Directory\WriteFactory($driverPool) + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Mvc/View/Http/InjectTemplateListener.php b/magento/setup/src/Magento/Setup/Mvc/View/Http/InjectTemplateListener.php new file mode 100644 index 0000000..537acc9 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Mvc/View/Http/InjectTemplateListener.php @@ -0,0 +1,70 @@ +getRouteMatch()->setParam('action', null); + parent::injectTemplate($e); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/AdminUserCreateCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/AdminUserCreateCommandTest.php new file mode 100644 index 0000000..44d53f5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/AdminUserCreateCommandTest.php @@ -0,0 +1,226 @@ +installerFactoryMock = $this->createMock(InstallerFactory::class); + $this->command = new AdminUserCreateCommand($this->installerFactoryMock, new UserValidationRules()); + + $this->questionHelperMock = $this->getMockBuilder(QuestionHelper::class) + ->setMethods(['ask']) + ->getMock(); + } + + /** + * @return void + */ + public function testExecute(): void + { + $options = [ + '--' . AdminAccount::KEY_USER => 'user', + '--' . AdminAccount::KEY_PASSWORD => '123123q', + '--' . AdminAccount::KEY_EMAIL => 'test@test.com', + '--' . AdminAccount::KEY_FIRST_NAME => 'John', + '--' . AdminAccount::KEY_LAST_NAME => 'Doe' + ]; + $data = [ + AdminAccount::KEY_USER => 'user', + AdminAccount::KEY_PASSWORD => '123123q', + AdminAccount::KEY_EMAIL => 'test@test.com', + AdminAccount::KEY_FIRST_NAME => 'John', + AdminAccount::KEY_LAST_NAME => 'Doe', + InitParamListener::BOOTSTRAP_PARAM => null + ]; + $commandTester = new CommandTester($this->command); + $installerMock = $this->createMock(Installer::class); + $installerMock->expects($this->once())->method('installAdminUser')->with($data); + $this->installerFactoryMock->expects($this->once())->method('create')->willReturn($installerMock); + $commandTester->execute($options, ['interactive' => false]); + $this->assertEquals('Created Magento administrator user named user' . PHP_EOL, $commandTester->getDisplay()); + } + + /** + * @return void + */ + public function testInteraction(): void + { + $application = new Application(); + $application->add($this->command); + + $this->questionHelperMock + ->method('ask') + ->willReturnOnConsecutiveCalls('admin', 'Password123', 'john.doe@example.com', 'John', 'Doe'); + + // We override the standard helper with our mock + $this->command->getHelperSet()->set($this->questionHelperMock, 'question'); + + $installerMock = $this->createMock(Installer::class); + + $expectedData = [ + 'admin-user' => 'admin', + 'admin-password' => 'Password123', + 'admin-email' => 'john.doe@example.com', + 'admin-firstname' => 'John', + 'admin-lastname' => 'Doe', + 'magento-init-params' => null, + 'help' => false, + 'quiet' => false, + 'verbose' => false, + 'version' => false, + 'ansi' => false, + 'no-ansi' => false, + 'no-interaction' => false + ]; + + $installerMock->expects($this->once())->method('installAdminUser')->with($expectedData); + $this->installerFactoryMock->expects($this->once())->method('create')->willReturn($installerMock); + + $commandTester = new CommandTester($this->command); + $commandTester->execute([ + 'command' => $this->command->getName(), + ]); + + $this->assertEquals( + 'Created Magento administrator user named admin' . PHP_EOL, + $commandTester->getDisplay() + ); + } + + /** + * @param int $mode + * @param string $description + * + * @return void + * @dataProvider getOptionListDataProvider + */ + public function testGetOptionsList($mode, $description): void + { + /* @var $argsList \Symfony\Component\Console\Input\InputArgument[] */ + $argsList = $this->command->getOptionsList($mode); + $this->assertEquals(AdminAccount::KEY_EMAIL, $argsList[2]->getName()); + $this->assertEquals($description, $argsList[2]->getDescription()); + } + + /** + * @return array + */ + public function getOptionListDataProvider(): array + { + return [ + [ + 'mode' => InputOption::VALUE_REQUIRED, + 'description' => '(Required) Admin email' + ], + [ + 'mode' => InputOption::VALUE_OPTIONAL, + 'description' => 'Admin email' + ] + ]; + } + + /** + * @param bool[] $options + * @param string[] $errors + * + * @dataProvider validateDataProvider + */ + public function testValidate(array $options, array $errors): void + { + $inputMock = $this->getMockForAbstractClass( + InputInterface::class, + [], + '', + false + ); + $inputMock + ->method('getOption') + ->willReturnOnConsecutiveCalls(...$options); + + $this->assertEquals($errors, $this->command->validate($inputMock)); + } + + /** + * @return array + */ + public function validateDataProvider(): array + { + return [ + [ + [null, 'Doe', 'admin', 'test@test.com', '123123q', '123123q'], + ['"First Name" is required. Enter and try again.'] + ], + [ + ['John', null, null, 'test@test.com', '123123q', '123123q'], + ['"User Name" is required. Enter and try again.', '"Last Name" is required. Enter and try again.'], + ], + [['John', 'Doe', 'admin', null, '123123q', '123123q'], ['Please enter a valid email.']], + [ + ['John', 'Doe', 'admin', 'test', '123123q', '123123q'], + ["'test' is not a valid email address in the basic format local-part@hostname"] + ], + [ + ['John', 'Doe', 'admin', 'test@test.com', '', ''], + [ + 'Password is required field.', + 'Your password must be at least 7 characters.', + 'Your password must include both numeric and alphabetic characters.' + ] + ], + [ + ['John', 'Doe', 'admin', 'test@test.com', '123123', '123123'], + [ + 'Your password must be at least 7 characters.', + 'Your password must include both numeric and alphabetic characters.' + ] + ], + [ + ['John', 'Doe', 'admin', 'test@test.com', '1231231', '1231231'], + ['Your password must include both numeric and alphabetic characters.'] + ], + [['John', 'Doe', 'admin', 'test@test.com', '123123q', '123123q'], []], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php new file mode 100644 index 0000000..9415b16 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php @@ -0,0 +1,151 @@ +createMock(MaintenanceMode::class); + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $this->objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManagerProvider->expects($this->any())->method('get')->willReturn($this->objectManager); + $this->backupRollback = $this->createMock(BackupRollback::class); + $this->backupRollbackFactory = $this->createMock(BackupRollbackFactory::class); + $this->backupRollbackFactory->expects($this->any()) + ->method('create') + ->willReturn($this->backupRollback); + $this->deploymentConfig = $this->createMock(DeploymentConfig::class); + $appState = $this->createMock(State::class); + $configLoader = $this->getMockForAbstractClass( + ConfigLoaderInterface::class, + [], + '', + false + ); + $configLoader->expects($this->any())->method('load')->willReturn([]); + + $this->objectManager->expects($this->any()) + ->method('get') + ->willReturnMap( + [ + [BackupRollbackFactory::class, $this->backupRollbackFactory], + [State::class, $appState], + [ConfigLoaderInterface::class, $configLoader], + ] + ); + $command = new BackupCommand( + $objectManagerProvider, + $maintenanceMode, + $this->deploymentConfig, + new MaintenanceModeEnabler($maintenanceMode) + ); + $this->tester = new CommandTester($command); + } + + public function testExecuteCodeBackup() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->backupRollback->expects($this->once()) + ->method('codeBackup') + ->willReturn($this->backupRollback); + $this->tester->execute(['--code' => true]); + } + + public function testExecuteMediaBackup() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->backupRollback->expects($this->once()) + ->method('codeBackup') + ->willReturn($this->backupRollback); + $this->tester->execute(['--media' => true]); + } + + public function testExecuteDBBackup() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->backupRollback->expects($this->once()) + ->method('dbBackup') + ->willReturn($this->backupRollback); + $this->tester->execute(['--db' => true]); + } + + public function testExecuteNotInstalled() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(false); + $this->tester->execute(['--db' => true]); + $this->assertStringMatchesFormat( + 'No information is available: the Magento application is not installed.%w', + $this->tester->getDisplay() + ); + } + + public function testExecuteNoOptions() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(false); + $this->tester->execute([]); + $expected = 'Enabling maintenance mode' . PHP_EOL + . 'Not enough information provided to take backup.' . PHP_EOL + . 'Disabling maintenance mode' . PHP_EOL; + $this->assertSame($expected, $this->tester->getDisplay()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ConfigSetCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ConfigSetCommandTest.php new file mode 100644 index 0000000..101f049 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ConfigSetCommandTest.php @@ -0,0 +1,134 @@ +createMock(TextConfigOption::class); + $option + ->expects($this->any()) + ->method('getName') + ->willReturn('db-host'); + $this->configModel = $this->createMock(ConfigModel::class); + $this->configModel + ->expects($this->exactly(2)) + ->method('getAvailableOptions') + ->willReturn([$option]); + $moduleList = $this->createMock(ModuleList::class); + $this->deploymentConfig = $this->createMock(DeploymentConfig::class); + $this->command = new ConfigSetCommand($this->configModel, $moduleList, $this->deploymentConfig); + } + + public function testExecuteNoInteractive() + { + $this->deploymentConfig + ->expects($this->once()) + ->method('get') + ->willReturn(null); + $this->configModel + ->expects($this->once()) + ->method('process') + ->with(['db-host' => 'host']); + $commandTester = new CommandTester($this->command); + $commandTester->execute(['--db-host' => 'host']); + $this->assertSame( + 'You saved the new configuration.' . PHP_EOL, + $commandTester->getDisplay() + ); + } + + public function testExecuteInteractiveWithYes() + { + $this->deploymentConfig + ->expects($this->once()) + ->method('get') + ->willReturn('localhost'); + $this->configModel + ->expects($this->once()) + ->method('process') + ->with(['db-host' => 'host']); + $this->checkInteraction('Y'); + } + + public function testExecuteInteractiveWithNo() + { + $this->deploymentConfig + ->expects($this->once()) + ->method('get') + ->willReturn('localhost'); + $this->configModel + ->expects($this->once()) + ->method('process') + ->with([]); + $this->checkInteraction('n'); + } + + /** + * Checks interaction with users on CLI + * + * @param string $interactionType + * @return void + */ + private function checkInteraction($interactionType) + { + $dialog = $this->createMock(QuestionHelper::class); + $dialog + ->expects($this->once()) + ->method('ask') + ->willReturn($interactionType); + + /** @var HelperSet|MockObject $helperSet */ + $helperSet = $this->createMock(HelperSet::class); + $helperSet + ->expects($this->once()) + ->method('get') + ->with('question') + ->willReturn($dialog); + $this->command->setHelperSet($helperSet); + + $commandTester = new CommandTester($this->command); + $commandTester->execute(['--db-host' => 'host']); + if (strtolower($interactionType) === 'y') { + $message = 'You saved the new configuration.' . PHP_EOL; + } else { + $message = 'You made no changes to the configuration.' . PHP_EOL; + } + $this->assertSame( + $message, + $commandTester->getDisplay() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbDataUpgradeCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbDataUpgradeCommandTest.php new file mode 100644 index 0000000..7cd696c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbDataUpgradeCommandTest.php @@ -0,0 +1,63 @@ +installerFactory = $this->createMock(InstallerFactory::class); + $this->deploymentConfig = $this->createMock(DeploymentConfig::class); + } + + public function testExecute() + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(true); + $installer = $this->createMock(Installer::class); + $this->installerFactory->expects($this->once())->method('create')->willReturn($installer); + $installer->expects($this->once())->method('installDataFixtures'); + + $commandTester = new CommandTester( + new DbDataUpgradeCommand($this->installerFactory, $this->deploymentConfig) + ); + $commandTester->execute([]); + } + + public function testExecuteNoConfig() + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(false); + $this->installerFactory->expects($this->never())->method('create'); + + $commandTester = new CommandTester( + new DbDataUpgradeCommand($this->installerFactory, $this->deploymentConfig) + ); + $commandTester->execute([]); + $this->assertStringMatchesFormat( + 'No information is available: the Magento application is not installed.%w', + $commandTester->getDisplay() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbSchemaUpgradeCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbSchemaUpgradeCommandTest.php new file mode 100644 index 0000000..7240bb6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbSchemaUpgradeCommandTest.php @@ -0,0 +1,90 @@ +installerFactory = $this->createMock(InstallerFactory::class); + $this->deploymentConfig = $this->createMock(DeploymentConfig::class); + } + + /** + * @dataProvider executeDataProvider + * @param $options + * @param $expectedOptions + */ + public function testExecute($options, $expectedOptions) + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(true); + $installer = $this->createMock(Installer::class); + $this->installerFactory->expects($this->once())->method('create')->willReturn($installer); + $installer + ->expects($this->once()) + ->method('installSchema') + ->with($expectedOptions); + + $commandTester = new CommandTester( + new DbSchemaUpgradeCommand($this->installerFactory, $this->deploymentConfig) + ); + $commandTester->execute($options); + } + + /** + * @return array + */ + public function executeDataProvider() + { + return [ + [ + 'options' => [ + '--magento-init-params' => '', + '--convert-old-scripts' => false + ], + 'expectedOptions' => [ + 'convert-old-scripts' => false, + 'magento-init-params' => '', + ] + ], + ]; + } + + public function testExecuteNoConfig() + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(false); + $this->installerFactory->expects($this->never())->method('create'); + + $commandTester = new CommandTester( + new DbSchemaUpgradeCommand($this->installerFactory, $this->deploymentConfig) + ); + $commandTester->execute([]); + $this->assertStringMatchesFormat( + 'No information is available: the Magento application is not installed.%w', + $commandTester->getDisplay() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbStatusCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbStatusCommandTest.php new file mode 100644 index 0000000..9031714 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DbStatusCommandTest.php @@ -0,0 +1,125 @@ +dbVersionInfo = $this->getMockBuilder(DbVersionInfo::class) + ->disableOriginalConstructor() + ->getMock(); + /** @var ObjectManagerProvider|Mock $objectManagerProvider */ + $objectManagerProvider = $this->getMockBuilder(ObjectManagerProvider::class) + ->disableOriginalConstructor() + ->getMock(); + /** @var ObjectManagerInterface|Mock $objectManager */ + $objectManager = $this->getMockForAbstractClass(ObjectManagerInterface::class); + $this->deploymentConfig = $this->getMockBuilder(DeploymentConfig::class) + ->disableOriginalConstructor() + ->getMock(); + $this->validators = [ + 'declarative_schema' => $this->getMockBuilder(UpToDateValidatorInterface::class) + ->getMock(), + 'up_to_date_schema' => $this->getMockBuilder(UpToDateValidatorInterface::class) + ->getMock(), + 'up_to_date_data' => $this->getMockBuilder(UpToDateValidatorInterface::class) + ->getMock(), + 'old_validator' => $this->getMockBuilder(UpToDateValidatorInterface::class) + ->getMock(), + ]; + + $objectManagerProvider->expects($this->any()) + ->method('get') + ->willReturn($objectManager); + $objectManager->expects(self::exactly(4)) + ->method('get') + ->willReturnOnConsecutiveCalls( + $this->validators['declarative_schema'], + $this->validators['up_to_date_schema'], + $this->validators['up_to_date_data'], + $this->validators['old_validator'] + ); + $this->command = new DbStatusCommand($objectManagerProvider, $this->deploymentConfig); + } + + public function testExecute() + { + $this->validators['old_validator']->expects(self::once()) + ->method('isUpToDate') + ->willReturn(true); + $this->validators['up_to_date_schema']->expects(self::once()) + ->method('isUpToDate') + ->willReturn(true); + $this->validators['up_to_date_data']->expects(self::once()) + ->method('isUpToDate') + ->willReturn(true); + $this->validators['declarative_schema']->expects(self::once()) + ->method('isUpToDate') + ->willReturn(true); + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $tester = new CommandTester($this->command); + $tester->execute([]); + $this->assertStringMatchesFormat('All modules are up to date.', $tester->getDisplay()); + $this->assertSame(0, $tester->getStatusCode()); + } + + public function testExecuteNotInstalled() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(false); + $tester = new CommandTester($this->command); + $tester->execute([]); + + $this->assertStringMatchesFormat( + 'No information is available: the Magento application is not installed.%w', + $tester->getDisplay() + ); + $this->assertSame(Cli::RETURN_FAILURE, $tester->getStatusCode()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php new file mode 100644 index 0000000..f205f25 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php @@ -0,0 +1,191 @@ +inputValidator = $this->createMock(InputValidator::class); + $this->consoleLoggerFactory = $this->createMock(ConsoleLoggerFactory::class); + $this->logger = $this->createMock(ConsoleLogger::class); + $this->objectManager = $this->getMockForAbstractClass(ObjectManagerInterface::class); + $this->appState = $this->createMock(State::class); + $this->deployService = $this->createMock(DeployStaticContent::class); + + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->method('get')->willReturn($this->objectManager); + + $this->command = (new ObjectManager($this))->getObject(DeployStaticContentCommand::class, [ + 'inputValidator' => $this->inputValidator, + 'consoleLoggerFactory' => $this->consoleLoggerFactory, + 'options' => new DeployStaticOptions(), + 'appState' => $this->appState, + 'objectManagerProvider' => $objectManagerProvider + ]); + } + + /** + * @param array $input + * @see DeployStaticContentCommand::execute() + * @dataProvider executeDataProvider + */ + public function testExecute($input) + { + $this->appState->expects($this->once()) + ->method('getMode') + ->willReturn(State::MODE_PRODUCTION); + + $this->inputValidator->expects($this->once()) + ->method('validate'); + + $this->consoleLoggerFactory->expects($this->once()) + ->method('getLogger')->willReturn($this->logger); + $this->logger->expects($this->exactly(2))->method('notice'); + + $this->objectManager->expects($this->once())->method('create')->willReturn($this->deployService); + $this->deployService->expects($this->once())->method('deploy'); + + $tester = new CommandTester($this->command); + $exitCode = $tester->execute($input); + $this->assertEquals(Cli::RETURN_SUCCESS, $exitCode); + } + + /** + * @return array + */ + public function executeDataProvider() + { + return [ + 'No options' => [ + [] + ], + 'With static content version option' => [ + ['--content-version' => '123456'] + ] + ]; + } + + /** + * @return void + */ + public function testExecuteWithError() + { + $this->appState->expects($this->once()) + ->method('getMode') + ->willReturn(State::MODE_PRODUCTION); + + $this->inputValidator->expects($this->once()) + ->method('validate'); + + $this->consoleLoggerFactory->expects($this->once()) + ->method('getLogger') + ->willReturn($this->logger); + $this->logger->expects($this->once()) + ->method('error'); + + $this->objectManager->expects($this->once()) + ->method('create') + ->willReturn($this->deployService); + $this->deployService->expects($this->once()) + ->method('deploy') + ->willThrowException(new TimeoutException()); + + $tester = new CommandTester($this->command); + $exitCode = $tester->execute([]); + $this->assertEquals(Cli::RETURN_FAILURE, $exitCode); + } + + /** + * @param string $mode + * @return void + * @dataProvider executionInNonProductionModeDataProvider + */ + public function testExecuteInNonProductionMode($mode) + { + $this->expectException('Magento\Framework\Exception\LocalizedException'); + $this->appState->expects($this->any())->method('getMode')->willReturn($mode); + $this->objectManager->expects($this->never())->method('create'); + + $tester = new CommandTester($this->command); + $tester->execute([]); + } + + /** + * @return array + */ + public function executionInNonProductionModeDataProvider() + { + return [ + [State::MODE_DEFAULT], + [State::MODE_DEVELOPER], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php new file mode 100644 index 0000000..8910298 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php @@ -0,0 +1,215 @@ +deploymentConfigMock = $this->createMock(DeploymentConfig::class); + $objectManagerProviderMock = $this->createMock(ObjectManagerProvider::class); + $this->objectManagerMock = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $this->cacheMock = $this->getMockBuilder(Cache::class) + ->disableOriginalConstructor() + ->getMock(); + + $objectManagerProviderMock->expects($this->once()) + ->method('get') + ->willReturn($this->objectManagerMock); + $this->managerMock = $this->createMock(Manager::class); + $this->directoryListMock = + $this->createMock(DirectoryList::class); + $this->directoryListMock->expects($this->any())->method('getPath')->willReturnMap([ + [DirectoryList::SETUP, '/path (1)/to/setup/'], + ]); + + $this->filesystemMock = $this->getMockBuilder(Filesystem::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->fileDriverMock = $this->getMockBuilder(File::class) + ->disableOriginalConstructor() + ->getMock(); + $this->fileDriverMock->method('getParentDirectory')->willReturnMap( + [ + ['/path/to/module/one', '/path/to/module'], + ['/path/to/module', '/path/to'], + ['/path (1)/to/module/two', '/path (1)/to/module'], + ['/path (1)/to/module', '/path (1)/to'], + ] + ); + $this->componentRegistrarMock = $this->createMock(ComponentRegistrar::class); + $this->componentRegistrarMock->expects($this->any())->method('getPaths')->willReturnMap([ + [ComponentRegistrar::MODULE, ['/path/to/module/one', '/path (1)/to/module/two']], + [ComponentRegistrar::LIBRARY, ['/path/to/library/one', '/path (1)/to/library/two']], + ]); + + $this->outputFormatter = new OutputFormatter(); + $this->outputMock = $this->getMockForAbstractClass(OutputInterface::class); + $this->outputMock->method('getFormatter') + ->willReturn($this->outputFormatter); + $this->fileMock = $this->getMockBuilder(Filesystem\Io\File::class) + ->disableOriginalConstructor() + ->getMock(); + $this->fileMock->method('getPathInfo')->willReturnMap( + [ + ['/path/to/module/one', ['basename' => 'one']], + ['/path/to/module', ['basename' => 'module']], + ['/path (1)/to/module/two', ['basename' => 'two']], + ['/path (1)/to/module', ['basename' => 'module']], + ] + ); + + $this->command = new DiCompileCommand( + $this->deploymentConfigMock, + $this->directoryListMock, + $this->managerMock, + $objectManagerProviderMock, + $this->filesystemMock, + $this->fileDriverMock, + $this->componentRegistrarMock, + $this->fileMock + ); + } + + public function testExecuteModulesNotEnabled() + { + $this->deploymentConfigMock->expects($this->once()) + ->method('get') + ->with(ConfigOptionsListConstants::KEY_MODULES) + ->willReturn(null); + $tester = new CommandTester($this->command); + $tester->execute([]); + $this->assertEquals( + 'You cannot run this command because modules are not enabled. You can enable modules by running the ' + . "'module:enable --all' command." . PHP_EOL, + $tester->getDisplay() + ); + } + + public function testExecute() + { + $this->directoryListMock->expects($this->atLeastOnce())->method('getPath')->willReturn(null); + $this->objectManagerMock->expects($this->once()) + ->method('get') + ->with(Cache::class) + ->willReturn($this->cacheMock); + $this->cacheMock->expects($this->once())->method('clean'); + $writeDirectory = $this->getMockForAbstractClass(WriteInterface::class); + $writeDirectory->expects($this->atLeastOnce())->method('delete'); + $this->filesystemMock->expects($this->atLeastOnce())->method('getDirectoryWrite')->willReturn($writeDirectory); + + $this->deploymentConfigMock->expects($this->once()) + ->method('get') + ->with(ConfigOptionsListConstants::KEY_MODULES) + ->willReturn(['Magento_Catalog' => 1]); + $progressBar = new ProgressBar($this->outputMock); + + $this->objectManagerMock->expects($this->once())->method('configure'); + $this->objectManagerMock + ->expects($this->once()) + ->method('create') + ->with(ProgressBar::class) + ->willReturn($progressBar); + + $this->managerMock->expects($this->exactly(9))->method('addOperation') + ->withConsecutive( + [OperationFactory::PROXY_GENERATOR, []], + [OperationFactory::REPOSITORY_GENERATOR, $this->anything()], + [OperationFactory::DATA_ATTRIBUTES_GENERATOR, []], + [OperationFactory::APPLICATION_CODE_GENERATOR, $this->callback(function ($subject) { + $this->assertEmpty(array_diff($subject['excludePatterns'], [ + "#^(?:/path \(1\)/to/setup/)(/[\w]+)*/Test#", + "#^(?:/path/to/library/one|/path \(1\)/to/library/two)/([\w]+/)?Test#", + "#^(?:/path/to/library/one|/path \(1\)/to/library/two)/([\w]+/)?tests#", + "#^(?:/path/to/(?:module/(?:one))|/path \(1\)/to/(?:module/(?:two)))/Test#", + "#^(?:/path/to/(?:module/(?:one))|/path \(1\)/to/(?:module/(?:two)))/tests#" + ])); + return true; + })], + [OperationFactory::INTERCEPTION, $this->anything()], + [OperationFactory::AREA_CONFIG_GENERATOR, $this->anything()], + [OperationFactory::INTERCEPTION_CACHE, $this->anything()], + [OperationFactory::APPLICATION_ACTION_LIST_GENERATOR, $this->anything()], + [OperationFactory::PLUGIN_LIST_GENERATOR, $this->anything()] + ); + + $this->managerMock->expects($this->once())->method('process'); + $tester = new CommandTester($this->command); + $tester->execute([]); + $this->assertContains( + 'Generated code and dependency injection configuration successfully.', + explode(PHP_EOL, $tester->getDisplay()) + ); + $this->assertSame(DiCompileCommand::NAME, $this->command->getName()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/FunctionExistMock.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/FunctionExistMock.php new file mode 100644 index 0000000..601df7f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/FunctionExistMock.php @@ -0,0 +1,17 @@ +fixtureModel = $this->createMock(FixtureModel::class); + $this->command = new GenerateFixturesCommand($this->fixtureModel); + } + + public function testExecute() + { + $this->fixtureModel->expects($this->once())->method('loadConfig')->with('path_to_profile.xml'); + $this->fixtureModel->expects($this->once())->method('initObjectManager'); + $this->fixtureModel->expects($this->once())->method('loadFixtures'); + + $commandTester = new CommandTester($this->command); + $commandTester->execute(['profile' => 'path_to_profile.xml']); + } + + public function testExecuteInvalidLanguageArgument() + { + $this->expectException('RuntimeException'); + $this->expectExceptionMessage('Not enough arguments'); + $commandTester = new CommandTester($this->command); + $commandTester->execute([]); + } + + public function testSkipReindexOption() + { + $this->fixtureModel->expects($this->never())->method('reindex'); + + $commandTester = new CommandTester($this->command); + $commandTester->execute(['profile' => 'path_to_profile.xml', '--skip-reindex' => true]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoAdminUriCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoAdminUriCommandTest.php new file mode 100644 index 0000000..ad0be19 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoAdminUriCommandTest.php @@ -0,0 +1,45 @@ +deploymentConfig = $this->createMock(DeploymentConfig::class); + } + + public function testExecute() + { + $this->deploymentConfig->expects($this->once())->method('get')->willReturn('admin_qw12er'); + + $commandTester = new CommandTester(new InfoAdminUriCommand($this->deploymentConfig)); + $commandTester->execute([]); + + $regexp = '/' . BackendFrontnameGenerator::ADMIN_AREA_PATH_PREFIX + . '[a-z0-9]{1,' . BackendFrontnameGenerator::ADMIN_AREA_PATH_RANDOM_PART_LENGTH . '}/'; + + $this->assertMatchesRegularExpression( + $regexp, + $commandTester->getDisplay(), + 'Unexpected Backend Frontname pattern.' + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoBackupsListCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoBackupsListCommandTest.php new file mode 100644 index 0000000..6cf1bf1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoBackupsListCommandTest.php @@ -0,0 +1,44 @@ +createMock(Table::class); + $table->expects($this->once())->method('setHeaders')->with(['Backup Filename', 'Backup Type']); + $table->expects($this->once())->method('addRow')->with(['backupFile_media.tgz', 'media']); + /** @var \Symfony\Component\Console\Helper\TableFactory|MockObject $helperSet */ + $tableFactoryMock = $this->createMock(\Symfony\Component\Console\Helper\TableFactory::class); + $tableFactoryMock->expects($this->once())->method('create')->willReturn($table); + /** @var DirectoryList + * |\PHPUnit\Framework\MockObject\MockObject $directoryList + */ + $directoryList = $this->createMock(DirectoryList::class); + /** @var File|MockObject $file */ + $file = $this->createMock(File::class); + $file->expects($this->once())->method('isExists')->willReturn(true); + $file->expects($this->once()) + ->method('readDirectoryRecursively') + ->willReturn(['backupFile_media.tgz']); + $command = new InfoBackupsListCommand($directoryList, $file, $tableFactoryMock); + $commandTester = new CommandTester($command); + $commandTester->execute([]); + $expected = 'Showing backup files in '; + $this->assertStringStartsWith($expected, $commandTester->getDisplay()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoCurrencyListCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoCurrencyListCommandTest.php new file mode 100644 index 0000000..4ddaef8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoCurrencyListCommandTest.php @@ -0,0 +1,40 @@ + 'Currency description' + ]; + + $table = $this->createMock(Table::class); + $table->expects($this->once())->method('setHeaders')->with(['Currency', 'Code']); + $table->expects($this->once())->method('addRow')->with(['Currency description', 'CUR']); + + /** @var \Symfony\Component\Console\Helper\TableFactory|MockObject $helperSet */ + $tableFactoryMock = $this->createMock(\Symfony\Component\Console\Helper\TableFactory::class); + $tableFactoryMock->expects($this->once())->method('create')->willReturn($table); + + /** @var Lists|MockObject $list */ + $list = $this->createMock(Lists::class); + $list->expects($this->once())->method('getCurrencyList')->willReturn($currencies); + $command = new InfoCurrencyListCommand($list, $tableFactoryMock); + $commandTester = new CommandTester($command); + $commandTester->execute([]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoLanguageListCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoLanguageListCommandTest.php new file mode 100644 index 0000000..6cfab7d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoLanguageListCommandTest.php @@ -0,0 +1,40 @@ + 'Language description' + ]; + + $table = $this->createMock(Table::class); + $table->expects($this->once())->method('setHeaders')->with(['Language', 'Code']); + $table->expects($this->once())->method('addRow')->with(['Language description', 'LNG']); + + /** @var \Symfony\Component\Console\Helper\TableFactory|MockObject $helperSet */ + $tableFactoryMock = $this->createMock(\Symfony\Component\Console\Helper\TableFactory::class); + $tableFactoryMock->expects($this->once())->method('create')->willReturn($table); + + /** @var Lists|MockObject $list */ + $list = $this->createMock(Lists::class); + $list->expects($this->once())->method('getLocaleList')->willReturn($languages); + $command = new InfoLanguageListCommand($list, $tableFactoryMock); + $commandTester = new CommandTester($command); + $commandTester->execute([]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoTimezoneListCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoTimezoneListCommandTest.php new file mode 100644 index 0000000..36279fc --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InfoTimezoneListCommandTest.php @@ -0,0 +1,40 @@ + 'timezone description' + ]; + + $table = $this->createMock(Table::class); + $table->expects($this->once())->method('setHeaders')->with(['Timezone', 'Code']); + $table->expects($this->once())->method('addRow')->with(['timezone description', 'timezone']); + + /** @var \Symfony\Component\Console\Helper\TableFactory|MockObject $helperSet */ + $tableFactoryMock = $this->createMock(\Symfony\Component\Console\Helper\TableFactory::class); + $tableFactoryMock->expects($this->once())->method('create')->willReturn($table); + + /** @var Lists|MockObject $list */ + $list = $this->createMock(Lists::class); + $list->expects($this->once())->method('getTimezoneList')->willReturn($timezones); + $command = new InfoTimezoneListCommand($list, $tableFactoryMock); + $commandTester = new CommandTester($command); + $commandTester->execute([]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InstallCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InstallCommandTest.php new file mode 100644 index 0000000..6595d7e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InstallCommandTest.php @@ -0,0 +1,379 @@ +input = [ + '--' . SetupConfigOptionsList::INPUT_KEY_DB_HOST => 'localhost', + '--' . SetupConfigOptionsList::INPUT_KEY_DB_NAME => 'magento', + '--' . SetupConfigOptionsList::INPUT_KEY_DB_USER => 'root', + '--' . BackendConfigOptionsList::INPUT_KEY_BACKEND_FRONTNAME => 'admin', + '--' . StoreConfigurationDataMapper::KEY_BASE_URL => 'http://127.0.0.1/magento2ce/', + '--' . StoreConfigurationDataMapper::KEY_LANGUAGE => 'en_US', + '--' . StoreConfigurationDataMapper::KEY_TIMEZONE => 'America/Chicago', + '--' . StoreConfigurationDataMapper::KEY_CURRENCY => 'USD', + ]; + + $configModel = $this->createMock(ConfigModel::class); + $configModel + ->expects($this->exactly(2)) + ->method('getAvailableOptions') + ->willReturn($this->getOptionsListDeployConfig()); + $configModel + ->expects($this->once()) + ->method('validate') + ->willReturn([]); + + $userConfig = $this->createMock(InstallStoreConfigurationCommand::class); + $userConfig + ->expects($this->atLeastOnce()) + ->method('getOptionsList') + ->willReturn($this->getOptionsListUserConfig()); + $userConfig + ->expects($this->once()) + ->method('validate') + ->willReturn([]); + + $this->adminUserMock = $this->createMock(AdminUserCreateCommand::class); + $this->adminUserMock + ->expects($this->atLeastOnce()) + ->method('getOptionsList') + ->willReturn($this->getOptionsListAdminUser()); + + $searchConfigOptionsList = new SearchConfigOptionsList(); + $this->installerFactory = $this->createMock(InstallerFactory::class); + $this->installer = $this->createMock(Installer::class); + $this->applicationMock = $this->getMockBuilder(Application::class) + ->disableOriginalConstructor() + ->getMock(); + $this->helperSetMock = $this->getMockBuilder(HelperSet::class) + ->disableOriginalConstructor() + ->getMock(); + $this->definitionMock = $this->getMockBuilder(InputDefinition::class) + ->disableOriginalConstructor() + ->getMock(); + $this->configImportMock = $this->getMockBuilder(ConfigImportCommand::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->applicationMock->expects($this->any()) + ->method('getHelperSet') + ->willReturn($this->helperSetMock); + $this->applicationMock->expects($this->any()) + ->method('getDefinition') + ->willReturn($this->definitionMock); + $this->definitionMock->expects($this->any()) + ->method('getOptions') + ->willReturn([]); + $this->applicationMock->expects($this->any()) + ->method('find') + ->with(ConfigImportCommand::COMMAND_NAME) + ->willReturn($this->configImportMock); + + $this->questionHelperMock = $this->getMockBuilder(QuestionHelper::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->command = new InstallCommand( + $this->installerFactory, + $configModel, + $userConfig, + $this->adminUserMock, + $searchConfigOptionsList + ); + $this->command->setApplication( + $this->applicationMock + ); + } + + public function testExecute() + { + $this->input['--' . AdminAccount::KEY_USER] = 'user'; + $this->input['--' . AdminAccount::KEY_PASSWORD] = '123123q'; + $this->input['--' . AdminAccount::KEY_EMAIL] = 'test@test.com'; + $this->input['--' . AdminAccount::KEY_FIRST_NAME] = 'John'; + $this->input['--' . AdminAccount::KEY_LAST_NAME] = 'Doe'; + + $this->adminUserMock + ->expects($this->once()) + ->method('validate') + ->willReturn([]); + $this->installerFactory->expects($this->once()) + ->method('create') + ->willReturn($this->installer); + $this->installer->expects($this->once())->method('install'); + $this->configImportMock->expects($this->once()) + ->method('run'); + + $commandTester = new CommandTester($this->command); + $commandTester->execute($this->input); + } + + public function testInteractiveExecute(): void + { + $this->installerFactory + ->expects($this->once()) + ->method('create') + ->willReturn($this->installer); + $this->installer + ->expects($this->once()) + ->method('install'); + $this->questionHelperMock->method('ask'); + $this->helperSetMock + ->method('get') + ->with('question') + ->willReturn($this->questionHelperMock); + $this->command->setHelperSet($this->helperSetMock); + + $commandTester = new CommandTester($this->command); + $commandTester->execute(['--' . InstallCommand::INPUT_KEY_INTERACTIVE_SETUP => true]); + $this->assertEquals(Cli::RETURN_SUCCESS, $commandTester->getStatusCode()); + } + + /** + * Get list of options for deployment configuration + * + * @return array + */ + private function getOptionsListDeployConfig() + { + $option1 = $this->createMock(TextConfigOption::class); + $option1 + ->expects($this->any()) + ->method('getName') + ->willReturn(SetupConfigOptionsList::INPUT_KEY_DB_HOST); + $option2 = $this->createMock(TextConfigOption::class); + $option2 + ->expects($this->any()) + ->method('getName') + ->willReturn(SetupConfigOptionsList::INPUT_KEY_DB_NAME); + $option3 = $this->createMock(TextConfigOption::class); + $option3 + ->expects($this->any()) + ->method('getName') + ->willReturn(SetupConfigOptionsList::INPUT_KEY_DB_USER); + $option4 = $this->createMock(TextConfigOption::class); + $option4 + ->expects($this->any()) + ->method('getName') + ->willReturn(BackendConfigOptionsList::INPUT_KEY_BACKEND_FRONTNAME); + + return [$option1, $option2, $option3, $option4]; + } + + /** + * Get list of options for user configuration + * + * @return array + */ + private function getOptionsListUserConfig() + { + $option1 = $this->createMock(TextConfigOption::class); + $option1 + ->expects($this->any()) + ->method('getName') + ->willReturn(StoreConfigurationDataMapper::KEY_BASE_URL); + $option2 = $this->createMock(TextConfigOption::class); + $option2 + ->expects($this->any()) + ->method('getName') + ->willReturn(StoreConfigurationDataMapper::KEY_LANGUAGE); + $option3 = $this->createMock(TextConfigOption::class); + $option3 + ->expects($this->any()) + ->method('getName') + ->willReturn(StoreConfigurationDataMapper::KEY_TIMEZONE); + $option4 = $this->createMock(TextConfigOption::class); + $option4 + ->expects($this->any()) + ->method('getName') + ->willReturn(StoreConfigurationDataMapper::KEY_CURRENCY); + + return [$option1, $option2, $option3, $option4]; + } + + /** + * Get list of options for admin user + * + * @return array + */ + private function getOptionsListAdminUser() + { + $option1 = $this->createMock(TextConfigOption::class); + $option1 + ->expects($this->any()) + ->method('getName') + ->willReturn(AdminAccount::KEY_USER); + $option2 = $this->createMock(TextConfigOption::class); + $option2 + ->expects($this->any()) + ->method('getName') + ->willReturn(AdminAccount::KEY_PASSWORD); + $option3 = $this->createMock(TextConfigOption::class); + $option3 + ->expects($this->any()) + ->method('getName') + ->willReturn(AdminAccount::KEY_EMAIL); + $option4 = $this->createMock(TextConfigOption::class); + $option4 + ->expects($this->any()) + ->method('getName') + ->willReturn(AdminAccount::KEY_FIRST_NAME); + $option5 = $this->createMock(TextConfigOption::class); + $option5 + ->expects($this->any()) + ->method('getName') + ->willReturn(AdminAccount::KEY_LAST_NAME); + + return [$option1, $option2, $option3, $option4, $option5]; + } + + /** + * Test install command with valid sales_order_increment_prefix value + * + * @dataProvider validateDataProvider + * @param $prefixValue + */ + public function testValidate($prefixValue) + { + $this->adminUserMock + ->expects($this->never()) + ->method('validate'); + $this->installerFactory->expects($this->once()) + ->method('create') + ->willReturn($this->installer); + $this->installer->expects($this->once())->method('install'); + $this->input['--' . InstallCommand::INPUT_KEY_SALES_ORDER_INCREMENT_PREFIX] = $prefixValue; + + $commandTester = new CommandTester($this->command); + $commandTester->execute($this->input); + } + + /** + * Test install command with invalid sales_order_increment_prefix value + * + * @dataProvider validateWithExceptionDataProvider + * @param $prefixValue + */ + public function testValidateWithException($prefixValue) + { + $this->expectException('InvalidArgumentException'); + $this->adminUserMock + ->expects($this->never()) + ->method('validate'); + $this->installerFactory->expects($this->never()) + ->method('create') + ->willReturn($this->installer); + $this->installer->expects($this->never())->method('install'); + $this->input['--' . InstallCommand::INPUT_KEY_SALES_ORDER_INCREMENT_PREFIX] = $prefixValue; + + $commandTester = new CommandTester($this->command); + $commandTester->execute($this->input); + } + + /** + * @return array + */ + public function validateDataProvider() + { + return [ + 'without option' => ['', ''], + 'normal case' => ['abcde', ''], + '20 chars' => ['12345678901234567890', ''], + ]; + } + + /** + * @return array + */ + public function validateWithExceptionDataProvider() + { + return [ + ['123456789012345678901', 'InvalidArgumentException'], + ['abcdefghijk12345678fdgsdfgsdfgsdfsgsdfg90abcdefgdfddgsdfg', 'InvalidArgumentException'], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InstallStoreConfigurationCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InstallStoreConfigurationCommandTest.php new file mode 100644 index 0000000..7e29c1a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/InstallStoreConfigurationCommandTest.php @@ -0,0 +1,213 @@ +urlValidatorMock = $this->createMock(UrlValidator::class); + $this->localeValidatorMock = $this->createMock(LocaleValidator::class); + $this->timezoneValidatorMock = $this->createMock(TimezoneValidator::class); + $this->currencyValidatorMock = $this->createMock(CurrencyValidator::class); + + $this->installerFactory = $this->createMock(InstallerFactory::class); + $this->deploymentConfig = $this->createMock(DeploymentConfig::class); + $this->installer = $this->createMock(Installer::class); + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $this->objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManagerProvider->expects($this->once())->method('get')->willReturn($this->objectManager); + $this->command = new InstallStoreConfigurationCommand( + $this->installerFactory, + $this->deploymentConfig, + $objectManagerProvider, + $this->localeValidatorMock, + $this->timezoneValidatorMock, + $this->currencyValidatorMock, + $this->urlValidatorMock + ); + } + + public function testExecute() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->installer->expects($this->once()) + ->method('installUserConfig'); + $this->installerFactory->expects($this->once()) + ->method('create') + ->willReturn($this->installer); + $tester = new CommandTester($this->command); + $tester->execute([]); + } + + public function testExecuteNotInstalled() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(false); + $this->installerFactory->expects($this->never()) + ->method('create'); + $tester = new CommandTester($this->command); + $tester->execute([]); + $this->assertStringMatchesFormat( + "Store settings can't be saved because the Magento application is not installed.%w", + $tester->getDisplay() + ); + } + + /** + * @dataProvider validateDataProvider + * @param array $option + * @param string $error + */ + public function testExecuteInvalidData(array $option, $error) + { + $this->localeValidatorMock->expects($this->any())->method('isValid')->willReturn(false); + $this->timezoneValidatorMock->expects($this->any())->method('isValid')->willReturn(false); + $this->currencyValidatorMock->expects($this->any())->method('isValid')->willReturn(false); + $this->urlValidatorMock->expects($this->any())->method('isValid')->willReturn(false); + + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->installerFactory->expects($this->never()) + ->method('create'); + $commandTester = new CommandTester($this->command); + $commandTester->execute($option); + $this->assertStringContainsString($error, $commandTester->getDisplay()); + } + + /** + * @return array + */ + public function validateDataProvider() + { + return [ + [ + ['--' . StoreConfigurationDataMapper::KEY_BASE_URL => 'sampleUrl'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_BASE_URL . '\': Invalid URL \'sampleUrl\'.' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_BASE_URL => 'http://example.com_test'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_BASE_URL + . '\': Invalid URL \'http://example.com_test\'.' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_LANGUAGE => 'sampleLanguage'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_LANGUAGE + . '\': Invalid value. To see possible values, run command \'bin/magento info:language:list\'.' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_TIMEZONE => 'sampleTimezone'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_TIMEZONE + . '\': Invalid value. To see possible values, run command \'bin/magento info:timezone:list\'.' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_CURRENCY => 'sampleLanguage'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_CURRENCY + . '\': Invalid value. To see possible values, run command \'bin/magento info:currency:list\'.' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_USE_SEF_URL => 'invalidValue'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_USE_SEF_URL + . '\': Invalid value. Possible values (0|1).' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_IS_SECURE => 'invalidValue'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_IS_SECURE + . '\': Invalid value. Possible values (0|1).' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_BASE_URL_SECURE => 'http://www.sample.com'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_BASE_URL_SECURE + . '\': Invalid URL \'http://www.sample.com\'.' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN => 'invalidValue'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN + . '\': Invalid value. Possible values (0|1).' + ], + [ + ['--' . StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY => 'invalidValue'], + 'Command option \'' . StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY + . '\': Invalid value. Possible values (0|1).' + ], + + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleConfigStatusCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleConfigStatusCommandTest.php new file mode 100644 index 0000000..ab96601 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleConfigStatusCommandTest.php @@ -0,0 +1,97 @@ +createMock(Reader::class); + $configReader->expects($this->once()) + ->method('load') + ->willReturn([ConfigOptionsListConstants::KEY_MODULES => $currentConfig]); + + $installer = $this->createMock(Installer::class); + $installer->expects($this->once()) + ->method('getModulesConfig') + ->willReturn($correctConfig); + + $installerFactory = $this->createMock(InstallerFactory::class); + $installerFactory->expects($this->once()) + ->method('create') + ->willReturn($installer); + + $command = new ModuleConfigStatusCommand($configReader, $installerFactory); + + $tester = new CommandTester($command); + $tester->execute([]); + + $this->assertEquals($expectedOutput, $tester->getDisplay()); + } + + /** + * @return array + */ + public function executeDataProvider() + { + $successMessage = 'The modules configuration is up to date.' . PHP_EOL; + $failureMessage = 'The modules configuration in the \'app/etc/config.php\' ' + . 'file is outdated. Run \'setup:upgrade\' to fix it.' . PHP_EOL; + + return [ + [ + ['Magento_ModuleA' => 1, 'Magento_ModuleB' => 1], + ['Magento_ModuleA' => 1, 'Magento_ModuleB' => 1], + $successMessage, + ], + [ + ['Magento_ModuleA' => 0, 'Magento_ModuleB' => 1], + ['Magento_ModuleA' => 0, 'Magento_ModuleB' => 1], + $successMessage, + ], + [ + ['Magento_ModuleA' => 1, 'Magento_ModuleB' => 1], + ['Magento_ModuleB' => 1, 'Magento_ModuleA' => 1], + $failureMessage, + ], + [ + ['Magento_ModuleA' => 0, 'Magento_ModuleB' => 1], + ['Magento_ModuleB' => 1, 'Magento_ModuleA' => 0], + $failureMessage, + ], + [ + ['Magento_ModuleA' => 1], + ['Magento_ModuleB' => 1, 'Magento_ModuleA' => 1], + $failureMessage, + ], + [ + ['Magento_ModuleA' => 1, 'Magento_ModuleB' => 1], + ['Magento_ModuleB' => 1], + $failureMessage, + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleEnableDisableCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleEnableDisableCommandTest.php new file mode 100644 index 0000000..4f46f68 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleEnableDisableCommandTest.php @@ -0,0 +1,341 @@ +objectManagerProviderMock = $this->createMock(ObjectManagerProvider::class); + $objectManager = $this->getMockForAbstractClass(ObjectManagerInterface::class); + $this->objectManagerProviderMock + ->method('get') + ->willReturn($objectManager); + $this->statusMock = $this->createMock(Status::class); + $this->cacheMock = $this->createMock(Cache::class); + $this->cleanupFilesMock = $this->createMock(CleanupFiles::class); + $this->fullModuleListMock = $this->createMock(FullModuleList::class); + $this->deploymentConfigMock = $this->createMock(DeploymentConfig::class); + $this->generatedFiles = $this->createMock(GeneratedFiles::class); + $objectManager->method('get') + ->willReturnMap( + [ + [Status::class, $this->statusMock], + [Cache::class, $this->cacheMock], + [CleanupFiles::class, $this->cleanupFilesMock], + [FullModuleList::class, $this->fullModuleListMock], + ] + ); + } + + /** + * @param bool $isEnable + * @param bool $clearStaticContent + * @param string $expectedMessage + * + * @dataProvider executeDataProvider + */ + public function testExecute($isEnable, $clearStaticContent, $expectedMessage) + { + $this->statusMock->expects($this->once()) + ->method('getModulesToChange') + ->with($isEnable, ['Magento_Module1', 'Magento_Module2']) + ->willReturn(['Magento_Module1']); + $this->statusMock->expects($this->any()) + ->method('checkConstraints') + ->willReturn([]); + $this->statusMock->expects($this->once()) + ->method('setIsEnabled') + ->with($isEnable, ['Magento_Module1']); + $this->cacheMock->expects($this->once()) + ->method('clean'); + $this->cleanupFilesMock->expects($this->once()) + ->method('clearCodeGeneratedClasses'); + $this->cleanupFilesMock->expects($clearStaticContent ? $this->once() : $this->never()) + ->method('clearMaterializedViewFiles'); + $commandTester = $this->getCommandTester($isEnable); + $input = ['module' => ['Magento_Module1', 'Magento_Module2']]; + if ($clearStaticContent) { + $input['--clear-static-content'] = true; + } + $commandTester->execute($input); + $display = $commandTester->getDisplay(); + $this->assertStringMatchesFormat($expectedMessage, $display); + } + + /** + * @return array + */ + public function executeDataProvider() + { + return [ + 'enable, do not clear static content' => [ + true, + false, + '%amodules have been enabled%aMagento_Module1%a' + . "Info: Some modules might require static view files to be cleared. To do this, run " + . "'module:enable' with the --clear-static-content%a" + ], + 'disable, do not clear static content' => [ + false, + false, + '%amodules have been disabled%aMagento_Module1%a' + . "Info: Some modules might require static view files to be cleared. To do this, run " + . "'module:disable' with the --clear-static-content%a" + ], + 'enable, clear static content' => [ + true, + true, + '%amodules have been enabled%aMagento_Module1%aGenerated static view files cleared%a' + ], + 'disable, clear static content' => [ + false, + true, + '%amodules have been disabled%aMagento_Module1%aGenerated static view files cleared%a' + ] + ]; + } + + public function testExecuteEnableInvalidModule() + { + $this->statusMock->expects($this->once()) + ->method('getModulesToChange') + ->with(true, ['invalid']) + ->willThrowException(new \LogicException('Unknown module(s): invalid')); + $commandTester = $this->getCommandTester(true); + $input = ['module' => ['invalid']]; + $commandTester->execute($input); + $this->assertEquals('Unknown module(s): invalid' . PHP_EOL, $commandTester->getDisplay()); + } + + public function testExecuteDisableInvalidModule() + { + $this->statusMock->expects($this->once()) + ->method('getModulesToChange') + ->with(false, ['invalid']) + ->willThrowException(new \LogicException('Unknown module(s): invalid')); + $commandTester = $this->getCommandTester(false); + $input = ['module' => ['invalid']]; + $commandTester->execute($input); + $this->assertEquals('Unknown module(s): invalid' . PHP_EOL, $commandTester->getDisplay()); + } + + /** + * @param bool $isEnable + * @param string $expectedMessage + * + * @dataProvider executeAllDataProvider + */ + public function testExecuteAll($isEnable, $expectedMessage) + { + $setupUpgradeMessage = 'To make sure that the enabled modules are properly registered, run \'setup:upgrade\'.'; + $this->fullModuleListMock->expects($this->once()) + ->method('getNames') + ->willReturn(['Magento_Module1', 'Magento_Module2']); + $this->statusMock->expects($this->once()) + ->method('getModulesToChange') + ->with($isEnable, ['Magento_Module1', 'Magento_Module2']) + ->willReturn(['Magento_Module1']); + $this->statusMock->expects($this->any()) + ->method('checkConstraints') + ->willReturn([]); + $this->statusMock->expects($this->once()) + ->method('setIsEnabled') + ->with($isEnable, ['Magento_Module1']); + if ($isEnable) { + $this->deploymentConfigMock->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + } else { + $this->deploymentConfigMock->expects($this->never()) + ->method('isAvailable'); + } + $commandTester = $this->getCommandTester($isEnable); + $input = ['--all' => true]; + $commandTester->execute($input); + $output = $commandTester->getDisplay(); + $this->assertStringMatchesFormat($expectedMessage, $output); + if ($isEnable) { + $this->assertStringContainsString($setupUpgradeMessage, $output); + } else { + $this->assertStringNotContainsString($setupUpgradeMessage, $output); + } + } + + /** + * @return array + */ + public function executeAllDataProvider() + { + return [ + 'enable' => [true, '%amodules have been enabled%aMagento_Module1%a'], + 'disable' => [false, '%amodules have been disabled%aMagento_Module1%a'], + ]; + } + + /** + * @param bool $isEnable + * + * @dataProvider executeWithConstraintsDataProvider + */ + public function testExecuteWithConstraints($isEnable) + { + $this->statusMock->expects($this->once()) + ->method('getModulesToChange') + ->with($isEnable, ['Magento_Module1', 'Magento_Module2']) + ->willReturn(['Magento_Module1']); + $this->statusMock->expects($this->any()) + ->method('checkConstraints') + ->willReturn(['constraint1', 'constraint2']); + $this->statusMock->expects($this->never()) + ->method('setIsEnabled'); + $commandTester = $this->getCommandTester($isEnable); + $commandTester->execute(['module' => ['Magento_Module1', 'Magento_Module2']]); + $this->assertStringMatchesFormat( + 'Unable to change status of modules%aconstraint1%aconstraint2%a', + $commandTester->getDisplay() + ); + } + + /** + * @return array + */ + public function executeWithConstraintsDataProvider() + { + return [ + 'enable' => [true], + 'disable' => [false], + ]; + } + + /** + * @param bool $isEnable + * @param string $expectedMessage + * + * @dataProvider executeExecuteForceDataProvider + */ + public function testExecuteForce($isEnable, $expectedMessage) + { + $this->statusMock->expects($this->once()) + ->method('getModulesToChange') + ->with($isEnable, ['Magento_Module1', 'Magento_Module2']) + ->willReturn(['Magento_Module1']); + $this->statusMock->expects($this->never()) + ->method('checkConstraints'); + $this->statusMock->expects($this->once()) + ->method('setIsEnabled') + ->with($isEnable, ['Magento_Module1']); + $commandTester = $this->getCommandTester($isEnable); + $commandTester->execute(['module' => ['Magento_Module1', 'Magento_Module2'], '--force' => true]); + $this->assertStringMatchesFormat( + $expectedMessage . '%amodules might not function properly%a', + $commandTester->getDisplay() + ); + } + + /** + * @return array + */ + public function executeExecuteForceDataProvider() + { + return [ + 'enable' => [true, '%amodules have been enabled%aMagento_Module1%a'], + 'disable' => [false, '%amodules have been disabled%aMagento_Module1%a'], + ]; + } + + /** + * @param bool $isEnable + * + * @dataProvider executeWithConstraintsDataProvider + */ + public function testExecuteNoChanges($isEnable) + { + $this->statusMock->expects($this->once()) + ->method('getModulesToChange') + ->with($isEnable, ['Magento_Module1', 'Magento_Module2']) + ->willReturn([]); + $this->statusMock->expects($this->never()) + ->method('setIsEnabled'); + $commandTester = $this->getCommandTester($isEnable); + $commandTester->execute(['module' => ['Magento_Module1', 'Magento_Module2']]); + $this->assertStringMatchesFormat( + 'No modules were changed%a', + $commandTester->getDisplay() + ); + } + + /** + * @param bool $isEnable + * @return CommandTester + */ + private function getCommandTester($isEnable) + { + $class = $isEnable ? ModuleEnableCommand::class : ModuleDisableCommand::class; + $command = new $class($this->objectManagerProviderMock); + $deploymentConfigProperty = new \ReflectionProperty($class, 'deploymentConfig'); + $deploymentConfigProperty->setAccessible(true); + $deploymentConfigProperty->setValue($command, $this->deploymentConfigMock); + $deploymentConfigProperty = new \ReflectionProperty($class, 'generatedFiles'); + $deploymentConfigProperty->setAccessible(true); + $deploymentConfigProperty->setValue($command, $this->generatedFiles); + return new CommandTester($command); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleStatusCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleStatusCommandTest.php new file mode 100644 index 0000000..2d0958a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleStatusCommandTest.php @@ -0,0 +1,49 @@ +createMock(ObjectManagerProvider::class); + $objectManager = $this->getMockForAbstractClass(ObjectManagerInterface::class); + $objectManagerProvider->expects($this->any()) + ->method('get') + ->willReturn($objectManager); + $moduleList = $this->createMock(ModuleList::class); + $fullModuleList = $this->createMock(FullModuleList::class); + $objectManager->expects($this->any()) + ->method('create') + ->willReturnMap([ + [ModuleList::class, [], $moduleList], + [FullModuleList::class, [], $fullModuleList], + ]); + $moduleList->expects($this->any()) + ->method('getNames') + ->willReturn(['Magento_Module1', 'Magento_Module2']); + $fullModuleList->expects($this->any()) + ->method('getNames') + ->willReturn(['Magento_Module1', 'Magento_Module2', 'Magento_Module3']); + $commandTester = new CommandTester(new ModuleStatusCommand($objectManagerProvider)); + $commandTester->execute([]); + $this->assertStringMatchesFormat( + 'List of enabled modules%aMagento_Module1%aMagento_Module2%a' + . 'List of disabled modules%aMagento_Module3%a', + $commandTester->getDisplay() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php new file mode 100644 index 0000000..724c9cc --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php @@ -0,0 +1,589 @@ +deploymentConfig = $this->createMock(DeploymentConfig::class); + $this->fullModuleList = $this->createMock(FullModuleList::class); + $this->maintenanceMode = $this->createMock(MaintenanceMode::class); + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $this->uninstallCollector = $this->createMock(UninstallCollector::class); + $this->packageInfo = $this->createMock(PackageInfo::class); + $packageInfoFactory = $this->createMock(PackageInfoFactory::class); + $packageInfoFactory->expects($this->once())->method('create')->willReturn($this->packageInfo); + $this->dependencyChecker = $this->createMock(DependencyChecker::class); + $this->backupRollback = $this->createMock(BackupRollback::class); + $this->backupRollbackFactory = $this->createMock(BackupRollbackFactory::class); + $this->backupRollbackFactory->expects($this->any()) + ->method('create') + ->willReturn($this->backupRollback); + $this->cache = $this->createMock(Cache::class); + $this->cleanupFiles = $this->createMock(CleanupFiles::class); + $objectManagerProvider->expects($this->any())->method('get')->willReturn($objectManager); + $configLoader = $this->getMockForAbstractClass( + ConfigLoaderInterface::class, + [], + '', + false + ); + $this->patchApplierMock = $this->getMockBuilder(PatchApplier::class) + ->disableOriginalConstructor() + ->getMock(); + $configLoader->expects($this->any())->method('load')->willReturn([]); + $objectManager->expects($this->any()) + ->method('get') + ->willReturnMap([ + [PackageInfoFactory::class, $packageInfoFactory], + [DependencyChecker::class, $this->dependencyChecker], + [Cache::class, $this->cache], + [CleanupFiles::class, $this->cleanupFiles], + [ + State::class, + $this->createMock(State::class) + ], + [BackupRollbackFactory::class, $this->backupRollbackFactory], + [PatchApplier::class, $this->patchApplierMock], + [ConfigLoaderInterface::class, $configLoader], + ]); + $composer = $this->createMock(ComposerInformation::class); + $composer->expects($this->any()) + ->method('getRootRequiredPackages') + ->willReturn(['magento/package-a', 'magento/package-b']); + $this->moduleUninstaller = $this->createMock(ModuleUninstaller::class); + $this->moduleRegistryUninstaller = $this->createMock(ModuleRegistryUninstaller::class); + $this->command = new ModuleUninstallCommand( + $composer, + $this->deploymentConfig, + $this->fullModuleList, + $this->maintenanceMode, + $objectManagerProvider, + $this->uninstallCollector, + $this->moduleUninstaller, + $this->moduleRegistryUninstaller, + new MaintenanceModeEnabler($this->maintenanceMode) + ); + $this->question = $this->createMock(QuestionHelper::class); + $this->question + ->expects($this->any()) + ->method('ask') + ->willReturn(true); + $this->helperSet = $this->createMock(HelperSet::class); + $this->helperSet + ->expects($this->any()) + ->method('get') + ->with('question') + ->willReturn($this->question); + $this->command->setHelperSet($this->helperSet); + $this->tester = new CommandTester($this->command); + } + + public function testExecuteApplicationNotInstalled() + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(false); + $this->tester->execute(['module' => ['Magento_A']]); + $this->assertEquals( + 'You cannot run this command because the Magento application is not installed.' . PHP_EOL, + $this->tester->getDisplay() + ); + } + + /** + * @dataProvider executeFailedValidationDataProvider + * @param array $packageInfoMap + * @param array $fullModuleListMap + * @param array $input + * @param array $expect + */ + public function testExecuteFailedValidation( + array $packageInfoMap, + array $fullModuleListMap, + array $input, + array $expect + ) { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(true); + $this->packageInfo->expects($this->exactly(count($input['module']))) + ->method('getPackageName') + ->willReturnMap($packageInfoMap); + $this->fullModuleList->expects($this->exactly(count($input['module']))) + ->method('has') + ->willReturnMap($fullModuleListMap); + $this->tester->execute($input); + foreach ($expect as $message) { + $this->assertStringContainsString($message, $this->tester->getDisplay()); + } + } + + /** + * @return array + */ + public function executeFailedValidationDataProvider() + { + return [ + 'one non-composer package' => [ + [['Magento_C', 'magento/package-c']], + [['Magento_C', true]], + ['module' => ['Magento_C']], + ['Magento_C is not an installed composer package'] + ], + 'one non-composer package, one valid' => [ + [['Magento_A', 'magento/package-a'], ['Magento_C', 'magento/package-c']], + [['Magento_A', true], ['Magento_C', true]], + ['module' => ['Magento_A', 'Magento_C']], + ['Magento_C is not an installed composer package'] + ], + 'two non-composer packages' => [ + [['Magento_C', 'magento/package-c'], ['Magento_D', 'magento/package-d']], + [['Magento_C', true], ['Magento_D', true]], + ['module' => ['Magento_C', 'Magento_D']], + ['Magento_C, Magento_D are not installed composer packages'] + ], + 'one unknown module' => [ + [['Magento_C', '']], + [['Magento_C', false]], + ['module' => ['Magento_C']], + ['Unknown module(s): Magento_C'] + ], + 'two unknown modules' => [ + [['Magento_C', ''], ['Magento_D', '']], + [['Magento_C', false], ['Magento_D', false]], + ['module' => ['Magento_C', 'Magento_D']], + ['Unknown module(s): Magento_C, Magento_D'] + ], + 'one unknown module, one valid' => [ + [['Magento_C', ''], ['Magento_B', 'magento/package-b']], + [['Magento_C', false], ['Magento_B', true]], + ['module' => ['Magento_C', 'Magento_B']], + ['Unknown module(s): Magento_C'] + ], + 'one non-composer package, one unknown module' => [ + [['Magento_C', 'magento/package-c'], ['Magento_D', '']], + [['Magento_C', true], ['Magento_D', false]], + ['module' => ['Magento_C', 'Magento_D']], + ['Magento_C is not an installed composer package', 'Unknown module(s): Magento_D'] + ], + 'two non-composer package, one unknown module' => [ + [['Magento_C', 'magento/package-c'], ['Magento_D', ''], ['Magento_E', 'magento/package-e']], + [['Magento_C', true], ['Magento_D', false], ['Magento_E', true]], + ['module' => ['Magento_C', 'Magento_D', 'Magento_E']], + ['Magento_C, Magento_E are not installed composer packages', 'Unknown module(s): Magento_D'] + ], + 'two non-composer package, two unknown module' => [ + [ + ['Magento_C', 'magento/package-c'], + ['Magento_D', ''], + ['Magento_E', 'magento/package-e'], + ['Magento_F', ''] + ], + [['Magento_C', true], ['Magento_D', false], ['Magento_E', true], ['Magento_F', false]], + ['module' => ['Magento_C', 'Magento_D', 'Magento_E', 'Magento_F']], + ['Magento_C, Magento_E are not installed composer packages', 'Unknown module(s): Magento_D, Magento_F'] + ], + 'two non-composer package, two unknown module, two valid' => [ + [ + ['Magento_C', 'magento/package-c'], + ['Magento_D', ''], + ['Magento_E', 'magento/package-e'], + ['Magento_F', ''], + ['Magento_A', 'magento/package-a'], + ['Magento_B', 'magento/package-b'], + ], + [ + ['Magento_A', true], + ['Magento_B', true], + ['Magento_C', true], + ['Magento_D', false], + ['Magento_E', true], + ['Magento_F', false] + ], + ['module' => ['Magento_A', 'Magento_B', 'Magento_C', 'Magento_D', 'Magento_E', 'Magento_F']], + ['Magento_C, Magento_E are not installed composer packages', 'Unknown module(s): Magento_D, Magento_F'] + ] + ]; + } + + private function setUpPassValidation() + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(true); + $packageMap = [ + ['Magento_A', 'magento/package-a'], + ['Magento_B', 'magento/package-b'], + ]; + $this->packageInfo->expects($this->any()) + ->method('getPackageName') + ->willReturnMap($packageMap); + $this->fullModuleList->expects($this->any()) + ->method('has') + ->willReturn(true); + } + + /** + * @dataProvider executeFailedDependenciesDataProvider + * @param array $dependencies + * @param array $input + * @param array $expect + */ + public function testExecuteFailedDependencies( + array $dependencies, + array $input, + array $expect + ) { + $this->setUpPassValidation(); + $this->dependencyChecker->expects($this->once()) + ->method('checkDependenciesWhenDisableModules') + ->willReturn($dependencies); + $this->tester->execute($input); + foreach ($expect as $message) { + $this->assertStringContainsString($message, $this->tester->getDisplay()); + } + } + + /** + * @return array + */ + public function executeFailedDependenciesDataProvider() + { + return [ + [ + ['Magento_A' => ['Magento_D' => ['Magento_D', 'Magento_A']]], + ['module' => ['Magento_A']], + [ + "Cannot uninstall module 'Magento_A' because the following module(s) depend on it:" . + PHP_EOL . "\tMagento_D" + ] + ], + [ + ['Magento_A' => ['Magento_D' => ['Magento_D', 'Magento_A']]], + ['module' => ['Magento_A', 'Magento_B']], + [ + "Cannot uninstall module 'Magento_A' because the following module(s) depend on it:" . + PHP_EOL . "\tMagento_D" + ] + ], + [ + [ + 'Magento_A' => ['Magento_D' => ['Magento_D', 'Magento_A']], + 'Magento_B' => ['Magento_E' => ['Magento_E', 'Magento_A']] + ], + ['module' => ['Magento_A', 'Magento_B']], + [ + "Cannot uninstall module 'Magento_A' because the following module(s) depend on it:" . + PHP_EOL . "\tMagento_D", + "Cannot uninstall module 'Magento_B' because the following module(s) depend on it:" . + PHP_EOL . "\tMagento_E" + ] + ], + ]; + } + + private function setUpExecute() + { + $this->setUpPassValidation(); + $this->dependencyChecker->expects($this->once()) + ->method('checkDependenciesWhenDisableModules') + ->willReturn(['Magento_A' => [], 'Magento_B' => []]); + $this->cache->expects($this->once())->method('clean'); + $this->cleanupFiles->expects($this->once())->method('clearCodeGeneratedClasses'); + } + + public function testExecute() + { + $input = ['module' => ['Magento_A', 'Magento_B']]; + $this->setUpExecute(); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallCode') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDb') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDeploymentConfig') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->tester->execute($input); + } + + public function testExecuteClearStaticContent() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '-c' => true]; + $this->setUpExecute(); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallCode') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDb') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDeploymentConfig') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->cleanupFiles->expects($this->once())->method('clearMaterializedViewFiles'); + $this->tester->execute($input); + } + + public function testExecuteRemoveData() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '-r' => true]; + $this->setUpExecute(); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallData') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallCode') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDb') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDeploymentConfig') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->tester->execute($input); + } + + public function testExecuteNonComposerModules() + { + $this->deploymentConfig->expects(self::once()) + ->method('isAvailable') + ->willReturn(true); + $input = ['module' => ['Magento_A'], '-c' => true, '-r' => true, '--non-composer' => true]; + $this->patchApplierMock->expects(self::once()) + ->method('revertDataPatches') + ->with('Magento_A'); + self::assertEquals(0, $this->tester->execute($input)); + } + + public function testExecuteAll() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '-c' => true, '-r' => true]; + $this->setUpExecute(); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallData') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallCode') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDb') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDeploymentConfig') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->cleanupFiles->expects($this->once())->method('clearMaterializedViewFiles'); + $this->tester->execute($input); + } + + public function testExecuteCodeBackup() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '--backup-code' => true]; + $this->setUpExecute(); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallCode') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDb') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDeploymentConfig') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->backupRollback->expects($this->once()) + ->method('codeBackup') + ->willReturn($this->backupRollback); + $this->tester->execute($input); + } + + public function testExecuteMediaBackup() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '--backup-media' => true]; + $this->setUpExecute(); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallCode') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDb') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDeploymentConfig') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->backupRollback->expects($this->once()) + ->method('codeBackup') + ->willReturn($this->backupRollback); + $this->tester->execute($input); + } + + public function testExecuteDBBackup() + { + $input = ['module' => ['Magento_A', 'Magento_B'], '--backup-db' => true]; + $this->setUpExecute(); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallCode') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDb') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDeploymentConfig') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->backupRollback->expects($this->once()) + ->method('dbBackup') + ->willReturn($this->backupRollback); + $this->tester->execute($input); + } + + public function testInteraction() + { + $input = ['module' => ['Magento_A', 'Magento_B']]; + $this->setUpExecute(); + $this->moduleUninstaller->expects($this->once()) + ->method('uninstallCode') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDb') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->moduleRegistryUninstaller->expects($this->once()) + ->method('removeModulesFromDeploymentConfig') + ->with($this->isInstanceOf(OutputInterface::class), $input['module']); + $this->question + ->expects($this->once()) + ->method('ask') + ->willReturn(false); + $this->helperSet + ->expects($this->once()) + ->method('get') + ->with('question') + ->willReturn($this->question); + $this->command->setHelperSet($this->helperSet); + $this->tester = new CommandTester($this->command); + $this->tester->execute($input); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php new file mode 100644 index 0000000..23ea91a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php @@ -0,0 +1,199 @@ +deploymentConfig = $this->createMock(DeploymentConfig::class); + $maintenanceMode = $this->createMock(MaintenanceMode::class); + $this->objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->expects($this->any())->method('get')->willReturn($this->objectManager); + $this->backupRollback = $this->createMock(BackupRollback::class); + $this->backupRollbackFactory = $this->createMock(BackupRollbackFactory::class); + $this->backupRollbackFactory->expects($this->any()) + ->method('create') + ->willReturn($this->backupRollback); + $appState = $this->createMock(State::class); + $configLoader = $this->getMockForAbstractClass( + ConfigLoaderInterface::class, + [], + '', + false + ); + $configLoader->expects($this->any())->method('load')->willReturn([]); + $this->objectManager->expects($this->any()) + ->method('get') + ->willReturnMap([ + [BackupRollbackFactory::class, $this->backupRollbackFactory], + [State::class, $appState], + [ConfigLoaderInterface::class, $configLoader], + ]); + $this->helperSet = $this->createMock(HelperSet::class); + $this->question = $this->createMock(QuestionHelper::class); + $this->question + ->expects($this->any()) + ->method('ask') + ->willReturn(true); + $this->helperSet + ->expects($this->any()) + ->method('get') + ->with('question') + ->willReturn($this->question); + $this->command = new RollbackCommand( + $objectManagerProvider, + $maintenanceMode, + $this->deploymentConfig, + new MaintenanceModeEnabler($maintenanceMode) + ); + $this->command->setHelperSet($this->helperSet); + $this->tester = new CommandTester($this->command); + } + + public function testExecuteCodeRollback() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->backupRollback->expects($this->once()) + ->method('codeRollback') + ->willReturn($this->backupRollback); + $this->tester->execute(['--code-file' => 'A.tgz']); + } + + public function testExecuteMediaRollback() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->backupRollback->expects($this->once()) + ->method('codeRollback') + ->willReturn($this->backupRollback); + $this->tester->execute(['--media-file' => 'A.tgz']); + } + + public function testExecuteDBRollback() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->backupRollback->expects($this->once()) + ->method('dbRollback') + ->willReturn($this->backupRollback); + $this->tester->execute(['--db-file' => 'C.gz']); + } + + public function testExecuteNotInstalled() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(false); + $this->tester->execute(['--db-file' => 'C.gz']); + $this->assertStringMatchesFormat( + 'No information is available: the Magento application is not installed.%w', + $this->tester->getDisplay() + ); + } + + public function testExecuteNoOptions() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->tester->execute([]); + $expected = 'Enabling maintenance mode' . PHP_EOL + . 'Not enough information provided to roll back.' . PHP_EOL + . 'Disabling maintenance mode' . PHP_EOL; + $this->assertSame($expected, $this->tester->getDisplay()); + } + + public function testInteraction() + { + $this->deploymentConfig->expects($this->once()) + ->method('isAvailable') + ->willReturn(true); + $this->question + ->expects($this->atLeast(2)) + ->method('ask') + ->willReturn(false); + $this->helperSet + ->expects($this->once()) + ->method('get') + ->with('question') + ->willReturn($this->question); + $this->command->setHelperSet($this->helperSet); + $this->tester = new CommandTester($this->command); + $this->tester->execute(['--db-file' => 'C.gz']); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/UninstallCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/UninstallCommandTest.php new file mode 100644 index 0000000..a05cf2e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/UninstallCommandTest.php @@ -0,0 +1,82 @@ +installerFactory = $this->createMock(InstallerFactory::class); + $this->installer = $this->createMock(Installer::class); + $this->command = new UninstallCommand($this->installerFactory); + } + + public function testExecuteInteractionYes() + { + $this->installer->expects($this->once())->method('uninstall'); + $this->installerFactory->expects($this->once())->method('create')->willReturn($this->installer); + + $this->checkInteraction(true); + } + + public function testExecuteInteractionNo() + { + $this->installer->expects($this->exactly(0))->method('uninstall'); + $this->installerFactory->expects($this->exactly(0))->method('create'); + + $this->checkInteraction(false); + } + + /** + * @param $answer + */ + public function checkInteraction($answer) + { + $question = $this->createMock(QuestionHelper::class); + $question + ->expects($this->once()) + ->method('ask') + ->willReturn($answer); + + /** @var HelperSet|MockObject $helperSet */ + $helperSet = $this->createMock(HelperSet::class); + $helperSet + ->expects($this->once()) + ->method('get') + ->with('question') + ->willReturn($question); + $this->command->setHelperSet($helperSet); + + $tester = new CommandTester($this->command); + $tester->execute([]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/UpgradeCommandTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/UpgradeCommandTest.php new file mode 100644 index 0000000..734f4ef --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Command/UpgradeCommandTest.php @@ -0,0 +1,192 @@ +deploymentConfigMock = $this->getMockBuilder(DeploymentConfig::class) + ->disableOriginalConstructor() + ->getMock(); + $this->installerFactoryMock = $this->getMockBuilder(InstallerFactory::class) + ->disableOriginalConstructor() + ->getMock(); + $this->installerMock = $this->getMockBuilder(Installer::class) + ->disableOriginalConstructor() + ->getMock(); + $this->installerFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($this->installerMock); + $this->appStateMock = $this->getMockBuilder(AppState::class) + ->disableOriginalConstructor() + ->getMock(); + $this->searchConfigMock = $this->getMockBuilder(SearchConfig::class) + ->disableOriginalConstructor() + ->getMock(); + /** @var MockObject|SearchConfigFactory $searchConfigFactoryMock */ + $searchConfigFactoryMock = $this->getMockBuilder(SearchConfigFactory::class) + ->disableOriginalConstructor() + ->getMock(); + $searchConfigFactoryMock->expects($this->once())->method('create')->willReturn($this->searchConfigMock); + + $this->upgradeCommand = new UpgradeCommand( + $this->installerFactoryMock, + $searchConfigFactoryMock, + $this->deploymentConfigMock, + $this->appStateMock + ); + $this->commandTester = new CommandTester($this->upgradeCommand); + } + + /** + * @param array $options + * @param string $deployMode + * @param string $expectedString + * @param array $expectedOptions + * + * @return void + * @dataProvider executeDataProvider + */ + public function testExecute($options, $deployMode, $expectedString, $expectedOptions): void + { + $this->appStateMock->method('getMode')->willReturn($deployMode); + $this->installerMock->expects($this->once()) + ->method('installSchema') + ->with($expectedOptions); + $this->installerMock + ->method('updateModulesSequence'); + $this->installerMock + ->method('installDataFixtures'); + + $this->assertSame(Cli::RETURN_SUCCESS, $this->commandTester->execute($options)); + $this->assertEquals($expectedString, $this->commandTester->getDisplay()); + } + + /** + * @return array + */ + public function executeDataProvider(): array + { + $mediaGalleryNotice = "Media files stored outside of 'Media Gallery Allowed' folders will not be available " + . "to the media gallery.\n" + . "Please refer to Developer Guide for more details.\n"; + + return [ + [ + 'options' => [ + '--magento-init-params' => '', + '--convert-old-scripts' => false + ], + 'deployMode' => AppState::MODE_PRODUCTION, + 'expectedString' => 'Please re-run Magento compile command. Use the command "setup:di:compile"' + . PHP_EOL . $mediaGalleryNotice, + 'expectedOptions' => [ + 'keep-generated' => false, + 'convert-old-scripts' => false, + 'safe-mode' => false, + 'data-restore' => false, + 'dry-run' => false, + 'magento-init-params' => '' + ] + ], + [ + 'options' => [ + '--magento-init-params' => '', + '--convert-old-scripts' => false, + '--keep-generated' => true + ], + 'deployMode' => AppState::MODE_PRODUCTION, + 'expectedString' => $mediaGalleryNotice, + 'expectedOptions' => [ + 'keep-generated' => true, + 'convert-old-scripts' => false, + 'safe-mode' => false, + 'data-restore' => false, + 'dry-run' => false, + 'magento-init-params' => '' + ] + ], + [ + 'options' => ['--magento-init-params' => '', '--convert-old-scripts' => false], + 'deployMode' => AppState::MODE_DEVELOPER, + 'expectedString' => $mediaGalleryNotice, + 'expectedOptions' => [ + 'keep-generated' => false, + 'convert-old-scripts' => false, + 'safe-mode' => false, + 'data-restore' => false, + 'dry-run' => false, + 'magento-init-params' => '' + ] + ], + [ + 'options' => ['--magento-init-params' => '', '--convert-old-scripts' => false], + 'deployMode' => AppState::MODE_DEFAULT, + 'expectedString' => $mediaGalleryNotice, + 'expectedOptions' => [ + 'keep-generated' => false, + 'convert-old-scripts' => false, + 'safe-mode' => false, + 'data-restore' => false, + 'dry-run' => false, + 'magento-init-params' => '' + ] + ] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/CommandListTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/CommandListTest.php new file mode 100644 index 0000000..09b7564 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/CommandListTest.php @@ -0,0 +1,40 @@ +serviceManager = $this->createMock(ServiceManager::class); + $this->commandList = new CommandList($this->serviceManager); + } + + public function testGetCommands() + { + $this->serviceManager->expects($this->atLeastOnce()) + ->method('get'); + + $this->commandList->getCommands(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/CompilerPreparationTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/CompilerPreparationTest.php new file mode 100644 index 0000000..beb9095 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/CompilerPreparationTest.php @@ -0,0 +1,230 @@ +serviceManagerMock = $this->getMockBuilder(ServiceManager::class) + ->disableOriginalConstructor() + ->getMock(); + $this->inputMock = $this->getMockBuilder(ArgvInput::class) + ->disableOriginalConstructor() + ->getMock(); + $this->filesystemDriverMock = $this->getMockBuilder(File::class) + ->disableOriginalConstructor() + ->getMock(); + $this->generationDirectoryAccessMock = $this->getMockBuilder(GenerationDirectoryAccess::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->model = (new ObjectManager($this))->getObject( + CompilerPreparation::class, + [ + 'serviceManager' => $this->serviceManagerMock, + 'input' => $this->inputMock, + 'filesystemDriver' => $this->filesystemDriverMock, + 'generationDirectoryAccess' => $this->generationDirectoryAccessMock, + ] + ); + } + + /** + * @dataProvider commandNameDataProvider + * @param $commandName + * @param $isCompileCommand + * @param $isHelpOption + * @param bool|null $dirExists + */ + public function testClearGenerationDirWhenNeeded($commandName, $isCompileCommand, $isHelpOption, $dirExists = false) + { + $this->inputMock->expects($this->once()) + ->method('getFirstArgument') + ->willReturn($commandName); + $this->inputMock->expects($this->atLeastOnce()) + ->method('hasParameterOption') + ->with($this->logicalOr('--help', '-h')) + ->willReturn($isHelpOption); + + if ($isCompileCommand && !$isHelpOption) { + $this->filesystemDriverMock->expects($this->exactly(2)) + ->method('isExists') + ->willReturn($dirExists); + $this->filesystemDriverMock->expects($this->exactly(((int)$dirExists) * 2)) + ->method('deleteDirectory'); + } else { + $this->filesystemDriverMock->expects($this->never()) + ->method('isExists'); + $this->filesystemDriverMock->expects($this->never()) + ->method('deleteDirectory'); + } + + $this->generationDirectoryAccessMock->expects($this->any()) + ->method('check') + ->willReturn(true); + + $this->model->handleCompilerEnvironment(); + } + + /** + * @return array + */ + public function commandNameDataProvider() + { + return [ + 'ST compiler, directory exists' => [ + 'commandName' => DiCompileCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => false, + 'dirExists' => true + ], + 'ST compiler, directory does not exist' => [ + 'commandName' => DiCompileCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => false, + 'dirExists' => false + ], + 'ST compiler, help option' => [ + 'commandName' => DiCompileCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => true, + 'dirExists' => false + ], + 'Other command' => [ + 'commandName' => 'not:a:compiler', + 'isCompileCommand' => false, + 'isHelpOption' => false, + ], + 'ST compiler, directory exists, abbreviation 1' => [ + 'commandName' => 's:d:c', + 'isCompileCommand' => true, + 'isHelpOption' => false, + 'dirExists' => true + ], + 'ST compiler, directory exists, abbreviation 2' => [ + 'commandName' => 'se:di:co', + 'isCompileCommand' => true, + 'isHelpOption' => false, + 'dirExists' => true + ], + 'ST compiler, directory exists, abbreviation ambiguous' => [ + 'commandName' => 'se:di', + 'isCompileCommand' => false, + 'isHelpOption' => false, + 'dirExists' => true + ], + ]; + } + + public function testGenerationDirectoryFromInitParams() + { + $customGenerationDirectory = '/custom/generated/code/directory'; + $defaultDiDirectory = '/custom/di/directory'; + $mageInitParams = ['MAGE_DIRS' => ['generation' => ['path' => $customGenerationDirectory]]]; + $dirValueMap = [ + [ + $customGenerationDirectory, + $defaultDiDirectory + ], + [ + true, + true + ] + ]; + + $this->inputMock->expects($this->once()) + ->method('getFirstArgument') + ->willReturn(DiCompileCommand::NAME); + $this->filesystemDriverMock->expects($this->exactly(2)) + ->method('isExists') + ->willReturn(true); + $this->filesystemDriverMock->expects($this->exactly(2)) + ->method('deleteDirectory') + ->willReturnMap($dirValueMap); + $this->serviceManagerMock->expects($this->once()) + ->method('get') + ->with(InitParamListener::BOOTSTRAP_PARAM) + ->willReturn($mageInitParams); + $this->generationDirectoryAccessMock->expects($this->once()) + ->method('check') + ->willReturn(true); + + $this->model->handleCompilerEnvironment(); + } + + public function testGenerationDirectoryFromCliOption() + { + $customGenerationDirectory = '/custom/generated/code/directory'; + $customDiDirectory = '/custom/di/directory'; + $dirResultMap = [ + [ + $this->logicalNot($this->equalTo($customGenerationDirectory)), + $this->logicalNot($this->equalTo($customDiDirectory)) + ], + [ + true, + true + ] + ]; + + $this->inputMock->expects($this->once()) + ->method('getFirstArgument') + ->willReturn(DiCompileCommand::NAME); + $this->filesystemDriverMock->expects($this->exactly(2)) + ->method('isExists') + ->willReturn(true); + $this->filesystemDriverMock->expects($this->exactly(2)) + ->method('deleteDirectory') + ->willReturnMap($dirResultMap); + $this->generationDirectoryAccessMock->expects($this->once()) + ->method('check') + ->willReturn(true); + + $this->model->handleCompilerEnvironment(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Style/MagentoStyleTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Style/MagentoStyleTest.php new file mode 100644 index 0000000..68ef161 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Style/MagentoStyleTest.php @@ -0,0 +1,318 @@ + 'foo'], new InputDefinition([new InputArgument('name')])); + $this->testOutput = new TestOutput(); + $this->magentoStyle = new MagentoStyle($input, $this->testOutput); + } + + /** + * Test style decorator will output block with correct style. + * + * @return void + */ + public function testBlockStyle() + { + $this->magentoStyle->block( + ['test first message', 'test second message'], + 'testBlockType', + 'testBlockStyle', + 'testBlockPrefix' + ); + // @codingStandardsIgnoreStart + $expected = PHP_EOL . PHP_EOL . PHP_EOL . + '\testBlockPrefix\[testBlockType\] test first message\s+' + . PHP_EOL . '\testBlockPrefix\s+' + . PHP_EOL . '\testBlockPrefix \s+ test second message\s+' + . PHP_EOL . PHP_EOL; + // @codingStandardsIgnoreEnd + $this->assertMatchesRegularExpression( + '/' . $expected . '/', + $this->testOutput->output, + 'Block does not match output' + ); + } + + /** + * Test style decorator will add title with correct style. + * + * @return void + */ + public function testTitleStyle() + { + $this->magentoStyle->title('My Title'); + $expected = PHP_EOL . PHP_EOL . PHP_EOL . ' My Title' . PHP_EOL . ' ========' . PHP_EOL . PHP_EOL; + $this->assertEquals($expected, $this->testOutput->output, 'Title does not match output'); + } + + /** + * Test style decorator will output section with correct style. + * + * @return void + */ + public function testSectionStyle() + { + $this->magentoStyle->section('My Section'); + $expected = PHP_EOL . PHP_EOL . PHP_EOL . ' My Section' . PHP_EOL . ' ----------' . PHP_EOL . PHP_EOL; + $this->assertEquals($expected, $this->testOutput->output, 'Section does not match output'); + } + + /** + * Test style decorator will output listing with proper style. + * + * @return void + */ + public function testListingStyle() + { + $this->magentoStyle->listing(['test first element', 'test second element']); + $expected = PHP_EOL . ' * test first element' . PHP_EOL . ' * test second element' . PHP_EOL . PHP_EOL; + $this->assertEquals($expected, $this->testOutput->output, 'Listing does not match output'); + } + + /** + * Test style decorator will output text with proper style. + * + * @return void + */ + public function testTextStyle() + { + $this->magentoStyle->text('test message'); + $expected = PHP_EOL . ' test message' . PHP_EOL; + + $this->assertEquals($expected, $this->testOutput->output, 'Text does not match output'); + } + + /** + * Test style decorator will output comment with proper style. + * + * @return void + */ + public function testCommentStyle() + { + $this->magentoStyle->comment('test comment'); + $expected = PHP_EOL . PHP_EOL . PHP_EOL . '\s+test comment\s+' . PHP_EOL . PHP_EOL; + $this->assertMatchesRegularExpression( + '/' . $expected . '/', + $this->testOutput->output, + 'Comment does not match output' + ); + } + + /** + * Test style decorator will output success message with proper style. + * + * @return void + */ + public function testSuccessStyle() + { + $this->magentoStyle->success('test success message'); + $expected = PHP_EOL . PHP_EOL . PHP_EOL . ' \[SUCCESS\] test success message\s+' . PHP_EOL . PHP_EOL; + $this->assertMatchesRegularExpression( + '/' . $expected . '/', + $this->testOutput->output, + 'Success message does not match output' + ); + } + + /** + * Test style decorator will output error message with proper style. + * + * @return void + */ + public function testErrorStyle() + { + $this->magentoStyle->error('test error message'); + $expected = PHP_EOL . PHP_EOL . PHP_EOL . '\s+\[ERROR\] test error message\s+' . PHP_EOL . PHP_EOL; + $this->assertMatchesRegularExpression( + '/' . $expected . '/', + $this->testOutput->output, + 'Error message does not match output' + ); + } + + /** + * Test style decorator will output warning message with proper style. + * + * @return void + */ + public function testWarningStyle() + { + $this->magentoStyle->warning('test warning message'); + $expected = PHP_EOL . PHP_EOL . PHP_EOL . '\s+\[WARNING\] test warning message\s+' . PHP_EOL . PHP_EOL; + $this->assertMatchesRegularExpression( + '/' . $expected . '/', + $this->testOutput->output, + 'Warning message does not match output' + ); + } + + /** + * Test style decorator will output note message with proper style. + * + * @return void + */ + public function testNoteStyle() + { + $this->magentoStyle->note('test note message'); + $expected = PHP_EOL . PHP_EOL . PHP_EOL . '\s+\[NOTE\] test note message\s+' . PHP_EOL . PHP_EOL; + $this->assertMatchesRegularExpression( + '/' . $expected . '/', + $this->testOutput->output, + 'Note message does not match output' + ); + } + + /** + * Test style decorator will output caution message with proper style. + * + * @return void + */ + public function testCautionStyle() + { + $this->magentoStyle->caution('test caution message'); + $expected = PHP_EOL . PHP_EOL . PHP_EOL . '\s+! \[CAUTION\] test caution message\s+' . PHP_EOL . PHP_EOL; + $this->assertMatchesRegularExpression( + '/' . $expected . '/', + $this->testOutput->output, + 'Caution message does not match output' + ); + } + + /** + * Test style decorator will output table with proper style. + * + * @return void + */ + public function testTableStyle() + { + $headers = [ + [new TableCell('Main table title', ['colspan' => 2])], + ['testHeader1', 'testHeader2', 'testHeader3'], + ]; + $rows = [ + [ + 'testValue1', + 'testValue2', + new TableCell('testValue3', ['rowspan' => 2]), + ], + ['testValue4', 'testValue5'], + ]; + $this->magentoStyle->table($headers, $rows); + $expected = ' ------------- ------------- ------------- ' . PHP_EOL . + ' Main table title ' . PHP_EOL . + ' ------------- ------------- ------------- ' . PHP_EOL . + ' testHeader1 testHeader2 testHeader3 ' . PHP_EOL . + ' ------------- ------------- ------------- ' . PHP_EOL . + ' testValue1 testValue2 testValue3 ' . PHP_EOL . + ' testValue4 testValue5 ' . PHP_EOL . + ' ------------- ------------- ------------- ' . PHP_EOL . PHP_EOL; + + $this->assertEquals($expected, $this->testOutput->output, 'Table does not match output'); + } + + /** + * @return void + */ + public function testAsk() + { + $objectManager = new ObjectManager($this); + $formatter = $this->getMockBuilder(OutputFormatter::class) + ->disableOriginalClone() + ->disableOriginalConstructor() + ->getMock(); + $input = $this->getMockBuilder(InputInterface::class) + ->setMethods(['isInteractive']) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $input->expects($this->exactly(2)) + ->method('isInteractive') + ->willReturn(false); + $output = $this->getMockBuilder(OutputInterface::class) + ->setMethods(['getVerbosity', 'getFormatter']) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $output->expects($this->once()) + ->method('getVerbosity') + ->willReturn(32); + $output->expects($this->once()) + ->method('getFormatter') + ->willReturn($formatter); + $magentoStyle = $objectManager->getObject( + MagentoStyle::class, + [ + 'input' => $input, + 'output' => $output, + ] + ); + $questionHelper = $this->getMockBuilder(SymfonyQuestionHelper::class) + ->disableOriginalConstructor() + ->getMock(); + $questionHelper->expects($this->once()) + ->method('ask') + ->willReturn('test Answer'); + $objectManager->setBackwardCompatibleProperty($magentoStyle, 'questionHelper', $questionHelper); + + $this->assertEquals( + 'test Answer', + $magentoStyle->ask('test question?', 'test default') + ); + } + + /** + * Test style decorator will output progress with proper style. + * + * @return void + */ + public function testProgress() + { + $this->magentoStyle->progressStart(2); + $this->magentoStyle->progressAdvance(3); + $this->magentoStyle->progressFinish(); + $expected = ' 0/2 [> ] 0%' . PHP_EOL . + ' 3/3 [============================] 100%' . PHP_EOL . PHP_EOL; + $this->assertEquals($expected, $this->testOutput->output, 'Progress does not match output'); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Console/Style/TestOutput.php b/magento/setup/src/Magento/Setup/Test/Unit/Console/Style/TestOutput.php new file mode 100644 index 0000000..65ca59b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Console/Style/TestOutput.php @@ -0,0 +1,32 @@ +output = ''; + } + + /** + * @param string $message + * @param bool $newline + */ + protected function doWrite($message, $newline) + { + $this->output .= $message . ($newline ? "\n" : ''); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/AttributeSetFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/AttributeSetFixtureTest.php new file mode 100644 index 0000000..8d80fb2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/AttributeSetFixtureTest.php @@ -0,0 +1,173 @@ + 'attribute set name', + 'attributes' => [ + 'attribute' => [ + [ + 'is_required' => 1, + 'is_visible_on_front' => 1, + 'is_visible_in_advanced_search' => 0, + 'is_filterable' => 0, + 'is_filterable_in_search' => 0, + 'attribute_code' => 'attribute_1', + 'is_searchable' => 0, + 'frontend_label' => 'Attribute 1', + 'frontend_input' => 'select', + 'backend_type' => 1, + 'default_option' => 'option 1', + 'options' => [ + 'option' => [ + [ + 'label' => 'option 1', + 'value' => 'option_1' + ], + ] + ] + ] + ] + ] + ]; + + // Mock Attribute Sets + $attributeSetMock = $this->getMockBuilder(AttributeSetInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $attributeSetMock->expects($this->once()) + ->method('setAttributeSetName') + ->with("attribute set name"); + $attributeSetMock->expects($this->once()) + ->method('setEntityTypeId') + ->with(ProductAttributeInterface::ENTITY_TYPE_CODE); + $attributeSetMock->expects($this->any()) + ->method('getAttributeSetName') + ->willReturn($attributeSets['name']); + + $attributeSetFactoryMock = $this->getMockBuilder(\Magento\Eav\Api\Data\AttributeSetInterfaceFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $attributeSetFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($attributeSetMock); + + $attributeSetManagementMock = $this->getMockBuilder(AttributeSetManagementInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $attributeSetManagementMock->expects($this->once()) + ->method('create') + ->with($attributeSetMock, '4') + ->willReturn($attributeSetMock); + + //Mock Attribute Groups + $attributeGroupMock = $this->getMockBuilder(AttributeGroupInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $attributeGroupMock->expects($this->once()) + ->method('setAttributeGroupName') + ->with($attributeSetMock->getAttributeSetName() . ' - Group'); + $attributeGroupMock->expects($this->once()) + ->method('setAttributeSetId') + ->with($attributeSetMock->getAttributeSetId()); + + $attributeGroupFactoryMock = $this->getMockBuilder(\Magento\Eav\Api\Data\AttributeGroupInterfaceFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $attributeGroupFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($attributeGroupMock); + + $productAttributeGroupRepoMock = $this->getMockBuilder( + ProductAttributeGroupRepositoryInterface::class + ) + ->disableOriginalConstructor() + ->getMock(); + $productAttributeGroupRepoMock->expects($this->once()) + ->method('save') + ->with($attributeGroupMock) + ->willReturn($attributeGroupMock); + + // Mock Attributes + $attributeMock = $this->getMockBuilder(ProductAttributeInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $attributeFactoryMock = $this->getMockBuilder(\Magento\Catalog\Api\Data\ProductAttributeInterfaceFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $attributeFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($attributeMock); + + //Mock Attribute Options + $optionMock = $this->getMockBuilder(AttributeOptionInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $optionFactoryMock = $this->getMockBuilder(\Magento\Eav\Api\Data\AttributeOptionInterfaceFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $optionFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($optionMock); + + $productAttributeRepoMock = $this->getMockBuilder( + ProductAttributeRepositoryInterface::class + ) + ->disableOriginalConstructor() + ->getMock(); + $productAttributeRepoMock->expects($this->once()) + ->method('save') + ->with($attributeMock) + ->willReturn($attributeMock); + + $productAttributeManagementMock = $this->getMockBuilder( + ProductAttributeManagementInterface::class + ) + ->disableOriginalConstructor() + ->getMock(); + $productAttributeManagementMock->expects($this->once()) + ->method('assign') + ->willReturn($attributeMock->getAttributeId()); + + $attributeSet = new AttributeSetFixture( + $attributeSetManagementMock, + $productAttributeGroupRepoMock, + $productAttributeRepoMock, + $productAttributeManagementMock, + $attributeFactoryMock, + $optionFactoryMock, + $attributeSetFactoryMock, + $attributeGroupFactoryMock + ); + $attributeSet->createAttributeSet($attributeSets); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/PatternTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/PatternTest.php new file mode 100644 index 0000000..c8065c6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/PatternTest.php @@ -0,0 +1,66 @@ + 'attribute set name', + 'attributes' => [ + 'attribute' => [ + [ + 'is_required' => 1, + 'is_visible_on_front' => 1, + 'is_visible_in_advanced_search' => 0, + 'is_filterable' => 0, + 'is_filterable_in_search' => 0, + 'attribute_code' => 'attribute_1', + 'is_searchable' => 0, + 'frontend_label' => 'Attribute 1', + 'frontend_input' => 'select', + 'backend_type' => 1, + 'default_value' => 'option_1', + 'options' => [ + 'option' => [ + [ + 'label' => 'option 1', + 'value' => 'option_1' + ], + [ + 'label' => 'option 2', + 'value' => 'option_2' + ] + ] + ] + ] + ] + ] + ]; + $pattern = new Pattern(); + $this->assertEquals( + $attributeSets, + $pattern->generateAttributeSet( + 'attribute set name', + 1, + 2, + function ($index, $attributeData) { + $attributeData['backend_type'] = $index; + return $attributeData; + } + ) + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/SwatchesGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/SwatchesGeneratorTest.php new file mode 100644 index 0000000..e14df18 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSet/SwatchesGeneratorTest.php @@ -0,0 +1,110 @@ + '/<-o->', + 'option_2' => '/>o<', + 'option_3' => '/|o|' + ]; + + protected function setUp(): void + { + // Mock Swatch Media Helper + $swatchHelperMock = $this->getMockBuilder(Media::class) + ->disableOriginalConstructor() + ->getMock(); + + $swatchHelperMock + ->expects($this->any()) + ->method('moveImageFromTmp') + ->willReturnOnConsecutiveCalls(...array_values($this->imagePathFixture)); + + // Mock image generator + $imageGeneratorMock = $this->getMockBuilder(ImagesGenerator::class) + ->disableOriginalConstructor() + ->getMock(); + + $imageGeneratorMock + ->expects($this->any()) + ->method('generate'); + + // Mock image generator factory + $imageGeneratorFactoryMock = $this->getMockBuilder(ImagesGeneratorFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $imageGeneratorFactoryMock + ->expects($this->once()) + ->method('create') + ->willReturn($imageGeneratorMock); + + $this->swatchesGeneratorMock = new SwatchesGenerator( + $swatchHelperMock, + $imageGeneratorFactoryMock + ); + } + + public function testGenerateSwatchData() + { + $attributeColorType['swatch_input_type'] = Swatch::SWATCH_INPUT_TYPE_VISUAL; + $attributeColorType['swatchvisual']['value'] = array_reduce( + range(1, 3), + function ($values, $index) { + $values['option_' . $index] = '#' . str_repeat(dechex(255 * $index / 3), 3); + return $values; + }, + [] + ); + + $attributeColorType['optionvisual']['value'] = array_reduce( + range(1, 3), + function ($values, $index) { + $values['option_' . $index] = ['option ' . $index]; + return $values; + }, + [] + ); + + $attributeImageType = $attributeColorType; + $attributeImageType['swatchvisual']['value'] = array_map( + function ($item) { + return ltrim($item, '/'); + }, + $this->imagePathFixture + ); + + $this->assertEquals( + $attributeColorType, + $this->swatchesGeneratorMock->generateSwatchData(3, 'test', 'color') + ); + + $this->assertEquals( + $attributeImageType, + $this->swatchesGeneratorMock->generateSwatchData(3, 'test', 'image') + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSetsFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSetsFixtureTest.php new file mode 100644 index 0000000..e00bcde --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSetsFixtureTest.php @@ -0,0 +1,117 @@ +fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->getMock(); + $this->attributeSetsFixtureMock = $this->getMockBuilder(AttributeSetFixture::class) + ->disableOriginalConstructor() + ->getMock(); + $this->patternMock = $this->getMockBuilder(Pattern::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->model = new AttributeSetsFixture( + $this->fixtureModelMock, + $this->attributeSetsFixtureMock, + $this->patternMock + ); + } + + public function testCreateAttributeSet() + { + $valueMap = [ + ['attribute_sets', null, ['attribute_set' => [['some-data']]]], + ['product_attribute_sets', null, null], + ]; + + $this->attributeSetsFixtureMock->expects($this->once()) + ->method('createAttributeSet') + ->with(['some-data']); + $this->fixtureModelMock + ->expects($this->exactly(2)) + ->method('getValue') + ->willReturnMap($valueMap); + + $this->model->execute(); + } + + public function testCreateProductAttributeSet() + { + $valueMap = [ + ['attribute_sets', null, null], + ['product_attribute_sets', null, 1], + ['product_attribute_sets_attributes', 3, 2], + ['product_attribute_sets_attributes_values', 3, 3], + ]; + + $closure = function () { + }; + $this->patternMock->expects($this->once()) + ->method('generateAttributeSet') + ->with(AttributeSetsFixture::PRODUCT_SET_NAME . 1, 2, 3, $closure) + ->willReturn(['some-data']); + $this->attributeSetsFixtureMock->expects($this->once()) + ->method('createAttributeSet') + ->with(['some-data']); + $this->fixtureModelMock + ->expects($this->exactly(4)) + ->method('getValue') + ->willReturnMap($valueMap); + + $this->model->execute(); + } + + public function testGetActionTitle() + { + $this->assertSame('Generating attribute sets', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame([ + 'attribute_sets' => 'Attribute Sets (Default)', + 'product_attribute_sets' => 'Attribute Sets (Extra)' + ], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CartPriceRulesFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CartPriceRulesFixtureTest.php new file mode 100644 index 0000000..23dac83 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CartPriceRulesFixtureTest.php @@ -0,0 +1,283 @@ +fixtureModelMock = $this->createMock(FixtureModel::class); + $this->ruleFactoryMock = $this->createPartialMock(\Magento\SalesRule\Model\RuleFactory::class, ['create']); + $this->model = new CartPriceRulesFixture($this->fixtureModelMock, $this->ruleFactoryMock); + } + + public function testExecute() + { + $storeMock = $this->createMock(Store::class); + $storeMock->expects($this->once()) + ->method('getRootCategoryId') + ->willReturn(2); + + $websiteMock = $this->createMock(Website::class); + $websiteMock->expects($this->once()) + ->method('getGroups') + ->willReturn([$storeMock]); + $websiteMock->expects($this->once()) + ->method('getId') + ->willReturn('website_id'); + + $contextMock = $this->createMock(Context::class); + $abstractDbMock = $this->getMockForAbstractClass( + AbstractDb::class, + [$contextMock], + '', + true, + true, + true, + ['getAllChildren'] + ); + $abstractDbMock->expects($this->once()) + ->method('getAllChildren') + ->willReturn([1]); + + $storeManagerMock = $this->createMock(StoreManager::class); + $storeManagerMock->expects($this->once()) + ->method('getWebsites') + ->willReturn([$websiteMock]); + + $categoryMock = $this->createMock(Category::class); + $categoryMock->expects($this->once()) + ->method('getResource') + ->willReturn($abstractDbMock); + $categoryMock->expects($this->once()) + ->method('getPath') + ->willReturn('path/to/file'); + $categoryMock->expects($this->once()) + ->method('getId') + ->willReturn('category_id'); + + $objectValueMap = [ + [Category::class, $categoryMock] + ]; + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->once()) + ->method('create') + ->willReturn($storeManagerMock); + $objectManagerMock->expects($this->once()) + ->method('get') + ->willReturnMap($objectValueMap); + + $valueMap = [ + ['cart_price_rules', 0, 1], + ['cart_price_rules_floor', 3, 3], + ['cart_price_rules_advanced_type', false, false] + ]; + + $this->fixtureModelMock + ->expects($this->exactly(3)) + ->method('getValue') + ->willReturnMap($valueMap); + $this->fixtureModelMock + ->expects($this->exactly(2)) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + + $ruleMock = $this->createMock(Rule::class); + $this->ruleFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($ruleMock); + + $this->model->execute(); + } + + public function testNoFixtureConfigValue() + { + $ruleMock = $this->createMock(Rule::class); + $ruleMock->expects($this->never())->method('save'); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->never()) + ->method('get') + ->with(Rule::class) + ->willReturn($ruleMock); + + $this->fixtureModelMock + ->expects($this->never()) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(false); + + $this->model->execute(); + } + + /** + * @param int $ruleId + * @param array $categoriesArray + * @param int $ruleCount + * @dataProvider dataProviderGenerateAdvancedCondition + */ + public function testGenerateAdvancedCondition($ruleId, $categoriesArray, $ruleCount) + { + $reflection = new \ReflectionClass($this->model); + $reflectionProperty = $reflection->getProperty('cartPriceRulesCount'); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($this->model, $ruleCount); + + $result = $this->model->generateAdvancedCondition($ruleId, $categoriesArray); + if ($ruleId < ($ruleCount - 200)) { + $firstCondition = [ + 'type' => Product::class, + 'attribute' => 'category_ids', + 'operator' => '==', + 'value' => 0, + ]; + + $secondCondition = [ + 'type' => Address::class, + 'attribute' => 'base_subtotal', + 'operator' => '>=', + 'value' => 5, + ]; + $expected = [ + 'conditions' => [ + 1 => [ + 'type' => Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1' => [ + 'type' => Found::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1--1' => $firstCondition, + '1--2' => $secondCondition + ], + 'actions' => [ + 1 => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + ] + ]; + } else { + // Shipping Region + $regions = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', + 'Delaware', 'District of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', + 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', + 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', + 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', + 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', + 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', + 'Wisconsin', 'Wyoming']; + $firstCondition = [ + 'type' => Address::class, + 'attribute' => 'region', + 'operator' => '==', + 'value' => $regions[intdiv($ruleId, 4) % 50], + ]; + + $secondCondition = [ + 'type' => Address::class, + 'attribute' => 'base_subtotal', + 'operator' => '>=', + 'value' => 5, + ]; + $expected = [ + 'conditions' => [ + 1 => [ + 'type' => Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1' => $firstCondition, + '1--2' => $secondCondition + ], + 'actions' => [ + 1 => [ + 'type' => \Magento\SalesRule\Model\Rule\Condition\Product\Combine::class, + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + ] + ]; + } + $this->assertSame($expected, $result); + } + + /** + * @return array + */ + public function dataProviderGenerateAdvancedCondition() + { + return [ + [1, [[0]], 1], + [1, [[0]], 300] + ]; + } + + public function testGetActionTitle() + { + $this->assertSame('Generating cart price rules', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame( + [ + 'cart_price_rules' => 'Cart Price Rules' + ], + $this->model->introduceParamLabels() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php new file mode 100644 index 0000000..f7f511a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php @@ -0,0 +1,164 @@ +fixtureModelMock = $this->createMock(FixtureModel::class); + + $this->model = new CatalogPriceRulesFixture($this->fixtureModelMock); + } + + public function testExecute() + { + $storeMock = $this->createMock(Store::class); + $storeMock->expects($this->once()) + ->method('getRootCategoryId') + ->willReturn(2); + + $websiteMock = $this->createMock(Website::class); + $websiteMock->expects($this->once()) + ->method('getGroups') + ->willReturn([$storeMock]); + $websiteMock->expects($this->once()) + ->method('getId') + ->willReturn('website_id'); + + $storeManagerMock = $this->createMock(StoreManager::class); + $storeManagerMock->expects($this->once()) + ->method('getWebsites') + ->willReturn([$websiteMock]); + + $contextMock = $this->createMock(Context::class); + $abstractDbMock = $this->getMockForAbstractClass( + AbstractDb::class, + [$contextMock], + '', + true, + true, + true, + ['getAllChildren'] + ); + $abstractDbMock->expects($this->once()) + ->method('getAllChildren') + ->willReturn([1]); + + $categoryMock = $this->createMock(Category::class); + $categoryMock->expects($this->once()) + ->method('getResource') + ->willReturn($abstractDbMock); + $categoryMock->expects($this->once()) + ->method('getPath') + ->willReturn('path/to/file'); + $categoryMock->expects($this->once()) + ->method('getId') + ->willReturn('category_id'); + + $modelMock = $this->createMock(Rule::class); + $metadataMock = $this->createMock(EntityMetadata::class); + $metadataPoolMock = $this->createMock(MetadataPool::class); + $metadataMock->expects($this->once()) + ->method('getLinkField') + ->willReturn('Field Id Name'); + + $valueMap = [ + [Rule::class, $modelMock], + [Category::class, $categoryMock], + [MetadataPool::class, $metadataPoolMock] + ]; + $metadataPoolMock + ->expects($this->once()) + ->method('getMetadata') + ->with(RuleInterface::class) + ->willReturn($metadataMock); + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->once()) + ->method('create') + ->willReturn($storeManagerMock); + $objectManagerMock->expects($this->exactly(3)) + ->method('get') + ->willReturnMap($valueMap); + + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(1); + $this->fixtureModelMock + ->expects($this->exactly(4)) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + + $this->model->execute(); + } + + public function testNoFixtureConfigValue() + { + $ruleMock = $this->createMock(\Magento\SalesRule\Model\Rule::class); + $ruleMock->expects($this->never())->method('save'); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->never()) + ->method('get') + ->with(\Magento\SalesRule\Model\Rule::class) + ->willReturn($ruleMock); + + $this->fixtureModelMock + ->expects($this->never()) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(false); + + $this->model->execute(); + } + + public function testGetActionTitle() + { + $this->assertSame('Generating catalog price rules', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame([ + 'catalog_price_rules' => 'Catalog Price Rules' + ], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CategoriesFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CategoriesFixtureTest.php new file mode 100644 index 0000000..1668c98 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CategoriesFixtureTest.php @@ -0,0 +1,180 @@ +fixtureModelMock = $this->createMock(FixtureModel::class); + $this->collectionFactoryMock = $this->createPartialMock(CollectionFactory::class, ['create']); + $this->collectionMock = $this->createMock(Collection::class); + $this->categoryFactoryMock = $this->createPartialMock(CategoryFactory::class, ['create']); + + $this->model = (new ObjectManager($this))->getObject(CategoriesFixture::class, [ + 'fixtureModel' => $this->fixtureModelMock, + 'collectionFactory' => $this->collectionFactoryMock, + 'rootCategoriesIds' => [2], + 'categoryFactory' => $this->categoryFactoryMock, + 'firstLevelCategoryIndex' => 1, + ]); + } + + public function testDoNoExecuteIfCategoriesAlreadyGenerated() + { + $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($this->collectionMock); + $this->collectionMock->expects($this->once())->method('getSize')->willReturn(32); + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(30); + $this->categoryFactoryMock->expects($this->never())->method('create'); + + $this->model->execute(); + } + + public function testExecute() + { + $valueMap = [ + ['categories', 0, 1], + ['categories_nesting_level', 3, 3] + ]; + + $this->fixtureModelMock + ->expects($this->exactly(2)) + ->method('getValue') + ->willReturnMap($valueMap); + + $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($this->collectionMock); + $this->collectionMock->expects($this->once())->method('getSize')->willReturn(2); + + $parentCategoryMock = $this->getMockBuilder(Category::class) + ->addMethods(['setUrlKey', 'setUrlPath', 'setDefaultSortBy', 'setIsAnchor']) + ->onlyMethods( + [ + 'getName', + 'setId', + 'getId', + 'setName', + 'setParentId', + 'setPath', + 'setLevel', + 'getLevel', + 'setAvailableSortBy', + 'setIsActive', + 'save', + 'setStoreId', + 'load' + ] + ) + ->disableOriginalConstructor() + ->getMock(); + $parentCategoryMock->expects($this->once())->method('getId')->willReturn(5); + $parentCategoryMock->expects($this->once())->method('getLevel')->willReturn(3); + $categoryMock = clone $parentCategoryMock; + $categoryMock->expects($this->once()) + ->method('getName') + ->with('Category 1') + ->willReturn('category_name'); + $categoryMock->expects($this->once()) + ->method('setId') + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setUrlKey') + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setUrlPath') + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setName') + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setParentId') + ->with(5) + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setPath') + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setIsAnchor') + ->with(true) + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setLevel') + ->with(4) + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setAvailableSortBy') + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setDefaultSortBy') + ->willReturnSelf(); + $categoryMock->expects($this->once()) + ->method('setIsActive') + ->willReturnSelf(); + $categoryMock->expects($this->exactly(2)) + ->method('setStoreId') + ->with(Store::DEFAULT_STORE_ID) + ->willReturnSelf(); + + $this->categoryFactoryMock->expects($this->once())->method('create')->willReturn($categoryMock); + + $this->model->execute(); + } + + public function testGetActionTitle() + { + $this->assertSame('Generating categories', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame([ + 'categories' => 'Categories' + ], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/ConfigsApplyFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/ConfigsApplyFixtureTest.php new file mode 100644 index 0000000..252b811 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/ConfigsApplyFixtureTest.php @@ -0,0 +1,103 @@ +fixtureModelMock = $this->createMock(FixtureModel::class); + + $this->model = new ConfigsApplyFixture($this->fixtureModelMock); + } + + public function testExecute() + { + $cacheMock = $this->createMock(Cache::class); + + $valueMock = $this->createMock(Config::class); + $configMock = $this->createMock(System::class); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock + ->method('get') + ->willReturnMap([ + [CacheInterface::class, $cacheMock], + [System::class, $configMock] + ]); + + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(['config' => $valueMock]); + $this->fixtureModelMock + ->method('getObjectManager') + ->willReturn($objectManagerMock); + + $cacheMock->method('clean'); + $configMock->method('clean'); + + $this->model->execute(); + } + + public function testNoFixtureConfigValue() + { + $configMock = $this->getMockBuilder(ValueInterface::class) + ->setMethods(['save']) + ->getMockForAbstractClass(); + $configMock->expects($this->never())->method('save'); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->never()) + ->method('create') + ->willReturn($configMock); + + $this->fixtureModelMock + ->expects($this->never()) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(false); + + $this->model->execute(); + } + + public function testGetActionTitle() + { + $this->assertSame('Config Changes', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame([], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/ConfigurableProductsFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/ConfigurableProductsFixtureTest.php new file mode 100644 index 0000000..a523eb3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/ConfigurableProductsFixtureTest.php @@ -0,0 +1,248 @@ +fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->setMethods(['createAttributeSet', 'getValue', 'getObjectManager']) + ->getMock(); + + $this->attributeSetsFixtureMock = $this->getMockBuilder(AttributeSetFixture::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->attributePatternMock = $this->getMockBuilder(Pattern::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->model = (new ObjectManager($this))->getObject(ConfigurableProductsFixture::class, [ + 'fixtureModel' => $this->fixtureModelMock, + 'attributeSetsFixture' => $this->attributeSetsFixtureMock, + 'attributePattern' => $this->attributePatternMock, + ]); + } + + /** + * @SuppressWarnings(PHPMD) + */ + public function testExecute() + { + $importMock = $this->getMockBuilder(Import::class) + ->disableOriginalConstructor() + ->getMock(); + + $categoryMock = $this->getMockBuilder(Category::class) + ->disableOriginalConstructor() + ->getMock(); + + $storeManagerMock = $this->getMockBuilder(StoreManager::class) + ->disableOriginalConstructor() + ->getMock(); + + $source = $this->getMockBuilder(Generator::class) + ->disableOriginalConstructor() + ->getMock(); + + $objectManagerMock = $this->getMockBuilder(\Magento\Framework\ObjectManager\ObjectManager::class) + ->disableOriginalConstructor() + ->getMock(); + + $attributeSetRepositoryMock = $this->getMockForAbstractClass( + AttributeSetRepositoryInterface::class + ); + + $productAttributeOptionManagementInterface = $this->getMockForAbstractClass( + ProductAttributeOptionManagementInterface::class + ); + + $objectManagerMock->expects($this->any()) + ->method('get') + ->willReturnMap([ + [ + StoreManager::class, + $storeManagerMock + ], + [ + AttributeSetRepositoryInterface::class, + $attributeSetRepositoryMock + ], + [ + ProductAttributeOptionManagementInterface::class, + $productAttributeOptionManagementInterface + ] + ]); + + $attributeCollectionFactoryMock = $this->getMockBuilder(CollectionFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + + $objectManagerMock->expects($this->any()) + ->method('create') + ->willReturnCallback( + function ($className) use ( + $attributeCollectionFactoryMock, + $categoryMock, + $importMock, + $source + ) { + if ($className === CollectionFactory::class) { + return $attributeCollectionFactoryMock; + } + + if ($className === Category::class) { + return $categoryMock; + } + + if ($className === Import::class) { + return $importMock; + } + + if ($className === Generator::class) { + return $source; + } + + return null; + } + ); + + $valuesMap = [ + ['configurable_products', 0, 1], + ['simple_products', 0, 1], + ['search_terms', null, ['search_term' =>[['term' => 'iphone 6', 'count' => '1']]]], + ['configurable_products_variation', 3, 1], + [ + 'search_config', + null, + [ + 'max_amount_of_words_description' => '200', + 'max_amount_of_words_short_description' => '20', + 'min_amount_of_words_description' => '20', + 'min_amount_of_words_short_description' => '5' + ] + ], + ['attribute_sets', + null, + [ + 'attribute_set' => [ + [ + 'name' => 'attribute set name', + 'attributes' => [ + 'attribute' => [ + [ + 'is_required' => 1, + 'is_visible_on_front' => 1, + 'is_visible_in_advanced_search' => 1, + 'is_filterable' => 1, + 'is_filterable_in_search' => 1, + 'default_value' => 'yellow1', + 'attribute_code' => 'mycolor', + 'is_searchable' => '1', + 'frontend_label' => 'mycolor', + 'frontend_input' => 'select', + 'options' => [ + 'option' => [ + [ + 'label' => 'yellow1', + 'value' => '' + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ]; + + $this->fixtureModelMock + ->expects($this->any()) + ->method('getValue') + ->willReturnMap($valuesMap); + + $this->model->execute(); + } + + public function testNoFixtureConfigValue() + { + $importMock = $this->getMockBuilder(Import::class) + ->disableOriginalConstructor() + ->getMock(); + $importMock->expects($this->never())->method('validateSource'); + $importMock->expects($this->never())->method('importSource'); + + $objectManagerMock = $this->getMockBuilder(\Magento\Framework\ObjectManager\ObjectManager::class) + ->disableOriginalConstructor() + ->getMock(); + $objectManagerMock->expects($this->never()) + ->method('create') + ->with(Import::class) + ->willReturn($importMock); + + $this->fixtureModelMock + ->expects($this->never()) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + + $this->model->execute(); + } + + public function testGetActionTitle() + { + $this->assertSame('Generating configurable products', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame([], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CouponCodesFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CouponCodesFixtureTest.php new file mode 100644 index 0000000..bc74872 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CouponCodesFixtureTest.php @@ -0,0 +1,166 @@ +fixtureModelMock = $this->createMock(FixtureModel::class); + $this->ruleFactoryMock = $this->createPartialMock(\Magento\SalesRule\Model\RuleFactory::class, ['create']); + $this->couponCodeFactoryMock = $this->createPartialMock( + \Magento\SalesRule\Model\CouponFactory::class, + ['create'] + ); + $this->model = new CouponCodesFixture( + $this->fixtureModelMock, + $this->ruleFactoryMock, + $this->couponCodeFactoryMock + ); + } + + /** + * testExecute + */ + public function testExecute() + { + $websiteMock = $this->createMock(Website::class); + $websiteMock->expects($this->once()) + ->method('getId') + ->willReturn('website_id'); + + $storeManagerMock = $this->createMock(StoreManager::class); + $storeManagerMock->expects($this->once()) + ->method('getWebsites') + ->willReturn([$websiteMock]); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->once()) + ->method('create') + ->willReturn($storeManagerMock); + + $valueMap = [ + ['coupon_codes', 0, 1] + ]; + + $this->fixtureModelMock + ->expects($this->exactly(1)) + ->method('getValue') + ->willReturnMap($valueMap); + $this->fixtureModelMock + ->expects($this->exactly(1)) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + + $ruleMock = $this->createMock(Rule::class); + $this->ruleFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($ruleMock); + + $couponMock = $this->createMock(Coupon::class); + $couponMock->expects($this->once()) + ->method('setRuleId') + ->willReturnSelf(); + $couponMock->expects($this->once()) + ->method('setCode') + ->willReturnSelf(); + $couponMock->expects($this->once()) + ->method('setIsPrimary') + ->willReturnSelf(); + $couponMock->expects($this->once()) + ->method('setType') + ->willReturnSelf(); + $couponMock->expects($this->once()) + ->method('save') + ->willReturnSelf(); + $this->couponCodeFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($couponMock); + + $this->model->execute(); + } + + /** + * testNoFixtureConfigValue + */ + public function testNoFixtureConfigValue() + { + $ruleMock = $this->createMock(Rule::class); + $ruleMock->expects($this->never())->method('save'); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->never()) + ->method('get') + ->with(Rule::class) + ->willReturn($ruleMock); + + $this->fixtureModelMock + ->expects($this->never()) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(false); + + $this->model->execute(); + } + + /** + * testGetActionTitle + */ + public function testGetActionTitle() + { + $this->assertSame('Generating coupon codes', $this->model->getActionTitle()); + } + + /** + * testIntroduceParamLabels + */ + public function testIntroduceParamLabels() + { + $this->assertSame(['coupon_codes' => 'Coupon Codes'], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CustomerGroupsFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CustomerGroupsFixtureTest.php new file mode 100644 index 0000000..43670ab --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CustomerGroupsFixtureTest.php @@ -0,0 +1,128 @@ +fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->getMock(); + + //Mock repository for customer groups + $this->groupRepositoryMock = $this->getMockBuilder(GroupRepositoryInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + //Mock for customer groups collection + $this->groupCollectionFactoryMock = $this->getMockBuilder(CollectionFactory::class) + ->setMethods(['create', 'getSize']) + ->disableOriginalConstructor() + ->getMock(); + + $this->groupCollectionFactoryMock + ->expects($this->once()) + ->method('create') + ->willReturn($this->groupCollectionFactoryMock); + + $this->groupCollectionFactoryMock + ->expects($this->once()) + ->method('getSize') + ->willReturn(0); + + //Mock customer groups data object + $this->groupDataObjectMock = $this->getMockBuilder(GroupInterface::class) + ->setMethods(['setCode', 'setTaxClassId', 'save']) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + //Mock customer groups factory + $this->groupFactoryMock = $this->getMockBuilder(GroupInterfaceFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + + $this->groupFactoryMock + ->expects($this->once()) + ->method('create') + ->willReturn($this->groupDataObjectMock); + + $this->groupDataObjectMock + ->expects($this->once()) + ->method('setCode') + ->willReturn($this->groupDataObjectMock); + + $this->groupDataObjectMock + ->expects($this->once()) + ->method('setTaxClassId') + ->willReturn($this->groupDataObjectMock); + + $this->groupRepositoryMock + ->expects($this->once()) + ->method('save') + ->willReturn($this->groupDataObjectMock); + + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(1); + + $this->model = new CustomerGroupsFixture( + $this->fixtureModelMock, + $this->groupCollectionFactoryMock, + $this->groupRepositoryMock, + $this->groupFactoryMock + ); + + $this->model->execute(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CustomersFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CustomersFixtureTest.php new file mode 100644 index 0000000..4cf6114 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/CustomersFixtureTest.php @@ -0,0 +1,140 @@ +fixtureModelMock = $this->createMock(FixtureModel::class); + + $this->customerGeneratorMock = + $this->createMock(CustomerGenerator::class); + + $this->customerDataGeneratorFactoryMock = + $this->createMock(CustomerDataGeneratorFactory::class); + + $this->collectionFactoryMock = + $this->createPartialMock( + \Magento\Customer\Model\ResourceModel\Customer\CollectionFactory::class, + ['create'] + ); + + $this->collectionMock = $this->createMock(Collection::class); + + $this->model = (new ObjectManager($this))->getObject(CustomersFixture::class, [ + 'fixtureModel' => $this->fixtureModelMock, + 'customerGenerator' => $this->customerGeneratorMock, + 'customerDataGeneratorFactory' => $this->customerDataGeneratorFactoryMock, + 'collectionFactory' => $this->collectionFactoryMock + ]); + } + + public function testExecute() + { + $entitiesInDB = 20; + $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($this->collectionMock); + $this->collectionMock->expects($this->once())->method('getSize')->willReturn($entitiesInDB); + + $customersNumber = 100500; + $customerConfig = [ + 'some-key' => 'some value' + ]; + + $this->fixtureModelMock + ->expects($this->exactly(2)) + ->method('getValue') + ->will($this->onConsecutiveCalls($customersNumber, $customerConfig)); + + $customerDataGeneratorMock = $this->createMock(CustomerDataGenerator::class); + + $this->customerDataGeneratorFactoryMock + ->expects($this->once()) + ->method('create') + ->with($customerConfig) + ->willReturn($customerDataGeneratorMock); + + $this->customerGeneratorMock + ->expects($this->once()) + ->method('generate') + ->with( + $customersNumber - $entitiesInDB, + $this->arrayHasKey('customer_data') + ); + + $this->model->execute(); + } + + public function testDoNoExecuteIfCustomersAlreadyGenerated() + { + $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($this->collectionMock); + $this->collectionMock->expects($this->once())->method('getSize')->willReturn(20); + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(20); + $this->customerDataGeneratorFactoryMock->expects($this->never())->method('create'); + + $this->model->execute(); + } + + public function testGetActionTitle() + { + $this->assertSame('Generating customers', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame( + [ + 'customers' => 'Customers' + ], + $this->model->introduceParamLabels() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/EavVariationsFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/EavVariationsFixtureTest.php new file mode 100644 index 0000000..88c3c0c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/EavVariationsFixtureTest.php @@ -0,0 +1,227 @@ +fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->getMock(); + $this->eavConfigMock = $this->getMockBuilder(Config::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeManagerMock = $this->getMockBuilder(StoreManager::class) + ->disableOriginalConstructor() + ->getMock(); + $this->attributeSetMock = $this->getMockBuilder(Set::class) + ->disableOriginalConstructor() + ->getMock(); + $this->cacheMock = $this->getMockBuilder(CacheInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->attributeFactoryMock = $this->getMockBuilder(AttributeFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + + $this->model = (new ObjectManager($this))->getObject( + EavVariationsFixture::class, + [ + 'fixtureModel' => $this->fixtureModelMock, + 'eavConfig' => $this->eavConfigMock, + 'storeManager' => $this->storeManagerMock, + 'attributeSet' => $this->attributeSetMock, + 'cache' => $this->cacheMock, + 'attributeFactory' => $this->attributeFactoryMock, + ] + ); + } + + /** + * Test for execute method when attribute already exists. + * + * @return void + */ + public function testDoNotExecuteWhenAttributeAlreadyExist() + { + $this->fixtureModelMock->expects($this->once()) + ->method('getValue')->with('configurable_products', [])->willReturn(10); + $this->eavConfigMock->expects($this->once())->method('getEntityAttributeCodes') + ->willReturn(['configurable_variation']); + $this->attributeFactoryMock->expects($this->never())->method('create'); + + $this->model->execute(); + } + + /** + * Test for execute method. + * + * @return void + */ + public function testExecute() + { + $storeId = 5; + $this->eavConfigMock->expects($this->once()) + ->method('getEntityAttributeCodes')->willReturn(['attr1', 'attr2']); + $this->fixtureModelMock + ->expects($this->any()) + ->method('getValue') + ->willReturnMap([ + ['configurable_products', [], ['some-config']], + ['configurable_products_variation', 3, 1], + ]); + + $storeMock = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeManagerMock->expects($this->once())->method('getStores')->willReturn([$storeId => $storeMock]); + $this->attributeSetMock->expects($this->once())->method('load')->willReturnSelf(); + $this->attributeSetMock->expects($this->once())->method('getDefaultGroupId')->willReturn(2); + + $attributeMock = $this->getMockBuilder(Attribute::class) + ->setMethods([ + 'setAttributeSetId', + 'setAttributeGroupId', + 'save', + ]) + ->disableOriginalConstructor() + ->getMock(); + $attributeMock->expects($this->exactly(2))->method('setAttributeSetId')->willReturnSelf(); + $attributeMock->expects($this->once())->method('setAttributeGroupId')->willReturnSelf(); + $this->attributeFactoryMock->expects($this->once())->method('create') + ->with( + [ + 'data' => [ + 'frontend_label' => [ + $storeId => 'configurable variations', + ], + 'frontend_input' => 'select', + 'is_required' => '0', + 'option' => [ + 'order' => ['option_1' => 1], + 'value' => ['option_1' => [$storeId => 'option 1']], + 'delete' => ['option_1' => ''], + ], + 'default' => ['option_0'], + 'attribute_code' => 'configurable_variation', + 'is_global' => '1', + 'default_value_text' => '', + 'default_value_yesno' => '0', + 'default_value_date' => '', + 'default_value_textarea' => '', + 'is_unique' => '0', + 'is_searchable' => '1', + 'is_visible_in_advanced_search' => '0', + 'is_comparable' => '0', + 'is_filterable' => '1', + 'is_filterable_in_search' => '0', + 'is_used_for_promo_rules' => '0', + 'is_html_allowed_on_front' => '1', + 'is_visible_on_front' => '0', + 'used_in_product_listing' => '0', + 'used_for_sort_by' => '0', + 'source_model' => null, + 'backend_model' => null, + 'apply_to' => [], + 'backend_type' => 'int', + 'entity_type_id' => 4, + 'is_user_defined' => 1, + 'swatch_input_type' => 'visual', + 'swatchvisual' => [ + 'value' => ['option_1' => '#ffffff'], + ], + 'optionvisual' => [ + 'value' => ['option_1' => ['option 1']], + ], + ] + ] + )->willReturn($attributeMock); + $this->cacheMock->expects($this->once()) + ->method('remove')->with(Config::ATTRIBUTES_CACHE_ID . Product::ENTITY); + + $this->model->execute(); + } + + /** + * Test for getActionTitle method. + * + * @return void + */ + public function testGetActionTitle() + { + $this->assertSame('Generating configurable EAV variations', $this->model->getActionTitle()); + } + + /** + * Test for introduceParamLabels method. + * + * @return void + */ + public function testIntroduceParamLabels() + { + $this->assertSame([], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/FixtureConfigTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/FixtureConfigTest.php new file mode 100644 index 0000000..47e8a30 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/FixtureConfigTest.php @@ -0,0 +1,83 @@ +fileParserMock = $this->createPartialMock(Parser::class, ['getDom', 'xmlToArray']); + + $this->model = new FixtureConfig($this->fileParserMock); + } + + public function testLoadConfigException() + { + $this->expectException('Exception'); + $this->expectExceptionMessage( + 'Profile configuration file `exception.file` is not readable or does not exists.' + ); + $this->model->loadConfig('exception.file'); + } + + public function testLoadConfig() + { + $this->fileParserMock->expects($this->exactly(2))->method('xmlToArray')->willReturn( + ['config' => [ 'profile' => ['some_key' => 'some_value']]] + ); + + $domMock = $this->createPartialMock(\DOMDocument::class, ['load', 'xinclude']); + $domMock->expects($this->once())->method('load')->with('config.file')->willReturn( + $this->fileParserMock->xmlToArray() + ); + $domMock->expects($this->once())->method('xinclude'); + $this->fileParserMock->expects($this->exactly(2))->method('getDom')->willReturn($domMock); + + $this->model->loadConfig('config.file'); + $this->assertSame('some_value', $this->model->getValue('some_key')); + } + + public function testGetValue() + { + $this->assertNull($this->model->getValue('null_key')); + } +} + +namespace Magento\Setup\Fixtures; + +/** + * Overriding the built-in PHP function since it cannot be mocked-> + * + * The method is used in FixtureModel. loadConfig in an if statement. By overriding this method we are able to test + * both of the possible cases based on the return value of is_readable. + * + * @param string $filename + * @return bool + */ +function is_readable($filename) +{ + if (strpos($filename, 'exception') !== false) { + return false; + } + return true; +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/FixtureModelTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/FixtureModelTest.php new file mode 100644 index 0000000..6b33400 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/FixtureModelTest.php @@ -0,0 +1,33 @@ +createMock(IndexerReindexCommand::class); + $this->model = new FixtureModel($reindexCommandMock); + } + + public function testReindex() + { + $outputMock = $this->getMockForAbstractClass(OutputInterface::class); + $this->model->reindex($outputMock); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/IndexersStatesApplyFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/IndexersStatesApplyFixtureTest.php new file mode 100644 index 0000000..bcc086e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/IndexersStatesApplyFixtureTest.php @@ -0,0 +1,108 @@ +fixtureModelMock = $this->createMock(FixtureModel::class); + + $this->model = new IndexersStatesApplyFixture($this->fixtureModelMock); + } + + public function testExecute() + { + $cacheInterfaceMock = $this->getMockForAbstractClass(CacheInterface::class); + $indexerRegistryMock = $this->createMock(IndexerRegistry::class); + $indexerMock = $this->getMockForAbstractClass(IndexerInterface::class); + + $indexerRegistryMock->expects($this->once()) + ->method('get') + ->willReturn($indexerMock); + + $indexerMock->expects($this->once()) + ->method('setScheduled'); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->once()) + ->method('get') + ->willReturn($cacheInterfaceMock); + $objectManagerMock->expects($this->once()) + ->method('create') + ->willReturn($indexerRegistryMock); + + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn([ + 'indexer' => [ + [ + 'id' => 1, + 'set_scheduled' => false, + ] + ] + ]); + $this->fixtureModelMock + ->method('getObjectManager') + ->willReturn($objectManagerMock); + + $this->model->execute(); + } + + public function testNoFixtureConfigValue() + { + $cacheInterfaceMock = $this->getMockForAbstractClass(CacheInterface::class); + $cacheInterfaceMock->expects($this->never())->method('clean'); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->never()) + ->method('get') + ->willReturn($cacheInterfaceMock); + + $this->fixtureModelMock + ->expects($this->never()) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(false); + + $this->model->execute(); + } + + public function testGetActionTitle() + { + $this->assertSame('Indexers Mode Changes', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame([], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/OrdersFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/OrdersFixtureTest.php new file mode 100644 index 0000000..8170a76 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/OrdersFixtureTest.php @@ -0,0 +1,112 @@ +getMockBuilder(StoreManagerInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $productCollectionFactoryMock = $this->getMockBuilder( + CollectionFactory::class + ) + ->disableOriginalConstructor() + ->getMock(); + + $productRepositoryMock = $this->getMockBuilder(ProductRepositoryInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $optionRepositoryMock = $this->getMockBuilder(OptionRepositoryInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $linkManagementMock = $this->getMockBuilder(LinkManagementInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $serializerMock = $this->getMockBuilder(SerializerInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->model = new OrdersFixture( + $storeManagerMock, + $productCollectionFactoryMock, + $productRepositoryMock, + $optionRepositoryMock, + $linkManagementMock, + $serializerMock, + $this->fixtureModelMock + ); + + $orderMock = $this->getMockBuilder(Order::class) + ->addMethods(['getTableName', 'query', 'fetchColumn']) + ->onlyMethods(['getTable', 'getConnection']) + ->disableOriginalConstructor() + ->getMock(); + + $path = explode('\\', Order::class); + $name = array_pop($path); + + $orderMock->expects($this->atLeastOnce()) + ->method('getConnection') + ->willReturn($orderMock); + $orderMock->expects($this->once()) + ->method('getTable') + ->willReturn(strtolower($name) . '_table_name'); + $orderMock->expects($this->once()) + ->method('query') + ->willReturn($orderMock); + $orderMock->expects($this->once()) + ->method('getTableName') + ->willReturn(strtolower($name) . '_table_name'); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->atLeastOnce()) + ->method('get') + ->willReturn($orderMock); + + $this->fixtureModelMock + ->expects($this->atLeastOnce()) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + + $this->model->execute(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteConfigurationTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteConfigurationTest.php new file mode 100644 index 0000000..564f997 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteConfigurationTest.php @@ -0,0 +1,82 @@ +fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->getMock(); + $objectManager = new ObjectManager($this); + + $this->fixture = $objectManager->getObject( + QuoteConfiguration::class, + [ + 'fixtureModel' => $this->fixtureModelMock + ] + ); + } + + /** + * Test load method. + * + * @return void + */ + public function testLoad() + { + $dir = str_replace('Test/Unit/', '', dirname(__DIR__)); + $expectedResult = [ + 'simple_count_to' => 1, + 'simple_count_from' => 1, + 'configurable_count_to' => 1, + 'configurable_count_from' => 1, + 'big_configurable_count_to' => 1, + 'big_configurable_count_from' => 1, + 'fixture_data_filename' => $dir . DIRECTORY_SEPARATOR . "_files" + . DIRECTORY_SEPARATOR . 'orders_fixture_data.json', + 'order_quotes_enable' => 1, + ]; + $this->fixtureModelMock->expects($this->atLeastOnce()) + ->method('getValue') + ->withConsecutive( + ['order_simple_product_count_to'], + ['order_simple_product_count_from'], + ['order_configurable_product_count_to'], + ['order_configurable_product_count_from'], + ['order_big_configurable_product_count_to'], + ['order_big_configurable_product_count_from'], + ['order_quotes_enable'] + )->willReturn(1); + $this->assertSame($expectedResult, $this->fixture->load()->getData()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteGeneratorFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteGeneratorFactoryTest.php new file mode 100644 index 0000000..9acd3eb --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteGeneratorFactoryTest.php @@ -0,0 +1,68 @@ +objectManager = $this->getMockBuilder(ObjectManagerInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $objectManager = new ObjectManager($this); + + $this->fixture = $objectManager->getObject( + QuoteGeneratorFactory::class, + [ + 'objectManager' => $this->objectManager, + 'instanceName' => QuoteGenerator::class, + ] + ); + } + + /** + * Test create method. + * + * @return void + */ + public function testCreate() + { + $result = $this->getMockBuilder(QuoteGenerator::class) + ->disableOriginalConstructor() + ->getMock(); + $this->objectManager->expects($this->once()) + ->method('create') + ->with(QuoteGenerator::class, []) + ->willReturn($result); + + $this->assertSame($result, $this->fixture->create([])); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteGeneratorTest.php new file mode 100644 index 0000000..fc06f90 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/Quote/QuoteGeneratorTest.php @@ -0,0 +1,321 @@ +fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeManager = $this->getMockBuilder(StoreManagerInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->productRepository = $this->getMockBuilder(ProductRepositoryInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->optionRepository = $this->getMockBuilder( + OptionRepositoryInterface::class + ) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->productCollectionFactory = $this->getMockBuilder( + \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory::class + ) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->linkManagement = $this->getMockBuilder(LinkManagementInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->serializer = $this->getMockBuilder(SerializerInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->config = $this->getMockBuilder(QuoteConfiguration::class) + ->disableOriginalConstructor() + ->setMethods( + [ + 'getSimpleCountTo', + 'getSimpleCountFrom', + 'getConfigurableCountTo', + 'getConfigurableCountFrom', + 'getBigConfigurableCountTo', + 'getBigConfigurableCountFrom', + 'getRequiredQuoteQuantity', + 'getFixtureDataFilename', + 'getExistsQuoteQuantity', + ] + ) + ->getMock(); + $objectManager = new ObjectManager($this); + + $this->fixture = $objectManager->getObject( + QuoteGenerator::class, + [ + 'fixtureModel' => $this->fixtureModelMock, + 'storeManager' => $this->storeManager, + 'productRepository' => $this->productRepository, + 'optionRepository' => $this->optionRepository, + 'productCollectionFactory' => $this->productCollectionFactory, + 'linkManagement' => $this->linkManagement, + 'serializer' => $this->serializer, + 'config' => $this->config, + ] + ); + } + + /** + * Test generateQuotes method. + * + * @return void + */ + public function testGenerateQuotes() + { + $storeId = 1; + $websiteId = 1; + $storeGroupId = 1; + $simpleProductIds = [1, 2]; + $configurableProductId = [3]; + $bigConfigurableProductId = [4]; + $dir = str_replace('Test/Unit/', '', dirname(__DIR__)); + $store = $this->getMockBuilder(StoreInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $website = $this->getMockBuilder(WebsiteInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $storeGroup = $this->getMockBuilder(GroupInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $productCollection = $this->getMockBuilder(Collection::class) + ->disableOriginalConstructor() + ->getMock(); + $select = $this->getMockBuilder(Select::class) + ->disableOriginalConstructor() + ->getMock(); + $this->config->expects($this->atLeastOnce())->method('getSimpleCountFrom')->willReturn(0); + $this->config->expects($this->atLeastOnce())->method('getSimpleCountTo')->willReturn(2); + $this->config->expects($this->atLeastOnce())->method('getConfigurableCountFrom')->willReturn(0); + $this->config->expects($this->atLeastOnce())->method('getConfigurableCountTo')->willReturn(1); + $this->config->expects($this->atLeastOnce())->method('getBigConfigurableCountFrom')->willReturn(0); + $this->config->expects($this->atLeastOnce())->method('getBigConfigurableCountTo')->willReturn(1); + $this->config->expects($this->atLeastOnce())->method('getRequiredQuoteQuantity')->willReturn(1); + $this->config->expects($this->atLeastOnce())->method('getExistsQuoteQuantity')->willReturn(0); + $this->config->expects($this->atLeastOnce()) + ->method('getFixtureDataFilename') + ->willReturn($dir . DIRECTORY_SEPARATOR . "_files" . DIRECTORY_SEPARATOR . 'orders_fixture_data.json'); + $this->storeManager->expects($this->atLeastOnce())->method('getStores')->willReturn([$store]); + $this->storeManager->expects($this->atLeastOnce()) + ->method('getWebsite')->with($websiteId)->willReturn($website); + $this->storeManager->expects($this->atLeastOnce()) + ->method('getGroup')->with($storeGroupId)->willReturn($storeGroup); + $store->expects($this->atLeastOnce())->method('getId')->willReturn($storeId); + $store->expects($this->atLeastOnce())->method('getWebsiteId')->willReturn($websiteId); + $store->expects($this->atLeastOnce())->method('getStoreGroupId')->willReturn($storeGroupId); + $website->expects($this->atLeastOnce())->method('getName')->willReturn('Default'); + $store->expects($this->atLeastOnce())->method('getName')->willReturn('Default'); + $storeGroup->expects($this->atLeastOnce())->method('getName')->willReturn('Default'); + $this->storeManager->expects($this->atLeastOnce())->method('setCurrentStore')->with($storeId); + $this->productCollectionFactory->expects($this->atLeastOnce()) + ->method('create')->willReturn($productCollection); + $productCollection->expects($this->atLeastOnce())->method('addStoreFilter')->with(1)->willReturnSelf(); + $productCollection->expects($this->atLeastOnce())->method('addWebsiteFilter')->with(1)->willReturnSelf(); + $productCollection->expects($this->atLeastOnce())->method('getSelect')->willReturn($select); + $select->expects($this->atLeastOnce()) + ->method('where') + ->withConsecutive( + [' type_id = \'simple\' '], + [' sku NOT LIKE \'Big%\' '], + [' type_id = \'configurable\' '], + [' sku NOT LIKE \'Big%\' '], + [' type_id = \'configurable\' '], + [' sku LIKE \'Big%\' '] + )->willReturnSelf(); + $productCollection->expects($this->atLeastOnce()) + ->method('getAllIds') + ->withConsecutive([2], [1], [1]) + ->willReturnOnConsecutiveCalls($simpleProductIds, $configurableProductId, $bigConfigurableProductId); + $this->prepareProducts(); + $this->mockConnection(); + $this->fixture->generateQuotes(); + } + + /** + * Prepare products mocks. + * + * @return void + */ + private function prepareProducts() + { + $product = $this->getMockBuilder(ProductInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $configurableChild = $this->getMockBuilder(ProductInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $childProduct = $this->getMockBuilder(ProductInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $option = $this->getMockBuilder(Attribute::class) + ->disableOriginalConstructor() + ->getMock(); + $optionValue = $this->getMockBuilder(OptionValueInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->productRepository->expects($this->atLeastOnce()) + ->method('getById') + ->withConsecutive([1], [2], [3], [4]) + ->willReturn($product); + $product->expects($this->atLeastOnce()) + ->method('getSku')->willReturnOnConsecutiveCalls('sku1', 'sku2', 'sku3', 'sku3', 'sku4', 'sku4'); + $product->expects($this->atLeastOnce()) + ->method('getName')->willReturnOnConsecutiveCalls('name1', 'name2', 'name3', 'name4'); + $this->serializer->expects($this->atLeastOnce()) + ->method('serialize') + ->willReturn('a:1:{i:10;i:1;}'); + $this->optionRepository->expects($this->atLeastOnce()) + ->method('getList') + ->withConsecutive(['sku3'], ['sku4']) + ->willReturn([$option]); + $this->linkManagement->expects($this->atLeastOnce()) + ->method('getChildren') + ->withConsecutive(['sku3'], ['sku4']) + ->willReturn([$configurableChild]); + $configurableChild->expects($this->atLeastOnce()) + ->method('getSku') + ->willReturnOnConsecutiveCalls('childSku3', 'childSku3', 'childSku4', 'childSku4'); + $this->productRepository->expects($this->atLeastOnce()) + ->method('get') + ->withConsecutive(['childSku3'], ['childSku4']) + ->willReturn($childProduct); + $childProduct->expects($this->atLeastOnce())->method('getId')->willReturnOnConsecutiveCalls(10, 11); + $option->expects($this->atLeastOnce())->method('getLabel')->willReturnOnConsecutiveCalls('label3', 'label4'); + $option->expects($this->atLeastOnce()) + ->method('getAttributeId')->willReturnOnConsecutiveCalls(10, 10, 20, 20); + $option->expects($this->atLeastOnce())->method('getValues')->willReturn([$optionValue]); + $optionValue->expects($this->atLeastOnce())->method('getValueIndex')->willReturn(1); + $configurableChild->expects($this->atLeastOnce()) + ->method('getName')->willReturnOnConsecutiveCalls('childName3', 'childName4'); + } + + /** + * Mock connection to DB and queries. + * + * @return void + */ + private function mockConnection() + { + $objectManager = $this->getMockBuilder(ObjectManagerInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $resource = $this->getMockBuilder(AbstractDb::class) + ->disableOriginalConstructor() + ->getMock(); + $connection = $this->getMockBuilder(AdapterInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $statement = $this->getMockBuilder(Mysql::class) + ->disableOriginalConstructor() + ->getMock(); + $this->fixtureModelMock->expects($this->atLeastOnce())->method('getObjectManager')->willReturn($objectManager); + $objectManager->expects($this->atLeastOnce()) + ->method('get') + ->willReturn($resource); + $resource->expects($this->atLeastOnce())->method('getConnection')->willReturn($connection); + $connection->expects($this->atLeastOnce()) + ->method('getTableName') + ->willReturn('table_name'); + $resource->expects($this->atLeastOnce()) + ->method('getTable') + ->willReturn('table_name'); + $connection->expects($this->atLeastOnce()) + ->method('query') + ->willReturn($statement); + $connection->expects($this->atLeastOnce())->method('getTransactionLevel')->willReturn(0); + $connection->expects($this->atLeastOnce())->method('beginTransaction')->willReturnSelf(); + $statement->expects($this->atLeastOnce())->method('fetchColumn')->with(0)->willReturn(25); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/StoresFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/StoresFixtureTest.php new file mode 100644 index 0000000..962789d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/StoresFixtureTest.php @@ -0,0 +1,296 @@ +fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->storeManagerMock = $this->getMockBuilder(StoreManager::class) + ->disableOriginalConstructor() + ->setMethods( + [ + 'getGroup', + 'getGroups', + 'getWebsite', + 'getDefaultStoreView', + 'getStore', + 'getStores', + ] + )->getMock(); + + $this->eventManagerMock = $this->getMockBuilder(ManagerInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->categoryFactoryMock = $this->getMockBuilder(CategoryFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $categoryMock = $this->getMockBuilder(CategoryInterface::class) + ->disableOriginalConstructor() + ->setMethods( + [ + 'create', + 'setName', + 'setPath', + 'setLevel', + 'setAvailableSortBy', + 'setDefaultSortBy', + 'setIsActive', + 'save' + ] + ) + ->getMockForAbstractClass(); + + $this->categoryFactoryMock->expects($this->exactly(5)) + ->method('create') + ->willReturn($categoryMock); + + $categoryMock->expects($this->exactly(5)) + ->method('setName') + ->willReturn($categoryMock); + + $categoryMock->expects($this->exactly(5)) + ->method('setPath') + ->willReturn($categoryMock); + + $categoryMock->expects($this->exactly(5)) + ->method('setLevel') + ->willReturn($categoryMock); + + $categoryMock->expects($this->exactly(5)) + ->method('setAvailableSortBy') + ->willReturn($categoryMock); + + $categoryMock->expects($this->exactly(5)) + ->method('setDefaultSortBy') + ->willReturn($categoryMock); + + $categoryMock->expects($this->exactly(5)) + ->method('setIsActive') + ->willReturn($categoryMock); + + $categoryMock->expects($this->exactly(5)) + ->method('getId') + ->willReturn($categoryMock); + + $categoryMock->expects($this->exactly(5)) + ->method('save') + ->willReturn($categoryMock); + + $this->localeConfigMock = $this->getMockBuilder(Config::class) + ->disableOriginalConstructor() + ->setMethods(['getAllowedLocales']) + ->getMock(); + + $this->localeConfigMock->expects($this->once()) + ->method('getAllowedLocales') + ->willReturn(['en_US']); + + $this->scopeConfigMock = $this->getMockBuilder(Writer::class) + ->disableOriginalConstructor() + ->getMock(); + + $storeMock = $this->getMockBuilder(StoreInterface::class) + ->disableOriginalConstructor() + ->setMethods(['getId', 'getRootCategoryId', 'addData', 'save']) + ->getMockForAbstractClass(); + + $storeMock->expects($this->exactly(11)) + ->method('getId') + ->willReturn(1); + + $storeMock->expects($this->exactly(11)) + ->method('addData') + ->withConsecutive( + [ + [ + 'store_id' => null, + 'name' => 'Store view 2 - website_id_1 - group_id_1', + 'website_id' => 1, + 'group_id' => 1, + 'code' => 'store_view_2', + ] + ], + [ + [ + 'store_id' => null, + 'name' => 'Store view 3 - website_id_1 - group_id_1', + 'website_id' => 1, + 'group_id' => 1, + 'code' => 'store_view_3', + ] + ] + ) + ->willReturn($storeMock); + + $storeGroupMock = $this->getMockBuilder(GroupInterface::class) + ->disableOriginalConstructor() + ->setMethods(['getId', 'addData', 'save']) + ->getMockForAbstractClass(); + + $storeGroupMock->expects($this->exactly(11)) + ->method('getId') + ->willReturn(1); + + $storeGroupMock->expects($this->exactly(5)) + ->method('addData') + ->withConsecutive( + [ + [ + 'group_id' => null, + 'website_id' => 1, + 'name' => 'Store Group 2 - website_id_1', + 'code' => 'store_group_2', + 'root_category_id' => $categoryMock, + ] + ], + [ + [ + 'group_id' => null, + 'website_id' => 1, + 'name' => 'Store Group 3 - website_id_1', + 'code' => 'store_group_3', + 'root_category_id' => $categoryMock, + ] + ] + ) + ->willReturn($storeGroupMock); + + $websiteMock = $this->getMockBuilder(WebsiteInterface::class) + ->disableOriginalConstructor() + ->setMethods(['getId', 'addData', 'save']) + ->getMockForAbstractClass(); + + $websiteMock->expects($this->exactly(3)) + ->method('getId') + ->willReturn(1); + + $websiteMock->expects($this->exactly(2)) + ->method('addData') + ->withConsecutive( + [ + [ + 'website_id' => null, + 'code' => 'website_2', + 'name' => 'Website 2', + 'is_default' => false, + ] + ], + [ + [ + 'website_id' => null, + 'code' => 'website_3', + 'name' => 'Website 3', + 'is_default' => false, + ] + ] + ) + ->willReturn($storeGroupMock); + + $this->storeManagerMock->expects($this->once()) + ->method('getGroups') + ->willReturn([$storeGroupMock]); + + $this->storeManagerMock->expects($this->once()) + ->method('getGroup') + ->willReturn($storeGroupMock); + + $this->storeManagerMock->expects($this->once()) + ->method('getWebsite') + ->willReturn($websiteMock); + + $this->storeManagerMock->expects($this->once()) + ->method('getStores') + ->willReturn([$storeMock]); + + $this->storeManagerMock->expects($this->once()) + ->method('getDefaultStoreView') + ->willReturn($storeMock); + + $this->fixtureModelMock + ->expects($this->exactly(4)) + ->method('getValue') + ->willReturnMap([ + ['websites', 1, 3], + ['store_groups', 1, 6], + ['store_views', 1, 12], + ['assign_entities_to_all_websites', false] + ]); + + $this->model = new StoresFixture( + $this->fixtureModelMock, + $this->storeManagerMock, + $this->eventManagerMock, + $this->categoryFactoryMock, + $this->localeConfigMock, + $this->scopeConfigMock + ); + + $this->model->execute(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/TaxRatesFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/TaxRatesFixtureTest.php new file mode 100644 index 0000000..0713e87 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/TaxRatesFixtureTest.php @@ -0,0 +1,107 @@ +fixtureModelMock = $this->createMock(FixtureModel::class); + + $this->model = new TaxRatesFixture($this->fixtureModelMock); + } + + public function testExecute() + { + $rateMock = $this->createPartialMock(Rate::class, ['setId', 'delete']); + + $collectionMock = + $this->createMock(Collection::class); + $collectionMock->expects($this->once()) + ->method('getAllIds') + ->willReturn([1]); + + $csvImportHandlerMock = $this->createMock(CsvImportHandler::class); + + $valueMap = [ + [Rate::class, $rateMock], + [Collection::class, $collectionMock] + ]; + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->exactly(2)) + ->method('get') + ->willReturnMap($valueMap); + $objectManagerMock->expects($this->once()) + ->method('create') + ->willReturn($csvImportHandlerMock); + + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn('taxRates.file'); + $this->fixtureModelMock + ->expects($this->exactly(3)) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + + $this->model->execute(); + } + + public function testNoFixtureConfigValue() + { + $csvImportHandlerMock = $this->createMock(CsvImportHandler::class); + $csvImportHandlerMock->expects($this->never())->method('importFromCsvFile'); + + $objectManagerMock = $this->createMock(ObjectManager::class); + $objectManagerMock->expects($this->never()) + ->method('create') + ->willReturn($csvImportHandlerMock); + + $this->fixtureModelMock + ->expects($this->never()) + ->method('getObjectManager') + ->willReturn($objectManagerMock); + $this->fixtureModelMock + ->expects($this->once()) + ->method('getValue') + ->willReturn(false); + + $this->model->execute(); + } + + public function testGetActionTitle() + { + $this->assertSame('Generating tax rates', $this->model->getActionTitle()); + } + + public function testIntroduceParamLabels() + { + $this->assertSame([], $this->model->introduceParamLabels()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/TaxRulesFixtureTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/TaxRulesFixtureTest.php new file mode 100644 index 0000000..bc288ef --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Fixtures/TaxRulesFixtureTest.php @@ -0,0 +1,132 @@ +fixtureModelMock = $this->getMockBuilder(FixtureModel::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->taxRateFactoryMock = $this->getMockBuilder(TaxRateInterfaceFactory::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->taxRateRepositoryMock = $this->getMockBuilder(TaxRateRepositoryInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->configWriterMock = $this->getMockBuilder(ConfigWriter::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->taxRuleFactoryMock = $this->getMockBuilder(TaxRuleInterfaceFactory::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->taxRuleRepositoryMock = $this->getMockBuilder(TaxRuleRepositoryInterface::class) + ->disableOriginalConstructor() + ->setMethods(['save', 'get', 'delete', 'deleteById', 'getList']) + ->getMockForAbstractClass(); + + $this->fixtureModelMock + ->expects($this->exactly(2)) + ->method('getValue') + ->willReturnMap([ + ['tax_mode', 'VAT'], + ['tax_rules', 2] + ]); + + $this->taxRateCollectionFactoryMock = $this->getMockBuilder(CollectionFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $taxRateCollectionMock = $this->getMockBuilder(Collection::class) + ->disableOriginalConstructor() + ->setMethods(['getAllIds']) + ->getMock(); + + $this->taxRateCollectionFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($taxRateCollectionMock); + + $taxRateCollectionMock->expects($this->once()) + ->method('getAllIds') + ->willReturn([1]); + + $this->model = new TaxRulesFixture( + $this->fixtureModelMock, + $this->taxRuleRepositoryMock, + $this->taxRuleFactoryMock, + $this->taxRateCollectionFactoryMock, + $this->taxRateFactoryMock, + $this->taxRateRepositoryMock, + $this->configWriterMock + ); + + $this->model->execute(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Address/AddressDataGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Address/AddressDataGeneratorTest.php new file mode 100644 index 0000000..f40db75 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Address/AddressDataGeneratorTest.php @@ -0,0 +1,53 @@ +addressGenerator = new AddressDataGenerator(); + } + + public function testPostcode() + { + // phpcs:ignore + mt_srand(42); + $address1 = $this->addressGenerator->generateAddress(); + + // phpcs:ignore + mt_srand(66); + $address2 = $this->addressGenerator->generateAddress(); + + $this->assertNotEquals($address1['postcode'], $address2['postcode']); + } + + public function testAddressStructure() + { + $address = $this->addressGenerator->generateAddress(); + + foreach ($this->addressStructure as $addressField) { + $this->assertArrayHasKey($addressField, $address); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/AdminAccountFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/AdminAccountFactoryTest.php new file mode 100644 index 0000000..94c938c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/AdminAccountFactoryTest.php @@ -0,0 +1,38 @@ +getMockBuilder(ServiceLocatorInterface::class) + ->onlyMethods(['get']) + ->getMockForAbstractClass(); + $serviceLocatorMock + ->expects($this->once()) + ->method('get') + ->with(Encryptor::class) + ->willReturn($this->getMockForAbstractClass(EncryptorInterface::class)); + $adminAccountFactory = new AdminAccountFactory($serviceLocatorMock); + $adminAccount = $adminAccountFactory->create( + $this->getMockForAbstractClass(AdapterInterface::class), + [] + ); + $this->assertInstanceOf(AdminAccount::class, $adminAccount); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/AdminAccountTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/AdminAccountTest.php new file mode 100644 index 0000000..4a267ac --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/AdminAccountTest.php @@ -0,0 +1,481 @@ +dbAdapter = $this->getMockBuilder(Mysql::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->dbAdapter + ->method('getTableName') + ->willReturnCallback(function ($table) { + return $table; + }); + + $this->encryptor = $this->getMockBuilder(EncryptorInterface::class) + ->getMockForAbstractClass(); + + $data = [ + AdminAccount::KEY_FIRST_NAME => 'John', + AdminAccount::KEY_LAST_NAME => 'Doe', + AdminAccount::KEY_EMAIL => 'john.doe@test.com', + AdminAccount::KEY_PASSWORD => '123123q', + AdminAccount::KEY_USER => 'admin', + AdminAccount::KEY_PREFIX => 'pre_' + ]; + + $this->prefix = $data[AdminAccount::KEY_PREFIX]; + + $this->adminAccount = new AdminAccount( + $this->dbAdapter, + $this->encryptor, + $data + ); + } + + /** + * @return void + */ + public function testSaveUserExistsAdminRoleExists(): void + { + // existing user data + $existingUserData = [ + 'email' => 'john.doe@test.com', + 'username' => 'admin', + 'user_id' => 1 + ]; + + // existing admin role data + $existingAdminRoleData = [ + 'parent_id' => 0, + 'tree_level' => 2, + 'role_type' => 'U', + 'user_id' => 1, + 'user_type' => 2, + 'role_name' => 'admin', + 'role_id' => 1 + ]; + + $returnValueMap = [ + [ + 'SELECT user_id, username, email FROM ' . $this->prefix . + 'admin_user WHERE username = :username OR email = :email', + ['username' => 'admin', 'email' => 'john.doe@test.com'], + null, + $existingUserData + ], + [ + 'SELECT user_id, username, email FROM ' . $this->prefix . + 'admin_user WHERE username = :username OR email = :email', + ['username' => 'admin', 'email' => 'john.doe@test.com'], + null, + $existingUserData + ], + [ + 'SELECT * FROM ' . $this->prefix . + 'authorization_role WHERE user_id = :user_id AND user_type = :user_type', + ['user_id' => 1, 'user_type' => 2], + null, + $existingAdminRoleData + ] + ]; + $this->dbAdapter + ->expects($this->exactly(3)) + ->method('fetchRow') + ->willReturnMap($returnValueMap); + $this->dbAdapter->expects($this->once())->method('quoteInto')->willReturn(''); + $this->dbAdapter->expects($this->once())->method('update')->willReturn(1); + + $this->dbAdapter->expects($this->once()) + ->method('insert') + ->with('pre_admin_passwords', $this->anything()); + + $this->adminAccount->save(); + } + + /** + * @return void + */ + public function testSaveUserExistsNewAdminRole(): void + { + // existing user data + $existingUserData = [ + 'email' => 'john.doe@test.com', + 'username' => 'admin', + 'user_id' => 1 + ]; + + // speical admin role data + $administratorRoleData = [ + 'parent_id' => 0, + 'tree_level' => 1, + 'role_type' => 'G', + 'user_id' => 0, + 'user_type' => 2, + 'role_name' => 'Administrators', + 'role_id' => 0 + ]; + + $returnValueMap = [ + [ + 'SELECT user_id, username, email FROM ' . $this->prefix . + 'admin_user WHERE username = :username OR email = :email', + ['username' => 'admin', 'email' => 'john.doe@test.com'], + null, + $existingUserData + ], + [ + 'SELECT user_id, username, email FROM ' . $this->prefix . + 'admin_user WHERE username = :username OR email = :email', + ['username' => 'admin', 'email' => 'john.doe@test.com'], + null, + $existingUserData + ], + [ + 'SELECT * FROM ' . $this->prefix . + 'authorization_role WHERE user_id = :user_id AND user_type = :user_type', + ['user_id' => 1, 'user_type' => 2], + null, + [] + ], + [ + 'SELECT * FROM ' . $this->prefix . + 'authorization_role WHERE parent_id = :parent_id AND tree_level = :tree_level ' . + 'AND role_type = :role_type AND user_id = :user_id ' . + 'AND user_type = :user_type AND role_name = :role_name', + [ + 'parent_id' => 0, + 'tree_level' => 1, + 'role_type' => 'G', + 'user_id' => 0, + 'user_type' => 2, + 'role_name' => 'Administrators', + ], + null, + $administratorRoleData + ] + ]; + + $this->dbAdapter + ->expects(self::exactly(4)) + ->method('fetchRow') + ->willReturnMap($returnValueMap); + $this->dbAdapter->method('quoteInto') + ->willReturn(''); + $this->dbAdapter->method('update') + ->with(self::equalTo('pre_admin_user'), self::anything()) + ->willReturn(1); + + // should only insert once (admin role) + $this->dbAdapter + ->method('insert') + ->withConsecutive( + [self::equalTo('pre_admin_passwords'), self::anything()], + [self::equalTo('pre_authorization_role'), self::anything()] + ); + + $this->adminAccount->save(); + } + + /** + * @return void + */ + public function testSaveNewUserAdminRoleExists(): void + { + // existing admin role data + $existingAdminRoleData = [ + 'parent_id' => 0, + 'tree_level' => 2, + 'role_type' => 'U', + 'user_id' => 1, + 'user_type' => 2, + 'role_name' => 'admin', + 'role_id' => 1 + ]; + + $returnValueMap = [ + [ + 'SELECT user_id, username, email FROM ' . $this->prefix . + 'admin_user WHERE username = :username OR email = :email', + ['username' => 'admin', 'email' => 'john.doe@test.com'], + null, + [] + ], + [ + 'SELECT * FROM ' . $this->prefix . + 'authorization_role WHERE user_id = :user_id AND user_type = :user_type', + ['user_id' => 1, 'user_type' => 2], + null, + $existingAdminRoleData + ] + ]; + + $this->dbAdapter + ->expects($this->exactly(2)) + ->method('fetchRow') + ->willReturnMap($returnValueMap); + // insert only once (new user) + $this->dbAdapter + ->method('insert') + ->withConsecutive(['pre_admin_user', $this->anything()], ['pre_admin_passwords', $this->anything()]); + + // after inserting new user + $this->dbAdapter->expects($this->once())->method('lastInsertId')->willReturn(1); + + $this->adminAccount->save(); + } + + /** + * @return void + */ + public function testSaveNewUserNewAdminRole(): void + { + // special admin role data + $administratorRoleData = [ + 'parent_id' => 0, + 'tree_level' => 1, + 'role_type' => 'G', + 'user_id' => 0, + 'user_type' => 2, + 'role_name' => 'Administrators', + 'role_id' => 0 + ]; + + $returnValueMap = [ + [ + 'SELECT user_id, username, email FROM ' . $this->prefix . + 'admin_user WHERE username = :username OR email = :email', + ['username' => 'admin', 'email' => 'john.doe@test.com'], + null, + [] + ], + [ + 'SELECT * FROM ' . $this->prefix . + 'authorization_role WHERE user_id = :user_id AND user_type = :user_type', + ['user_id' => 1, 'user_type' => 2], + null, + [] + ], + [ + 'SELECT * FROM ' . $this->prefix . + 'authorization_role WHERE parent_id = :parent_id AND tree_level = :tree_level ' . + 'AND role_type = :role_type AND user_id = :user_id ' . + 'AND user_type = :user_type AND role_name = :role_name', + [ + 'parent_id' => 0, + 'tree_level' => 1, + 'role_type' => 'G', + 'user_id' => 0, + 'user_type' => 2, + 'role_name' => 'Administrators', + ], + null, + $administratorRoleData + ] + + ]; + + $this->dbAdapter + ->expects($this->exactly(3)) + ->method('fetchRow') + ->willReturnMap($returnValueMap); + // after inserting new user + $this->dbAdapter->expects($this->once())->method('lastInsertId')->willReturn(1); + + // insert only (new user and new admin role and new admin password) + $this->dbAdapter->expects($this->exactly(3))->method('insert'); + + $this->adminAccount->save(); + } + + /** + * @return void + */ + public function testSaveExceptionUsernameNotMatch(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('An existing user has the given email but different username.'); + // existing user in db + $existingUserData = [ + 'email' => 'john.doe@test.com', + 'username' => 'Another.name' + ]; + + $this->dbAdapter->expects($this->exactly(2)) + ->method('fetchRow')->willReturn($existingUserData); + // should not alter db + $this->dbAdapter->expects($this->never())->method('update'); + $this->dbAdapter->expects($this->never())->method('insert'); + + $this->adminAccount->save(); + } + + /** + * @return void + */ + public function testSaveExceptionEmailNotMatch(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('An existing user has the given username but different email.'); + $existingUserData = [ + 'email' => 'another.email@test.com', + 'username' => 'admin' + ]; + + $this->dbAdapter->expects($this->exactly(2)) + ->method('fetchRow')->willReturn($existingUserData); + // should not alter db + $this->dbAdapter->expects($this->never())->method('update'); + $this->dbAdapter->expects($this->never())->method('insert'); + + $this->adminAccount->save(); + } + + /** + * @return void + */ + public function testSaveExceptionSpecialAdminRoleNotFound(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('No Administrators role was found, data fixture needs to be run'); + $this->dbAdapter->expects($this->exactly(3))->method('fetchRow')->willReturn([]); + $this->dbAdapter->expects($this->once())->method('lastInsertId')->willReturn(1); + + $this->adminAccount->save(); + } + + /** + * @return void + */ + public function testSaveExceptionPasswordEmpty(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('"Password" is required. Enter and try again.'); + // alternative data must be used for this test + $data = [ + AdminAccount::KEY_FIRST_NAME => 'John', + AdminAccount::KEY_LAST_NAME => 'Doe', + AdminAccount::KEY_EMAIL => 'john.doe@test.com', + AdminAccount::KEY_PASSWORD => '', + AdminAccount::KEY_USER => 'admin', + AdminAccount::KEY_PREFIX => '' + ]; + + $adminAccount = new AdminAccount( + $this->dbAdapter, + $this->encryptor, + $data + ); + + // existing user data + $existingUserData = [ + 'email' => 'john.doe@test.com', + 'username' => 'passMatch2Username', + 'user_id' => 1, + ]; + + $returnValueMap = [ + [ + 'SELECT user_id, username, email FROM admin_user WHERE username = :username OR email = :email', + ['username' => 'admin', 'email' => 'john.doe@test.com'], + null, + $existingUserData + ] + + ]; + $this->dbAdapter + ->expects($this->exactly(1)) + ->method('fetchRow') + ->willReturnMap($returnValueMap); + $this->dbAdapter->expects($this->never())->method('insert'); + $this->dbAdapter->expects($this->never())->method('update'); + + $adminAccount->save(); + } + + /** + * @return void + */ + public function testSaveExceptionPasswordAndUsernameEqual(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Password cannot be the same as the user name.'); + // alternative data must be used for this test + $data = [ + AdminAccount::KEY_FIRST_NAME => 'John', + AdminAccount::KEY_LAST_NAME => 'Doe', + AdminAccount::KEY_EMAIL => 'john.doe@test.com', + AdminAccount::KEY_PASSWORD => 'passMatch2Username', + AdminAccount::KEY_USER => 'passMatch2Username', + AdminAccount::KEY_PREFIX => '' + ]; + + $adminAccount = new AdminAccount( + $this->dbAdapter, + $this->encryptor, + $data + ); + + // existing user data + $existingUserData = [ + 'email' => 'john.doe@test.com', + 'username' => 'passMatch2Username', + 'user_id' => 1 + ]; + + $returnValueMap = [ + [ + 'SELECT user_id, username, email FROM admin_user WHERE username = :username OR email = :email', + ['username' => 'passMatch2Username', 'email' => 'john.doe@test.com'], + null, + $existingUserData + ] + ]; + $this->dbAdapter + ->expects($this->exactly(1)) + ->method('fetchRow') + ->willReturnMap($returnValueMap); + $this->dbAdapter->expects($this->never())->method('insert'); + $this->dbAdapter->expects($this->never())->method('update'); + + $adminAccount->save(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/BasePackageInfoTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/BasePackageInfoTest.php new file mode 100644 index 0000000..5d38993 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/BasePackageInfoTest.php @@ -0,0 +1,117 @@ +readFactoryMock = $this->createMock(\Magento\Framework\Filesystem\Directory\ReadFactory::class); + $this->readerMock = $this->getMockForAbstractClass( + \Magento\Framework\Filesystem\Directory\ReadInterface::class, + [], + '', + false + ); + $this->readFactoryMock->expects($this->once())->method('create')->willReturn($this->readerMock); + $this->basePackageInfo = new BasePackageInfo($this->readFactoryMock); + } + + // Error scenario: magento/magento2-base/composer.json not found + public function testBaseComposerJsonFileNotFound() + { + $this->readerMock->expects($this->once())->method('isExist')->willReturn(false); + $this->readerMock->expects($this->never())->method('isReadable'); + $this->readerMock->expects($this->never())->method('readFile'); + $this->expectException(\Magento\Setup\Exception::class); + $this->expectExceptionMessage( + sprintf('Could not locate %s file.', BasePackageInfo::MAGENTO_BASE_PACKAGE_COMPOSER_JSON_FILE) + ); + $this->basePackageInfo->getPaths(); + } + + // Error scenario: magento/magento2-base/composer.json file could not be read + public function testBaseComposerJsonFileNotReadable() + { + $this->readerMock->expects($this->once())->method('isExist')->willReturn(true); + $this->readerMock->expects($this->once())->method('isReadable')->willReturn(false); + $this->readerMock->expects($this->never())->method('readFile'); + $this->expectException(\Magento\Setup\Exception::class); + $this->expectExceptionMessage( + sprintf('Could not read %s file.', BasePackageInfo::MAGENTO_BASE_PACKAGE_COMPOSER_JSON_FILE) + ); + $this->basePackageInfo->getPaths(); + } + + // Scenario: ["extra"]["map"] is absent within magento/magento2-base/composer.json file + public function testBaseNoExtraMapSectionInComposerJsonFile() + { + $this->readerMock->expects($this->once())->method('isExist')->willReturn(true); + $this->readerMock->expects($this->once())->method('isReadable')->willReturn(true); + $jsonData = json_encode( + [ + BasePackageInfo::COMPOSER_KEY_EXTRA => [ + __FILE__, + __FILE__ + ] + ] + ); + $this->readerMock->expects($this->once())->method('readFile')->willReturn($jsonData); + $expectedList = []; + $actualList = $this->basePackageInfo->getPaths(); + $this->assertEquals($expectedList, $actualList); + } + + // Success scenario + public function testBasePackageInfo() + { + $this->readerMock->expects($this->once())->method('isExist')->willReturn(true); + $this->readerMock->expects($this->once())->method('isReadable')->willReturn(true); + $jsonData = json_encode( + [ + BasePackageInfo::COMPOSER_KEY_EXTRA => [ + BasePackageInfo::COMPOSER_KEY_MAP => [ + [ + __FILE__, + __FILE__ + ], + [ + __DIR__, + __DIR__ + ] + ] + ] + ] + ); + $this->readerMock->expects($this->once())->method('readFile')->willReturn($jsonData); + $expectedList = [__FILE__, __DIR__]; + $actualList = $this->basePackageInfo->getPaths(); + $this->assertEquals($expectedList, $actualList); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Complex/ComplexGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Complex/ComplexGeneratorTest.php new file mode 100644 index 0000000..2a8bcc7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Complex/ComplexGeneratorTest.php @@ -0,0 +1,90 @@ +_pattern instanceof Pattern) { + $patternData = [ + [ + 'id' => '%s', + 'name' => 'Static', + 'calculated' => function ($index) { + return $index * 10; + }, + ], + [ + 'name' => 'xxx %s' + ], + [ + 'name' => 'yyy %s' + ], + ]; + $this->_pattern = new Pattern(); + $this->_pattern->setHeaders(array_keys($patternData[0])); + $this->_pattern->setRowsSet($patternData); + } + return $this->_pattern; + } + + /** + * Test complex generator iterator interface + * + * @return void + */ + public function testIteratorInterface() + { + $model = new Generator($this->getPattern(), 2); + $rows = []; + foreach ($model as $row) { + $rows[] = $row; + } + $this->assertEquals( + [ + ['id' => '1', 'name' => 'Static', 'calculated' => 10], + ['id' => '', 'name' => 'xxx 1', 'calculated' => ''], + ['id' => '', 'name' => 'yyy 1', 'calculated' => ''], + ['id' => '2', 'name' => 'Static', 'calculated' => 20], + ['id' => '', 'name' => 'xxx 2', 'calculated' => ''], + ['id' => '', 'name' => 'yyy 2', 'calculated' => ''], + ], + $rows + ); + } + + /** + * Test generator getIndex + * + * @return void + */ + public function testGetIndex() + { + $model = new Generator($this->getPattern(), 4); + for ($i = 0; $i < 32; $i++) { + $this->assertEquals($model->getIndex($i), floor($i / $this->getPattern()->getRowsCount()) + 1); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Complex/PatternTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Complex/PatternTest.php new file mode 100644 index 0000000..36002de --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Complex/PatternTest.php @@ -0,0 +1,98 @@ +setHeaders(array_keys($patternData[0])); + $pattern->setRowsSet($patternData); + return $pattern; + } + + /** + * Data source for pattern + * + * @return array + */ + public function patternDataProvider() + { + $result = [ + 0 => [ + [ + [ + 'id' => '%s', + 'name' => 'Static', + 'calculated' => function ($index, $generatedKey) { + return $index * 10 + $generatedKey; + }, + ], + [ + 'name' => 'xxx %s' + ], + [ + 'name' => 'yyy %s' + ], + ], + 'expectedCount' => 3, + 'expectedRowsResult' => [ + ['id' => '1', 'name' => 'Static', 'calculated' => 10], + ['id' => '', 'name' => 'xxx 1', 'calculated' => ''], + ['id' => '', 'name' => 'yyy 1', 'calculated' => ''], + ], + ], + 1 => [ + [ + [ + 'id' => '%s', + 'name' => 'Dynamic %s', + 'calculated' => 'calc %s', + ], + ], + 'expectedCount' => 1, + 'expectedRowsResult' => [ + ['id' => '1', 'name' => 'Dynamic 1', 'calculated' => 'calc 1'], + ], + ], + ]; + return $result; + } + + /** + * Test pattern object + * + * @param array $patternData + * @param int $expectedRowsCount + * @param array $expectedRowsResult + * + * @dataProvider patternDataProvider + * @test + * + * @return void + */ + public function testPattern($patternData, $expectedRowsCount, $expectedRowsResult) + { + $pattern = $this->getPattern($patternData); + $this->assertEquals($pattern->getRowsCount(), $expectedRowsCount); + foreach ($expectedRowsResult as $key => $expectedRow) { + $this->assertEquals($expectedRow, $pattern->getRow(floor($key / $pattern->getRowsCount()) + 1, $key)); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php new file mode 100644 index 0000000..384bd4d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php @@ -0,0 +1,164 @@ +deploymentConfigMock = $this->getMockBuilder(DeploymentConfig::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->configDataMock = $this->getMockBuilder(ConfigData::class) + ->disableOriginalConstructor() + ->setMethods(['set']) + ->getMock(); + + $configDataFactoryMock = $this->getMockBuilder(ConfigDataFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $configDataFactoryMock->method('create') + ->willReturn($this->configDataMock); + + $this->driverOptionsMock = $this->getMockBuilder(DriverOptions::class) + ->disableOriginalConstructor() + ->setMethods(['getDriverOptions']) + ->getMock(); + + $this->model = $objectManager->getObject( + ConfigGenerator::class, + [ + 'deploymentConfig' => $this->deploymentConfigMock, + 'configDataFactory' => $configDataFactoryMock, + 'driverOptions' => $this->driverOptionsMock, + ] + ); + } + + public function testCreateXFrameConfig() + { + $this->deploymentConfigMock->expects($this->atLeastOnce()) + ->method('get') + ->with(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT) + ->willReturn(null); + + $this->configDataMock + ->expects($this->once()) + ->method('set') + ->with(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT, 'SAMEORIGIN'); + + $this->model->createXFrameConfig(); + } + + public function testCreateCacheHostsConfig() + { + $data = [ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS => 'localhost:8080, website.com, 120.0.0.1:90']; + $expectedData = [ + 0 => [ + 'host' => 'localhost', + 'port' => '8080', + ], + 1 => [ + 'host' => 'website.com', + ], + 2 => [ + 'host' => '120.0.0.1', + 'port' => '90', + ], + ]; + + $this->configDataMock + ->expects($this->once()) + ->method('set') + ->with(ConfigOptionsListConstants::CONFIG_PATH_CACHE_HOSTS, $expectedData); + + $this->model->createCacheHostsConfig($data); + } + + public function testCreateModeConfig() + { + $this->deploymentConfigMock->expects($this->once()) + ->method('get') + ->with(State::PARAM_MODE) + ->willReturn(null); + + $this->configDataMock + ->expects($this->once()) + ->method('set') + ->with(State::PARAM_MODE, State::MODE_DEFAULT); + + $this->model->createModeConfig(); + } + + public function testCreateModeConfigIfAlreadySet() + { + $this->deploymentConfigMock->expects($this->once()) + ->method('get') + ->with(State::PARAM_MODE) + ->willReturn(State::MODE_PRODUCTION); + $configData = $this->model->createModeConfig(); + $this->assertSame([], $configData->getData()); + } + + public function testCreateCryptKeyConfig() + { + $key = 'my-new-key'; + $data = [ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY => $key]; + + $this->deploymentConfigMock + ->method('get') + ->with(ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY) + ->willReturn(null); + + $this->configDataMock + ->expects($this->once()) + ->method('set') + ->with(ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, $key); + + $this->model->createCryptConfig($data); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigModelTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigModelTest.php new file mode 100644 index 0000000..80560d8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigModelTest.php @@ -0,0 +1,210 @@ +collector = $this->createMock(ConfigOptionsListCollector::class); + $this->writer = $this->createMock(Writer::class); + $this->deploymentConfig = $this->createMock(DeploymentConfig::class); + $this->configOptionsList = $this->createMock(ConfigOptionsList::class); + $this->configData = $this->createMock(ConfigData::class); + $this->filePermissions = $this->createMock(FilePermissions::class); + + $this->deploymentConfig->expects($this->any())->method('get'); + + $this->configModel = new ConfigModel( + $this->collector, + $this->writer, + $this->deploymentConfig, + $this->filePermissions + ); + } + + /** + * @return void + */ + public function testValidate(): void + { + $option = $this->createMock(TextConfigOption::class); + $option->expects($this->exactly(3))->method('getName')->willReturn('Fake'); + $optionsSet = [ + $option, + $option, + $option + ]; + $configOption = $this->configOptionsList; + $configOption->expects($this->once())->method('getOptions')->willReturn($optionsSet); + $configOption->expects($this->once())->method('validate')->willReturn([]); + + $this->collector + ->expects($this->exactly(2)) + ->method('collectOptionsLists') + ->willReturn([$configOption]); + + $this->configModel->validate(['Fake' => null]); + } + + /** + * @return void + */ + public function testProcess(): void + { + $testSet1 = [ + ConfigFilePool::APP_CONFIG => [ + 'segment' => [ + 'someKey' => 'value', + 'test' => 'value1' + ] + ] + ]; + + $testSet2 = [ + ConfigFilePool::APP_CONFIG => [ + 'segment' => [ + 'test' => 'value2' + ] + ] + ]; + + $testSetExpected1 = [ + ConfigFilePool::APP_CONFIG => [ + 'segment' => [ + 'someKey' => 'value', + 'test' => 'value1' + ] + ] + ]; + + $testSetExpected2 = [ + ConfigFilePool::APP_CONFIG => [ + 'segment' => [ + 'test' => 'value2' + ] + ] + ]; + + $configData1 = clone $this->configData; + $configData2 = clone $this->configData; + + $configData1->expects($this->any()) + ->method('getData') + ->willReturn($testSet1[ConfigFilePool::APP_CONFIG]); + $configData1->expects($this->any())->method('getFileKey')->willReturn(ConfigFilePool::APP_CONFIG); + $configData1->expects($this->once())->method('isOverrideWhenSave')->willReturn(false); + + $configData2->expects($this->any()) + ->method('getData') + ->willReturn($testSet2[ConfigFilePool::APP_CONFIG]); + $configData2->expects($this->any())->method('getFileKey')->willReturn(ConfigFilePool::APP_CONFIG); + $configData2->expects($this->once())->method('isOverrideWhenSave')->willReturn(false); + + $configOption = $this->configOptionsList; + $configOption->expects($this->once()) + ->method('createConfig') + ->willReturn([$configData1, $configData2]); + + $configOptionsList = [ + 'Fake_Module' => $configOption + ]; + $this->collector->expects($this->once()) + ->method('collectOptionsLists') + ->willReturn($configOptionsList); + + $this->writer + ->method('saveConfig') + ->withConsecutive([$testSetExpected1], [$testSetExpected2]); + + $this->configModel->process([]); + } + + /** + * @return void + */ + public function testProcessException(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('In module : Fake_ModuleConfigOption::createConfig'); + $configOption = $this->configOptionsList; + $configOption->expects($this->once()) + ->method('createConfig') + ->willReturn([null]); + + $wrongData = [ + 'Fake_Module' => $configOption + ]; + + $this->collector->expects($this->once())->method('collectOptionsLists')->willReturn($wrongData); + + $this->configModel->process([]); + } + + /** + * @return void + */ + public function testWritePermissionErrors(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Missing write permissions to the following paths:'); + $this->filePermissions->expects($this->once())->method('getMissingWritablePathsForInstallation') + ->willReturn(['/a/ro/dir', '/media']); + $this->configModel->process([]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/CacheTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/CacheTest.php new file mode 100644 index 0000000..12a5ee2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/CacheTest.php @@ -0,0 +1,272 @@ +validatorMock = $this->createMock(RedisConnectionValidator::class); + $this->deploymentConfigMock = $this->createMock(DeploymentConfig::class); + + $this->configOptionsList = new CacheConfigOptionsList($this->validatorMock); + } + + /** + * testGetOptions + */ + public function testGetOptions() + { + $options = $this->configOptionsList->getOptions(); + $this->assertCount(9, $options); + + $this->assertArrayHasKey(0, $options); + $this->assertInstanceOf(SelectConfigOption::class, $options[0]); + $this->assertEquals('cache-backend', $options[0]->getName()); + + $this->assertArrayHasKey(1, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[1]); + $this->assertEquals('cache-backend-redis-server', $options[1]->getName()); + + $this->assertArrayHasKey(2, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[2]); + $this->assertEquals('cache-backend-redis-db', $options[2]->getName()); + + $this->assertArrayHasKey(3, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[3]); + $this->assertEquals('cache-backend-redis-port', $options[3]->getName()); + + $this->assertArrayHasKey(4, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[4]); + $this->assertEquals('cache-backend-redis-password', $options[4]->getName()); + + $this->assertArrayHasKey(5, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[5]); + $this->assertEquals('cache-backend-redis-compress-data', $options[5]->getName()); + + $this->assertArrayHasKey(6, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[6]); + $this->assertEquals('cache-backend-redis-compression-lib', $options[6]->getName()); + + $this->assertArrayHasKey(7, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[7]); + $this->assertEquals('cache-id-prefix', $options[7]->getName()); + + $this->assertArrayHasKey(8, $options); + $this->assertInstanceOf(FlagConfigOption::class, $options[8]); + $this->assertEquals('allow-parallel-generation', $options[8]->getName()); + } + + /** + * testCreateConfigCacheRedis + */ + public function testCreateConfigCacheRedis() + { + $this->deploymentConfigMock->method('get')->willReturn(''); + + $expectedConfigData = [ + 'cache' => [ + 'frontend' => [ + 'default' => [ + 'backend' => \Magento\Framework\Cache\Backend\Redis::class, + 'backend_options' => [ + 'server' => '', + 'port' => '', + 'database' => '', + 'password' => '', + 'compress_data' => '', + 'compression_lib' => '', + ], + 'id_prefix' => $this->expectedIdPrefix(), + ] + ], + 'allow_parallel_generation' => '', + ] + ]; + + $configData = $this->configOptionsList + ->createConfig(['cache-backend' => 'redis'], $this->deploymentConfigMock); + + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + /** + * testCreateConfigWithRedisConfig + */ + public function testCreateConfigWithRedisConfig() + { + $this->deploymentConfigMock->method('get')->withConsecutive( + [CacheConfigOptionsList::CONFIG_PATH_CACHE_ID_PREFIX], + [CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_SERVER, '127.0.0.1'], + [CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_DATABASE, '0'], + [CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_PORT, '6379'], + [CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_PASSWORD, ''], + [CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_COMPRESS_DATA, '1'], + [CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_COMPRESSION_LIB, ''], + [CacheConfigOptionsList::CONFIG_PATH_ALLOW_PARALLEL_CACHE_GENERATION, 'false'] + )->willReturnOnConsecutiveCalls( + 'XXX_', + '127.0.0.1', + '0', + '6379', + '', + '1', + '', + null + ); + + $expectedConfigData = [ + 'cache' => [ + 'frontend' => [ + 'default' => [ + 'backend' => \Magento\Framework\Cache\Backend\Redis::class, + 'backend_options' => [ + 'server' => 'localhost', + 'port' => '1234', + 'database' => '5', + 'password' => '', + 'compress_data' => '1', + 'compression_lib' => 'gzip', + ], + ] + ], + 'allow_parallel_generation' => null, + ] + ]; + + $options = [ + 'cache-backend' => 'redis', + 'cache-backend-redis-server' => 'localhost', + 'cache-backend-redis-port' => '1234', + 'cache-backend-redis-db' => '5', + 'cache-backend-redis-compress-data' => '1', + 'cache-backend-redis-compression-lib' => 'gzip' + ]; + + $configData = $this->configOptionsList->createConfig($options, $this->deploymentConfigMock); + + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + /** + * testCreateConfigCacheRedis + */ + public function testCreateConfigWithFileCache() + { + $this->deploymentConfigMock->method('get')->willReturn(''); + + $expectedConfigData = [ + 'cache' => [ + 'frontend' => [ + 'default' => [ + 'id_prefix' => $this->expectedIdPrefix(), + ] + ] + ] + ]; + + $configData = $this->configOptionsList->createConfig([], $this->deploymentConfigMock); + + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + /** + * testCreateConfigCacheRedis + */ + public function testCreateConfigWithIdPrefix() + { + $this->deploymentConfigMock->method('get')->willReturn(''); + + $explicitPrefix = 'XXX_'; + $expectedConfigData = [ + 'cache' => [ + 'frontend' => [ + 'default' => [ + 'id_prefix' => $explicitPrefix, + ] + ] + ] + ]; + + $configData = $this->configOptionsList->createConfig( + ['cache-id-prefix' => $explicitPrefix], + $this->deploymentConfigMock + ); + + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + /** + * testValidateWithValidInput + */ + public function testValidateWithValidInput() + { + $options = [ + 'cache-backend' => 'redis', + 'cache-backend-redis-server' => 'localhost', + ]; + $this->validatorMock->expects($this->once()) + ->method('isValidConnection') + ->with(['host' => 'localhost', 'db' => '', 'port' => '', 'password' => '']) + ->willReturn(true); + + $errors = $this->configOptionsList->validate($options, $this->deploymentConfigMock); + + $this->assertEmpty($errors); + } + + /** + * testValidateWithInvalidInput + */ + public function testValidateWithInvalidInput() + { + $invalidCacheOption = 'clay-tablet'; + $options = ['cache-backend' => $invalidCacheOption]; + + $errors = $this->configOptionsList->validate($options, $this->deploymentConfigMock); + + $this->assertCount(1, $errors); + $this->assertEquals("Invalid cache handler 'clay-tablet'", $errors[0]); + } + + /** + * The default ID prefix, based on installation directory + * + * @return string + */ + private function expectedIdPrefix(): string + { + return substr(\hash('sha256', dirname(__DIR__, 8)), 0, 3) . '_'; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/LockTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/LockTest.php new file mode 100644 index 0000000..83f16d4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/LockTest.php @@ -0,0 +1,255 @@ +deploymentConfigMock = $this->createMock(DeploymentConfig::class); + $this->lockConfigOptionsList = new LockConfigOptionsList(); + } + + /** + * @return void + */ + public function testGetOptions() + { + $options = $this->lockConfigOptionsList->getOptions(); + $this->assertCount(5, $options); + + $this->assertArrayHasKey(0, $options); + $this->assertInstanceOf(SelectConfigOption::class, $options[0]); + $this->assertEquals(LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER, $options[0]->getName()); + + $this->assertArrayHasKey(1, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[1]); + $this->assertEquals(LockConfigOptionsList::INPUT_KEY_LOCK_DB_PREFIX, $options[1]->getName()); + + $this->assertArrayHasKey(2, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[2]); + $this->assertEquals(LockConfigOptionsList::INPUT_KEY_LOCK_ZOOKEEPER_HOST, $options[2]->getName()); + + $this->assertArrayHasKey(3, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[3]); + $this->assertEquals(LockConfigOptionsList::INPUT_KEY_LOCK_ZOOKEEPER_PATH, $options[3]->getName()); + + $this->assertArrayHasKey(4, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[4]); + $this->assertEquals(LockConfigOptionsList::INPUT_KEY_LOCK_FILE_PATH, $options[4]->getName()); + } + + /** + * @param array $options + * @param array $expectedResult + * @dataProvider createConfigDataProvider + */ + public function testCreateConfig(array $options, array $expectedResult) + { + $this->deploymentConfigMock->expects($this->any()) + ->method('get') + ->willReturnArgument(1); + $data = $this->lockConfigOptionsList->createConfig($options, $this->deploymentConfigMock); + $this->assertInstanceOf(ConfigData::class, $data); + $this->assertTrue($data->isOverrideWhenSave()); + $this->assertSame($expectedResult, $data->getData()); + } + + /** + * @return array + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function createConfigDataProvider(): array + { + return [ + 'Check default values' => [ + 'options' => [], + 'expectedResult' => [ + 'lock' => [ + 'provider' => LockBackendFactory::LOCK_DB + ], + ], + ], + 'Check default value for cache lock' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_CACHE, + ], + 'expectedResult' => [ + 'lock' => [ + 'provider' => LockBackendFactory::LOCK_CACHE, + ], + ], + ], + 'Check default value for zookeeper lock' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_ZOOKEEPER, + ], + 'expectedResult' => [ + 'lock' => [ + 'provider' => LockBackendFactory::LOCK_ZOOKEEPER, + 'config' => [ + 'host' => null, + 'path' => ZookeeperLock::DEFAULT_PATH, + ], + ], + ], + ], + 'Check specific db lock options' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_DB, + LockConfigOptionsList::INPUT_KEY_LOCK_DB_PREFIX => 'my_prefix' + ], + 'expectedResult' => [ + 'lock' => [ + 'provider' => LockBackendFactory::LOCK_DB, + 'config' => [ + 'prefix' => 'my_prefix', + ], + ], + ], + ], + 'Check specific zookeeper lock options' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_ZOOKEEPER, + LockConfigOptionsList::INPUT_KEY_LOCK_ZOOKEEPER_HOST => '123.45.67.89:10', + LockConfigOptionsList::INPUT_KEY_LOCK_ZOOKEEPER_PATH => '/some/path', + ], + 'expectedResult' => [ + 'lock' => [ + 'provider' => LockBackendFactory::LOCK_ZOOKEEPER, + 'config' => [ + 'host' => '123.45.67.89:10', + 'path' => '/some/path', + ], + ], + ], + ], + 'Check specific file lock options' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_FILE, + LockConfigOptionsList::INPUT_KEY_LOCK_FILE_PATH => '/my/path' + ], + 'expectedResult' => [ + 'lock' => [ + 'provider' => LockBackendFactory::LOCK_FILE, + 'config' => [ + 'path' => '/my/path', + ], + ], + ], + ], + 'Check specific db lock prefix null options' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_DB, + LockConfigOptionsList::INPUT_KEY_LOCK_DB_PREFIX => null + ], + 'expectedResult' => [ + 'lock' => [ + 'provider' => LockBackendFactory::LOCK_DB + ], + ], + ], + 'Check specific db lock prefix empty options' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_DB, + LockConfigOptionsList::INPUT_KEY_LOCK_DB_PREFIX => '' + ], + 'expectedResult' => [ + 'lock' => [ + 'provider' => LockBackendFactory::LOCK_DB, + 'config' => [ + 'prefix' => '', + ], + ], + ], + ], + ]; + } + + /** + * @param array $options + * @param array $expectedResult + * @dataProvider validateDataProvider + */ + public function testValidate(array $options, array $expectedResult) + { + $this->deploymentConfigMock->expects($this->any()) + ->method('get') + ->willReturnArgument(1); + $this->assertSame( + $expectedResult, + $this->lockConfigOptionsList->validate($options, $this->deploymentConfigMock) + ); + } + + /** + * @return array + */ + public function validateDataProvider(): array + { + return [ + 'Wrong lock provider' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => 'SomeProvider', + ], + 'expectedResult' => [ + 'The lock provider SomeProvider does not exist.', + ], + ], + 'Empty host and path for Zookeeper' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_ZOOKEEPER, + LockConfigOptionsList::INPUT_KEY_LOCK_ZOOKEEPER_HOST => '', + LockConfigOptionsList::INPUT_KEY_LOCK_ZOOKEEPER_PATH => '', + ], + 'expectedResult' => extension_loaded('zookeeper') + ? [ + 'Zookeeper path needs to be a non-empty string.', + 'Zookeeper host is should be set.', + ] + : [ + 'php extension Zookeeper is not installed.', + 'Zookeeper path needs to be a non-empty string.', + 'Zookeeper host is should be set.', + ], + ], + 'Empty path for File lock' => [ + 'options' => [ + LockConfigOptionsList::INPUT_KEY_LOCK_PROVIDER => LockBackendFactory::LOCK_FILE, + LockConfigOptionsList::INPUT_KEY_LOCK_FILE_PATH => '', + ], + 'expectedResult' => [ + 'The path needs to be a non-empty string.', + ], + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/PageCacheTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/PageCacheTest.php new file mode 100644 index 0000000..502b277 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/PageCacheTest.php @@ -0,0 +1,260 @@ +validatorMock = $this->createMock(RedisConnectionValidator::class); + $this->deploymentConfigMock = $this->createMock(DeploymentConfig::class); + + $this->configList = new PageCache($this->validatorMock); + } + + /** + * testGetOptions + */ + public function testGetOptions() + { + $options = $this->configList->getOptions(); + $this->assertCount(8, $options); + + $this->assertArrayHasKey(0, $options); + $this->assertInstanceOf(SelectConfigOption::class, $options[0]); + $this->assertEquals('page-cache', $options[0]->getName()); + + $this->assertArrayHasKey(1, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[1]); + $this->assertEquals('page-cache-redis-server', $options[1]->getName()); + + $this->assertArrayHasKey(2, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[2]); + $this->assertEquals('page-cache-redis-db', $options[2]->getName()); + + $this->assertArrayHasKey(3, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[3]); + $this->assertEquals('page-cache-redis-port', $options[3]->getName()); + + $this->assertArrayHasKey(4, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[4]); + $this->assertEquals('page-cache-redis-password', $options[4]->getName()); + + $this->assertArrayHasKey(5, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[5]); + $this->assertEquals('page-cache-redis-compress-data', $options[5]->getName()); + + $this->assertArrayHasKey(6, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[6]); + $this->assertEquals('page-cache-redis-compression-lib', $options[6]->getName()); + + $this->assertArrayHasKey(7, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[7]); + $this->assertEquals('page-cache-id-prefix', $options[7]->getName()); + } + + /** + * testCreateConfigWithRedis + */ + public function testCreateConfigWithRedis() + { + $this->deploymentConfigMock->method('get')->willReturn(''); + + $expectedConfigData = [ + 'cache' => [ + 'frontend' => [ + 'page_cache' => [ + 'backend' => \Magento\Framework\Cache\Backend\Redis::class, + 'backend_options' => [ + 'server' => '', + 'port' => '', + 'database' => '', + 'compress_data' => '', + 'password' => '', + 'compression_lib' => '', + ], + 'id_prefix' => $this->expectedIdPrefix(), + ] + ] + ] + ]; + + $configData = $this->configList->createConfig(['page-cache' => 'redis'], $this->deploymentConfigMock); + + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + /** + * testCreateConfigWithRedisConfiguration + */ + public function testCreateConfigWithRedisConfiguration() + { + $this->deploymentConfigMock->method('get')->withConsecutive( + [PageCache::CONFIG_PATH_PAGE_CACHE_ID_PREFIX], + [PageCache::CONFIG_PATH_PAGE_CACHE_BACKEND_SERVER, '127.0.0.1'], + [PageCache::CONFIG_PATH_PAGE_CACHE_BACKEND_DATABASE, '1'], + [PageCache::CONFIG_PATH_PAGE_CACHE_BACKEND_PORT, '6379'], + [PageCache::CONFIG_PATH_PAGE_CACHE_BACKEND_PASSWORD, ''], + [PageCache::CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESS_DATA, '0'], + [PageCache::CONFIG_PATH_PAGE_CACHE_BACKEND_COMPRESSION_LIB, ''] + )->willReturnOnConsecutiveCalls( + 'XXX_', + '127.0.0.1', + '1', + '6379', + '', + '0', + '' + ); + + $expectedConfigData = [ + 'cache' => [ + 'frontend' => [ + 'page_cache' => [ + 'backend' => \Magento\Framework\Cache\Backend\Redis::class, + 'backend_options' => [ + 'server' => 'foo.bar', + 'port' => '9000', + 'database' => '6', + 'password' => '', + 'compress_data' => '1', + 'compression_lib' => 'gzip', + ], + ] + ] + ] + ]; + + $options = [ + 'page-cache' => 'redis', + 'page-cache-redis-server' => 'foo.bar', + 'page-cache-redis-port' => '9000', + 'page-cache-redis-db' => '6', + 'page-cache-redis-compress-data' => '1', + 'page-cache-redis-compression-lib' => 'gzip', + ]; + + $configData = $this->configList->createConfig($options, $this->deploymentConfigMock); + + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + /** + * testCreateConfigWithRedis + */ + public function testCreateConfigWithFileCache() + { + $this->deploymentConfigMock->method('get')->willReturn(''); + + $expectedConfigData = [ + 'cache' => [ + 'frontend' => [ + 'page_cache' => [ + 'id_prefix' => $this->expectedIdPrefix(), + ] + ] + ] + ]; + + $configData = $this->configList->createConfig([], $this->deploymentConfigMock); + + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + /** + * testCreateConfigCacheRedis + */ + public function testCreateConfigWithIdPrefix() + { + $this->deploymentConfigMock->method('get')->willReturn(''); + + $explicitPrefix = 'XXX_'; + $expectedConfigData = [ + 'cache' => [ + 'frontend' => [ + 'page_cache' => [ + 'id_prefix' => $explicitPrefix, + ] + ] + ] + ]; + + $configData = $this->configList->createConfig( + ['page-cache-id-prefix' => $explicitPrefix], + $this->deploymentConfigMock + ); + + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + /** + * testValidationWithValidData + */ + public function testValidationWithValidData() + { + $this->validatorMock->expects($this->once()) + ->method('isValidConnection') + ->willReturn(true); + + $options = [ + 'page-cache' => 'redis', + 'page-cache-redis-db' => '2' + ]; + + $errors = $this->configList->validate($options, $this->deploymentConfigMock); + + $this->assertEmpty($errors); + } + + /** + * testValidationWithInvalidData + */ + public function testValidationWithInvalidData() + { + $options = [ + 'page-cache' => 'foobar' + ]; + + $errors = $this->configList->validate($options, $this->deploymentConfigMock); + + $this->assertCount(1, $errors); + $this->assertEquals('Invalid cache handler \'foobar\'', $errors[0]); + } + + /** + * The default ID prefix, based on installation directory + * + * @return string + */ + private function expectedIdPrefix(): string + { + return substr(\hash('sha256', dirname(__DIR__, 8)), 0, 3) . '_'; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/SessionTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/SessionTest.php new file mode 100644 index 0000000..98ef1d6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/SessionTest.php @@ -0,0 +1,315 @@ +configList = new SessionConfigOptionsList(); + + $this->deploymentConfigMock = $this->createMock(DeploymentConfig::class); + } + + public function testGetOptions() + { + $options = $this->configList->getOptions(); + $this->assertCount(23, $options); + + $this->assertArrayHasKey(0, $options); + $this->assertInstanceOf(SelectConfigOption::class, $options[0]); + $this->assertEquals('session-save', $options[0]->getName()); + + $this->assertArrayHasKey(1, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[1]); + $this->assertEquals('session-save-redis-host', $options[1]->getName()); + + $this->assertArrayHasKey(2, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[2]); + $this->assertEquals('session-save-redis-port', $options[2]->getName()); + + $this->assertArrayHasKey(3, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[3]); + $this->assertEquals('session-save-redis-password', $options[3]->getName()); + + $this->assertArrayHasKey(4, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[4]); + $this->assertEquals('session-save-redis-timeout', $options[4]->getName()); + + $this->assertArrayHasKey(5, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[5]); + $this->assertEquals('session-save-redis-persistent-id', $options[5]->getName()); + + $this->assertArrayHasKey(6, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[6]); + $this->assertEquals('session-save-redis-db', $options[6]->getName()); + + $this->assertArrayHasKey(7, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[7]); + $this->assertEquals('session-save-redis-compression-threshold', $options[7]->getName()); + + $this->assertArrayHasKey(8, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[8]); + $this->assertEquals('session-save-redis-compression-lib', $options[8]->getName()); + + $this->assertArrayHasKey(9, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[9]); + $this->assertEquals('session-save-redis-log-level', $options[9]->getName()); + + $this->assertArrayHasKey(10, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[10]); + $this->assertEquals('session-save-redis-max-concurrency', $options[10]->getName()); + + $this->assertArrayHasKey(11, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[11]); + $this->assertEquals('session-save-redis-break-after-frontend', $options[11]->getName()); + + $this->assertArrayHasKey(12, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[12]); + $this->assertEquals('session-save-redis-break-after-adminhtml', $options[12]->getName()); + + $this->assertArrayHasKey(13, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[13]); + $this->assertEquals('session-save-redis-first-lifetime', $options[13]->getName()); + + $this->assertArrayHasKey(14, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[14]); + $this->assertEquals('session-save-redis-bot-first-lifetime', $options[14]->getName()); + + $this->assertArrayHasKey(15, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[15]); + $this->assertEquals('session-save-redis-bot-lifetime', $options[15]->getName()); + + $this->assertArrayHasKey(16, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[16]); + $this->assertEquals('session-save-redis-disable-locking', $options[16]->getName()); + + $this->assertArrayHasKey(17, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[17]); + $this->assertEquals('session-save-redis-min-lifetime', $options[17]->getName()); + + $this->assertArrayHasKey(18, $options); + $this->assertInstanceOf(TextConfigOption::class, $options[18]); + $this->assertEquals('session-save-redis-max-lifetime', $options[18]->getName()); + } + + public function testCreateConfig() + { + $configData = $this->configList->createConfig([], $this->deploymentConfigMock); + $this->assertInstanceOf(ConfigData::class, $configData); + } + + public function testCreateConfigWithSessionSaveFiles() + { + $expectedConfigData = [ + 'session' => [ + 'save' => 'files' + ] + ]; + + $options = ['session-save' => 'files']; + + $configData = $this->configList->createConfig($options, $this->deploymentConfigMock); + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + public function testCreateConfigWithSessionSaveRedis() + { + $this->deploymentConfigMock->expects($this->any())->method('get')->willReturn(''); + + $expectedConfigData = [ + 'session' => [ + 'save' => 'redis', + 'redis' => [ + 'host' => '', + 'port' => '', + 'password' => '', + 'timeout' => '', + 'persistent_identifier' => '', + 'database' => '', + 'compression_threshold' => '', + 'compression_library' => '', + 'log_level' => '', + 'max_concurrency' => '', + 'break_after_frontend' => '', + 'break_after_adminhtml' => '', + 'first_lifetime' => '', + 'bot_first_lifetime' => '', + 'bot_lifetime' => '', + 'disable_locking' => '', + 'min_lifetime' => '', + 'max_lifetime' => '', + 'sentinel_master' => '', + 'sentinel_servers' => '', + 'sentinel_connect_retries' => '', + 'sentinel_verify_master' => '', + ] + + ] + ]; + + $options = ['session-save' => 'redis']; + + $configData = $this->configList->createConfig($options, $this->deploymentConfigMock); + $this->assertEquals($expectedConfigData, $configData->getData()); + } + + public function testEmptyCreateConfig() + { + $expectedConfigData = []; + + $config = $this->configList->createConfig([], $this->deploymentConfigMock); + $this->assertEquals($expectedConfigData, $config->getData()); + } + + public function testCreateConfigWithRedisInput() + { + $this->deploymentConfigMock->expects($this->any())->method('get')->willReturn(''); + + $options = [ + 'session-save' => 'redis', + 'session-save-redis-host' => 'localhost', + 'session-save-redis-log-level' => '4', + 'session-save-redis-min-lifetime' => '60', + 'session-save-redis-max-lifetime' => '3600', + ]; + + $expectedConfigData = [ + 'session' => [ + 'save' => 'redis', + 'redis' => [ + 'host' => 'localhost', + 'port' => '', + 'password' => '', + 'timeout' => '', + 'persistent_identifier' => '', + 'database' => '', + 'compression_threshold' => '', + 'compression_library' => '', + 'log_level' => '4', + 'max_concurrency' => '', + 'break_after_frontend' => '', + 'break_after_adminhtml' => '', + 'first_lifetime' => '', + 'bot_first_lifetime' => '', + 'bot_lifetime' => '', + 'disable_locking' => '', + 'min_lifetime' => '60', + 'max_lifetime' => '3600', + 'sentinel_master' => '', + 'sentinel_servers' => '', + 'sentinel_connect_retries' => '', + 'sentinel_verify_master' => '', + ] + ], + + ]; + + $config = $this->configList->createConfig($options, $this->deploymentConfigMock); + $actualConfigData = $config->getData(); + + $this->assertEquals($expectedConfigData, $actualConfigData); + } + + /** + * @param string $option + * @param string $configArrayKey + * @param string $optionValue + * @dataProvider redisOptionProvider + */ + public function testIndividualOptionsAreSetProperly($option, $configArrayKey, $optionValue) + { + $configData = $this->configList->createConfig([$option => $optionValue], $this->deploymentConfigMock); + $redisConfigData = $configData->getData()['session']['redis']; + + $this->assertEquals($redisConfigData[$configArrayKey], $optionValue); + } + + public function testValidationWithValidOptions() + { + $options = [ + 'session-save' => 'files', + 'session-save-redis-host' => 'localhost', + 'session-save-redis-compression-library' => 'gzip' + ]; + + $errors = $this->configList->validate($options, $this->deploymentConfigMock); + + $this->assertEmpty($errors); + } + + /** + * @param string $option + * @param string $invalidInput + * @param string $errorMessage + * @dataProvider invalidOptionsProvider + */ + public function testValidationWithInvalidOptions($option, $invalidInput, $errorMessage) + { + $errors = $this->configList->validate([$option => $invalidInput], $this->deploymentConfigMock); + + $this->assertCount(1, $errors); + $this->assertSame($errorMessage, $errors[0]); + } + + /** + * @return array + */ + public function redisOptionProvider() + { + return [ + ['session-save-redis-host', 'host', 'google'], + ['session-save-redis-port', 'port', '1234'], + ['session-save-redis-password', 'password', 'secretPassword'], + ['session-save-redis-timeout', 'timeout', '1000'], + ['session-save-redis-persistent-id', 'persistent_identifier', 'foo'], + ['session-save-redis-db', 'database', '5'], + ['session-save-redis-compression-threshold', 'compression_threshold', '1024'], + ['session-save-redis-compression-lib', 'compression_library', 'tar'], + ['session-save-redis-log-level', 'log_level', '2'], + ['session-save-redis-max-concurrency', 'max_concurrency', '3'], + ['session-save-redis-break-after-frontend', 'break_after_frontend', '10'], + ['session-save-redis-break-after-adminhtml', 'break_after_adminhtml', '20'], + ['session-save-redis-first-lifetime', 'first_lifetime', '300'], + ['session-save-redis-bot-first-lifetime', 'bot_first_lifetime', '30'], + ['session-save-redis-bot-lifetime', 'bot_lifetime', '3600'], + ['session-save-redis-disable-locking', 'disable_locking', '1'], + ['session-save-redis-min-lifetime', 'min_lifetime', '20'], + ['session-save-redis-max-lifetime', 'max_lifetime', '12000'], + ]; + } + + /** + * @return array + */ + public function invalidOptionsProvider() + { + return [ + ['session-save', 'clay-tablet', 'Invalid session handler \'clay-tablet\''], + ['session-save-redis-log-level', '10', 'Invalid Redis log level \'10\'. Valid range is 0-7, inclusive.'], + ['session-save-redis-compression-lib', 'foobar', 'Invalid Redis compression library \'foobar\''], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php new file mode 100644 index 0000000..20d1d4c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php @@ -0,0 +1,236 @@ +generator = $this->createMock(ConfigGenerator::class); + $this->deploymentConfig = $this->createMock(DeploymentConfig::class); + $this->dbValidator = $this->createMock(DbValidator::class); + $this->encryptionKeyValidator = $this->createMock(KeyValidator::class); + $this->driverOptionsMock = $this->createMock(DriverOptions::class); + $this->object = new ConfigOptionsList( + $this->generator, + $this->dbValidator, + $this->encryptionKeyValidator, + $this->driverOptionsMock + ); + } + + public function testGetOptions() + { + $options = $this->object->getOptions(); + $this->assertInstanceOf(TextConfigOption::class, $options[0]); + $this->assertSame('Encryption key', $options[0]->getDescription()); + $this->assertInstanceOf(TextConfigOption::class, $options[1]); + $this->assertSame('Database server host', $options[1]->getDescription()); + $this->assertInstanceOf(TextConfigOption::class, $options[2]); + $this->assertSame('Database name', $options[2]->getDescription()); + $this->assertInstanceOf(TextConfigOption::class, $options[3]); + $this->assertSame('Database server username', $options[3]->getDescription()); + $this->assertInstanceOf(TextConfigOption::class, $options[4]); + $this->assertSame('Database server engine', $options[4]->getDescription()); + $this->assertInstanceOf(TextConfigOption::class, $options[5]); + $this->assertSame('Database server password', $options[5]->getDescription()); + $this->assertInstanceOf(TextConfigOption::class, $options[6]); + $this->assertSame('Database table prefix', $options[6]->getDescription()); + $this->assertInstanceOf(TextConfigOption::class, $options[7]); + $this->assertSame('Database type', $options[7]->getDescription()); + $this->assertInstanceOf(TextConfigOption::class, $options[8]); + $this->assertSame('Database initial set of commands', $options[8]->getDescription()); + $this->assertInstanceOf(FlagConfigOption::class, $options[9]); + $this->assertSame( + 'If specified, then db connection validation will be skipped', + $options[9]->getDescription() + ); + $this->assertInstanceOf(TextConfigOption::class, $options[10]); + $this->assertSame('http Cache hosts', $options[10]->getDescription()); + $this->assertGreaterThanOrEqual(11, count($options)); + } + + public function testCreateOptions() + { + $configDataMock = $this->createMock(ConfigData::class); + $this->generator->expects($this->once())->method('createCryptConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createDefinitionsConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createDbConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createResourceConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createXFrameConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createCacheHostsConfig')->willReturn($configDataMock); + + $configData = $this->object->createConfig([Lock::INPUT_KEY_LOCK_PROVIDER => 'db'], $this->deploymentConfig); + $this->assertGreaterThanOrEqual(6, count($configData)); + } + + public function testCreateOptionsWithOptionalNull() + { + $configDataMock = $this->createMock(ConfigData::class); + $this->generator->expects($this->once())->method('createCryptConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createDefinitionsConfig')->willReturn(null); + $this->generator->expects($this->once())->method('createDbConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createResourceConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createXFrameConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createCacheHostsConfig')->willReturn($configDataMock); + + $configData = $this->object->createConfig([Lock::INPUT_KEY_LOCK_PROVIDER => 'db'], $this->deploymentConfig); + $this->assertGreaterThanOrEqual(6, count($configData)); + } + + public function testValidateSuccess() + { + $options = [ + ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX => 'prefix', + ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE => 'files', + ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION => false, + ConfigOptionsListConstants::INPUT_KEY_DB_NAME => 'name', + ConfigOptionsListConstants::INPUT_KEY_DB_HOST => 'host', + ConfigOptionsListConstants::INPUT_KEY_DB_USER => 'user', + ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD => 'pass', + Lock::INPUT_KEY_LOCK_PROVIDER => 'db' + ]; + $this->prepareValidationMocks(); + + $this->assertEquals([], $this->object->validate($options, $this->deploymentConfig)); + } + + public function testValidateInvalidSessionHandler() + { + $invalidSaveHandler = 'clay-tablet'; + + $options = [ + ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX => 'prefix', + ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE => $invalidSaveHandler, + ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION => false, + ConfigOptionsListConstants::INPUT_KEY_DB_NAME => 'name', + ConfigOptionsListConstants::INPUT_KEY_DB_HOST => 'host', + ConfigOptionsListConstants::INPUT_KEY_DB_USER => 'user', + ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD => 'pass', + Lock::INPUT_KEY_LOCK_PROVIDER => 'db' + ]; + $this->prepareValidationMocks(); + + $this->assertEquals( + ["Invalid session handler '{$invalidSaveHandler}'"], + $this->object->validate($options, $this->deploymentConfig) + ); + } + + public function testValidateEmptyEncryptionKey() + { + $options = [ + ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION => true, + ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY => '', + Lock::INPUT_KEY_LOCK_PROVIDER => 'db' + ]; + $this->assertEquals( + ['Invalid encryption key. Encryption key must be 32 character string without any white space.'], + $this->object->validate($options, $this->deploymentConfig) + ); + } + + private function prepareValidationMocks() + { + $configDataMock = $this->getMockBuilder(ConfigData::class) + ->disableOriginalConstructor() + ->getMock(); + $this->dbValidator->expects($this->once())->method('checkDatabaseTablePrefix')->willReturn($configDataMock); + $this->dbValidator->expects($this->once()) + ->method('checkDatabaseConnectionWithDriverOptions') + ->willReturn($configDataMock); + $this->dbValidator + ->expects($this->once()) + ->method('checkDatabaseConnectionWithDriverOptions') + ->willReturn($configDataMock); + } + + /** + * @param string $hosts + * @param bool $expectedError + * @dataProvider validateCacheHostsDataProvider + */ + public function testValidateCacheHosts($hosts, $expectedError) + { + $options = [ + ConfigOptionsListConstants::INPUT_KEY_SKIP_DB_VALIDATION => true, + ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS => $hosts, + Lock::INPUT_KEY_LOCK_PROVIDER => 'db' + ]; + $result = $this->object->validate($options, $this->deploymentConfig); + if ($expectedError) { + $this->assertCount(1, $result); + $this->assertEquals("Invalid http cache hosts '$hosts'", $result[0]); + } else { + $this->assertCount(0, $result); + } + } + + /** + * @return array + */ + public function validateCacheHostsDataProvider() + { + return [ + ['localhost', false], + ['122.11.2.34:800', false], + ['122.11.2.34:800,localhost', false], + ['website.com:9000', false], + ['web-site.com:9000', false], + ['website.com/m2ce:9000', true], + ['website.com+:9000', true], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/CryptKeyGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/CryptKeyGeneratorTest.php new file mode 100644 index 0000000..2511c08 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/CryptKeyGeneratorTest.php @@ -0,0 +1,61 @@ +randomMock = $this->getMockBuilder(Random::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->cryptKeyGenerator = new CryptKeyGenerator($this->randomMock); + } + + public function testStringForHashingIsReadFromRandom() + { + $this->randomMock + ->expects($this->once()) + ->method('getRandomString') + ->willReturn(''); + + $this->cryptKeyGenerator->generate(); + } + + public function testReturnsMd5OfRandomString() + { + $expected = 'fdb7594e77f1ad5fbb8e6c917b6012ce'; // == 'magento2' + + $this->randomMock + ->method('getRandomString') + ->willReturn('magento2'); + + $actual = $this->cryptKeyGenerator->generate(); + + $this->assertEquals($expected, $actual); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Customer/CustomerDataGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Customer/CustomerDataGeneratorTest.php new file mode 100644 index 0000000..2213af2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Customer/CustomerDataGeneratorTest.php @@ -0,0 +1,109 @@ + 10 + ]; + + /** + * @var AddressDataGenerator|MockObject + */ + private $addressGeneratorMock; + + /** + * @var CustomerDataGenerator + */ + private $customerGenerator; + + /** + * @var CollectionFactory|MockObject + */ + private $groupCollectionFactoryMock; + + protected function setUp(): void + { + $this->groupCollectionFactoryMock = $this->getMockBuilder(CollectionFactory::class) + ->disableOriginalConstructor() + ->addMethods( + ['getAllIds'] + ) + ->onlyMethods(['create']) + ->getMock(); + + $this->groupCollectionFactoryMock + ->expects($this->once()) + ->method('create') + ->willReturn($this->groupCollectionFactoryMock); + + $this->groupCollectionFactoryMock + ->expects($this->once()) + ->method('getAllIds') + ->willReturn([1]); + + $this->addressGeneratorMock = $this->createMock(AddressDataGenerator::class); + + $this->customerGenerator = new CustomerDataGenerator( + $this->groupCollectionFactoryMock, + $this->addressGeneratorMock, + $this->config + ); + } + + public function testEmail() + { + $customer = $this->customerGenerator->generate(42); + + $this->assertEquals('user_42@example.com', $customer['customer']['email']); + } + + public function testAddressGeneration() + { + $this->addressGeneratorMock + ->expects($this->exactly(10)) + ->method('generateAddress'); + + $customer = $this->customerGenerator->generate(42); + + $this->assertCount($this->config['addresses-count'], $customer['addresses']); + } + + public function testCustomerGroup() + { + $customer = $this->customerGenerator->generate(1); + $this->assertEquals(1, $customer['customer']['group_id']); + } + + public function testCustomerStructure() + { + $customer = $this->customerGenerator->generate(42); + + foreach ($this->customerStructure as $customerField) { + $this->assertArrayHasKey($customerField, $customer); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/DataGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/DataGeneratorTest.php new file mode 100644 index 0000000..3d222bd --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/DataGeneratorTest.php @@ -0,0 +1,51 @@ +generate($wordCount, $wordCount); + + $found = false; + foreach ($data as $word) { + $found = (strpos($result, $word[0]) !== false) || $found; + } + $this->assertTrue($found); + $this->assertCount($wordCount, explode(" ", $result)); + } + + public function testGenerateWithKey() + { + $key = 'generate-test'; + + $data = file(__DIR__ . self::PATH_TO_CSV_FILE); + $wordCount = random_int(1, count($data)); + $model = new DataGenerator(__DIR__ . self::PATH_TO_CSV_FILE); + $result = $model->generate($wordCount, $wordCount, $key); + + $foundResult = $model->generate($wordCount, $wordCount, $key); + + $this->assertCount($wordCount, explode(" ", $result)); + $this->assertEquals($result, $foundResult); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/DateTime/DateTimeProviderTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/DateTime/DateTimeProviderTest.php new file mode 100644 index 0000000..558a5b5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/DateTime/DateTimeProviderTest.php @@ -0,0 +1,53 @@ +createMock(DateTime::class); + /** @var TimeZoneProvider|MockObject $timeZoneProvider */ + $timeZoneProvider = $this->createMock(TimeZoneProvider::class); + $timeZone = $this->createMock(Timezone::class); + $timeZoneProvider->expects($this->any()) + ->method('get') + ->willReturn($timeZone); + $objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManager->expects($this->once()) + ->method('create') + ->with( + DateTime::class, + ['localeDate' => $timeZone] + ) + ->willReturn($dateTime); + /** @var ObjectManagerProvider|MockObject $objectManagerProvider */ + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->expects($this->any()) + ->method('get') + ->willReturn($objectManager); + $object = new DateTimeProvider($timeZoneProvider, $objectManagerProvider); + $this->assertSame($dateTime, $object->get()); + // Assert that the provider always returns the same object + $this->assertSame($dateTime, $object->get()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/DateTime/TimeZoneProviderTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/DateTime/TimeZoneProviderTest.php new file mode 100644 index 0000000..f087549 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/DateTime/TimeZoneProviderTest.php @@ -0,0 +1,46 @@ +createMock(Timezone::class); + $objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManager->expects($this->once()) + ->method('create') + ->with( + Timezone::class, + ['scopeType' => ScopeConfigInterface::SCOPE_TYPE_DEFAULT] + ) + ->willReturn($timeZone); + /** @var ObjectManagerProvider|MockObject $objectManagerProvider */ + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->expects($this->any()) + ->method('get') + ->willReturn($objectManager); + $object = new TimeZoneProvider($objectManagerProvider); + $this->assertSame($timeZone, $object->get()); + // Assert that the provider always returns the same object + $this->assertSame($timeZone, $object->get()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionGeneratorTest.php new file mode 100644 index 0000000..837f0a4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionGeneratorTest.php @@ -0,0 +1,105 @@ + [ + 'count-min' => 3, + 'count-max' => 3 + ], + 'mixin' => [ + 'tags' => ['p', 'b', 'div'] + ] + ]; + + /** + * @var array + */ + private $descriptionConfigWithoutMixin = [ + 'paragraphs' => [ + 'count-min' => 3, + 'count-max' => 3 + ] + ]; + + protected function setUp(): void + { + $this->descriptionParagraphGeneratorMock = + $this->createMock(DescriptionParagraphGenerator::class); + $this->descriptionParagraphGeneratorMock + ->expects($this->exactly(3)) + ->method('generate') + ->will($this->onConsecutiveCalls( + $this->paragraphs[0], + $this->paragraphs[1], + $this->paragraphs[2] + )); + + $this->mixinManagerMock = $this->createMock(MixinManager::class); + } + + public function testGeneratorWithMixin() + { + $descriptionWithMixin = 'Some description with mixin'; + $this->mixinManagerMock + ->expects($this->once()) + ->method('apply') + ->with( + implode(PHP_EOL, $this->paragraphs), + $this->descriptionConfigWithMixin['mixin']['tags'] + ) + ->willReturn($descriptionWithMixin); + + $generator = new DescriptionGenerator( + $this->descriptionParagraphGeneratorMock, + $this->mixinManagerMock, + $this->descriptionConfigWithMixin + ); + + $this->assertEquals($descriptionWithMixin, $generator->generate()); + } + + public function testGeneratorWithoutMixin() + { + $generator = new DescriptionGenerator( + $this->descriptionParagraphGeneratorMock, + $this->mixinManagerMock, + $this->descriptionConfigWithoutMixin + ); + + $this->assertEquals(implode(PHP_EOL, $this->paragraphs), $generator->generate()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionParagraphGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionParagraphGeneratorTest.php new file mode 100644 index 0000000..0c33270 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionParagraphGeneratorTest.php @@ -0,0 +1,73 @@ + [ + 'count-min' => 4, + 'count-max' => 4 + ] + ]; + + protected function setUp(): void + { + $this->sentenceGeneratorMock = + $this->createMock(DescriptionSentenceGenerator::class); + $this->paragraphGenerator = new DescriptionParagraphGenerator( + $this->sentenceGeneratorMock, + $this->paragraphConfig + ); + } + + public function testParagraphGeneration() + { + // @codingStandardsIgnoreStart + $consecutiveSentences = [ + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', + 'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.', + 'Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.' + ]; + // @codingStandardsIgnoreEnd + + $this->sentenceGeneratorMock + ->expects($this->exactly(4)) + ->method('generate') + ->will($this->onConsecutiveCalls( + $consecutiveSentences[0], + $consecutiveSentences[1], + $consecutiveSentences[2], + $consecutiveSentences[3] + )); + + $this->assertEquals( + implode(' ', $consecutiveSentences), + $this->paragraphGenerator->generate() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionSentenceGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionSentenceGeneratorTest.php new file mode 100644 index 0000000..d57d697 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/DescriptionSentenceGeneratorTest.php @@ -0,0 +1,66 @@ + [ + 'count-min' => 7, + 'count-max' => 7 + ] + ]; + + protected function setUp(): void + { + $this->dictionaryMock = $this->createMock(Dictionary::class); + $this->sentenceGenerator = new DescriptionSentenceGenerator( + $this->dictionaryMock, + $this->sentenceConfig + ); + } + + public function testSentenceGeneration() + { + $this->dictionaryMock + ->expects($this->exactly(7)) + ->method('getRandWord') + ->will($this->onConsecutiveCalls( + 'Lorem', + 'ipsum', + 'dolor', + 'sit', + 'amet', + 'consectetur', + 'adipiscing' + )); + + $this->assertEquals( + 'Lorem ipsum dolor sit amet consectetur adipiscing.', + $this->sentenceGenerator->generate() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/BoldMixinTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/BoldMixinTest.php new file mode 100644 index 0000000..3d9b02c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/BoldMixinTest.php @@ -0,0 +1,70 @@ +randomWordSelectorMock = + $this->createMock(RandomWordSelector::class); + $this->wordWrapperMock = $this->createMock(WordWrapper::class); + + $this->mixin = new BoldMixin( + $this->randomWordSelectorMock, + $this->wordWrapperMock + ); + } + + public function testEmptyApply() + { + $this->assertEquals('', $this->mixin->apply('')); + } + + public function testApply() + { + $fixtureString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + $fixtureStringResult = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + $randWordsFixture = ['Lorem', 'dolor']; + + $this->randomWordSelectorMock + ->expects($this->once()) + ->method('getRandomWords') + ->with($fixtureString, $this->greaterThan(0)) + ->willReturn($randWordsFixture); + + $this->wordWrapperMock + ->expects($this->once()) + ->method('wrapWords') + ->with($fixtureString, $randWordsFixture, '%s') + ->willReturn($fixtureStringResult); + + $this->assertEquals($fixtureStringResult, $this->mixin->apply($fixtureString)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/BrakeMixinTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/BrakeMixinTest.php new file mode 100644 index 0000000..77b7b7e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/BrakeMixinTest.php @@ -0,0 +1,53 @@ +mixin = new BrakeMixin(); + } + + /** + * @dataProvider getTestData + */ + public function testApply($subject, $expectedResult) + { + $this->assertEquals($expectedResult, $this->mixin->apply($subject)); + } + + /** + * @return array + */ + public function getTestData() + { + return [ + ['', ''], + [ + 'Lorem ipsum dolor sit amet.' . PHP_EOL + . 'Consectetur adipiscing elit.' . PHP_EOL + . 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + + 'Lorem ipsum dolor sit amet.' . PHP_EOL + . '
' . PHP_EOL + . 'Consectetur adipiscing elit.' . PHP_EOL + . '
' . PHP_EOL + . 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' + ] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/HeaderMixinTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/HeaderMixinTest.php new file mode 100644 index 0000000..d663083 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/HeaderMixinTest.php @@ -0,0 +1,54 @@ +mixin = new HeaderMixin(); + } + + /** + * @dataProvider getTestData + */ + public function testApply($subject, $expectedResult) + { + $this->assertEquals($expectedResult, $this->mixin->apply($subject)); + } + + /** + * @return array + */ + public function getTestData() + { + return [ + ['', ''], + [ + 'Lorem ipsum dolor sit amet.' . PHP_EOL + . 'Consectetur adipiscing elit.' . PHP_EOL + . 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + + '

Lorem ipsum

' . PHP_EOL + . 'Lorem ipsum dolor sit amet.' . PHP_EOL + . '

Consectetur

' . PHP_EOL + . 'Consectetur adipiscing elit.' . PHP_EOL + . '

Sed do eiusmod

' . PHP_EOL + . 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' + ] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/Helper/RandomWordSelectorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/Helper/RandomWordSelectorTest.php new file mode 100644 index 0000000..24a52c9 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/Helper/RandomWordSelectorTest.php @@ -0,0 +1,68 @@ +helper = new RandomWordSelector(); + } + + /** + * @param string $fixtureSource + * @param int $fixtureCount + * @dataProvider getTestData + */ + public function testRandomSelector($fixtureSource, $fixtureCount) + { + $randWords = $this->helper->getRandomWords($fixtureSource, $fixtureCount); + + $this->assertCount($fixtureCount, $randWords); + + $fixtureWords = str_word_count($fixtureSource, 1); + foreach ($randWords as $randWord) { + $this->assertContains($randWord, $fixtureWords); + } + } + + /** + * @return array + */ + public function getTestData() + { + return [ + [ + 'source' => ' + Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + ', + 'count' => 1 + ], + [ + 'source' => 'Lorem.', + 'count' => 5 + ], + [ + 'source' => ' + Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + ', + 'count' => 3 + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/Helper/WordWrapperTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/Helper/WordWrapperTest.php new file mode 100644 index 0000000..c500629 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/Helper/WordWrapperTest.php @@ -0,0 +1,72 @@ +wrapper = new WordWrapper(); + } + + /** + * @param array $inputData + * @param string $expectedResult + * @dataProvider getTestData + */ + public function testWrapping($inputData, $expectedResult) + { + $this->assertEquals( + $expectedResult, + $this->wrapper->wrapWords($inputData['source'], $inputData['words'], $inputData['format']) + ); + } + + /** + * @return array + */ + public function getTestData() + { + return [ + [ + [ + 'source' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', + 'words' => [], + 'format' => '', + ], + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' + ], + + [ + [ + 'source' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', + 'words' => ['Lorem'], + 'format' => '%s', + ], + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' + ], + + [ + [ + 'source' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', + 'words' => ['Lorem', 'consectetur', 'elit'], + 'format' => '%s', + ], + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/ItalicMixinTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/ItalicMixinTest.php new file mode 100644 index 0000000..0ec0d67 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/ItalicMixinTest.php @@ -0,0 +1,70 @@ +randomWordSelectorMock = + $this->createMock(RandomWordSelector::class); + $this->wordWrapperMock = $this->createMock(WordWrapper::class); + + $this->mixin = new ItalicMixin( + $this->randomWordSelectorMock, + $this->wordWrapperMock + ); + } + + public function testEmptyApply() + { + $this->assertEquals('', $this->mixin->apply('')); + } + + public function testApply() + { + $fixtureString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + $fixtureStringResult = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + $randWordsFixture = ['Lorem', 'dolor']; + + $this->randomWordSelectorMock + ->expects($this->once()) + ->method('getRandomWords') + ->with($fixtureString, $this->greaterThan(0)) + ->willReturn($randWordsFixture); + + $this->wordWrapperMock + ->expects($this->once()) + ->method('wrapWords') + ->with($fixtureString, $randWordsFixture, '%s') + ->willReturn($fixtureStringResult); + + $this->assertEquals($fixtureStringResult, $this->mixin->apply($fixtureString)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/ParagraphMixinTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/ParagraphMixinTest.php new file mode 100644 index 0000000..5892674 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/ParagraphMixinTest.php @@ -0,0 +1,51 @@ +mixin = new ParagraphMixin(); + } + + /** + * @dataProvider getTestData + */ + public function testApply($subject, $expectedResult) + { + $this->assertEquals($expectedResult, $this->mixin->apply($subject)); + } + + /** + * @return array + */ + public function getTestData() + { + return [ + ['', '

'], + [ + 'Lorem ipsum dolor sit amet.' . PHP_EOL + . 'Consectetur adipiscing elit.' . PHP_EOL + . 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + + '

Lorem ipsum dolor sit amet.

' . PHP_EOL + . '

Consectetur adipiscing elit.

' . PHP_EOL + . '

Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

' + ] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/SpanMixinTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/SpanMixinTest.php new file mode 100644 index 0000000..93cc2c2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/Mixin/SpanMixinTest.php @@ -0,0 +1,70 @@ +randomWordSelectorMock = + $this->createMock(RandomWordSelector::class); + $this->wordWrapperMock = $this->createMock(WordWrapper::class); + + $this->mixin = new SpanMixin( + $this->randomWordSelectorMock, + $this->wordWrapperMock + ); + } + + public function testEmptyApply() + { + $this->assertEquals('', $this->mixin->apply('')); + } + + public function testApply() + { + $fixtureString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + $fixtureStringResult = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + $randWordsFixture = ['Lorem', 'dolor']; + + $this->randomWordSelectorMock + ->expects($this->once()) + ->method('getRandomWords') + ->with($fixtureString, $this->greaterThan(0)) + ->willReturn($randWordsFixture); + + $this->wordWrapperMock + ->expects($this->once()) + ->method('wrapWords') + ->with($fixtureString, $randWordsFixture, '%s') + ->willReturn($fixtureStringResult); + + $this->assertEquals($fixtureStringResult, $this->mixin->apply($fixtureString)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/MixinManagerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/MixinManagerTest.php new file mode 100644 index 0000000..41c7c96 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Description/MixinManagerTest.php @@ -0,0 +1,84 @@ +mixinFactoryMock = $this->createMock(MixinFactory::class); + $this->mixinManager = new MixinManager($this->mixinFactoryMock); + } + + public function testApply() + { + $description = '>o<'; + $mixinList = ['x', 'y', 'z']; + + $xMixinMock = $this->getMockForAbstractClass( + DescriptionMixinInterface::class + ); + $xMixinMock->expects($this->once()) + ->method('apply') + ->with($description) + ->willReturn($description . 'x'); + + $yMixinMock = $this->getMockForAbstractClass( + DescriptionMixinInterface::class + ); + $yMixinMock->expects($this->once()) + ->method('apply') + ->with($description . 'x') + ->willReturn($description . 'xy'); + + $zMixinMock = $this->getMockForAbstractClass( + DescriptionMixinInterface::class + ); + $zMixinMock->expects($this->once()) + ->method('apply') + ->with($description . 'xy') + ->willReturn($description . 'xyz'); + + $this->mixinFactoryMock + ->expects($this->exactly(count($mixinList))) + ->method('create') + ->withConsecutive( + [$mixinList[0]], + [$mixinList[1]], + [$mixinList[2]] + ) + ->will( + $this->onConsecutiveCalls( + $xMixinMock, + $yMixinMock, + $zMixinMock + ) + ); + + $this->assertEquals( + $description . 'xyz', + $this->mixinManager->apply($description, $mixinList) + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/DictionaryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/DictionaryTest.php new file mode 100644 index 0000000..b1c8d86 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/DictionaryTest.php @@ -0,0 +1,60 @@ +expectException('Magento\Setup\Exception'); + $this->expectExceptionMessage('Description file some-wrong-file.csv not found or is not readable'); + $dictionary = new Dictionary('some-wrong-file.csv'); + $dictionary->getRandWord(); + } + + public function testDictionaryFileIsEmptyException() + { + $this->expectException('Magento\Setup\Exception'); + $this->expectExceptionMessageMatches('/Dictionary file .*empty-dictionary\.csv is empty/'); + $filePath = __DIR__ . '/_files/empty-dictionary.csv'; + file_put_contents($filePath, ''); + + try { + $dictionary = new Dictionary($filePath); + $dictionary->getRandWord(); + } finally { + unlink($filePath); + } + } + + public function testGetRandWord() + { + $filePath = __DIR__ . '/_files/valid-dictionary.csv'; + file_put_contents($filePath, implode(PHP_EOL, $this->dictionary)); + + $dictionary = new Dictionary($filePath); + + $this->assertContains($dictionary->getRandWord(), $this->dictionary); + $this->assertContains($dictionary->getRandWord(), $this->dictionary); + $this->assertContains($dictionary->getRandWord(), $this->dictionary); + + unlink($filePath); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/FixtureGenerator/SqlCollectorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/FixtureGenerator/SqlCollectorTest.php new file mode 100644 index 0000000..ccb4341 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/FixtureGenerator/SqlCollectorTest.php @@ -0,0 +1,129 @@ +resourceConnection = $this->getMockBuilder(ResourceConnection::class) + ->disableOriginalConstructor() + ->getMock(); + $this->unit = (new ObjectManager($this))->getObject( + SqlCollector::class, + ['resourceConnection' => $this->resourceConnection] + ); + } + + public function testGetEmptySql() + { + $connection = $this->getMockBuilder(AdapterInterface::class) + ->setMethods(['getProfiler']) + ->getMockForAbstractClass(); + $profiler = $this->getMockBuilder(\Zend_Db_Profiler::class) + ->disableOriginalConstructor() + ->getMock(); + $connection->expects($this->once())->method('getProfiler')->willReturn($profiler); + $this->resourceConnection->expects($this->once())->method('getConnection')->willReturn($connection); + + $profiler->expects($this->once())->method('getQueryProfiles')->willReturn([]); + + $this->unit->disable(); + $this->assertEquals([], $this->unit->getSql()); + } + + public function testGetEmptySqlWhenSelectQueryProcessed() + { + $connection = $this->getMockBuilder(AdapterInterface::class) + ->setMethods(['getProfiler']) + ->getMockForAbstractClass(); + $profiler = $this->getMockBuilder(\Zend_Db_Profiler::class) + ->disableOriginalConstructor() + ->getMock(); + $connection->expects($this->once())->method('getProfiler')->willReturn($profiler); + $this->resourceConnection->expects($this->once())->method('getConnection')->willReturn($connection); + + $query = $this->getMockBuilder(\Zend_Db_Profiler_Query::class)->disableOriginalConstructor() + ->getMock(); + $query->expects($this->exactly(2))->method('getQueryType')->willReturn(\Zend_Db_Profiler::SELECT); + $profiler->expects($this->once())->method('getQueryProfiles')->willReturn([$query]); + + $this->unit->disable(); + $this->assertEquals([], $this->unit->getSql()); + } + + public function testGetSql() + { + $connection = $this->getMockBuilder(AdapterInterface::class) + ->setMethods(['getProfiler']) + ->getMockForAbstractClass(); + $profiler = $this->getMockBuilder(\Zend_Db_Profiler::class) + ->disableOriginalConstructor() + ->getMock(); + $connection->expects($this->once())->method('getProfiler')->willReturn($profiler); + $this->resourceConnection->expects($this->once())->method('getConnection')->willReturn($connection); + + $query = $this->getMockBuilder(\Zend_Db_Profiler_Query::class)->disableOriginalConstructor() + ->getMock(); + $query->expects($this->once())->method('getQueryType')->willReturn(\Zend_Db_Profiler::INSERT); + $query->expects($this->once())->method('getQuery')->willReturn( + 'INSERT INTO `catalog_product_entity` (id, sku, type, created_at, attribute_set)' + . ' VALUES (?, ?, ?, \'2013-12-11\', ?), (?, ?, ?, \'2013-12-11\', ?)' + ); + $query->expects($this->once())->method('getQueryParams')->willReturn([ + 4, 'sku_4', 'simple', 4, 5, 'sku_5', 'simple', 12 + ]); + $profiler->expects($this->once())->method('getQueryProfiles')->willReturn([$query]); + + $this->unit->disable(); + $this->assertEquals( + [ + [ + [ + [ + 'id' => 4, + 'sku' => 'sku_4', + 'type' => 'simple', + 'created_at' => '2013-12-11', + 'attribute_set' => 4, + ], + [ + 'id' => 5, + 'sku' => 'sku_5', + 'type' => 'simple', + 'created_at' => '2013-12-11', + 'attribute_set' => 12, + ], + ], + 'catalog_product_entity' + ] + ], + $this->unit->getSql() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/GeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/GeneratorTest.php new file mode 100644 index 0000000..7de572e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/GeneratorTest.php @@ -0,0 +1,42 @@ + '%s', + 'name' => 'Static', + 'calculated' => function ($index) { + return $index * 10; + }, + ]; + $model = new Generator($pattern, 2); + $rows = []; + foreach ($model as $row) { + $rows[] = $row; + } + $this->assertEquals( + [ + ['id' => '1', 'name' => 'Static', 'calculated' => 10], + ['id' => '2', 'name' => 'Static', 'calculated' => 20], + ], + $rows + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/Installer/ProgressTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/Installer/ProgressTest.php new file mode 100644 index 0000000..33b7103 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/Installer/ProgressTest.php @@ -0,0 +1,100 @@ +expectException('LogicException'); + $this->expectExceptionMessage('Total number must be more than zero.'); + new Progress($total, $current); + } + + /** + * return array + */ + public function constructorExceptionInvalidTotalDataProvider() + { + return [[0,0], [0, 1], [[], 1]]; + } + + public function testConstructorExceptionCurrentExceedsTotal() + { + $this->expectException('LogicException'); + $this->expectExceptionMessage('Current cannot exceed total number.'); + new Progress(1, 2); + } + + public function testSetNext() + { + $progress = new Progress(10); + $progress->setNext(); + $this->assertEquals(1, $progress->getCurrent()); + } + + public function testSetNextException() + { + $this->expectException('LogicException'); + $this->expectExceptionMessage('Current cannot exceed total number.'); + $progress = new Progress(10, 10); + $progress->setNext(); + } + + public function testFinish() + { + $progress = new Progress(10); + $progress->finish(); + $this->assertEquals(10, $progress->getCurrent()); + } + + public function testGetCurrent() + { + $progress = new Progress(10, 5); + $this->assertEquals(5, $progress->getCurrent()); + } + + public function testGetTotal() + { + $progress = new Progress(10); + $this->assertEquals(10, $progress->getTotal()); + } + + /** + * @param int $total + * @param int $current + * @dataProvider ratioDataProvider + */ + public function testRatio($total, $current) + { + $progress = new Progress($total, $current); + $this->assertEquals($current / $total, $progress->getRatio()); + } + + /** + * @return array + */ + public function ratioDataProvider() + { + $data = []; + for ($i = 10; $i <= 20; $i++) { + for ($j = 0; $j <= $i; $j++) { + $data[] = [$i, $j]; + } + } + return $data; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php new file mode 100644 index 0000000..adc451e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php @@ -0,0 +1,184 @@ +objectManagerProviderMock = $this->getMockBuilder(ObjectManagerProvider::class) + ->disableOriginalConstructor() + ->onlyMethods(['get']) + ->getMock(); + + $objectManagerMock = $this->getMockBuilder(ObjectManager::class) + ->disableOriginalConstructor() + ->onlyMethods(['get']) + ->getMock(); + $objectManagerMock->expects($this->any()) + ->method('get') + ->willReturnMap( + [ + [DeclarationInstaller::class, $this->createMock(DeclarationInstaller::class)], + [SchemaPersistor::class, $this->createMock(SchemaPersistor::class)], + ] + ); + $this->objectManagerProviderMock->expects($this->any()) + ->method('get') + ->willReturn($objectManagerMock); + /** @var ServiceLocatorInterface|MockObject $serviceLocatorMock */ + $serviceLocatorMock = $this->getMockBuilder( + ServiceLocatorInterface::class + )->onlyMethods( + ['get'] + )->getMockForAbstractClass(); + $serviceLocatorMock->expects($this->any())->method('get') + ->willReturnMap($this->getReturnValueMap()); + + /** @var LoggerInterface|MockObject $log */ + $log = $this->getMockForAbstractClass(LoggerInterface::class); + /** @var ResourceFactory|MockObject $resourceFactoryMock */ + $resourceFactoryMock = $this->createMock(ResourceFactory::class); + $resourceFactoryMock + ->expects($this->any()) + ->method('create') + ->willReturn($this->createMock(ResourceConnection::class)); + $installerFactory = new InstallerFactory($serviceLocatorMock, $resourceFactoryMock); + $installer = $installerFactory->create($log); + $this->assertInstanceOf(Installer::class, $installer); + } + + /** + * @return array + */ + private function getReturnValueMap() + { + return [ + [ + FilePermissions::class, + $this->createMock(FilePermissions::class), + ], + [ + Writer::class, + $this->createMock(Writer::class), + ], + [ + Reader::class, + $this->createMock(Reader::class), + ], + [ + DeploymentConfig::class, + $this->createMock(DeploymentConfig::class), + ], + [ + ModuleList::class, + $this->createMock(ModuleList::class), + ], + [ + Loader::class, + $this->createMock(Loader::class), + ], + [ + AdminAccountFactory::class, + $this->createMock(AdminAccountFactory::class), + ], + [ + ConnectionFactory::class, + $this->createMock(ConnectionFactory::class), + ], + [ + MaintenanceMode::class, + $this->createMock(MaintenanceMode::class), + ], + [ + Filesystem::class, + $this->createMock(Filesystem::class), + ], + [ + ObjectManagerProvider::class, + $this->objectManagerProviderMock + ], + [ + TransactionManager::class, + $this->createMock(TransactionManager::class), + ], + [ + ObjectRelationProcessor::class, + $this->createMock(ObjectRelationProcessor::class), + ], + [ + ConfigModel::class, + $this->createMock(ConfigModel::class), + ], + [ + CleanupFiles::class, + $this->createMock(CleanupFiles::class), + ], + [ + DbValidator::class, + $this->createMock(DbValidator::class), + ], + [ + SetupFactory::class, + $this->createMock(SetupFactory::class), + ], + [ + DataSetupFactory::class, + $this->createMock(DataSetupFactory::class), + ], + [ + State::class, + $this->createMock(State::class), + ], + [ + PhpReadinessCheck::class, + $this->createMock(PhpReadinessCheck::class), + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php new file mode 100644 index 0000000..d3d7d38 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php @@ -0,0 +1,1426 @@ + '127.0.0.1', + ConfigOptionsListConstants::INPUT_KEY_DB_NAME => 'magento', + ConfigOptionsListConstants::INPUT_KEY_DB_USER => 'magento', + ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY => 'encryption_key', + ConfigOptionsList::INPUT_KEY_BACKEND_FRONTNAME => 'backend' + ]; + + /** + * @var Installer|MockObject + */ + private $object; + + /** + * @var FilePermissions|MockObject + */ + private $filePermissions; + + /** + * @var Writer|MockObject + */ + private $configWriter; + + /** + * @var Reader|MockObject + */ + private $configReader; + + /** + * @var DeploymentConfig|MockObject + */ + private $config; + + /** + * @var ModuleListInterface|MockObject + */ + private $moduleList; + + /** + * @var Loader|MockObject + */ + private $moduleLoader; + + /** + * @var AdminAccountFactory|MockObject + */ + private $adminFactory; + + /** + * @var LoggerInterface|MockObject + */ + private $logger; + + /** + * @var AdapterInterface|MockObject + */ + private $connection; + + /** + * @var MaintenanceMode|MockObject + */ + private $maintenanceMode; + + /** + * @var Filesystem|MockObject + */ + private $filesystem; + + /** + * @var MockObject + */ + private $objectManager; + + /** + * @var ConfigModel|MockObject + */ + private $configModel; + + /** + * @var CleanupFiles|MockObject + */ + private $cleanupFiles; + + /** + * @var DbValidator|MockObject + */ + private $dbValidator; + + /** + * @var SetupFactory|MockObject + */ + private $setupFactory; + + /** + * @var DataSetupFactory|MockObject + */ + private $dataSetupFactory; + + /** + * @var State|MockObject + */ + private $sampleDataState; + + /** + * @var ComponentRegistrar|MockObject + */ + private $componentRegistrar; + + /** + * @var MockObject|PhpReadinessCheck + */ + private $phpReadinessCheck; + + /** + * @var DeclarationInstaller|MockObject + */ + private $declarationInstallerMock; + + /** + * @var SchemaListener|MockObject + */ + private $schemaListenerMock; + + /** + * Sample DB configuration segment + * @var array + */ + private static $dbConfig = [ + 'default' => [ + ConfigOptionsListConstants::KEY_HOST => '127.0.0.1', + ConfigOptionsListConstants::KEY_NAME => 'magento', + ConfigOptionsListConstants::KEY_USER => 'magento', + ConfigOptionsListConstants::KEY_PASSWORD => '' + ] + ]; + + /** + * @var Context|MockObject + */ + private $contextMock; + + /** + * @var PatchApplier|MockObject + */ + private $patchApplierMock; + + /** + * @var PatchApplierFactory|MockObject + */ + private $patchApplierFactoryMock; + + /** + * @inheritdoc + */ + protected function setUp(): void + { + $this->filePermissions = $this->createMock(FilePermissions::class); + $this->configWriter = $this->createMock(Writer::class); + $this->configReader = $this->createMock(Reader::class); + $this->config = $this->createMock(DeploymentConfig::class); + + $this->moduleList = $this->getMockForAbstractClass(ModuleListInterface::class); + $this->moduleList->expects($this->any())->method('getNames')->willReturn( + ['Foo_One', 'Bar_Two'] + ); + $this->moduleLoader = $this->createMock(Loader::class); + $this->adminFactory = $this->createMock(AdminAccountFactory::class); + $this->logger = $this->getMockForAbstractClass(LoggerInterface::class); + $this->connection = $this->getMockForAbstractClass(AdapterInterface::class); + $this->maintenanceMode = $this->createMock(MaintenanceMode::class); + $this->filesystem = $this->createMock(Filesystem::class); + $this->objectManager = $this->getMockForAbstractClass(ObjectManagerInterface::class); + $this->contextMock = + $this->createMock(Context::class); + $this->configModel = $this->createMock(ConfigModel::class); + $this->cleanupFiles = $this->createMock(CleanupFiles::class); + $this->dbValidator = $this->createMock(DbValidator::class); + $this->setupFactory = $this->createMock(SetupFactory::class); + $this->dataSetupFactory = $this->createMock(DataSetupFactory::class); + $this->sampleDataState = $this->createMock(State::class); + $this->componentRegistrar = + $this->createMock(ComponentRegistrar::class); + $this->phpReadinessCheck = $this->createMock(PhpReadinessCheck::class); + $this->declarationInstallerMock = $this->createMock(DeclarationInstaller::class); + $this->schemaListenerMock = $this->createMock(SchemaListener::class); + $this->patchApplierFactoryMock = $this->createMock(PatchApplierFactory::class); + $this->patchApplierMock = $this->createMock(PatchApplier::class); + $this->patchApplierFactoryMock->expects($this->any())->method('create')->willReturn( + $this->patchApplierMock + ); + $this->object = $this->createObject(); + } + + /** + * Instantiates the object with mocks + * @param MockObject|bool $connectionFactory + * @param MockObject|bool $objectManagerProvider + * @return Installer + */ + private function createObject($connectionFactory = false, $objectManagerProvider = false) + { + if (!$connectionFactory) { + $connectionFactory = $this->createMock(ConnectionFactory::class); + $connectionFactory->expects($this->any())->method('create')->willReturn($this->connection); + } + if (!$objectManagerProvider) { + $objectManagerProvider = + $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->expects($this->any())->method('get')->willReturn($this->objectManager); + } + + $installer = $this->getMockBuilder(Installer::class) + ->enableOriginalConstructor() + ->onlyMethods(['getModuleResource']) + ->setConstructorArgs([ + 'filePermissions' => $this->filePermissions, + 'deploymentConfigWriter' => $this->configWriter, + 'deploymentConfigReader' => $this->configReader, + 'deploymentConfig' => $this->config, + 'moduleList' => $this->moduleList, + 'moduleLoader' => $this->moduleLoader, + 'adminAccountFactory' => $this->adminFactory, + 'log' => $this->logger, + 'connectionFactory' => $connectionFactory, + 'maintenanceMode' => $this->maintenanceMode, + 'filesystem' => $this->filesystem, + 'objectManagerProvider' => $objectManagerProvider, + 'context' => $this->contextMock, + 'setupConfigModel' => $this->configModel, + 'cleanupFiles' => $this->cleanupFiles, + 'dbValidator' => $this->dbValidator, + 'setupFactory' => $this->setupFactory, + 'dataSetupFactory' => $this->dataSetupFactory, + 'sampleDataState' => $this->sampleDataState, + 'componentRegistrar' => $this->componentRegistrar, + 'phpReadinessCheck' => $this->phpReadinessCheck, + ]) + ->getMock(); + + return $installer; + } + + /** + * @param array $request + * @param array $logMessages + * @dataProvider installDataProvider + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function testInstall(array $request, array $logMessages) + { + $this->moduleList->method('getOne') + ->willReturnMap( + [ + ['Foo_One', ['setup_version' => '2.0.0']], + ['Bar_Two', ['setup_version' => null]] + ] + ); + + $this->config->expects($this->atLeastOnce()) + ->method('get') + ->willReturnMap( + [ + [ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT, null, true], + [ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, null, true], + ['modules/Magento_User', null, '1'] + ] + ); + $allModules = ['Foo_One' => [], 'Bar_Two' => []]; + + $this->declarationInstallerMock->expects($this->once())->method('installSchema'); + $this->moduleLoader->expects($this->any())->method('load')->willReturn($allModules); + $setup = $this->createMock(Setup::class); + $table = $this->createMock(Table::class); + $connection = $this->getMockBuilder(AdapterInterface::class) + ->onlyMethods(['getTables', 'newTable']) + ->addMethods(['getSchemaListener']) + ->getMockForAbstractClass(); + $connection->expects($this->any())->method('getSchemaListener')->willReturn($this->schemaListenerMock); + $connection->expects($this->once())->method('getTables')->willReturn([]); + $setup->expects($this->any())->method('getConnection')->willReturn($connection); + $table->expects($this->any())->method('addColumn')->willReturn($table); + $table->expects($this->any())->method('setComment')->willReturn($table); + $table->expects($this->any())->method('addIndex')->willReturn($table); + $connection->expects($this->any())->method('newTable')->willReturn($table); + $resource = $this->createMock(ResourceConnection::class); + $this->contextMock->expects($this->any())->method('getResources')->willReturn($resource); + $resource->expects($this->any())->method('getConnection')->willReturn($connection); + + $moduleResource = $this->getMockBuilder(ModuleResource::class) + ->enableOriginalConstructor() + ->onlyMethods(['getDbVersion', 'getDataVersion']) + ->setConstructorArgs(['context' => $this->contextMock]) + ->getMock(); + $moduleResource->method('getDbVersion')->willReturnOnConsecutiveCalls(false, '2.1.0'); + $moduleResource->method('getDataVersion')->willReturn(false); + $this->object->method('getModuleResource')->willReturn($moduleResource); + + $dataSetup = $this->createMock(DataSetup::class); + $dataSetup->expects($this->any())->method('getConnection')->willReturn($connection); + $cacheManager = $this->createMock(Manager::class); + $cacheManager->expects($this->any())->method('getAvailableTypes')->willReturn(['foo', 'bar']); + $cacheManager->expects($this->exactly(3))->method('setEnabled')->willReturn(['foo', 'bar']); + $cacheManager->expects($this->exactly(3))->method('clean'); + $cacheManager->expects($this->exactly(3))->method('getStatus')->willReturn(['foo' => 1, 'bar' => 1]); + $appState = $this->getMockBuilder(\Magento\Framework\App\State::class) + ->disableOriginalConstructor() + ->disableArgumentCloning() + ->getMock(); + $appState->expects($this->once()) + ->method('setAreaCode') + ->with(Area::AREA_GLOBAL); + $registry = $this->createMock(Registry::class); + $searchConfigMock = $this->getMockBuilder(SearchConfig::class)->disableOriginalConstructor()->getMock(); + + $remoteStorageValidatorMock = $this->getMockBuilder(RemoteStorageValidator::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->configWriter->expects(static::never())->method('checkIfWritable'); + + $this->setupFactory->expects($this->atLeastOnce())->method('create')->with($resource)->willReturn($setup); + $this->dataSetupFactory->expects($this->atLeastOnce())->method('create')->willReturn($dataSetup); + $this->objectManager->expects($this->any()) + ->method('create') + ->willReturnMap( + [ + [Manager::class, [], $cacheManager], + [\Magento\Framework\App\State::class, [], $appState], + [ + PatchApplierFactory::class, + ['objectManager' => $this->objectManager], + $this->patchApplierFactoryMock + ], + ] + ); + $this->patchApplierMock->expects($this->exactly(2))->method('applySchemaPatch')->willReturnMap( + [ + ['Bar_Two'], + ['Foo_One'] + ] + ); + $this->patchApplierMock->expects($this->exactly(2))->method('applyDataPatch')->willReturnMap( + [ + ['Bar_Two'], + ['Foo_One'] + ] + ); + $this->objectManager->expects($this->any()) + ->method('get') + ->willReturnMap( + [ + [\Magento\Framework\App\State::class, $appState], + [Manager::class, $cacheManager], + [DeclarationInstaller::class, $this->declarationInstallerMock], + [Registry::class, $registry], + [SearchConfig::class, $searchConfigMock], + [RemoteStorageValidator::class, $remoteStorageValidatorMock] + ] + ); + $this->adminFactory->expects($this->any())->method('create')->willReturn( + $this->createMock(AdminAccount::class) + ); + $this->sampleDataState->expects($this->once())->method('hasError')->willReturn(true); + $this->phpReadinessCheck->expects($this->once())->method('checkPhpExtensions')->willReturn( + ['responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS] + ); + $this->filePermissions->expects($this->any()) + ->method('getMissingWritablePathsForInstallation') + ->willReturn([]); + $this->filePermissions->expects($this->once()) + ->method('getMissingWritableDirectoriesForDbUpgrade') + ->willReturn([]); + call_user_func_array( + [ + $this->logger->expects($this->exactly(count($logMessages)))->method('log'), + 'withConsecutive' + ], + $logMessages + ); + $this->logger->expects($this->exactly(2)) + ->method('logSuccess') + ->withConsecutive( + ['Magento installation complete.'], + ['Magento Admin URI: /'] + ); + + $this->object->install($request); + } + + /** + * @return array + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function installDataProvider() + { + return [ + [ + 'request' => $this->request, + 'logMessages' => [ + ['Starting Magento installation:'], + ['File permissions check...'], + ['Required extensions check...'], + ['Enabling Maintenance Mode...'], + ['Installing deployment configuration...'], + ['Installing database schema:'], + ['Schema creation/updates:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Schema post-updates:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Installing search configuration...'], + ['Validating remote storage configuration...'], + ['Installing user configuration...'], + ['Enabling caches:'], + ['Current status:'], + ['foo: 1'], + ['bar: 1'], + ['Installing data...'], + ['Data install/update:'], + ['Disabling caches:'], + ['Current status:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Data post-updates:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Enabling caches:'], + ['Current status:'], + ['Caches clearing:'], + ['Cache cleared successfully'], + ['Disabling Maintenance Mode:'], + ['Post installation file permissions check...'], + ['Write installation date...'], + ['Sample Data is installed with errors. See log file for details'] + ], + ], + [ + 'request' => [ + ConfigOptionsListConstants::INPUT_KEY_DB_HOST => '127.0.0.1', + ConfigOptionsListConstants::INPUT_KEY_DB_NAME => 'magento', + ConfigOptionsListConstants::INPUT_KEY_DB_USER => 'magento', + ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY => 'encryption_key', + ConfigOptionsList::INPUT_KEY_BACKEND_FRONTNAME => 'backend', + AdminAccount::KEY_USER => 'admin', + AdminAccount::KEY_PASSWORD => '123', + AdminAccount::KEY_EMAIL => 'admin@example.com', + AdminAccount::KEY_FIRST_NAME => 'John', + AdminAccount::KEY_LAST_NAME => 'Doe' + ], + 'logMessages' => [ + ['Starting Magento installation:'], + ['File permissions check...'], + ['Required extensions check...'], + ['Enabling Maintenance Mode...'], + ['Installing deployment configuration...'], + ['Installing database schema:'], + ['Schema creation/updates:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Schema post-updates:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Installing search configuration...'], + ['Validating remote storage configuration...'], + ['Installing user configuration...'], + ['Enabling caches:'], + ['Current status:'], + ['foo: 1'], + ['bar: 1'], + ['Installing data...'], + ['Data install/update:'], + ['Disabling caches:'], + ['Current status:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Data post-updates:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Enabling caches:'], + ['Current status:'], + ['Installing admin user...'], + ['Caches clearing:'], + ['Cache cleared successfully'], + ['Disabling Maintenance Mode:'], + ['Post installation file permissions check...'], + ['Write installation date...'], + ['Sample Data is installed with errors. See log file for details'] + ], + ], + ]; + } + + /** + * Test installation with invalid remote storage configuration raises ValidationException via validation + * and reverts configuration back to local file driver + * + * @param bool $isDeploymentConfigWritable + * @dataProvider installWithInvalidRemoteStorageConfigurationDataProvider + * @throws \Magento\Framework\Exception\FileSystemException + * @throws \Magento\Framework\Exception\LocalizedException + * @throws \Magento\Framework\Exception\RuntimeException + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function testInstallWithInvalidRemoteStorageConfiguration(bool $isDeploymentConfigWritable) + { + $request = $this->request; + + $logMessages = [ + ['Starting Magento installation:'], + ['File permissions check...'], + ['Required extensions check...'], + ['Enabling Maintenance Mode...'], + ['Installing deployment configuration...'], + ['Installing database schema:'], + ['Schema creation/updates:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Schema post-updates:'], + ['Module \'Foo_One\':'], + ['Module \'Bar_Two\':'], + ['Installing search configuration...'], + ['Validating remote storage configuration...'], + ]; + + $this->config->expects(static::atLeastOnce()) + ->method('get') + ->willReturnMap( + [ + [ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT, null, true], + [ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, null, true], + ['modules/Magento_User', null, '1'] + ] + ); + $this->moduleList->method('getOne')->willReturn(['setup_version' => '2.0.0']); + $allModules = ['Foo_One' => [], 'Bar_Two' => []]; + + $this->declarationInstallerMock->expects(static::once())->method('installSchema'); + $this->moduleLoader->expects(static::exactly(2))->method('load')->willReturn($allModules); + $setup = $this->createMock(Setup::class); + $table = $this->createMock(Table::class); + $connection = $this->getMockBuilder(AdapterInterface::class) + ->onlyMethods(['newTable', 'getTables']) + ->addMethods(['getSchemaListener']) + ->getMockForAbstractClass(); + $connection->expects(static::any())->method('getSchemaListener')->willReturn($this->schemaListenerMock); + $connection->expects(static::once())->method('getTables')->willReturn([]); + $setup->expects(static::any())->method('getConnection')->willReturn($connection); + $table->expects(static::any())->method('addColumn')->willReturn($table); + $table->expects(static::any())->method('setComment')->willReturn($table); + $table->expects(static::any())->method('addIndex')->willReturn($table); + $connection->expects(static::any())->method('newTable')->willReturn($table); + + $resource = $this->createMock(ResourceConnection::class); + $resource->expects(static::any())->method('getConnection')->willReturn($connection); + + $this->contextMock->expects(static::exactly(2))->method('getResources')->willReturn($resource); + $this->setModuleResource(); + + $dataSetup = $this->createMock(DataSetup::class); + $dataSetup->expects(static::never())->method('getConnection'); + + $cacheManager = $this->createMock(Manager::class); + $cacheManager->expects(static::never())->method('getAvailableTypes'); + + $appState = $this->getMockBuilder(\Magento\Framework\App\State::class) + ->disableOriginalConstructor() + ->disableArgumentCloning() + ->getMock(); + $registry = $this->createMock(Registry::class); + $searchConfigMock = $this->getMockBuilder(SearchConfig::class)->disableOriginalConstructor()->getMock(); + + $remoteStorageValidatorMock = $this->getMockBuilder(RemoteStorageValidator::class) + ->disableOriginalConstructor() + ->getMock(); + + $remoteStorageValidatorMock + ->expects(static::once()) + ->method('validate') + ->with($request, $this->config) + ->willReturn(['Invalid Remote Storage!']); + + $this->expectException(ValidationException::class); + + $this->configWriter + ->expects(static::once()) + ->method('checkIfWritable') + ->willReturn($isDeploymentConfigWritable); + + $remoteStorageReversionArguments = [ + [ + ConfigFilePool::APP_ENV => [ + 'remote_storage' => [ + 'driver' => 'file' + ] + ] + ], + true + ]; + + if ($isDeploymentConfigWritable) { // assert remote storage reversion is attempted + $this->configWriter + ->method('saveConfig') + ->withConsecutive([], [], $remoteStorageReversionArguments); + } else { // assert remote storage reversion is never attempted + $this->configWriter + ->expects(static::any()) + ->method('saveConfig') + ->willReturnCallback(function (array $data, $override) use ($remoteStorageReversionArguments) { + $this->assertNotEquals($remoteStorageReversionArguments, [$data, $override]); + }); + } + + $this->setupFactory->expects(static::once())->method('create')->with($resource)->willReturn($setup); + + $this->objectManager->expects(static::any()) + ->method('create') + ->willReturnMap( + [ + [Manager::class, [], $cacheManager], + [\Magento\Framework\App\State::class, [], $appState], + [ + PatchApplierFactory::class, + ['objectManager' => $this->objectManager], + $this->patchApplierFactoryMock + ] + ] + ); + $this->patchApplierMock->expects(static::exactly(2))->method('applySchemaPatch')->willReturnMap( + [ + ['Bar_Two'], + ['Foo_One'] + ] + ); + $this->objectManager->expects(static::any()) + ->method('get') + ->willReturnMap( + [ + [\Magento\Framework\App\State::class, $appState], + [Manager::class, $cacheManager], + [DeclarationInstaller::class, $this->declarationInstallerMock], + [Registry::class, $registry], + [SearchConfig::class, $searchConfigMock], + [RemoteStorageValidator::class, $remoteStorageValidatorMock] + ] + ); + + $this->sampleDataState->expects(static::never())->method('hasError'); + + $this->phpReadinessCheck->expects(static::once())->method('checkPhpExtensions')->willReturn( + ['responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS] + ); + + $this->filePermissions->expects(static::exactly(2)) + ->method('getMissingWritablePathsForInstallation') + ->willReturn([]); + + call_user_func_array( + [ + $this->logger->expects(static::exactly(count($logMessages)))->method('log'), + 'withConsecutive' + ], + $logMessages + ); + + $this->logger->expects(static::never())->method('logSuccess'); + + $this->object->install($request); + } + + /** + * @return array + */ + public function installWithInvalidRemoteStorageConfigurationDataProvider() + { + return [ + [true], + [false] + ]; + } + + /** + * Test that installation with unresolvable remote storage validator object still produces successful install + * in case RemoteStorage module is not available. + * + * @throws \Magento\Framework\Exception\FileSystemException + * @throws \Magento\Framework\Exception\LocalizedException + * @throws \Magento\Framework\Exception\RuntimeException + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function testInstallWithUnresolvableRemoteStorageValidator() + { + $request = $this->request; + + // every log message call is expected + $logMessages = $this->installDataProvider()[0]['logMessages']; + + $this->config->expects(static::atLeastOnce()) + ->method('get') + ->willReturnMap( + [ + [ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT, null, true], + [ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, null, true], + ['modules/Magento_User', null, '1'] + ] + ); + $allModules = ['Foo_One' => [], 'Bar_Two' => []]; + $this->moduleList->method('getOne')->willReturn(['setup_version' => '2.0.0']); + + $this->declarationInstallerMock->expects(static::once())->method('installSchema'); + $this->moduleLoader->expects(static::any())->method('load')->willReturn($allModules); + $setup = $this->createMock(Setup::class); + $table = $this->createMock(Table::class); + $connection = $this->getMockBuilder(AdapterInterface::class) + ->addMethods(['getSchemaListener']) + ->onlyMethods(['getTables', 'newTable']) + ->getMockForAbstractClass(); + $connection->expects(static::any())->method('getSchemaListener')->willReturn($this->schemaListenerMock); + $connection->expects(static::once())->method('getTables')->willReturn([]); + $setup->expects(static::any())->method('getConnection')->willReturn($connection); + $table->expects(static::any())->method('addColumn')->willReturn($table); + $table->expects(static::any())->method('setComment')->willReturn($table); + $table->expects(static::any())->method('addIndex')->willReturn($table); + $connection->expects(static::any())->method('newTable')->willReturn($table); + $resource = $this->createMock(ResourceConnection::class); + $this->contextMock->expects(static::any())->method('getResources')->willReturn($resource); + $resource->expects(static::any())->method('getConnection')->willReturn($connection); + $this->setModuleResource(); + + $dataSetup = $this->createMock(DataSetup::class); + $dataSetup->expects(static::any())->method('getConnection')->willReturn($connection); + $cacheManager = $this->createMock(Manager::class); + $cacheManager->expects(static::any())->method('getAvailableTypes')->willReturn(['foo', 'bar']); + $cacheManager->expects(static::exactly(3))->method('setEnabled')->willReturn(['foo', 'bar']); + $cacheManager->expects(static::exactly(3))->method('clean'); + $cacheManager->expects(static::exactly(3))->method('getStatus')->willReturn(['foo' => 1, 'bar' => 1]); + $appState = $this->getMockBuilder(\Magento\Framework\App\State::class) + ->disableOriginalConstructor() + ->disableArgumentCloning() + ->getMock(); + $appState->expects(static::once()) + ->method('setAreaCode') + ->with(Area::AREA_GLOBAL); + $registry = $this->createMock(Registry::class); + $searchConfigMock = $this->getMockBuilder(SearchConfig::class)->disableOriginalConstructor()->getMock(); + + $remoteStorageValidatorMock = $this->getMockBuilder(RemoteStorageValidator::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->configWriter->expects(static::never())->method('checkIfWritable'); + + $remoteStorageValidatorMock + ->expects(static::never()) + ->method('validate'); + + $remoteStorageReversionArguments = [ + [ + ConfigFilePool::APP_ENV => [ + 'remote_storage' => [ + 'driver' => 'file' + ] + ] + ], + true + ]; + + // assert remote storage reversion is never attempted + $this->configWriter + ->expects(static::any()) + ->method('saveConfig') + ->willReturnCallback(function (array $data, $override) use ($remoteStorageReversionArguments) { + $this->assertNotEquals($remoteStorageReversionArguments, [$data, $override]); + }); + + $this->setupFactory->expects(static::atLeastOnce())->method('create')->with($resource)->willReturn($setup); + $this->dataSetupFactory->expects(static::atLeastOnce())->method('create')->willReturn($dataSetup); + $this->objectManager->expects(static::any()) + ->method('create') + ->willReturnMap( + [ + [Manager::class, [], $cacheManager], + [\Magento\Framework\App\State::class, [], $appState], + [ + PatchApplierFactory::class, + ['objectManager' => $this->objectManager], + $this->patchApplierFactoryMock + ] + ] + ); + $this->patchApplierMock->expects(static::exactly(2))->method('applySchemaPatch')->willReturnMap( + [ + ['Bar_Two'], + ['Foo_One'] + ] + ); + $this->patchApplierMock->expects(static::exactly(2))->method('applyDataPatch')->willReturnMap( + [ + ['Bar_Two'], + ['Foo_One'] + ] + ); + + $objectManagerReturnMapSequence = [ + 0 => [Registry::class, $registry], + 1 => [DeclarationInstaller::class, $this->declarationInstallerMock], + 3 => [SearchConfig::class, $searchConfigMock], + 4 => [ + RemoteStorageValidator::class, + new ReflectionException('Class ' . RemoteStorageValidator::class . ' does not exist') + ], + 5 => [\Magento\Framework\App\State::class, $appState], + 7 => [Registry::class, $registry], + 11 => [Manager::class, $cacheManager] + ]; + $withArgs = $willReturnArgs = []; + + foreach ($objectManagerReturnMapSequence as $map) { + list($getArgument, $mockedObject) = $map; + + $withArgs[] = [$getArgument]; + + if ($mockedObject instanceof \Exception) { + $willReturnArgs[] = $this->throwException($mockedObject); + } else { + $willReturnArgs[] = $mockedObject; + } + } + $this->objectManager + ->method('get') + ->withConsecutive(...$withArgs) + ->willReturnOnConsecutiveCalls(...$willReturnArgs); + + $this->adminFactory->expects(static::any())->method('create')->willReturn( + $this->createMock(AdminAccount::class) + ); + $this->sampleDataState->expects(static::once())->method('hasError')->willReturn(true); + $this->phpReadinessCheck->expects(static::once())->method('checkPhpExtensions')->willReturn( + ['responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS] + ); + $this->filePermissions->expects(static::any()) + ->method('getMissingWritablePathsForInstallation') + ->willReturn([]); + $this->filePermissions->expects(static::once()) + ->method('getMissingWritableDirectoriesForDbUpgrade') + ->willReturn([]); + call_user_func_array( + [ + $this->logger->expects(static::exactly(count($logMessages)))->method('log'), + 'withConsecutive' + ], + $logMessages + ); + $this->logger->expects(static::exactly(2)) + ->method('logSuccess') + ->withConsecutive( + ['Magento installation complete.'], + ['Magento Admin URI: /'] + ); + + $this->object->install($request); + } + + /** + * Test installation with invalid remote storage configuration is able to be caught earlier than + * the queued validation step if necessary, and that configuration is reverted back to local file driver. + * + * @dataProvider installWithInvalidRemoteStorageConfigurationWithEarlyExceptionDataProvider + * @throws \Magento\Framework\Exception\FileSystemException + * @throws \Magento\Framework\Exception\LocalizedException + * @throws \Magento\Framework\Exception\RuntimeException + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function testInstallWithInvalidRemoteStorageConfigurationWithEarlyException(\Exception $exception) + { + $request = $this->request; + + $logMessages = [ + ['Starting Magento installation:'], + ['File permissions check...'], + ['Required extensions check...'], + ['Enabling Maintenance Mode...'], + ['Installing deployment configuration...'], + ['Installing database schema:'], + ['Schema creation/updates:'] + ]; + + $this->config->expects(static::atLeastOnce()) + ->method('get') + ->willReturnMap( + [ + [ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT, null, true], + [ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, null, true], + ['modules/Magento_User', null, '1'] + ] + ); + $allModules = ['Foo_One' => [], 'Bar_Two' => []]; + $this->moduleList->method('getOne')->willReturn(['setup_version' => '2.0.0']); + + $this->declarationInstallerMock + ->expects(static::once()) + ->method('installSchema') + ->willThrowException($exception); + + $this->expectException(get_class($exception)); + + $this->moduleLoader->expects(static::exactly(2))->method('load')->willReturn($allModules); + $setup = $this->createMock(Setup::class); + $table = $this->createMock(Table::class); + $connection = $this->getMockBuilder(AdapterInterface::class) + ->onlyMethods(['getTables', 'newTable']) + ->addMethods(['getSchemaListener']) + ->getMockForAbstractClass(); + $connection->expects(static::any())->method('getSchemaListener')->willReturn($this->schemaListenerMock); + $connection->expects(static::once())->method('getTables')->willReturn([]); + $setup->expects(static::any())->method('getConnection')->willReturn($connection); + $table->expects(static::any())->method('addColumn')->willReturn($table); + $table->expects(static::any())->method('setComment')->willReturn($table); + $table->expects(static::any())->method('addIndex')->willReturn($table); + $connection->expects(static::any())->method('newTable')->willReturn($table); + + $resource = $this->createMock(ResourceConnection::class); + $this->contextMock->expects(static::once())->method('getResources')->willReturn($resource); + + $dataSetup = $this->createMock(DataSetup::class); + $dataSetup->expects(static::never())->method('getConnection'); + + $cacheManager = $this->createMock(Manager::class); + $cacheManager->expects(static::never())->method('getAvailableTypes'); + + $registry = $this->createMock(Registry::class); + + $remoteStorageValidatorMock = $this->getMockBuilder(RemoteStorageValidator::class) + ->disableOriginalConstructor() + ->getMock(); + + $remoteStorageValidatorMock + ->expects(static::never()) + ->method('validate'); + + $this->configWriter + ->expects(static::once()) + ->method('checkIfWritable') + ->willReturn(true); + + $remoteStorageReversionArguments = [ + [ + ConfigFilePool::APP_ENV => [ + 'remote_storage' => [ + 'driver' => 'file' + ] + ] + ], + true + ]; + + $this->configWriter + ->method('saveConfig') + ->withConsecutive([], [], $remoteStorageReversionArguments); + + $this->setupFactory->expects(static::once())->method('create')->with($resource)->willReturn($setup); + + $this->objectManager->expects(static::any()) + ->method('get') + ->willReturnMap( + [ + [DeclarationInstaller::class, $this->declarationInstallerMock], + [Registry::class, $registry] + ] + ); + + $this->sampleDataState->expects(static::never())->method('hasError'); + + $this->phpReadinessCheck->expects(static::once())->method('checkPhpExtensions')->willReturn( + ['responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS] + ); + + $this->filePermissions->expects(static::exactly(2)) + ->method('getMissingWritablePathsForInstallation') + ->willReturn([]); + + call_user_func_array( + [ + $this->logger->expects(static::exactly(count($logMessages)))->method('log'), + 'withConsecutive' + ], + $logMessages + ); + + $this->logger->expects(static::never())->method('logSuccess'); + + $this->object->install($request); + } + + public function installWithInvalidRemoteStorageConfigurationWithEarlyExceptionDataProvider() + { + return [ + [new RuntimeException(__('Remote driver is not available.'))], + [new DriverException(__('Bucket and region are required values'))] + ]; + } + + /** + * Test for InstallDataFixtures + * + * @dataProvider testInstallDataFixturesDataProvider + * + * @param bool $keepCache + * @param array $expectedToEnableCacheTypes + * @return void + */ + public function testInstallDataFixtures(bool $keepCache, array $expectedToEnableCacheTypes): void + { + $this->moduleList->method('getOne')->willReturn(['setup_version' => '2.0.0']); + + $cacheManagerMock = $this->createMock(Manager::class); + //simulate disabled layout cache type + $cacheManagerMock->expects($this->atLeastOnce()) + ->method('getStatus') + ->willReturn(['layout' => 0]); + $cacheManagerMock->expects($this->atLeastOnce()) + ->method('getAvailableTypes') + ->willReturn(['block_html', 'full_page', 'layout' , 'config', 'collections']); + $cacheManagerMock->expects($this->exactly(2)) + ->method('setEnabled') + ->withConsecutive([$expectedToEnableCacheTypes, false], [$expectedToEnableCacheTypes, true]) + ->willReturn([]); + + $this->objectManager->expects($this->atLeastOnce()) + ->method('create') + ->willReturnMap( + [ + [Manager::class, [], $cacheManagerMock], + [ + PatchApplierFactory::class, + ['objectManager' => $this->objectManager], + $this->patchApplierFactoryMock + ], + ] + ); + + $registryMock = $this->createMock(Registry::class); + $this->objectManager->expects($this->atLeastOnce()) + ->method('get') + ->with(Registry::class) + ->willReturn($registryMock); + + $this->config->expects($this->atLeastOnce()) + ->method('get') + ->willReturn(true); + + $this->filePermissions->expects($this->atLeastOnce()) + ->method('getMissingWritableDirectoriesForDbUpgrade') + ->willReturn([]); + + $connection = $this->getMockBuilder(AdapterInterface::class) + ->addMethods(['getSchemaListener']) + ->getMockForAbstractClass(); + $connection->expects($this->once()) + ->method('getSchemaListener') + ->willReturn($this->schemaListenerMock); + + $resource = $this->createMock(ResourceConnection::class); + $resource->expects($this->atLeastOnce()) + ->method('getConnection') + ->willReturn($connection); + $this->contextMock->expects($this->once()) + ->method('getResources') + ->willReturn($resource); + $this->setModuleResource(); + + $dataSetup = $this->createMock(DataSetup::class); + $dataSetup->expects($this->once()) + ->method('getConnection') + ->willReturn($connection); + + $this->dataSetupFactory->expects($this->atLeastOnce()) + ->method('create') + ->willReturn($dataSetup); + + $this->object->installDataFixtures($this->request, $keepCache); + } + + /** + * DataProvider for testInstallDataFixtures + * + * @return array + */ + public function testInstallDataFixturesDataProvider(): array + { + return [ + 'keep cache' => [ + true, ['block_html', 'full_page'] + ], + 'do not keep a cache' => [ + false, + ['block_html', 'full_page', 'layout'] + ], + ]; + } + + public function testCheckInstallationFilePermissions() + { + $this->filePermissions + ->expects($this->once()) + ->method('getMissingWritablePathsForInstallation') + ->willReturn([]); + $this->object->checkInstallationFilePermissions(); + } + + public function testCheckInstallationFilePermissionsError() + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Missing write permissions to the following paths:'); + $this->filePermissions + ->expects($this->once()) + ->method('getMissingWritablePathsForInstallation') + ->willReturn(['foo', 'bar']); + $this->object->checkInstallationFilePermissions(); + } + + public function testCheckExtensions() + { + $this->phpReadinessCheck->expects($this->once())->method('checkPhpExtensions')->willReturn( + ['responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS] + ); + $this->object->checkExtensions(); + } + + public function testCheckExtensionsError() + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Missing following extensions: \'foo\''); + $this->phpReadinessCheck->expects($this->once())->method('checkPhpExtensions')->willReturn( + [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => ['required' => ['foo', 'bar'], 'missing' => ['foo']] + ] + ); + $this->object->checkExtensions(); + } + + public function testCheckApplicationFilePermissions() + { + $this->filePermissions + ->expects($this->once()) + ->method('getUnnecessaryWritableDirectoriesForApplication') + ->willReturn(['foo', 'bar']); + $expectedMessage = "For security, remove write permissions from these directories: 'foo' 'bar'"; + $this->logger->expects($this->once())->method('log')->with($expectedMessage); + $this->object->checkApplicationFilePermissions(); + $this->assertSame(['message' => [$expectedMessage]], $this->object->getInstallInfo()); + } + + public function testUpdateModulesSequence() + { + $this->cleanupFiles->expects($this->once())->method('clearCodeGeneratedFiles')->willReturn( + [ + "The directory '/generation' doesn't exist - skipping cleanup" + ] + ); + $installer = $this->prepareForUpdateModulesTests(); + + $this->logger + ->method('log') + ->withConsecutive( + ['Cache types config flushed successfully'], + ['Cache cleared successfully'], + ['File system cleanup:'], + ['The directory \'/generation\' doesn\'t exist - skipping cleanup'], + ['Updating modules:'] + ); + + $installer->updateModulesSequence(false); + } + + public function testUpdateModulesSequenceKeepGenerated() + { + $this->cleanupFiles->expects($this->never())->method('clearCodeGeneratedClasses'); + + $installer = $this->prepareForUpdateModulesTests(); + $this->logger + ->method('log') + ->withConsecutive( + ['Cache types config flushed successfully'], + ['Cache cleared successfully'], + ['Updating modules:'] + ); + + $installer->updateModulesSequence(true); + } + + /** + * @return void + */ + public function testUninstall(): void + { + $this->config->expects($this->once()) + ->method('get') + ->with(ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTIONS) + ->willReturn([]); + $this->configReader->expects($this->once())->method('getFiles')->willReturn( + [ + 'ConfigOne.php', + 'ConfigTwo.php' + ] + ); + $configDir = $this->getMockForAbstractClass( + WriteInterface::class + ); + $configDir + ->expects($this->exactly(2)) + ->method('getAbsolutePath') + ->willReturnMap( + [ + ['ConfigOne.php', '/config/ConfigOne.php'], + ['ConfigTwo.php', '/config/ConfigTwo.php'] + ] + ); + $this->filesystem + ->expects($this->any()) + ->method('getDirectoryWrite') + ->willReturnMap( + [ + [DirectoryList::CONFIG, DriverPool::FILE, $configDir], + ] + ); + $cacheManager = $this->createMock(Manager::class); + $cacheManager->expects($this->once())->method('getAvailableTypes')->willReturn(['foo', 'bar']); + $cacheManager->expects($this->once())->method('clean'); + $this->objectManager->expects($this->any()) + ->method('get') + ->with(Manager::class) + ->willReturn($cacheManager); + $this->logger->expects($this->once())->method('logSuccess')->with('Magento uninstallation complete.'); + $this->cleanupFiles->expects($this->once())->method('clearAllFiles')->willReturn( + [ + "The directory '/var' doesn't exist - skipping cleanup", + "The directory '/static' doesn't exist - skipping cleanup" + ] + ); + + $this->logger + ->method('log') + ->withConsecutive( + ['Starting Magento uninstallation:'], + ['Cache cleared successfully'], + ['No database connection defined - skipping database cleanup'], + ['File system cleanup:'], + ["The directory '/var' doesn't exist - skipping cleanup"], + ["The directory '/static' doesn't exist - skipping cleanup"], + ["The file '/config/ConfigOne.php' doesn't exist - skipping cleanup"], + ["The file '/config/ConfigTwo.php' doesn't exist - skipping cleanup"] + ); + + $this->object->uninstall(); + } + + /** + * @return void + */ + public function testCleanupDb(): void + { + $this->config->expects($this->once()) + ->method('get') + ->with(ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTIONS) + ->willReturn(self::$dbConfig); + $this->connection + ->method('quoteIdentifier') + ->with('magento') + ->willReturn('`magento`'); + + $this->connection + ->method('query') + ->withConsecutive( + ['DROP DATABASE IF EXISTS `magento`'], + ['CREATE DATABASE IF NOT EXISTS `magento`'] + ); + + $this->logger->expects($this->once())->method('log')->with('Cleaning up database `magento`'); + $this->object->cleanupDb(); + } + + /** + * Prepare mocks for update modules tests and returns the installer to use + * @return Installer + */ + private function prepareForUpdateModulesTests() + { + $allModules = [ + 'Foo_One' => [], + 'Bar_Two' => [], + 'New_Module' => [] + ]; + + $cacheManager = $this->createMock(Manager::class); + $cacheManager->expects($this->once())->method('getAvailableTypes')->willReturn(['foo', 'bar']); + $cacheManager->expects($this->once())->method('clean'); + $this->objectManager->expects($this->any()) + ->method('get') + ->willReturnMap( + [ + [Manager::class, $cacheManager] + ] + ); + $this->moduleLoader->expects($this->once())->method('load')->willReturn($allModules); + + $expectedModules = [ + ConfigFilePool::APP_CONFIG => [ + 'modules' => [ + 'Bar_Two' => 0, + 'Foo_One' => 1, + 'New_Module' => 1 + ] + ] + ]; + + $this->config->expects($this->atLeastOnce()) + ->method('get') + ->with(ConfigOptionsListConstants::KEY_MODULES) + ->willReturn(true); + + $newObject = $this->createObject(false, false); + $this->configReader->expects($this->once())->method('load') + ->willReturn(['modules' => ['Bar_Two' => 0, 'Foo_One' => 1, 'Old_Module' => 0]]); + $this->configWriter->expects($this->once())->method('saveConfig')->with($expectedModules); + + return $newObject; + } + + /** + * Sets a new ModuleResource object to the installer + * + * @return void + */ + private function setModuleResource(): void + { + $moduleResource = new ModuleResource($this->contextMock); + $this->object->method('getModuleResource')->willReturn($moduleResource); + } + } +} + +namespace Magento\Setup\Model { + + /** + * Mocking autoload function + * + * @returns array + */ + function spl_autoload_functions() + { + return ['mock_function_one', 'mock_function_two']; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/LicenseTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/LicenseTest.php new file mode 100644 index 0000000..78e52a7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/LicenseTest.php @@ -0,0 +1,63 @@ +directoryReadMock = $this->createMock(Read::class); + $this->filesystemMock = $this->createMock(Filesystem::class); + $this->filesystemMock + ->expects($this->once()) + ->method('getDirectoryRead') + ->willReturn($this->directoryReadMock); + } + + public function testGetContents() + { + $this->directoryReadMock + ->expects($this->atLeastOnce()) + ->method('readFile') + ->willReturn('License text'); + $this->directoryReadMock + ->expects($this->atLeastOnce()) + ->method('isFile') + ->willReturn(true); + + $license = new License($this->filesystemMock); + $this->assertSame('License text', $license->getContents()); + } + + public function testGetContentsNoFile() + { + $this->directoryReadMock + ->expects($this->atLeastOnce()) + ->method('isFile') + ->willReturn(false); + + $license = new License($this->filesystemMock); + $this->assertFalse($license->getContents()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleContextTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleContextTest.php new file mode 100644 index 0000000..c5851ea --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleContextTest.php @@ -0,0 +1,21 @@ +assertSame($version, $object->getVersion()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleRegistryUninstallerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleRegistryUninstallerTest.php new file mode 100644 index 0000000..e03667b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleRegistryUninstallerTest.php @@ -0,0 +1,96 @@ +deploymentConfig = $this->createMock(DeploymentConfig::class); + $this->writer = $this->createMock(Writer::class); + $this->loader = $this->createMock(Loader::class); + $this->dataSetup = $this->createMock(DataSetup::class); + $dataSetupFactory = $this->createMock(DataSetupFactory::class); + $dataSetupFactory->expects($this->any())->method('create')->willReturn($this->dataSetup); + $this->output = $this->getMockForAbstractClass(OutputInterface::class); + $this->moduleRegistryUninstaller = new ModuleRegistryUninstaller( + $dataSetupFactory, + $this->deploymentConfig, + $this->writer, + $this->loader + ); + } + + public function testRemoveModulesFromDb() + { + $this->output->expects($this->atLeastOnce())->method('writeln'); + $this->dataSetup->expects($this->atLeastOnce())->method('deleteTableRow'); + $this->moduleRegistryUninstaller->removeModulesFromDb($this->output, ['moduleA', 'moduleB']); + } + + public function testRemoveModulesFromDeploymentConfig() + { + $this->output->expects($this->atLeastOnce())->method('writeln'); + $this->deploymentConfig->expects($this->once()) + ->method('getConfigData') + ->willReturn(['moduleA' => 1, 'moduleB' => 1, 'moduleC' => 1, 'moduleD' => 1]); + $this->loader->expects($this->once())->method('load')->willReturn(['moduleC' => [], 'moduleD' => []]); + $this->writer->expects($this->once()) + ->method('saveConfig') + ->with( + [ + ConfigFilePool::APP_CONFIG => [ + ConfigOptionsListConstants::KEY_MODULES => ['moduleC' => 1, 'moduleD' => 1] + ] + ] + ); + $this->moduleRegistryUninstaller->removeModulesFromDeploymentConfig($this->output, ['moduleA', 'moduleB']); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleUninstallerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleUninstallerTest.php new file mode 100644 index 0000000..b5e616a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ModuleUninstallerTest.php @@ -0,0 +1,142 @@ +objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->expects($this->once())->method('get')->willReturn($this->objectManager); + + $this->remove = $this->createMock(Remove::class); + $this->collector = $this->createMock(UninstallCollector::class); + + $this->setup = $this->createMock(Setup::class); + $this->patchApplierMock = $this->createMock(PatchApplier::class); + $setupFactory = $this->createMock(SetupFactory::class); + $setupFactory->expects($this->any())->method('create')->willReturn($this->setup); + + $this->uninstaller = new ModuleUninstaller( + $objectManagerProvider, + $this->remove, + $this->collector, + $setupFactory + ); + + $this->output = $this->getMockForAbstractClass(OutputInterface::class); + } + + public function testUninstallRemoveData() + { + $uninstall = $this->getMockForAbstractClass(UninstallInterface::class, [], '', false); + $uninstall->expects($this->atLeastOnce()) + ->method('uninstall') + ->with($this->setup, $this->isInstanceOf(ModuleContext::class)); + $this->collector->expects($this->once()) + ->method('collectUninstall') + ->willReturn(['moduleA' => $uninstall, 'moduleB' => $uninstall]); + + $resource = $this->createMock(ModuleResource::class); + $resource->expects($this->atLeastOnce())->method('getDbVersion')->willReturn('1.0'); + + $this->output->expects($this->atLeastOnce())->method('writeln'); + + $this->objectManager->expects($this->any()) + ->method('get') + ->willReturnMap( + [ + [ModuleResource::class, $resource], + [PatchApplier::class, $this->patchApplierMock] + ] + ); + $this->patchApplierMock->expects($this->exactly(2))->method('revertDataPatches')->willReturnMap( + [ + ['moduleA'], + ['moduleB'] + ] + ); + $this->uninstaller->uninstallData($this->output, ['moduleA', 'moduleB']); + } + + public function testUninstallRemoveCode() + { + $this->output->expects($this->once())->method('writeln'); + $packageInfoFactory = $this->createMock(PackageInfoFactory::class); + $packageInfo = $this->createMock(PackageInfo::class); + $packageInfo->expects($this->atLeastOnce())->method('getPackageName'); + $packageInfoFactory->expects($this->once())->method('create')->willReturn($packageInfo); + $this->objectManager->expects($this->once()) + ->method('get') + ->with(PackageInfoFactory::class) + ->willReturn($packageInfoFactory); + $this->remove->expects($this->once())->method('remove'); + $this->uninstaller->uninstallCode($this->output, ['moduleA', 'moduleB']); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ObjectManagerProviderTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ObjectManagerProviderTest.php new file mode 100644 index 0000000..854128f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ObjectManagerProviderTest.php @@ -0,0 +1,105 @@ +serviceLocatorMock = $this->getMockForAbstractClass(ServiceLocatorInterface::class); + $this->bootstrapMock = $this->createMock(Bootstrap::class); + + $this->model = new ObjectManagerProvider($this->serviceLocatorMock, $this->bootstrapMock); + } + + public function testGet() + { + $initParams = ['param' => 'value']; + $commands = [ + new Command('setup:install'), + new Command('setup:upgrade'), + ]; + + $application = $this->getMockBuilder(Application::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->serviceLocatorMock + ->expects($this->atLeastOnce()) + ->method('get') + ->willReturnMap( + [ + [InitParamListener::BOOTSTRAP_PARAM, $initParams], + [ + Application::class, + $application, + ], + ] + ); + + $commandListMock = $this->getMockForAbstractClass(CommandListInterface::class); + $commandListMock->expects($this->once()) + ->method('getCommands') + ->willReturn($commands); + + $objectManagerMock = $this->getMockForAbstractClass(ObjectManagerInterface::class); + $objectManagerMock->expects($this->once()) + ->method('create') + ->with(CommandListInterface::class) + ->willReturn($commandListMock); + + $objectManagerFactoryMock = $this->getMockBuilder(ObjectManagerFactory::class) + ->disableOriginalConstructor() + ->getMock(); + $objectManagerFactoryMock->expects($this->once()) + ->method('create') + ->with($initParams) + ->willReturn($objectManagerMock); + + $this->bootstrapMock + ->expects($this->once()) + ->method('createObjectManagerFactory') + ->willReturn($objectManagerFactoryMock); + + $this->assertInstanceOf(ObjectManagerInterface::class, $this->model->get()); + + foreach ($commands as $command) { + $this->assertSame($application, $command->getApplication()); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/PhpInformationTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/PhpInformationTest.php new file mode 100644 index 0000000..9f92868 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/PhpInformationTest.php @@ -0,0 +1,34 @@ +assertEquals(200, $phpInformation->getRequiredMinimumXDebugNestedLevel()); + } + + public function testGetCurrent() + { + $phpInformation = new PhpInformation(); + + $actualExtensions = $phpInformation->getCurrent(); + $this->assertIsArray($actualExtensions); + + // Calling second type should cause class variable to be used + $this->assertSame($actualExtensions, $phpInformation->getCurrent()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/PhpReadinessCheckTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/PhpReadinessCheckTest.php new file mode 100644 index 0000000..919b16c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/PhpReadinessCheckTest.php @@ -0,0 +1,482 @@ +composerInfo = $this->createMock(ComposerInformation::class); + $this->phpInfo = $this->createMock(PhpInformation::class); + $this->versionParser = $this->createMock(VersionParser::class); + $this->dataSize = $this->createMock(DataSize::class); + $this->phpReadinessCheck = new PhpReadinessCheck( + $this->composerInfo, + $this->phpInfo, + $this->versionParser, + $this->dataSize + ); + } + + /** + * @return void + */ + public function testCheckPhpVersionNoRequiredVersion(): void + { + $this->composerInfo->expects($this->once()) + ->method('getRequiredPhpVersion') + ->willThrowException(new \Exception()); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => [ + 'error' => 'phpVersionError', + 'message' => 'Cannot determine required PHP version: ' + ] + ]; + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpVersion()); + } + + /** + * @return void + */ + public function testCheckPhpVersionPrettyVersion(): void + { + $this->composerInfo->expects($this->once())->method('getRequiredPhpVersion')->willReturn('1.0'); + $multipleConstraints = $this->getMockForAbstractClass( + ConstraintInterface::class, + [], + '', + false + ); + $currentPhpVersion = $this->getMockForAbstractClass( + ConstraintInterface::class, + [], + '', + false + ); + $this->versionParser + ->method('parseConstraints') + ->willReturnOnConsecutiveCalls($multipleConstraints, $currentPhpVersion); + $this->versionParser + ->method('normalize') + ->willReturn('1.0'); + $multipleConstraints->expects($this->once())->method('matches')->willReturn(true); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS, + 'data' => [ + 'required' => 1.0, + 'current' => PHP_VERSION + ] + ]; + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpVersion()); + } + + /** + * @return void + */ + public function testCheckPhpVersionPrettyVersionFailed(): void + { + $this->composerInfo->expects($this->once())->method('getRequiredPhpVersion')->willReturn('1.0'); + $multipleConstraints = $this->getMockForAbstractClass( + ConstraintInterface::class, + [], + '', + false + ); + $currentPhpVersion = $this->getMockForAbstractClass( + ConstraintInterface::class, + [], + '', + false + ); + $this->versionParser + ->method('parseConstraints') + ->willReturnOnConsecutiveCalls($multipleConstraints, $currentPhpVersion); + $this->versionParser + ->method('normalize') + ->willReturn('1.0'); + $multipleConstraints->expects($this->once())->method('matches')->willReturn(false); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => [ + 'required' => 1.0, + 'current' => PHP_VERSION + ] + ]; + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpVersion()); + } + + /** + * @return void + */ + private function setUpNoPrettyVersionParser(): void + { + $multipleConstraints = $this->getMockForAbstractClass( + ConstraintInterface::class, + [], + '', + false + ); + $currentPhpVersion = $this->getMockForAbstractClass( + ConstraintInterface::class, + [], + '', + false + ); + $this->versionParser + ->method('parseConstraints') + ->willReturnOnConsecutiveCalls($multipleConstraints, $currentPhpVersion); + $this->versionParser + ->method('normalize') + ->willReturn('1.0'); + $multipleConstraints->expects($this->once())->method('matches')->willReturn(true); + } + + /** + * @return void + */ + public function testCheckPhpVersion(): void + { + $this->composerInfo->expects($this->once())->method('getRequiredPhpVersion')->willReturn('1.0'); + + $this->setUpNoPrettyVersionParser(); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS, + 'data' => [ + 'required' => 1.0, + 'current' => PHP_VERSION + ] + ]; + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpVersion()); + } + + /** + * @return void + */ + public function testCheckPhpVersionFailed(): void + { + $this->composerInfo->expects($this->once())->method('getRequiredPhpVersion')->willReturn('1.0'); + $multipleConstraints = $this->getMockForAbstractClass( + ConstraintInterface::class, + [], + '', + false + ); + $currentPhpVersion = $this->getMockForAbstractClass( + ConstraintInterface::class, + [], + '', + false + ); + $this->versionParser + ->method('parseConstraints') + ->willReturnOnConsecutiveCalls($multipleConstraints, $currentPhpVersion); + $this->versionParser + ->method('normalize') + ->willReturn('1.0'); + $multipleConstraints->expects($this->once())->method('matches')->willReturn(false); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => [ + 'required' => 1.0, + 'current' => PHP_VERSION + ] + ]; + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpVersion()); + } + + /** + * @return void + */ + public function testCheckPhpSettings(): void + { + $this->phpInfo->expects($this->once())->method('getCurrent')->willReturn(['xdebug']); + $this->phpInfo->expects($this->once())->method('getRequiredMinimumXDebugNestedLevel')->willReturn(50); + $xdebugMessage = sprintf( + 'Your current setting of xdebug.max_nesting_level=%d. + Magento 2 requires it to be set to %d or more. + Edit your config, restart web server, and try again.', + 100, + 50 + ); + + $rawPostMessage = sprintf( + 'Your PHP Version is %s, but always_populate_raw_post_data = -1. + $HTTP_RAW_POST_DATA is deprecated from PHP 5.6 onwards and will be removed in PHP 7.0. + This will stop the installer from running. + Please open your php.ini file and set always_populate_raw_post_data to -1. + If you need more help please call your hosting provider.', + PHP_VERSION + ); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS, + 'data' => [ + 'xdebug_max_nesting_level' => [ + 'message' => $xdebugMessage, + 'error' => false + ], + 'missed_function_imagecreatefromjpeg' => [ + 'message' => 'You must have installed GD library with --with-jpeg-dir=DIR option.', + 'helpUrl' => 'http://php.net/manual/en/image.installation.php', + 'error' => false + ] + ] + ]; + if (!$this->isPhp7OrHhvm()) { + $this->setUpNoPrettyVersionParser(); + $expected['data']['always_populate_raw_post_data'] = [ + 'message' => $rawPostMessage, + 'helpUrl' => 'http://php.net/manual/en/ini.core.php#ini.always-populate-settings-data', + 'error' => false + ]; + } + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpSettings()); + } + + /** + * @return void + */ + public function testCheckPhpSettingsFailed(): void + { + $this->phpInfo->expects($this->once())->method('getCurrent')->willReturn(['xdebug']); + $this->phpInfo->expects($this->once())->method('getRequiredMinimumXDebugNestedLevel')->willReturn(200); + $xdebugMessage = sprintf( + 'Your current setting of xdebug.max_nesting_level=%d. + Magento 2 requires it to be set to %d or more. + Edit your config, restart web server, and try again.', + 100, + 200 + ); + + $rawPostMessage = sprintf( + 'Your PHP Version is %s, but always_populate_raw_post_data = -1. + $HTTP_RAW_POST_DATA is deprecated from PHP 5.6 onwards and will be removed in PHP 7.0. + This will stop the installer from running. + Please open your php.ini file and set always_populate_raw_post_data to -1. + If you need more help please call your hosting provider.', + PHP_VERSION + ); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => [ + 'xdebug_max_nesting_level' => [ + 'message' => $xdebugMessage, + 'error' => true + ], + 'missed_function_imagecreatefromjpeg' => [ + 'message' => 'You must have installed GD library with --with-jpeg-dir=DIR option.', + 'helpUrl' => 'http://php.net/manual/en/image.installation.php', + 'error' => false + ] + ] + ]; + if (!$this->isPhp7OrHhvm()) { + $this->setUpNoPrettyVersionParser(); + $expected['data']['always_populate_raw_post_data'] = [ + 'message' => $rawPostMessage, + 'helpUrl' => 'http://php.net/manual/en/ini.core.php#ini.always-populate-settings-data', + 'error' => false + ]; + } + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpSettings()); + } + + /** + * @return void + */ + public function testCheckPhpSettingsNoXDebug(): void + { + $this->phpInfo->expects($this->once())->method('getCurrent')->willReturn([]); + + $rawPostMessage = sprintf( + 'Your PHP Version is %s, but always_populate_raw_post_data = -1. + $HTTP_RAW_POST_DATA is deprecated from PHP 5.6 onwards and will be removed in PHP 7.0. + This will stop the installer from running. + Please open your php.ini file and set always_populate_raw_post_data to -1. + If you need more help please call your hosting provider.', + PHP_VERSION + ); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS, + 'data' => [] + ]; + if (!$this->isPhp7OrHhvm()) { + $this->setUpNoPrettyVersionParser(); + $expected['data'] = [ + 'always_populate_raw_post_data' => [ + 'message' => $rawPostMessage, + 'helpUrl' => 'http://php.net/manual/en/ini.core.php#ini.always-populate-settings-data', + 'error' => false + ] + ]; + } + + $expected['data']['missed_function_imagecreatefromjpeg'] = [ + 'message' => 'You must have installed GD library with --with-jpeg-dir=DIR option.', + 'helpUrl' => 'http://php.net/manual/en/image.installation.php', + 'error' => false + ]; + + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpSettings()); + } + + /** + * @return void + */ + public function testCheckPhpSettingsMemoryLimitError(): void + { + $this->dataSize->expects($this->any())->method('convertSizeToBytes')->willReturnMap( + [ + ['512M', 512], + ['756M', 756], + ['2G', 2048] + ] + ); + + $rawPostMessage = + 'Your current PHP memory limit is 512M. + Magento 2 requires it to be set to 756M or more. + As a user with root privileges, edit your php.ini file to increase memory_limit. + (The command php --ini tells you where it is located.) + After that, restart your web server and try again.'; + + $expected['memory_limit'] = [ + 'message' => $rawPostMessage, + 'error' => true, + 'warning' => false + ]; + + $this->assertEquals($expected, $this->phpReadinessCheck->checkMemoryLimit()); + } + + /** + * @return void + */ + public function testCheckPhpExtensionsNoRequired(): void + { + $this->composerInfo->expects($this->once()) + ->method('getRequiredExtensions') + ->willThrowException(new \Exception()); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => [ + 'error' => 'phpExtensionError', + 'message' => 'Cannot determine required PHP extensions: ' + ] + ]; + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpExtensions()); + } + + /** + * @return void + */ + public function testCheckPhpExtensions(): void + { + $this->composerInfo->expects($this->once()) + ->method('getRequiredExtensions') + ->willReturn(['a', 'b', 'c']); + $this->phpInfo->expects($this->once()) + ->method('getCurrent') + ->willReturn(['a', 'b', 'c', 'd']); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_SUCCESS, + 'data' => [ + 'required' => ['a', 'b', 'c'], + 'missing' => [] + ] + ]; + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpExtensions()); + } + + /** + * @return void + */ + public function testCheckPhpExtensionsFailed(): void + { + $this->composerInfo->expects($this->once()) + ->method('getRequiredExtensions') + ->willReturn(['a', 'b', 'c']); + $this->phpInfo->expects($this->once()) + ->method('getCurrent') + ->willReturn(['a', 'b']); + $expected = [ + 'responseType' => ResponseTypeInterface::RESPONSE_TYPE_ERROR, + 'data' => [ + 'required' => ['a', 'b', 'c'], + 'missing' => ['c'] + ] + ]; + $this->assertEquals($expected, $this->phpReadinessCheck->checkPhpExtensions()); + } + + /** + * @return bool + */ + protected function isPhp7OrHhvm(): bool + { + return version_compare(PHP_VERSION, '7.0.0-beta') >= 0 || defined('HHVM_VERSION'); + } +} + +namespace Magento\Setup\Model; + +/** + * @param $param + * @return int|string|bool + */ +function ini_get($param) +{ + if ($param === 'xdebug.max_nesting_level') { + return 100; + } elseif ($param === 'always_populate_raw_post_data') { + return -1; + } elseif ($param === 'memory_limit') { + return '512M'; + } + return false; +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchConfigOptionsListTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchConfigOptionsListTest.php new file mode 100644 index 0000000..35e53a6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchConfigOptionsListTest.php @@ -0,0 +1,70 @@ +searchConfigOptionsList = $objectManager->getObject(SearchConfigOptionsList::class); + } + + public function testGetOptionsList() + { + $optionsList = $this->searchConfigOptionsList->getOptionsList(); + $this->assertCount(8, $optionsList); + + $this->assertArrayHasKey(0, $optionsList); + $this->assertInstanceOf(SelectConfigOption::class, $optionsList[0]); + $this->assertEquals('search-engine', $optionsList[0]->getName()); + $this->assertCount(3, $optionsList[0]->getSelectOptions()); + $this->assertContains('elasticsearch5', $optionsList[0]->getSelectOptions()); + $this->assertContains('elasticsearch6', $optionsList[0]->getSelectOptions()); + $this->assertContains('elasticsearch7', $optionsList[0]->getSelectOptions()); + + $this->assertArrayHasKey(1, $optionsList); + $this->assertInstanceOf(TextConfigOption::class, $optionsList[1]); + $this->assertEquals('elasticsearch-host', $optionsList[1]->getName()); + + $this->assertArrayHasKey(2, $optionsList); + $this->assertInstanceOf(TextConfigOption::class, $optionsList[2]); + $this->assertEquals('elasticsearch-port', $optionsList[2]->getName()); + + $this->assertArrayHasKey(3, $optionsList); + $this->assertInstanceOf(TextConfigOption::class, $optionsList[3]); + $this->assertEquals('elasticsearch-enable-auth', $optionsList[3]->getName()); + + $this->assertArrayHasKey(4, $optionsList); + $this->assertInstanceOf(TextConfigOption::class, $optionsList[4]); + $this->assertEquals('elasticsearch-username', $optionsList[4]->getName()); + + $this->assertArrayHasKey(5, $optionsList); + $this->assertInstanceOf(TextConfigOption::class, $optionsList[5]); + $this->assertEquals('elasticsearch-password', $optionsList[5]->getName()); + + $this->assertArrayHasKey(6, $optionsList); + $this->assertInstanceOf(TextConfigOption::class, $optionsList[6]); + $this->assertEquals('elasticsearch-index-prefix', $optionsList[6]->getName()); + + $this->assertArrayHasKey(7, $optionsList); + $this->assertInstanceOf(TextConfigOption::class, $optionsList[7]); + $this->assertEquals('elasticsearch-timeout', $optionsList[7]->getName()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchConfigTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchConfigTest.php new file mode 100644 index 0000000..6c9bf23 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchConfigTest.php @@ -0,0 +1,163 @@ +installConfigMock = $this->getMockBuilder(CompositeInstallConfig::class) + ->disableOriginalConstructor() + ->getMock(); + $this->searchEngineValidatorMock = $this->getMockBuilder(Validator::class) + ->disableOriginalConstructor() + ->getMock(); + + $objectManager = new ObjectManager($this); + $this->searchConfigOptionsList = $objectManager->getObject(SearchConfigOptionsList::class); + $this->searchConfig = $objectManager->getObject( + SearchConfig::class, + [ + 'searchConfigOptionsList' => $this->searchConfigOptionsList, + 'searchValidator' => $this->searchEngineValidatorMock, + 'installConfig' => $this->installConfigMock + ] + ); + } + + /** + * @param array $installInput + * @param array $searchInput + * @dataProvider installInputDataProvider + */ + public function testSaveConfiguration(array $installInput, array $searchInput) + { + $this->installConfigMock->expects($this->once())->method('configure')->with($searchInput); + $this->searchEngineValidatorMock + ->expects($this->once()) + ->method('validate') + ->willReturn([]); + + $this->searchConfig->saveConfiguration($installInput); + } + + /** + * @param array $installInput + * @param array $searchInput + * @dataProvider installInputDataProvider + */ + public function testSaveConfigurationInvalidSearchEngine(array $installInput, array $searchInput) + { + $this->expectException(\Magento\Setup\Exception::class); + $this->expectExceptionMessage('Search engine \'other-engine\' is not an available search engine.'); + + $installInput['search-engine'] = 'other-engine'; + $searchInput['search-engine'] = 'other-engine'; + $this->installConfigMock->expects($this->never())->method('configure'); + + $this->searchConfig->saveConfiguration($installInput); + } + + /** + * @param array $installInput + * @param array $searchInput + * @dataProvider installInputDataProvider + */ + public function testSaveConfigurationValidationFail(array $installInput, array $searchInput) + { + $this->expectException(\Magento\Framework\Validation\ValidationException::class); + $this->expectExceptionMessage('Could not connect to host'); + + $this->installConfigMock->expects($this->once())->method('configure')->with($searchInput); + $this->searchEngineValidatorMock + ->expects($this->once()) + ->method('validate') + ->willReturn(['Could not connect to host']); + + $this->searchConfig->saveConfiguration($installInput); + } + + public function installInputDataProvider() + { + return [ + [ + 'all' => [ + 'amqp-host' => '', + 'amqp-port' => '5672', + 'amqp-user' => '', + 'amqp-password' => '', + 'amqp-virtualhost' => '/', + 'amqp-ssl' => '', + 'amqp-ssl-options' => '', + 'db-host' => 'localhost', + 'db-name' => 'magento', + 'db-user' => 'root', + 'db-engine' => null, + 'db-password' => 'root', + 'db-prefix' => null, + 'db-model' => null, + 'db-init-statements' => null, + 'skip-db-validation' => false, + 'http-cache-hosts' => null, + 'base-url' => 'http://magento.dev', + 'language' => 'en_US', + 'timezone' => 'America/Chicago', + 'currency' => 'USD', + 'use-rewrites' => '1', + 'use-secure' => null, + 'base-url-secure' => null, + 'use-secure-admin' => null, + 'admin-use-security-key' => null, + 'search-engine' => 'elasticsearch7', + 'elasticsearch-host' => 'localhost', + 'elasticsearch-port' => '9200', + 'elasticsearch-enable-auth' => false, + 'elasticsearch-index-prefix' => 'magento2', + 'elasticsearch-timeout' => 15, + 'no-interaction' => false, + ], + 'search' => [ + 'search-engine' => 'elasticsearch7', + 'elasticsearch-host' => 'localhost', + 'elasticsearch-port' => '9200', + 'elasticsearch-enable-auth' => false, + 'elasticsearch-index-prefix' => 'magento2', + 'elasticsearch-timeout' => 15, + ] + ] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchTermDescriptionGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchTermDescriptionGeneratorTest.php new file mode 100644 index 0000000..2f6873c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchTermDescriptionGeneratorTest.php @@ -0,0 +1,67 @@ +descriptionGeneratorMock = + $this->createMock(DescriptionGenerator::class); + $this->searchTermManagerMock = $this->createMock(SearchTermManager::class); + + $this->searchTermDescriptionGenerator = new SearchTermDescriptionGenerator( + $this->descriptionGeneratorMock, + $this->searchTermManagerMock + ); + } + + public function testGeneratorWithCaching() + { + $descriptionMock = ''; + $firstProductIndex = 1; + $secondProductIndex = 2; + + $this->descriptionGeneratorMock + ->expects($this->once()) + ->method('generate') + ->willReturn($descriptionMock); + + $this->searchTermManagerMock + ->expects($this->exactly(2)) + ->method('applySearchTermsToDescription') + ->withConsecutive( + [$descriptionMock, $firstProductIndex], + [$descriptionMock, $secondProductIndex] + ); + + $this->searchTermDescriptionGenerator->generate($firstProductIndex); + $this->searchTermDescriptionGenerator->generate($secondProductIndex); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchTermManagerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchTermManagerTest.php new file mode 100644 index 0000000..a72f816 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/SearchTermManagerTest.php @@ -0,0 +1,81 @@ + 'x-wing', + 'count' => '33' + ], [ + 'term' => 'tie-fighter', + 'count' => '100' + ], [ + 'term' => 'n-1 starfighter', + 'count' => '42' + ], + ]; + + /** + * @var array + */ + private $searchTermsUsage = [ + 'x-wing' => [ + 'used' => 0 + ], + 'tie-fighter' => [ + 'used' => 0 + ], + 'n-1 starfighter' => [ + 'used' => 0 + ] + ]; + + protected function setUp(): void + { + $this->searchTermManager = new SearchTermManager( + $this->searchTermConfiguration, + $this->totalProductsCount + ); + } + + public function testSearchTermApplied() + { + for ($productIndex=1; $productIndex<=$this->totalProductsCount; $productIndex++) { + $description = 'Fleet: '; + $this->searchTermManager->applySearchTermsToDescription($description, $productIndex); + + foreach (array_keys($this->searchTermsUsage) as $searchTerm) { + if (preg_match("/\\b$searchTerm\\b/", $description)) { + $this->searchTermsUsage[$searchTerm]['used']++; + } + } + } + + foreach ($this->searchTermConfiguration as $searchTerm) { + $this->assertEquals($searchTerm['count'], $this->searchTermsUsage[$searchTerm['term']]['used']); + } + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/StoreConfigurationDataMapperTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/StoreConfigurationDataMapperTest.php new file mode 100644 index 0000000..df94438 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/StoreConfigurationDataMapperTest.php @@ -0,0 +1,145 @@ +assertEquals($expected, $userConfigurationDataMapper->getConfigData($data)); + } + + /** + * @return array + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function getConfigDataDataProvider() + { + return [ + 'valid' => [ + [ + StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY => '1', + StoreConfigurationDataMapper::KEY_BASE_URL => 'http://127.0.0.1/', + StoreConfigurationDataMapper::KEY_BASE_URL_SECURE => 'https://127.0.0.1/', + StoreConfigurationDataMapper::KEY_CURRENCY => 'USD', + StoreConfigurationDataMapper::KEY_IS_SECURE => '1', + StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN => '1', + StoreConfigurationDataMapper::KEY_LANGUAGE => 'en_US', + StoreConfigurationDataMapper::KEY_TIMEZONE => 'America/Chicago', + StoreConfigurationDataMapper::KEY_USE_SEF_URL => '1', + ], + [ + Store::XML_PATH_USE_REWRITES => '1', + Store::XML_PATH_UNSECURE_BASE_URL => 'http://127.0.0.1/', + Store::XML_PATH_SECURE_IN_FRONTEND => '1', + Store::XML_PATH_SECURE_BASE_URL => 'https://127.0.0.1/', + Store::XML_PATH_SECURE_IN_ADMINHTML => '1', + Data::XML_PATH_DEFAULT_LOCALE => 'en_US', + Data::XML_PATH_DEFAULT_TIMEZONE => 'America/Chicago', + Currency::XML_PATH_CURRENCY_BASE => 'USD', + Currency::XML_PATH_CURRENCY_DEFAULT => 'USD', + Currency::XML_PATH_CURRENCY_ALLOW => 'USD', + Url::XML_PATH_USE_SECURE_KEY => '1', + ], + ], + 'valid alphabet url' => [ + [ + StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY => '1', + StoreConfigurationDataMapper::KEY_BASE_URL => 'http://example.com/', + StoreConfigurationDataMapper::KEY_BASE_URL_SECURE => 'https://example.com/', + StoreConfigurationDataMapper::KEY_CURRENCY => 'USD', + StoreConfigurationDataMapper::KEY_IS_SECURE => '1', + StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN => '1', + StoreConfigurationDataMapper::KEY_LANGUAGE => 'en_US', + StoreConfigurationDataMapper::KEY_TIMEZONE => 'America/Chicago', + StoreConfigurationDataMapper::KEY_USE_SEF_URL => '1', + ], + [ + Store::XML_PATH_USE_REWRITES => '1', + Store::XML_PATH_UNSECURE_BASE_URL => 'http://example.com/', + Store::XML_PATH_SECURE_IN_FRONTEND => '1', + Store::XML_PATH_SECURE_BASE_URL => 'https://example.com/', + Store::XML_PATH_SECURE_IN_ADMINHTML => '1', + Data::XML_PATH_DEFAULT_LOCALE => 'en_US', + Data::XML_PATH_DEFAULT_TIMEZONE => 'America/Chicago', + Currency::XML_PATH_CURRENCY_BASE => 'USD', + Currency::XML_PATH_CURRENCY_DEFAULT => 'USD', + Currency::XML_PATH_CURRENCY_ALLOW => 'USD', + Url::XML_PATH_USE_SECURE_KEY => '1', + ], + ], + 'no trailing slash' => [ + [ + StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY => '1', + StoreConfigurationDataMapper::KEY_BASE_URL => 'http://127.0.0.1', + StoreConfigurationDataMapper::KEY_BASE_URL_SECURE => 'https://127.0.0.1', + StoreConfigurationDataMapper::KEY_CURRENCY => 'USD', + StoreConfigurationDataMapper::KEY_IS_SECURE => '1', + StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN => '1', + StoreConfigurationDataMapper::KEY_LANGUAGE => 'en_US', + StoreConfigurationDataMapper::KEY_TIMEZONE => 'America/Chicago', + StoreConfigurationDataMapper::KEY_USE_SEF_URL => '1', + ], + [ + Store::XML_PATH_USE_REWRITES => '1', + Store::XML_PATH_UNSECURE_BASE_URL => 'http://127.0.0.1/', + Store::XML_PATH_SECURE_IN_FRONTEND => '1', + Store::XML_PATH_SECURE_BASE_URL => 'https://127.0.0.1/', + Store::XML_PATH_SECURE_IN_ADMINHTML => '1', + Data::XML_PATH_DEFAULT_LOCALE => 'en_US', + Data::XML_PATH_DEFAULT_TIMEZONE => 'America/Chicago', + Currency::XML_PATH_CURRENCY_BASE => 'USD', + Currency::XML_PATH_CURRENCY_DEFAULT => 'USD', + Currency::XML_PATH_CURRENCY_ALLOW => 'USD', + Url::XML_PATH_USE_SECURE_KEY => '1', + ], + ], + 'no trailing slash, alphabet url' => [ + [ + StoreConfigurationDataMapper::KEY_ADMIN_USE_SECURITY_KEY => '1', + StoreConfigurationDataMapper::KEY_BASE_URL => 'http://example.com', + StoreConfigurationDataMapper::KEY_BASE_URL_SECURE => 'https://example.com', + StoreConfigurationDataMapper::KEY_CURRENCY => 'USD', + StoreConfigurationDataMapper::KEY_IS_SECURE => '1', + StoreConfigurationDataMapper::KEY_IS_SECURE_ADMIN => '1', + StoreConfigurationDataMapper::KEY_LANGUAGE => 'en_US', + StoreConfigurationDataMapper::KEY_TIMEZONE => 'America/Chicago', + StoreConfigurationDataMapper::KEY_USE_SEF_URL => '1', + ], + [ + Store::XML_PATH_USE_REWRITES => '1', + Store::XML_PATH_UNSECURE_BASE_URL => 'http://example.com/', + Store::XML_PATH_SECURE_IN_FRONTEND => '1', + Store::XML_PATH_SECURE_BASE_URL => 'https://example.com/', + Store::XML_PATH_SECURE_IN_ADMINHTML => '1', + Data::XML_PATH_DEFAULT_LOCALE => 'en_US', + Data::XML_PATH_DEFAULT_TIMEZONE => 'America/Chicago', + Currency::XML_PATH_CURRENCY_BASE => 'USD', + Currency::XML_PATH_CURRENCY_DEFAULT => 'USD', + Currency::XML_PATH_CURRENCY_ALLOW => 'USD', + Url::XML_PATH_USE_SECURE_KEY => '1', + ], + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/ThemeDependencyCheckerFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/ThemeDependencyCheckerFactoryTest.php new file mode 100644 index 0000000..03d10c4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/ThemeDependencyCheckerFactoryTest.php @@ -0,0 +1,54 @@ +objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $this->objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + } + + public function testCreate() + { + $this->objectManagerProvider->expects($this->once())->method('get')->willReturn($this->objectManager); + $this->objectManager->expects($this->once()) + ->method('get') + ->with(ThemeDependencyChecker::class); + $this->themeDependencyCheckerFactory = new ThemeDependencyCheckerFactory($this->objectManagerProvider); + $this->themeDependencyCheckerFactory->create(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/UninstallCollectorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Model/UninstallCollectorTest.php new file mode 100644 index 0000000..a854888 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/UninstallCollectorTest.php @@ -0,0 +1,123 @@ +createMock(\Magento\Setup\Model\ObjectManagerProvider::class); + $objectManager = + $this->getMockForAbstractClass(\Magento\Framework\ObjectManagerInterface::class, [], '', false); + $objectManagerProvider->expects($this->once())->method('get')->willReturn($objectManager); + + $setup = $this->createMock(\Magento\Setup\Module\DataSetup::class); + $this->adapterInterface = $this->getMockForAbstractClass( + \Magento\Framework\DB\Adapter\AdapterInterface::class, + [], + '', + false + ); + $select = $this->createPartialMock(\Magento\Framework\DB\Select::class, ['from']); + $this->adapterInterface->expects($this->once())->method('select')->willReturn($select); + $setup->expects($this->exactly(2))->method('getConnection')->willReturn($this->adapterInterface); + $this->result = $this->createMock(\Magento\Framework\DB\Select::class); + $select->expects($this->once())->method('from')->willReturn($this->result); + + $uninstallA = 'Uninstall Class A'; + $uninstallB = 'Uninstall Class B'; + $objectManager->expects($this->any()) + ->method('create') + ->willReturnMap( + [ + ['Magento\A\Setup\Uninstall', [], $uninstallA], + ['Magento\B\Setup\Uninstall', [], $uninstallB], + ] + ); + $setupFactory = $this->createMock(\Magento\Setup\Module\DataSetupFactory::class); + $setupFactory->expects($this->once())->method('create')->willReturn($setup); + + $this->collector = new UninstallCollector($objectManagerProvider, $setupFactory); + } + + public function testUninstallCollector() + { + $this->result->expects($this->never())->method('where'); + $this->adapterInterface->expects($this->once()) + ->method('fetchAll') + ->with($this->result) + ->willReturn([['module' => 'Magento_A'], ['module' => 'Magento_B'], ['module' => 'Magento_C']]); + + $this->assertEquals( + ['Magento_A' => 'Uninstall Class A', 'Magento_B' => 'Uninstall Class B'], + $this->collector->collectUninstall() + ); + } + + public function testUninstallCollectorWithInput() + { + $this->result->expects($this->once())->method('where')->willReturn($this->result); + $this->adapterInterface->expects($this->once()) + ->method('fetchAll') + ->with($this->result) + ->willReturn([['module' => 'Magento_A']]); + + $this->assertEquals(['Magento_A' => 'Uninstall Class A'], $this->collector->collectUninstall(['Magento_A'])); + } +} + +namespace Magento\Setup\Model; + +/** + * This function overrides the native function for the purpose of testing + * + * @param string $obj + * @param string $className + * @return bool + */ +function is_subclass_of($obj, $className) +{ + if ($obj == 'Uninstall Class A' && $className == \Magento\Framework\Setup\UninstallInterface::class) { + return true; + } + if ($obj == 'Uninstall Class B' && $className == \Magento\Framework\Setup\UninstallInterface::class) { + return true; + } + return false; +} + +/** + * This function overrides the native function for the purpose of testing + * + * @param string $className + * @return bool + */ +function class_exists($className) +{ + if ($className == 'Magento\A\Setup\Uninstall' || $className == 'Magento\B\Setup\Uninstall') { + return true; + } + return false; +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Model/_files/dictionary.csv b/magento/setup/src/Magento/Setup/Test/Unit/Model/_files/dictionary.csv new file mode 100644 index 0000000..da9dfd0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Model/_files/dictionary.csv @@ -0,0 +1,5 @@ +one +two +three +four +five \ No newline at end of file diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php new file mode 100644 index 0000000..8e37e29 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php @@ -0,0 +1,142 @@ +createMock(DeploymentConfig::class); + $deployConfig->expects($this->any())->method('isAvailable')->willReturn(false); + + /** @var Random|MockObject $randomMock */ + $randomMock = $this->createMock(Random::class); + $randomMock->expects($this->any())->method('getRandomString')->willReturn('key'); + + $cryptKeyGenerator = new CryptKeyGenerator($randomMock); + + $objectManagerMock = $this->getMockBuilder(\Magento\Framework\App\ObjectManager::class) + ->disableOriginalConstructor() + ->getMock(); + + $objectManagerMock->method('create')->willReturn(new ConfigData('app_env')); + + $configDataFactoryMock = (new ObjectManager($this)) + ->getObject(ConfigDataFactory::class, ['objectManager' => $objectManagerMock]); + + $driverOptions = $this->getMockBuilder(DriverOptions::class) + ->disableOriginalConstructor() + ->setMethods(['getDriverOptions']) + ->getMock(); + + $this->configGeneratorObject = new ConfigGenerator( + $randomMock, + $deployConfig, + $configDataFactoryMock, + $cryptKeyGenerator, + $driverOptions + ); + } + + public function testCreateCryptConfigWithInput() + { + $testData = [ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY => 'some-test_key']; + $returnValue = $this->configGeneratorObject->createCryptConfig($testData); + $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey()); + $this->assertEquals(['crypt' => ['key' => 'some-test_key']], $returnValue->getData()); + } + + public function testCreateCryptConfigWithoutInput() + { + $returnValue = $this->configGeneratorObject->createCryptConfig([]); + $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey()); + // phpcs:ignore Magento2.Security.InsecureFunction + $this->assertEquals(['crypt' => ['key' => md5('key')]], $returnValue->getData()); + } + + public function testCreateSessionConfigWithInput() + { + $testData = [ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE => 'files']; + $returnValue = $this->configGeneratorObject->createSessionConfig($testData); + $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey()); + $this->assertEquals( + ['session' => ['save' => ConfigOptionsListConstants::SESSION_SAVE_FILES]], + $returnValue->getData() + ); + + $testData = [ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE => 'db']; + $returnValue = $this->configGeneratorObject->createSessionConfig($testData); + $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey()); + $this->assertEquals( + ['session' => ['save' => ConfigOptionsListConstants::SESSION_SAVE_DB]], + $returnValue->getData() + ); + } + + public function testCreateSessionConfigWithoutInput() + { + $returnValue = $this->configGeneratorObject->createSessionConfig([]); + $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey()); + $this->assertEquals([], $returnValue->getData()); + } + + public function testCreateDbConfig() + { + $testData = [ + ConfigOptionsListConstants::INPUT_KEY_DB_HOST => 'testLocalhost', + ConfigOptionsListConstants::INPUT_KEY_DB_NAME => 'testDbName', + ConfigOptionsListConstants::INPUT_KEY_DB_USER => 'testDbUser', + ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX => 'testSomePrefix', + ]; + $returnValue = $this->configGeneratorObject->createDbConfig($testData); + $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey()); + $dbData = $returnValue->getData(); + $dbData = $dbData['db']; + $this->assertArrayHasKey('table_prefix', $dbData); + $this->assertSame('testSomePrefix', $dbData['table_prefix']); + $this->assertArrayHasKey('connection', $dbData); + $this->assertArrayHasKey('default', $dbData['connection']); + $this->assertArrayHasKey('host', $dbData['connection']['default']); + $this->assertSame('testLocalhost', $dbData['connection']['default']['host']); + $this->assertArrayHasKey('dbname', $dbData['connection']['default']); + $this->assertSame('testDbName', $dbData['connection']['default']['dbname']); + $this->assertArrayHasKey('username', $dbData['connection']['default']); + $this->assertSame('testDbUser', $dbData['connection']['default']['username']); + $this->assertArrayHasKey('active', $dbData['connection']['default']); + $this->assertSame('1', $dbData['connection']['default']['active']); + } + + public function testCreateResourceConfig() + { + $returnValue = $this->configGeneratorObject->createResourceConfig(); + $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey()); + $this->assertEquals(['resource' => ['default_setup' => ['connection' => 'default']]], $returnValue->getData()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/ConnectionFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/ConnectionFactoryTest.php new file mode 100644 index 0000000..22f6628 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/ConnectionFactoryTest.php @@ -0,0 +1,75 @@ +getMockForAbstractClass(ServiceLocatorInterface::class); + $objectManagerProviderMock = $this->createMock(ObjectManagerProvider::class); + $serviceLocatorMock->expects($this->once()) + ->method('get') + ->with( + ObjectManagerProvider::class + ) + ->willReturn($objectManagerProviderMock); + $objectManagerMock = $this->getMockForAbstractClass(ObjectManagerInterface::class); + $objectManagerProviderMock->expects($this->once()) + ->method('get') + ->willReturn($objectManagerMock); + $this->connectionFactory = $objectManager->getObject( + ConnectionFactory::class, + [ + 'serviceLocator' => $serviceLocatorMock + ] + ); + } + + /** + * @param array $config + * @dataProvider createDataProvider + */ + public function testCreate($config) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('MySQL adapter: Missing required configuration option \'host\''); + $this->connectionFactory->create($config); + } + + /** + * @return array + */ + public function createDataProvider() + { + return [ + [ + [] + ], + [ + ['value'] + ], + [ + ['active' => 0] + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/DataSetupFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/DataSetupFactoryTest.php new file mode 100644 index 0000000..888a495 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/DataSetupFactoryTest.php @@ -0,0 +1,46 @@ +createMock(ResourceConnection::class); + $filesystem = $this->createMock(Filesystem::class); + $context = $this->createMock(Context::class); + $context->expects($this->once())->method('getEventManager'); + $context->expects($this->once())->method('getLogger'); + $context->expects($this->once())->method('getMigrationFactory'); + $context->expects($this->once())->method('getResourceModel')->willReturn($resource); + $context->expects($this->once())->method('getFilesystem')->willReturn($filesystem); + $objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManager->expects($this->once()) + ->method('get') + ->with(Context::class) + ->willReturn($context); + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->expects($this->once())->method('get')->willReturn($objectManager); + $factory = new DataSetupFactory($objectManagerProvider); + $this->assertInstanceOf(DataSetup::class, $factory->create()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/CodeTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/CodeTest.php new file mode 100644 index 0000000..3b35ace --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/CodeTest.php @@ -0,0 +1,72 @@ +parser = $objectManagerHelper->getObject(Code::class); + } + + /** + * @param array $options + * @dataProvider dataProviderWrongOptionFilesForParse + */ + public function testParseWithWrongOptionFilesForParse($options) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Parse error: Option "files_for_parse" is wrong.'); + $this->parser->parse($options); + } + + /** + * @return array + */ + public function dataProviderWrongOptionFilesForParse() + { + return [ + [['files_for_parse' => [], 'declared_namespaces' => [1, 2]]], + [['files_for_parse' => 'sting', 'declared_namespaces' => [1, 2]]], + [['there_are_no_files_for_parse' => [1, 3], 'declared_namespaces' => [1, 2]]] + ]; + } + + /** + * @param array $options + * @dataProvider dataProviderWrongOptionDeclaredNamespace + */ + public function testParseWithWrongOptionDeclaredNamespace($options) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Parse error: Option "declared_namespaces" is wrong.'); + $this->parser->parse($options); + } + + /** + * @return array + */ + public function dataProviderWrongOptionDeclaredNamespace() + { + return [ + [['declared_namespaces' => [], 'files_for_parse' => [1, 2]]], + [['declared_namespaces' => 'sting', 'files_for_parse' => [1, 2]]], + [['there_are_no_declared_namespaces' => [1, 3], 'files_for_parse' => [1, 2]]] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/Composer/JsonTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/Composer/JsonTest.php new file mode 100644 index 0000000..88a9dca --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/Composer/JsonTest.php @@ -0,0 +1,50 @@ +parser = $objectManagerHelper->getObject(Json::class); + } + + /** + * @param array $options + * @dataProvider dataProviderWrongOptionFilesForParse + */ + public function testParseWithWrongOptionFilesForParse($options) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Parse error: Option "files_for_parse" is wrong.'); + $this->parser->parse($options); + } + + /** + * @return array + */ + public function dataProviderWrongOptionFilesForParse() + { + return [ + [['files_for_parse' => []]], + [['files_for_parse' => 'string']], + [['there_are_no_files_for_parse' => [1, 3]]] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/Config/XmlTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/Config/XmlTest.php new file mode 100644 index 0000000..2b15346 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Parser/Config/XmlTest.php @@ -0,0 +1,49 @@ +parser = $objectManagerHelper->getObject(Xml::class); + } + + /** + * @param array $options + * @dataProvider dataProviderWrongOptionFilesForParse + */ + public function testParseWithWrongOptionFilesForParse($options) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Parse error: Option "files_for_parse" is wrong.'); + $this->parser->parse($options); + } + + /** + * @return array + */ + public function dataProviderWrongOptionFilesForParse() + { + return [ + [['files_for_parse' => []]], + [['files_for_parse' => 'sting']], + [['there_are_no_files_for_parse' => [1, 3]]] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Builder/AbstractBuilderTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Builder/AbstractBuilderTest.php new file mode 100644 index 0000000..ad42875 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Builder/AbstractBuilderTest.php @@ -0,0 +1,115 @@ +dependenciesParserMock = $this->getMockForAbstractClass(ParserInterface::class); + $this->reportWriterMock = $this->getMockForAbstractClass(WriterInterface::class); + + $this->builder = $this->getMockForAbstractClass( + AbstractBuilder::class, + ['dependenciesParser' => $this->dependenciesParserMock, 'reportWriter' => $this->reportWriterMock] + ); + } + + /** + * @param array $options + * @dataProvider dataProviderWrongParseOptions + */ + public function testBuildWithWrongParseOptions($options) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Passed option section "parse" is wrong.'); + $this->builder->build($options); + } + + /** + * @return array + */ + public function dataProviderWrongParseOptions() + { + return [[['write' => [1, 2]]], [['parse' => [], 'write' => [1, 2]]]]; + } + + /** + * @param array $options + * @dataProvider dataProviderWrongWriteOptions + */ + public function testBuildWithWrongWriteOptions($options) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Passed option section "write" is wrong.'); + $this->builder->build($options); + } + + /** + * @return array + */ + public function dataProviderWrongWriteOptions() + { + return [[['parse' => [1, 2]]], [['parse' => [1, 2], 'write' => []]]]; + } + + public function testBuild() + { + $options = [ + 'parse' => ['files_for_parse' => [1, 2, 3]], + 'write' => ['report_filename' => 'some_filename'], + ]; + + $parseResult = ['foo', 'bar', 'baz']; + $configMock = $this->getMockForAbstractClass(ConfigInterface::class); + + $this->dependenciesParserMock->expects( + $this->once() + )->method( + 'parse' + )->with( + $options['parse'] + )->willReturn( + $parseResult + ); + $this->builder->expects( + $this->once() + )->method( + 'buildData' + )->with( + $parseResult + )->willReturn( + $configMock + ); + $this->reportWriterMock->expects($this->once())->method('write')->with($options['write'], $configMock); + + $this->builder->build($options); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ChainTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ChainTest.php new file mode 100644 index 0000000..9a572a5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ChainTest.php @@ -0,0 +1,29 @@ +getObject( + Chain::class, + ['modules' => $modules] + ); + + $this->assertEquals($modules, $chain->getModules()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ConfigTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ConfigTest.php new file mode 100644 index 0000000..f605060 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ConfigTest.php @@ -0,0 +1,52 @@ +moduleFirst = $this->createMock(Module::class); + $this->moduleSecond = $this->createMock(Module::class); + + $objectManagerHelper = new ObjectManager($this); + $this->config = $objectManagerHelper->getObject( + Config::class, + ['modules' => [$this->moduleFirst, $this->moduleSecond]] + ); + } + + public function testGetDependenciesCount() + { + $this->moduleFirst->expects($this->once())->method('getChainsCount')->willReturn(0); + $this->moduleSecond->expects($this->once())->method('getChainsCount')->willReturn(2); + + $this->assertEquals(2, $this->config->getDependenciesCount()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ModuleTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ModuleTest.php new file mode 100644 index 0000000..1bfa91b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Circular/Data/ModuleTest.php @@ -0,0 +1,52 @@ +getObject( + Module::class, + ['name' => $name, 'chains' => $chains] + ); + } + + public function testGetName() + { + $name = 'name'; + $module = $this->createModule($name, []); + + $this->assertEquals($name, $module->getName()); + } + + public function testGetChains() + { + $chains = ['foo', 'baz', 'bar']; + $module = $this->createModule('name', $chains); + + $this->assertEquals($chains, $module->getChains()); + } + + public function testGetChainsCount() + { + $module = $this->createModule('name', ['foo', 'baz', 'bar']); + + $this->assertEquals(3, $module->getChainsCount()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Data/Config/AbstractConfigTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Data/Config/AbstractConfigTest.php new file mode 100644 index 0000000..9299ad8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Data/Config/AbstractConfigTest.php @@ -0,0 +1,27 @@ +getMockForAbstractClass( + AbstractConfig::class, + ['modules' => $modules] + ); + + $this->assertEquals($modules, $config->getModules()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/ConfigTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/ConfigTest.php new file mode 100644 index 0000000..b097576 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/ConfigTest.php @@ -0,0 +1,77 @@ +moduleFirst = $this->createMock(Module::class); + $this->moduleSecond = $this->createMock(Module::class); + + $objectManagerHelper = new ObjectManager($this); + $this->config = $objectManagerHelper->getObject( + Config::class, + ['modules' => [$this->moduleFirst, $this->moduleSecond]] + ); + } + + public function testGetDependenciesCount() + { + $this->moduleFirst->expects($this->once())->method('getHardDependenciesCount')->willReturn(1); + $this->moduleFirst->expects($this->once())->method('getSoftDependenciesCount')->willReturn(2); + + $this->moduleSecond->expects($this->once())->method('getHardDependenciesCount')->willReturn(3); + $this->moduleSecond->expects($this->once())->method('getSoftDependenciesCount')->willReturn(4); + + $this->assertEquals(10, $this->config->getDependenciesCount()); + } + + public function testGetHardDependenciesCount() + { + $this->moduleFirst->expects($this->once())->method('getHardDependenciesCount')->willReturn(1); + $this->moduleFirst->expects($this->never())->method('getSoftDependenciesCount'); + + $this->moduleSecond->expects($this->once())->method('getHardDependenciesCount')->willReturn(2); + $this->moduleSecond->expects($this->never())->method('getSoftDependenciesCount'); + + $this->assertEquals(3, $this->config->getHardDependenciesCount()); + } + + public function testGetSoftDependenciesCount() + { + $this->moduleFirst->expects($this->never())->method('getHardDependenciesCount'); + $this->moduleFirst->expects($this->once())->method('getSoftDependenciesCount')->willReturn(1); + + $this->moduleSecond->expects($this->never())->method('getHardDependenciesCount'); + $this->moduleSecond->expects($this->once())->method('getSoftDependenciesCount')->willReturn(3); + + $this->assertEquals(4, $this->config->getSoftDependenciesCount()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/DependencyTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/DependencyTest.php new file mode 100644 index 0000000..a99b02e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/DependencyTest.php @@ -0,0 +1,62 @@ +getObject( + Dependency::class, + ['module' => $module, 'type' => $type] + ); + } + + public function testGetModule() + { + $module = 'module'; + + $dependency = $this->createDependency($module); + + $this->assertEquals($module, $dependency->getModule()); + } + + public function testGetType() + { + $type = Dependency::TYPE_SOFT; + + $dependency = $this->createDependency('module', $type); + + $this->assertEquals($type, $dependency->getType()); + } + + public function testThatHardTypeIsDefault() + { + $dependency = $this->createDependency('module'); + + $this->assertEquals(Dependency::TYPE_HARD, $dependency->getType()); + } + + public function testThatHardTypeIsDefaultIfPassedWrongType() + { + $dependency = $this->createDependency('module', 'wrong_type'); + + $this->assertEquals(Dependency::TYPE_HARD, $dependency->getType()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/ModuleTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/ModuleTest.php new file mode 100644 index 0000000..577cf83 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Dependency/Data/ModuleTest.php @@ -0,0 +1,83 @@ +dependencyFirst = + $this->createMock(Dependency::class); + $this->dependencySecond = + $this->createMock(Dependency::class); + + $objectManagerHelper = new ObjectManager($this); + $this->module = $objectManagerHelper->getObject( + Module::class, + ['name' => 'name', 'dependencies' => [$this->dependencyFirst, $this->dependencySecond]] + ); + } + + public function testGetName() + { + $this->assertEquals('name', $this->module->getName()); + } + + public function testGetDependencies() + { + $this->assertEquals([$this->dependencyFirst, $this->dependencySecond], $this->module->getDependencies()); + } + + public function testGetDependenciesCount() + { + $this->assertEquals(2, $this->module->getDependenciesCount()); + } + + public function testGetHardDependenciesCount() + { + $this->dependencyFirst->expects($this->once())->method('isHard')->willReturn(true); + $this->dependencyFirst->expects($this->never())->method('isSoft'); + + $this->dependencySecond->expects($this->once())->method('isHard')->willReturn(false); + $this->dependencySecond->expects($this->never())->method('isSoft'); + + $this->assertEquals(1, $this->module->getHardDependenciesCount()); + } + + public function testGetSoftDependenciesCount() + { + $this->dependencyFirst->expects($this->never())->method('isHard'); + $this->dependencyFirst->expects($this->once())->method('isSoft')->willReturn(true); + + $this->dependencySecond->expects($this->never())->method('isHard'); + $this->dependencySecond->expects($this->once())->method('isSoft')->willReturn(false); + + $this->assertEquals(1, $this->module->getSoftDependenciesCount()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/BuilderTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/BuilderTest.php new file mode 100644 index 0000000..b022b92 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/BuilderTest.php @@ -0,0 +1,55 @@ +builder = $objectManagerHelper->getObject( + Builder::class + ); + } + + /** + * @param array $options + * @dataProvider dataProviderWrongOptionConfigFiles + */ + public function testBuildWithWrongOptionConfigFiles($options) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Parse error. Passed option "config_files" is wrong.'); + $this->builder->build($options); + } + + /** + * @return array + */ + public function dataProviderWrongOptionConfigFiles() + { + return [ + [ + [ + 'parse' => ['files_for_parse' => [1, 2], 'config_files' => []], + 'write' => [1, 2], + ], + ], + [['parse' => ['files_for_parse' => [1, 2]], 'write' => [1, 2]]] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/ConfigTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/ConfigTest.php new file mode 100644 index 0000000..1af1558 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/ConfigTest.php @@ -0,0 +1,52 @@ +moduleFirst = $this->createMock(Module::class); + $this->moduleSecond = $this->createMock(Module::class); + + $objectManagerHelper = new ObjectManager($this); + $this->config = $objectManagerHelper->getObject( + Config::class, + ['modules' => [$this->moduleFirst, $this->moduleSecond]] + ); + } + + public function testGetDependenciesCount() + { + $this->moduleFirst->expects($this->once())->method('getDependenciesCount')->willReturn(0); + $this->moduleSecond->expects($this->once())->method('getDependenciesCount')->willReturn(2); + + $this->assertEquals(2, $this->config->getDependenciesCount()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/DependencyTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/DependencyTest.php new file mode 100644 index 0000000..d2c0d89 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/DependencyTest.php @@ -0,0 +1,47 @@ +getObject( + Dependency::class, + ['lib' => $lib, 'count' => $count] + ); + } + + public function testGetLib() + { + $lib = 'lib'; + + $dependency = $this->createDependency($lib, 0); + + $this->assertEquals($lib, $dependency->getLib()); + } + + public function testGetCount() + { + $count = 3; + + $dependency = $this->createDependency('lib', $count); + + $this->assertEquals($count, $dependency->getCount()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/ModuleTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/ModuleTest.php new file mode 100644 index 0000000..29c7d37 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Framework/Data/ModuleTest.php @@ -0,0 +1,52 @@ +getObject( + Module::class, + ['name' => $name, 'dependencies' => $dependencies] + ); + } + + public function testGetName() + { + $name = 'name'; + $module = $this->createModule($name, []); + + $this->assertEquals($name, $module->getName()); + } + + public function testGetDependencies() + { + $dependencies = ['foo', 'baz', 'bar']; + $module = $this->createModule('name', $dependencies); + + $this->assertEquals($dependencies, $module->getDependencies()); + } + + public function testGetDependenciesCount() + { + $module = $this->createModule('name', ['foo', 'baz', 'bar']); + + $this->assertEquals(3, $module->getDependenciesCount()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Writer/Csv/AbstractWriterTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Writer/Csv/AbstractWriterTest.php new file mode 100644 index 0000000..468b29d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Dependency/Report/Writer/Csv/AbstractWriterTest.php @@ -0,0 +1,81 @@ +csvMock = $this->createMock(Csv::class); + + $this->writer = $this->getMockForAbstractClass( + AbstractWriter::class, + ['writer' => $this->csvMock] + ); + } + + public function testWrite() + { + $options = ['report_filename' => 'some_filename']; + $configMock = $this->getMockForAbstractClass(ConfigInterface::class); + $preparedData = ['foo', 'baz', 'bar']; + + $this->writer->expects( + $this->once() + )->method( + 'prepareData' + )->with( + $configMock + )->willReturn( + $preparedData + ); + $this->csvMock->expects($this->once())->method('saveData')->with($options['report_filename'], $preparedData); + + $this->writer->write($options, $configMock); + } + + /** + * @param array $options + * @dataProvider dataProviderWrongOptionReportFilename + */ + public function testWriteWithWrongOptionReportFilename($options) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Writing error: Passed option "report_filename" is wrong.'); + $configMock = $this->getMockForAbstractClass(ConfigInterface::class); + + $this->writer->write($options, $configMock); + } + + /** + * @return array + */ + public function dataProviderWrongOptionReportFilename() + { + return [ + [['report_filename' => '']], + [['there_are_no_report_filename' => 'some_name']] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ApplicationCodeGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ApplicationCodeGeneratorTest.php new file mode 100644 index 0000000..f70035e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ApplicationCodeGeneratorTest.php @@ -0,0 +1,117 @@ +directoryScannerMock = $this->getMockBuilder( + DirectoryScanner::class + )->disableOriginalConstructor() + ->getMock(); + $this->phpScannerMock = $this->getMockBuilder(PhpScanner::class) + ->disableOriginalConstructor() + ->getMock(); + $this->classesScannerMock = $this->getMockBuilder(ClassesScanner::class) + ->disableOriginalConstructor() + ->getMock(); + } + + /** + * @param array $data + * + * @dataProvider doOperationWrongDataDataProvider + */ + public function testDoOperationWrongData($data) + { + $model = new ApplicationCodeGenerator( + $this->classesScannerMock, + $this->phpScannerMock, + $this->directoryScannerMock, + $data + ); + + $this->classesScannerMock->expects($this->never()) + ->method('getList'); + $this->directoryScannerMock->expects($this->never()) + ->method('scan'); + $this->phpScannerMock->expects($this->never()) + ->method('collectEntities'); + + $this->assertEmpty($model->doOperation()); + } + + /** + * @return array + */ + public function doOperationWrongDataDataProvider() + { + return [ + [[]], + [['filePatterns' => ['php' => '*.php']]], + [['path' => 'path']], + ]; + } + + public function testDoOperation() + { + $data = [ + 'paths' => ['path/to/app'], + 'filePatterns' => ['php' => '.php'], + 'excludePatterns' => ['/\/Test\//'] + ]; + $files = ['php' => []]; + $model = new ApplicationCodeGenerator( + $this->classesScannerMock, + $this->phpScannerMock, + $this->directoryScannerMock, + $data + ); + + $this->classesScannerMock->expects($this->once()) + ->method('getList') + ->with($data['paths'][0]); + $this->directoryScannerMock->expects($this->once()) + ->method('scan') + ->with( + $data['paths'][0], + $data['filePatterns'], + $data['excludePatterns'] + )->willReturn($files); + $this->phpScannerMock->expects($this->once()) + ->method('collectEntities') + ->with($files['php']) + ->willReturn([]); + + $this->assertEmpty($model->doOperation()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/AreaTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/AreaTest.php new file mode 100644 index 0000000..93f81a0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/AreaTest.php @@ -0,0 +1,129 @@ +areaListMock = $this->getMockBuilder(AreaList::class) + ->disableOriginalConstructor() + ->getMock(); + $this->areaInstancesNamesList = + $this->getMockBuilder(\Magento\Setup\Module\Di\Code\Reader\Decorator\Area::class) + ->disableOriginalConstructor() + ->getMock(); + $this->configReaderMock = $this->getMockBuilder(Reader::class) + ->disableOriginalConstructor() + ->getMock(); + $this->configWriterMock = + $this->getMockBuilder(ConfigWriterInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->configChain = $this->getMockBuilder(ModificationChain::class) + ->disableOriginalConstructor() + ->getMock(); + } + + public function testDoOperationEmptyPath() + { + $areaOperation = new Area( + $this->areaListMock, + $this->areaInstancesNamesList, + $this->configReaderMock, + $this->configWriterMock, + $this->configChain + ); + + $this->assertNull($areaOperation->doOperation()); + } + + public function testDoOperationGlobalArea() + { + $path = 'path/to/codebase/'; + $arguments = ['class' => []]; + $generatedConfig = [ + 'arguments' => $arguments, + 'preferences' => [], + 'instanceTypes' => [] + ]; + + $areaOperation = new Area( + $this->areaListMock, + $this->areaInstancesNamesList, + $this->configReaderMock, + $this->configWriterMock, + $this->configChain, + [$path] + ); + + $this->areaListMock->expects($this->once()) + ->method('getCodes') + ->willReturn([]); + $this->areaInstancesNamesList->expects($this->once()) + ->method('getList') + ->with($path) + ->willReturn($arguments); + $this->configReaderMock->expects($this->once()) + ->method('generateCachePerScope') + ->with( + $this->isInstanceOf(Collection::class), + App\Area::AREA_GLOBAL + ) + ->willReturn($generatedConfig); + $this->configChain->expects($this->once()) + ->method('modify') + ->with($generatedConfig) + ->willReturn($generatedConfig); + + $this->configWriterMock->expects($this->once()) + ->method('write') + ->with( + App\Area::AREA_GLOBAL, + $generatedConfig + ); + + $areaOperation->doOperation(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/InterceptionCacheTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/InterceptionCacheTest.php new file mode 100644 index 0000000..8df12ba --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/InterceptionCacheTest.php @@ -0,0 +1,87 @@ +configMock = $this->getMockBuilder(Config::class) + ->setMethods([]) + ->disableOriginalConstructor() + ->getMock(); + $this->interceptionsListMock = $this->getMockBuilder( + Interceptions::class + ) + ->setMethods([]) + ->disableOriginalConstructor() + ->getMock(); + } + + public function testDoOperationEmptyData() + { + $data = []; + + $operation = new InterceptionCache($this->configMock, $this->interceptionsListMock, $data); + $this->configMock->expects($this->never()) + ->method('initialize'); + + $this->assertNull($operation->doOperation()); + } + + public function testDoOperationInitializeWithDefinitions() + { + $definitions = [ + 'Library\Class', + 'Application\Class', + 'VarGeneration\Class', + 'AppGeneration\Class' + ]; + + $data = [ + 'lib', + 'app', + 'generation', + 'appgeneration' + ]; + + $this->interceptionsListMock->expects($this->any()) + ->method('getList') + ->willReturnMap( + [ + ['lib', ['Library\Class']], + ['app', ['Application\Class']], + ['generation', ['VarGeneration\Class']], + ['appgeneration', ['AppGeneration\Class']] + ] + ); + + $operation = new InterceptionCache($this->configMock, $this->interceptionsListMock, $data); + $this->configMock->expects($this->once()) + ->method('initialize') + ->with($definitions); + + $this->assertNull($operation->doOperation()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/OperationFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/OperationFactoryTest.php new file mode 100644 index 0000000..b2af18b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/OperationFactoryTest.php @@ -0,0 +1,88 @@ +objectManagerMock = $this->getMockBuilder(ObjectManagerInterface::class) + ->setMethods([]) + ->getMockForAbstractClass(); + $objectManagerProviderMock = $this->createMock(ObjectManagerProvider::class); + $objectManagerProviderMock->expects($this->once())->method('get')->willReturn($this->objectManagerMock); + $this->factory = new OperationFactory( + $objectManagerProviderMock + ); + } + + /** + * @param string $alias + * @param mixed $arguments + * @dataProvider aliasesDataProvider + */ + public function testCreateSuccess($alias, $arguments, $instanceName) + { + $operationInstance = $this->getMockBuilder(OperationInterface::class) + ->getMock(); + + $this->objectManagerMock->expects($this->once()) + ->method('create') + ->with($instanceName, ['data' => $arguments]) + ->willReturn($operationInstance); + + $this->assertSame($operationInstance, $this->factory->create($alias, $arguments)); + } + + public function testCreateException() + { + $notRegisteredOperation = 'coffee'; + $this->expectException(OperationException::class); + $this->expectExceptionMessage( + sprintf('Unrecognized operation "%s"', $notRegisteredOperation) + ); + $this->factory->create($notRegisteredOperation); + } + + /** + * @return array + */ + public function aliasesDataProvider() + { + return [ + [OperationFactory::AREA_CONFIG_GENERATOR, [], Area::class], + [OperationFactory::INTERCEPTION, null, Interception::class], + [ + OperationFactory::INTERCEPTION_CACHE, + 1, + InterceptionCache::class + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ProxyGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ProxyGeneratorTest.php new file mode 100644 index 0000000..ece457e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ProxyGeneratorTest.php @@ -0,0 +1,70 @@ +proxyScannerMock = $this->getMockBuilder(XmlScanner::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->configurationScannerMock = $this->getMockBuilder( + ConfigurationScanner::class + )->disableOriginalConstructor() + ->getMock(); + + $objectManagerHelper = new ObjectManager($this); + $this->model = $objectManagerHelper->getObject( + ProxyGenerator::class, + [ + 'proxyScanner' => $this->proxyScannerMock, + 'configurationScanner' => $this->configurationScannerMock, + ] + ); + } + + public function testDoOperation() + { + $files = ['file1', 'file2']; + $this->configurationScannerMock->expects($this->once()) + ->method('scan') + ->with('di.xml') + ->willReturn($files); + $this->proxyScannerMock->expects($this->once()) + ->method('collectEntities') + ->with($files) + ->willReturn([]); + + $this->model->doOperation(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/RepositoryGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/RepositoryGeneratorTest.php new file mode 100644 index 0000000..d2caec2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/RepositoryGeneratorTest.php @@ -0,0 +1,86 @@ +repositoryScannerMock = + $this->getMockBuilder(RepositoryScanner::class) + ->disableOriginalConstructor() + ->getMock(); + $this->classesScannerMock = $this->getMockBuilder(ClassesScanner::class) + ->disableOriginalConstructor() + ->getMock(); + $this->configurationScannerMock = $this->getMockBuilder( + ConfigurationScanner::class + )->disableOriginalConstructor() + ->getMock(); + $objectManagerHelper = new ObjectManager($this); + $this->model = $objectManagerHelper->getObject( + RepositoryGenerator::class, + [ + 'repositoryScanner' => $this->repositoryScannerMock, + 'classesScanner' => $this->classesScannerMock, + 'configurationScanner' => $this->configurationScannerMock, + 'data' => ['paths' => ['path/to/app']] + ] + ); + } + + public function testDoOperation() + { + $this->classesScannerMock->expects($this->once()) + ->method('getList') + ->with('path/to/app'); + $this->repositoryScannerMock->expects($this->once()) + ->method('setUseAutoload') + ->with(false); + $files = ['file1', 'file2']; + $this->configurationScannerMock->expects($this->once()) + ->method('scan') + ->with('di.xml') + ->willReturn($files); + $this->repositoryScannerMock->expects($this->once()) + ->method('collectEntities') + ->with($files) + ->willReturn([]); + + $this->model->doOperation(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ServiceDataAttributesGeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ServiceDataAttributesGeneratorTest.php new file mode 100644 index 0000000..00cc726 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ServiceDataAttributesGeneratorTest.php @@ -0,0 +1,68 @@ +configurationScannerMock = $this->getMockBuilder( + ConfigurationScanner::class + )->disableOriginalConstructor() + ->getMock(); + $this->serviceDataAttributesScannerMock = $this->getMockBuilder( + ServiceDataAttributesScanner::class + )->disableOriginalConstructor() + ->getMock(); + $objectManagerHelper = new ObjectManager($this); + $this->model = $objectManagerHelper->getObject( + ServiceDataAttributesGenerator::class, + [ + 'serviceDataAttributesScanner' => $this->serviceDataAttributesScannerMock, + 'configurationScanner' => $this->configurationScannerMock, + ] + ); + } + + public function testDoOperation() + { + $files = ['file1', 'file2']; + $this->configurationScannerMock->expects($this->once()) + ->method('scan') + ->with('extension_attributes.xml') + ->willReturn($files); + $this->serviceDataAttributesScannerMock->expects($this->once()) + ->method('collectEntities') + ->with($files) + ->willReturn([]); + + $this->model->doOperation(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Generator/InterceptionConfigurationBuilderTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Generator/InterceptionConfigurationBuilderTest.php new file mode 100644 index 0000000..71d6b53 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Generator/InterceptionConfigurationBuilderTest.php @@ -0,0 +1,125 @@ +interceptionConfig = + $this->createPartialMock(Config::class, ['hasPlugins']); + $this->pluginList = $this->createPartialMock( + PluginList::class, + ['setInterceptedClasses', 'setScopePriorityScheme', 'getPluginsConfig'] + ); + $this->cacheManager = $this->createMock(Manager::class); + $this->interceptableValidator = + $this->createMock(InterceptableValidator::class); + + $this->typeReader = $this->createPartialMock(Type::class, ['isConcrete']); + $this->model = new InterceptionConfigurationBuilder( + $this->interceptionConfig, + $this->pluginList, + $this->typeReader, + $this->cacheManager, + $this->interceptableValidator + ); + } + + /** + * @dataProvider getInterceptionConfigurationDataProvider + */ + public function testGetInterceptionConfiguration($plugins) + { + $definedClasses = ['Class1']; + $this->interceptionConfig->expects($this->once()) + ->method('hasPlugins') + ->with('Class1') + ->willReturn(true); + $this->typeReader->expects($this->any()) + ->method('isConcrete') + ->willReturnMap([ + ['Class1', true], + ['instance', true], + ]); + $this->interceptableValidator->expects($this->any()) + ->method('validate') + ->with('Class1') + ->willReturn(true); + + $this->cacheManager->expects($this->once()) + ->method('setEnabled') + ->with([CompiledConfig::TYPE_IDENTIFIER], true); + $this->pluginList->expects($this->once()) + ->method('setInterceptedClasses') + ->with($definedClasses); + $this->pluginList->expects($this->once()) + ->method('setScopePriorityScheme') + ->with(['global', 'areaCode']); + $this->pluginList->expects($this->once()) + ->method('getPluginsConfig') + ->willReturn(['instance' => $plugins]); + + $this->model->addAreaCode('areaCode'); + $this->model->getInterceptionConfiguration($definedClasses); + } + + /** + * @return array + */ + public function getInterceptionConfigurationDataProvider() + { + $someInstance = new stdClass(); + return [ + [null], + [['plugin' => ['instance' => $someInstance]]], + [['plugin' => ['instance' => $someInstance], 'plugin2' => ['instance' => $someInstance]]] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/ClassReaderDecoratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/ClassReaderDecoratorTest.php new file mode 100644 index 0000000..7f8193f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/ClassReaderDecoratorTest.php @@ -0,0 +1,79 @@ +classReaderMock = $this->getMockBuilder(ClassReader::class) + ->disableOriginalConstructor() + ->setMethods([]) + ->getMock(); + $this->model = new ClassReaderDecorator($this->classReaderMock); + } + + /** + * @param $expectation + * @param $className + * @param $willReturn + * @dataProvider getConstructorDataProvider + */ + public function testGetConstructor($expectation, $className, $willReturn) + { + $this->classReaderMock->expects($this->once()) + ->method('getConstructor') + ->with($className) + ->willReturn($willReturn); + $this->assertEquals( + $expectation, + $this->model->getConstructor($className) + ); + } + + /** + * @return array + */ + public function getConstructorDataProvider() + { + return [ + [null, 'null', null], + [ + [new ConstructorArgument(['name', 'type', 'isRequired', 'defaultValue'])], + 'array', + [['name', 'type', 'isRequired', 'defaultValue']] + ] + ]; + } + + public function testGetParents() + { + $stringArray = ['Parent_Class_Name1', 'Interface_1']; + $this->classReaderMock->expects($this->once()) + ->method('getParents') + ->with('Child_Class_Name') + ->willReturn($stringArray); + $this->assertEquals($stringArray, $this->model->getParents('Child_Class_Name')); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/ClassesScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/ClassesScannerTest.php new file mode 100644 index 0000000..e2c1708 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/ClassesScannerTest.php @@ -0,0 +1,48 @@ +generation = realpath(__DIR__ . '/../../_files/var/generation'); + $mock = $this->getMockBuilder(DirectoryList::class) + ->disableOriginalConstructor() + ->setMethods( + ['getPath'] + )->getMock(); + $mock->method('getPath')->willReturn($this->generation); + $this->model = new ClassesScanner([], $mock); + } + + public function testGetList() + { + $pathToScan = str_replace('\\', '/', realpath(__DIR__ . '/../../') . '/_files/app/code/Magento/SomeModule'); + $actual = $this->model->getList($pathToScan); + $this->assertIsArray($actual); + $this->assertCount(6, $actual); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/FileClassScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/FileClassScannerTest.php new file mode 100644 index 0000000..7996995 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/FileClassScannerTest.php @@ -0,0 +1,341 @@ +expectException(InvalidFileException::class); + new FileClassScanner(''); + } + + public function testEmptyArrayForFileWithoutNamespaceOrClass() + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<getClassName(); + self::assertEmpty($result); + } + + public function testGetClassName() + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<getClassName(); + self::assertEquals('ThisIsATest', $result); + } + + public function testGetClassNameAndSingleNamespace() + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<getClassName(); + self::assertEquals('NS\ThisIsMyTest', $result); + } + + public function testGetClassNameAndMultiNamespace() + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<getClassName(); + self::assertEquals('This\Is\My\Ns\ThisIsMyTest', $result); + } + + public function testGetMultiClassNameAndMultiNamespace() + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<get(\This\Is\Another\Ns::class)->method(); + self:: class; + } + + public function test() + { + + } +} + +class ThisIsForBreaking { + +} + +PHP + ); + + /** @var $scanner FileClassScanner */ + $result = $scanner->getClassName(); + // only a single class should be in the file + self::assertEquals('This\Is\My\Ns\ThisIsMyTest', $result); + } + + public function testBracketedNamespacesAndClasses() + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<getClassName(); + // only a single class should in the file + self::assertEquals('This\Is\My\Ns\ThisIsMyTest', $result); + } + + public function testMultipleClassKeywordsInMiddleOfFileWithStringVariableParsing() + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<<'PHP' +doMethod(stdClass::class)->runAction(); + } +} + +PHP + ); + + /* @var $scanner FileClassScanner */ + $result = $scanner->getClassName(); + self::assertEquals('This\Is\My\Ns\ThisIsMyTest', $result); + } + + public function testInvalidPHPCodeThrowsExceptionWhenCannotDetermineBraceOrSemiColon() + { + $this->expectException(InvalidFileException::class); + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<getClassName(); + } + + /** + * Checks a case when file with class also contains `class_alias` function for backward compatibility. + */ + public function testFileContainsClassAliasFunction(): void + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<<'PHP' +doMethod(); + } +} + +class_alias(\This\Is\My\Ns\ThisIsMyTest::class, stdClass::class); + +PHP + ); + + /* @var $scanner FileClassScanner */ + $result = $scanner->getClassName(); + self::assertEquals('This\Is\My\Ns\ThisIsMyTest', $result); + } + + /** + * Checks a case when file with class also contains `class_exists` function. + */ + public function testFileContainsClassExistsFunction(): void + { + $scanner = $this->getScannerMockObject(); + $scanner->expects(self::once()) + ->method('getFileContents') + ->willReturn( + <<getClassName(); + self::assertEmpty($result); + } + + /** + * Creates file class scanner mock object. + * + * @return MockObject + */ + private function getScannerMockObject(): MockObject + { + $scanner = $this->getMockBuilder(FileClassScanner::class) + ->disableOriginalConstructor() + ->setMethods(['getFileContents']) + ->getMock(); + + return $scanner; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/FileScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/FileScannerTest.php new file mode 100644 index 0000000..5368906 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/FileScannerTest.php @@ -0,0 +1,86 @@ +fileScanner = new FileScanner( + __DIR__ . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'TestClass.php' + ); + } + + /** + * Check that all uses are found. + * + * @return void + */ + public function testGetUses(): void + { + $actualResult = $this->fileScanner->getUses(); + $expectedResult = $this->getExpectedResultForTestClass(); + + $this->assertEquals($expectedResult, $actualResult); + } + + /** + * Check that all uses are found with correct namespace provided. + * + * @return void + */ + public function testGetUsesWithCorrectNamespace(): void + { + $actualResult = $this->fileScanner->getUses('Some\TestNamespace'); + $expectedResult = $this->getExpectedResultForTestClass(); + + $this->assertEquals($expectedResult, $actualResult); + } + + /** + * Check that function returns null with wrong namespace provided. + * + * @return void + */ + public function testGetUsesWithAnotherNamespace(): void + { + $result = $this->fileScanner->getUses('Another\WrongNamespace'); + + $this->assertNull($result); + } + + /** + * Data provider for getUses test + * + * @return array + */ + private function getExpectedResultForTestClass(): array + { + return [ + [ + 'use' => 'Some\OtherNamespace\OtherClass', + 'as' => null + ], + [ + 'use' => 'Some\TestNamespace\TestInteface', + 'as' => 'TestAlias' + ] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/AreaTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/AreaTest.php new file mode 100644 index 0000000..8d7be6f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/AreaTest.php @@ -0,0 +1,82 @@ +classesScannerMock = $this->getMockBuilder(ClassesScanner::class) + ->disableOriginalConstructor() + ->setMethods(['getList']) + ->getMock(); + + $this->classReaderDecoratorMock = $this->getMockBuilder( + ClassReaderDecorator::class + ) + ->disableOriginalConstructor() + ->setMethods(['getConstructor']) + ->getMock(); + + $this->model = new Area( + $this->classesScannerMock, + $this->classReaderDecoratorMock + ); + } + + public function testGetList() + { + $path = '/tmp/test'; + + $classes = ['NameSpace1\ClassName1', 'NameSpace1\ClassName2']; + + $this->classesScannerMock->expects($this->once()) + ->method('getList') + ->with($path) + ->willReturn($classes); + + $constructors = [ + ['NameSpace1\ClassName1', ['arg1' => 'NameSpace1\class5', 'arg2' => 'NameSpace1\ClassName4']], + ['NameSpace1\ClassName2', ['arg1' => 'NameSpace1\class5']] + ]; + + $this->classReaderDecoratorMock->expects($this->exactly(count($classes))) + ->method('getConstructor') + ->willReturnMap($constructors); + + $result = $this->model->getList($path); + + $expected = [ + $classes[0] => $constructors[0][1], + $classes[1] => $constructors[1][1] + ]; + + $this->assertEquals($result, $expected); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/DirectoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/DirectoryTest.php new file mode 100644 index 0000000..7e4baed --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/DirectoryTest.php @@ -0,0 +1,219 @@ +logMock = $this->getMockBuilder(Log::class) + ->disableOriginalConstructor() + ->setMethods(['add']) + ->getMock(); + + $this->classesScanner = $this->getMockBuilder(ClassesScanner::class) + ->disableOriginalConstructor() + ->setMethods(['getList']) + ->getMock(); + + $this->classReaderMock = $this->getMockBuilder(ClassReader::class) + ->disableOriginalConstructor() + ->setMethods(['getParents']) + ->getMock(); + + $this->validatorMock = $this->getMockBuilder(Validator::class) + ->disableOriginalConstructor() + ->setMethods(['validate']) + ->getMock(); + + $this->model = new Directory( + $this->logMock, + $this->classReaderMock, + $this->classesScanner, + $this->validatorMock, + '/generated/code' + ); + } + + public function testGetList() + { + $path = '/tmp/test'; + + $classes = ['NameSpace1\ClassName1', 'NameSpace1\ClassName2']; + + $this->classesScanner->expects($this->once()) + ->method('getList') + ->with($path) + ->willReturn($classes); + + $parents = [ + ['NameSpace1\ClassName1', ['Parent_Class_Name', 'Interface_1', 'Interface_2']], + ['NameSpace1\ClassName2', ['Parent_Class_Name', 'Interface_1', 'Interface_2']] + ]; + + $this->classReaderMock->expects( + $this->exactly( + count($classes) + ) + ) + ->method('getParents') + ->willReturnMap( + $parents + ); + + $this->logMock->expects($this->never()) + ->method('add'); + + $this->validatorMock->expects($this->exactly(count($classes))) + ->method('validate'); + + $this->model->getList($path); + $result = $this->model->getRelations(); + + $expected = [ + $classes[0] => $parents[0][1], + $classes[1] => $parents[1][1] + ]; + + $this->assertEquals($result, $expected); + } + + public function testGetListNoValidation() + { + $path = '/generated/code'; + + $classes = ['NameSpace1\ClassName1', 'NameSpace1\ClassName2']; + + $this->classesScanner->expects($this->once()) + ->method('getList') + ->with($path) + ->willReturn($classes); + + $parents = [ + ['NameSpace1\ClassName1', ['Parent_Class_Name', 'Interface_1', 'Interface_2']], + ['NameSpace1\ClassName2', ['Parent_Class_Name', 'Interface_1', 'Interface_2']] + ]; + + $this->classReaderMock->expects($this->exactly(count($classes))) + ->method('getParents') + ->willReturnMap( + $parents + ); + + $this->logMock->expects($this->never()) + ->method('add'); + + $this->validatorMock->expects($this->never()) + ->method('validate'); + + $this->model->getList($path); + $result = $this->model->getRelations(); + + $expected = [ + $classes[0] => $parents[0][1], + $classes[1] => $parents[1][1] + ]; + + $this->assertEquals($result, $expected); + } + + /** + * @dataProvider getListExceptionDataProvider + * + * @param $exception + */ + public function testGetListException(\Exception $exception) + { + $path = '/tmp/test'; + + $classes = ['NameSpace1\ClassName1']; + + $this->classesScanner->expects($this->once()) + ->method('getList') + ->with($path) + ->willReturn($classes); + + $this->logMock->expects($this->once()) + ->method('add') + ->with(Log::COMPILATION_ERROR, $classes[0], $exception->getMessage()); + + $this->validatorMock->expects($this->exactly(count($classes))) + ->method('validate') + ->willThrowException( + $exception + ); + + $this->model->getList($path); + + $result = $this->model->getRelations(); + + $this->assertEquals($result, []); + } + + /** + * DataProvider for test testGetListException + * + * @return array + */ + public function getListExceptionDataProvider() + { + return [ + [new ValidatorException(new Phrase('Not Valid!'))], + [new \ReflectionException('Not Valid!')] + ]; + } + + /** + * @inheritdoc + */ + protected function tearDown(): void + { + restore_error_handler(); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/InterceptionsTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/InterceptionsTest.php new file mode 100644 index 0000000..0daa05f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/InstancesNamesList/InterceptionsTest.php @@ -0,0 +1,176 @@ +logMock = $this->getMockBuilder(Log::class) + ->disableOriginalConstructor() + ->setMethods(['add', 'report']) + ->getMock(); + + $this->classesScanner = $this->getMockBuilder(ClassesScanner::class) + ->disableOriginalConstructor() + ->setMethods(['getList']) + ->getMock(); + + $this->classReaderMock = $this->getMockBuilder(ClassReader::class) + ->disableOriginalConstructor() + ->setMethods(['getParents']) + ->getMock(); + + $this->validatorMock = $this->getMockBuilder(Validator::class) + ->disableOriginalConstructor() + ->setMethods(['validate', 'add']) + ->getMock(); + + $this->model = new Interceptions( + $this->classesScanner, + $this->classReaderMock, + $this->validatorMock, + new ConstructorIntegrity(), + $this->logMock + ); + } + + public function testGetList() + { + $path = '/tmp/test'; + + $classes = ['NameSpace1\ClassName1', 'NameSpace1\ClassName2']; + + $this->classesScanner->expects($this->once()) + ->method('getList') + ->with($path) + ->willReturn($classes); + + $this->logMock->expects($this->never()) + ->method('add'); + + $this->logMock->expects($this->once())->method('report'); + + $this->validatorMock->expects($this->exactly(count($classes))) + ->method('validate'); + + $result = $this->model->getList($path); + + $this->assertEquals($result, $classes); + } + + public function testGetListNoValidation() + { + $path = '/generated/code'; + + $classes = ['NameSpace1\ClassName1', 'NameSpace1\ClassName2']; + + $this->classesScanner->expects($this->once()) + ->method('getList') + ->with($path) + ->willReturn($classes); + + $this->logMock->expects($this->never()) + ->method('add'); + + $this->validatorMock->expects($this->never()) + ->method('validate'); + + $this->logMock->expects($this->once())->method('report'); + + $result = $this->model->getList($path); + + $this->assertEquals($result, $classes); + } + + /** + * @dataProvider getListExceptionDataProvider + * + * @param $exception + */ + public function testGetListException(\Exception $exception) + { + $path = '/tmp/test'; + + $classes = ['NameSpace1\ClassName1']; + + $this->classesScanner->expects($this->once()) + ->method('getList') + ->with($path) + ->willReturn($classes); + + $this->logMock->expects($this->once()) + ->method('add') + ->with(Log::COMPILATION_ERROR, $classes[0], $exception->getMessage()); + + $this->validatorMock->expects($this->exactly(count($classes))) + ->method('validate') + ->willThrowException( + $exception + ); + + $this->logMock->expects($this->once())->method('report'); + + $result = $this->model->getList($path); + + $this->assertEquals($result, []); + } + + /** + * DataProvider for test testGetListException + * + * @return array + */ + public function getListExceptionDataProvider() + { + return [ + [new ValidatorException(new Phrase('Not Valid!'))], + [new \ReflectionException('Not Valid!')] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/_files/TestClass.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/_files/TestClass.php new file mode 100644 index 0000000..a8818a6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Reader/_files/TestClass.php @@ -0,0 +1,15 @@ +_model = new ArrayScanner(); + $this->_testDir = str_replace('\\', '/', realpath(__DIR__ . '/../../') . '/_files'); + } + + public function testCollectEntities() + { + $actual = $this->_model->collectEntities([$this->_testDir . '/additional.php']); + $expected = ['Some_Model_Proxy', 'Some_Model_EntityFactory']; + $this->assertEquals($expected, $actual); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/CompositeScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/CompositeScannerTest.php new file mode 100644 index 0000000..c6d5c40 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/CompositeScannerTest.php @@ -0,0 +1,65 @@ +_model = new CompositeScanner(); + } + + public function testScan() + { + $phpFiles = ['one/file/php', 'two/file/php']; + $configFiles = ['one/file/config', 'two/file/config']; + $files = ['php' => $phpFiles, 'config' => $configFiles]; + + $scannerPhp = $this->getMockForAbstractClass(ScannerInterface::class); + $scannerXml = $this->getMockForAbstractClass(ScannerInterface::class); + + $scannerPhpExpected = ['Model_OneProxy', 'Model_TwoFactory']; + $scannerXmlExpected = ['Model_OneProxy', 'Model_ThreeFactory']; + $scannerPhp->expects( + $this->once() + )->method( + 'collectEntities' + )->with( + $phpFiles + )->willReturn( + $scannerPhpExpected + ); + + $scannerXml->expects( + $this->once() + )->method( + 'collectEntities' + )->with( + $configFiles + )->willReturn( + $scannerXmlExpected + ); + + $this->_model->addChild($scannerPhp, 'php'); + $this->_model->addChild($scannerXml, 'config'); + + $actual = $this->_model->collectEntities($files); + $expected = [$scannerPhpExpected, $scannerXmlExpected]; + + $this->assertEquals($expected, array_values($actual)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ConfigurationScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ConfigurationScannerTest.php new file mode 100644 index 0000000..a5499b2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ConfigurationScannerTest.php @@ -0,0 +1,74 @@ +fileResolverMock = $this->getMockBuilder(FileResolver::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->areaListMock = $this->getMockBuilder(AreaList::class) + ->disableOriginalConstructor() + ->getMock(); + + $objectManagerHelper = new ObjectManager($this); + $this->model = $objectManagerHelper->getObject( + ConfigurationScanner::class, + [ + 'fileResolver' => $this->fileResolverMock, + 'areaList' => $this->areaListMock, + ] + ); + } + + public function testScan() + { + $codes = ['code1', 'code2']; + $iteratorMock = $this->getMockBuilder(FileIterator::class) + ->disableOriginalConstructor() + ->getMock(); + $this->areaListMock->expects($this->once()) + ->method('getCodes') + ->willReturn($codes); + $counts = count($codes) + 2; + $this->fileResolverMock->expects($this->exactly($counts)) + ->method('get') + ->willReturn($iteratorMock); + $files = ['file1' => 'onefile', 'file2' => 'anotherfile']; + $iteratorMock->expects($this->exactly($counts)) + ->method('toArray') + ->willReturn($files); + $this->assertEquals(array_keys($files), $this->model->scan('di.xml')); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/DirectoryScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/DirectoryScannerTest.php new file mode 100644 index 0000000..47b584a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/DirectoryScannerTest.php @@ -0,0 +1,63 @@ +_model = new DirectoryScanner(); + $this->_testDir = str_replace('\\', '/', realpath(__DIR__ . '/../../') . '/_files'); + } + + public function testScan() + { + $filePatterns = [ + 'php' => '/.*\.php$/', + 'etc' => '/\/app\/etc\/.*\.xml$/', + 'config' => '/\/etc\/(config([a-z0-9\.]*)?|adminhtml\/system)\.xml$/', + 'view' => '/\/view\/[a-z0-9A-Z\/\.]*\.xml$/', + 'design' => '/\/app\/design\/[a-z0-9A-Z\/\.]*\.xml$/', + ]; + + $actual = $this->_model->scan($this->_testDir, $filePatterns); + $expected = [ + 'php' => [ + $this->_testDir . '/additional.php', + $this->_testDir . '/app/bootstrap.php', + $this->_testDir . '/app/code/Magento/SomeModule/Helper/Test.php', + $this->_testDir . '/app/code/Magento/SomeModule/Model/Test.php', + ], + 'config' => [ + $this->_testDir . '/app/code/Magento/SomeModule/etc/adminhtml/system.xml', + $this->_testDir . '/app/code/Magento/SomeModule/etc/config.xml', + ], + 'view' => [$this->_testDir . '/app/code/Magento/SomeModule/view/frontend/default.xml'], + 'design' => [$this->_testDir . '/app/design/adminhtml/Magento/backend/layout.xml'], + 'etc' => [$this->_testDir . '/app/etc/additional.xml', $this->_testDir . '/app/etc/config.xml'], + ]; + $this->assertEquals(sort($expected['php']), sort($actual['php']), 'Incorrect php files list'); + $this->assertEquals(sort($expected['config']), sort($actual['config']), 'Incorrect config files list'); + $this->assertEquals(sort($expected['view']), sort($actual['view']), 'Incorrect view files list'); + $this->assertEquals(sort($expected['design']), sort($actual['design']), 'Incorrect design files list'); + $this->assertEquals(sort($expected['etc']), sort($actual['etc']), 'Incorrect etc files list'); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PhpScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PhpScannerTest.php new file mode 100644 index 0000000..1d57743 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PhpScannerTest.php @@ -0,0 +1,84 @@ +log = $this->createMock(Log::class); + $this->scanner = new PhpScanner($this->log, new TypeProcessor()); + $this->testDir = str_replace('\\', '/', realpath(__DIR__ . '/../../') . '/_files'); + } + + /** + * @return void + */ + public function testCollectEntities(): void + { + $testFiles = [ + $this->testDir . '/app/code/Magento/SomeModule/Helper/Test.php', + $this->testDir . '/app/code/Magento/SomeModule/Model/DoubleColon.php', + $this->testDir . '/app/code/Magento/SomeModule/Api/Data/SomeInterface.php', + $this->testDir . '/app/code/Magento/SomeModule/Model/StubWithAnonymousClass.php' + ]; + + $this->log + ->method('add') + ->withConsecutive( + [ + 4, + 'Magento\SomeModule\Module\Factory', + 'Invalid Factory for nonexistent class Magento\SomeModule\Module in file ' . $testFiles[0] + ], + [ + 4, + 'Magento\SomeModule\Element\Factory', + 'Invalid Factory declaration for class Magento\SomeModule\Element in file ' . $testFiles[0] + ] + ); + + $result = $this->scanner->collectEntities($testFiles); + + self::assertEquals( + ['\\' . \Magento\Eav\Api\Data\AttributeExtensionInterface::class], + $result + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PluginScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PluginScannerTest.php new file mode 100644 index 0000000..355ffc0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PluginScannerTest.php @@ -0,0 +1,49 @@ +model = new PluginScanner(); + $testDir = str_replace('\\', '/', realpath(__DIR__ . '/../../') . '/_files'); + $this->testFiles = [ + $testDir . '/app/code/Magento/SomeModule/etc/di.xml', + $testDir . '/app/etc/di/config.xml', + ]; + } + + protected function tearDown(): void + { + unset($this->model); + } + + public function testCollectEntities() + { + $actual = $this->model->collectEntities($this->testFiles); + $expected = [\Magento\Framework\App\Cache\TagPlugin::class, \Magento\Store\Model\Action\Plugin::class]; + $this->assertEquals($expected, $actual); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php new file mode 100644 index 0000000..6007a3d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php @@ -0,0 +1,42 @@ +model = new ServiceDataAttributesScanner(); + $this->testFile = str_replace('\\', '/', realpath(__DIR__ . '/../../') . '/_files/extension_attributes.xml'); + } + + public function testCollectEntities() + { + $files = [$this->testFile]; + $expectedResult = [ + \Magento\Sales\Api\Data\OrderExtensionInterface::class, + \Magento\Sales\Api\Data\OrderExtension::class, + \Magento\Sales\Api\Data\OrderItemExtensionInterface::class, + \Magento\Sales\Api\Data\OrderItemExtension::class, + ]; + $this->assertSame($expectedResult, $this->model->collectEntities($files)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/XmlInterceptorScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/XmlInterceptorScannerTest.php new file mode 100644 index 0000000..58affa6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/XmlInterceptorScannerTest.php @@ -0,0 +1,49 @@ +_model = new XmlInterceptorScanner(); + $this->_testDir = str_replace('\\', '/', realpath(__DIR__ . '/../../') . '/_files'); + $this->_testFiles = [ + $this->_testDir . '/app/code/Magento/SomeModule/etc/di.xml', + $this->_testDir . '/app/etc/di/config.xml', + ]; + } + + public function testCollectEntities() + { + $actual = $this->_model->collectEntities($this->_testFiles); + $expected = [ + \Magento\Framework\App\Cache\Interceptor::class, + \Magento\Framework\App\Action\Context\Interceptor::class, + ]; + $this->assertEquals($expected, $actual); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/XmlScannerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/XmlScannerTest.php new file mode 100644 index 0000000..11208d1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/XmlScannerTest.php @@ -0,0 +1,77 @@ +_model = new XmlScanner( + $this->_logMock = $this->createMock(Log::class) + ); + $testDir = __DIR__ . '/../../' . '/_files'; + $this->_testFiles = [ + $testDir . '/app/code/Magento/SomeModule/etc/adminhtml/system.xml', + $testDir . '/app/code/Magento/SomeModule/etc/di.xml', + $testDir . '/app/code/Magento/SomeModule/view/frontend/default.xml', + ]; + } + + /** + * @return void + */ + public function testCollectEntities(): void + { + $className = 'Magento\Store\Model\Config\Invalidator\Proxy'; + $this->_logMock + ->method('add') + ->withConsecutive( + [ + 4, + $className, + 'Invalid proxy class for ' . substr($className, 0, -5) + ], + [ + 4, + '\Magento\SomeModule\Model\Element\Proxy', + 'Invalid proxy class for ' . substr('\Magento\SomeModule\Model\Element\Proxy', 0, -5) + ], + [ + 4, + '\Magento\SomeModule\Model\Nested\Element\Proxy', + 'Invalid proxy class for ' . substr('\Magento\SomeModule\Model\Nested\Element\Proxy', 0, -5) + ] + ); + $actual = $this->_model->collectEntities($this->_testFiles); + $expected = []; + $this->assertEquals($expected, $actual); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/ArgumentsResolverTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/ArgumentsResolverTest.php new file mode 100644 index 0000000..8e22200 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/ArgumentsResolverTest.php @@ -0,0 +1,208 @@ +diContainerConfig = $this->getMockForAbstractClass(ConfigInterface::class); + $this->model = new ArgumentsResolver($this->diContainerConfig); + } + + public function testGetResolvedArgumentsConstructorFormat() + { + $expectedResultDefault = $this->getResolvedSimpleConfigExpectation(); + + $constructor = [ + new ConstructorArgument(['type_dependency', 'Type\Dependency', true, null]), + new ConstructorArgument(['type_dependency_shared', 'Type\Dependency\Shared', true, null]), + new ConstructorArgument(['value', null, false, 'value']), + new ConstructorArgument(['value_array', null, false, ['default_value1', 'default_value2']]), + new ConstructorArgument(['value_null', null, false, null]), + ]; + $this->diContainerConfig->expects($this->any()) + ->method('isShared') + ->willReturnMap( + [ + ['Type\Dependency', false], + ['Type\Dependency\Shared', true] + ] + ); + + $type = 'Class'; + $this->diContainerConfig->expects($this->any()) + ->method('getArguments') + ->with($type) + ->willReturn([]); + + $this->assertSame( + $expectedResultDefault, + $this->model->getResolvedConstructorArguments($type, $constructor) + ); + } + + public function testGetResolvedArgumentsConstructorConfiguredFormat() + { + $expectedResultConfigured = $this->getResolvedConfigurableConfigExpectation(); + + $constructor = [ + new ConstructorArgument(['type_dependency_configured', 'Type\Dependency', true, null]), + new ConstructorArgument(['type_dependency_shared_configured', 'Type\Dependency\Shared', true, null]), + new ConstructorArgument(['global_argument', null, false, null]), + new ConstructorArgument(['global_argument_def', null, false, []]), + new ConstructorArgument(['value_configured', null, false, 'value']), + new ConstructorArgument(['value_array_configured', null, false, []]), + new ConstructorArgument(['value_null', null, false, null]), + ]; + + $this->diContainerConfig->expects($this->any()) + ->method('isShared') + ->willReturnMap( + [ + ['Type\Dependency', false], + ['Type\Dependency\Shared', true], + ['Type\Dependency\Configured', false], + ['Type\Dependency\Shared\Configured', true] + ] + ); + + $type = 'Class'; + $this->diContainerConfig->expects($this->any()) + ->method('getArguments') + ->with($type) + ->willReturn( + $this->getConfiguredArguments() + ); + + $this->assertSame( + $expectedResultConfigured, + $this->model->getResolvedConstructorArguments($type, $constructor) + ); + } + + /** + * Returns resolved simple config expectation + * + * @return array + */ + private function getResolvedSimpleConfigExpectation() + { + return [ + 'type_dependency' => [ + '_ins_' => 'Type\Dependency', + ], + 'type_dependency_shared' => [ + '_i_' => 'Type\Dependency\Shared', + ], + 'value' => [ + '_v_' => 'value', + ], + 'value_array' => [ + '_v_' => ['default_value1', 'default_value2'], + ], + 'value_null' => [ + '_vn_' => true, + ], + ]; + } + + /** + * Returns configured arguments expectation + * + * @return array + */ + private function getConfiguredArguments() + { + return [ + 'type_dependency_configured' => ['instance' => 'Type\Dependency\Configured'], + 'type_dependency_shared_configured' => ['instance' => 'Type\Dependency\Shared\Configured'], + 'global_argument' => ['argument' => 'global_argument_configured'], + 'global_argument_def' => ['argument' => 'global_argument_configured'], + 'value_configured' => 'value_configured', + 'value_array_configured' => [ + 'array_value' => 'value', + 'array_configured_instance' => ['instance' => 'Type\Dependency\Shared\Configured'], + 'array_configured_array' => [ + 'array_array_value' => 'value', + 'array_array_configured_instance' => [ + 'instance' => 'Type\Dependency\Shared\Configured', + 'shared' => false + ] + ], + 'array_global_argument' => ['argument' => 'global_argument_configured'] + ], + 'value_null' => null, + ]; + } + + /** + * Returns resolved configurable config expectation + * + * @return array + */ + private function getResolvedConfigurableConfigExpectation() + { + return [ + 'type_dependency_configured' => [ + '_ins_' => 'Type\Dependency\Configured', + ], + 'type_dependency_shared_configured' => [ + '_i_' => 'Type\Dependency\Shared\Configured', + ], + 'global_argument' => [ + '_a_' => 'global_argument_configured', + '_d_' => null + ], + 'global_argument_def' => [ + '_a_' => 'global_argument_configured', + '_d_' => [] + ], + 'value_configured' => [ + '_v_' => 'value_configured', + ], + 'value_array_configured' => [ + '_vac_' => [ + 'array_value' => 'value', + 'array_configured_instance' => [ + '_i_' => 'Type\Dependency\Shared\Configured', + ], + 'array_configured_array' => [ + 'array_array_value' => 'value', + 'array_array_configured_instance' => [ + '_ins_' => 'Type\Dependency\Shared\Configured', + ], + ], + 'array_global_argument' => [ + '_a_' => 'global_argument_configured', + '_d_' => null + ] + ], + ], + 'value_null' => [ + '_vn_' => true, + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/ArgumentsSerializationTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/ArgumentsSerializationTest.php new file mode 100644 index 0000000..d34d2c2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/ArgumentsSerializationTest.php @@ -0,0 +1,68 @@ +serializer = $this->getMockBuilder(SerializerInterface::class) + ->getMock(); + $this->serializer->expects($this->any())->method('serialize')->willReturnCallback(function ($param) { + return json_encode($param); + }); + } + + public function testModifyArgumentsDoNotExist() + { + $inputConfig = [ + 'data' => [] + ]; + $modifier = new ArgumentsSerialization($this->serializer); + $this->assertSame($inputConfig, $modifier->modify($inputConfig)); + } + + public function testModifyArguments() + { + $inputConfig = [ + 'arguments' => [ + 'argument1' => [], + 'argument2' => null, + ] + ]; + + $expected = [ + 'arguments' => [ + 'argument1' => json_encode([]), + 'argument2' => null, + ] + ]; + + $modifier = new ArgumentsSerialization($this->serializer); + $this->assertEquals($expected, $modifier->modify($inputConfig)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/BackslashTrimTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/BackslashTrimTest.php new file mode 100644 index 0000000..9f2d2a0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/BackslashTrimTest.php @@ -0,0 +1,79 @@ + [] + ]; + $modifier = new BackslashTrim(); + $this->assertSame($inputConfig, $modifier->modify($inputConfig)); + } + + public function testModifyArguments() + { + $modifier = new BackslashTrim(); + $this->assertEquals($this->getOutputConfig(), $modifier->modify($this->getInputConfig())); + } + + /** + * Input config + * + * @return array + */ + private function getInputConfig() + { + return [ + 'arguments' => [ + '\\Class' => [ + 'argument_type' => ['_i_' => '\\Class\\Dependency'], + 'argument_not_shared' => ['_ins_' => '\\Class\\Dependency'], + 'array' => [ + 'argument_type' => ['_i_' => '\\Class\\Dependency'], + 'argument_not_shared' => ['_ins_' => '\\Class\\Dependency'], + 'array' => [ + 'argument_type' => ['_i_' => '\\Class\\Dependency'], + 'argument_not_shared' => ['_ins_' => '\\Class\\Dependency'], + ] + ] + ] + ] + ]; + } + + /** + * Output config + * + * @return array + */ + private function getOutputConfig() + { + return [ + 'arguments' => [ + 'Class' => [ + 'argument_type' => ['_i_' => 'Class\\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\\Dependency'], + 'array' => [ + 'argument_type' => ['_i_' => 'Class\\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\\Dependency'], + 'array' => [ + 'argument_type' => ['_i_' => 'Class\\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\\Dependency'], + ] + ] + ] + ] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/InterceptorSubstitutionTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/InterceptorSubstitutionTest.php new file mode 100644 index 0000000..f754db2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/InterceptorSubstitutionTest.php @@ -0,0 +1,143 @@ + [] + ]; + $modifier = new InterceptorSubstitution(); + $this->assertSame($inputConfig, $modifier->modify($inputConfig)); + } + + public function testModifyArguments() + { + $modifier = new InterceptorSubstitution(); + $this->assertEquals($this->getOutputConfig(), $modifier->modify($this->getInputConfig())); + } + + public function testModifyPreferences() + { + $inputConfig = [ + 'arguments' => [ + 'ClassReplaced' => [], + 'ClassReplacement' => [], + 'ClassReplaced\Interceptor' => [], + 'ClassReplacement\Interceptor' => [] + ], + 'preferences' => [ + 'ClassReplaced' => 'ClassReplacement' + ], + 'instanceTypes' => [] + ]; + + $outputConfig = [ + 'arguments' => [ + 'ClassReplaced\Interceptor' => [], + 'ClassReplacement\Interceptor' => [] + ], + 'preferences' => [ + 'ClassReplaced' => 'ClassReplacement\Interceptor', + 'ClassReplacement' => 'ClassReplacement\Interceptor' + ], + 'instanceTypes' => [] + ]; + + $modifier = new InterceptorSubstitution(); + $this->assertEquals($outputConfig, $modifier->modify($inputConfig)); + } + + /** + * Input config + * + * @return array + */ + private function getInputConfig() + { + return [ + 'arguments' => [ + 'Class' => [ + 'argument_type' => ['_i_' => 'Class\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\Dependency'], + 'array_configured' => [ + 'argument_type' => ['_i_' => 'Class\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\Dependency'], + 'array' => [ + 'argument_type' => ['_i_' => 'Class\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\DependencyIntercepted'], + ] + ] + ], + 'virtualType' => [ + 'argument_type' => ['_i_' => 'Class\DependencyIntercepted'], + 'argument_not_shared' => ['_ins_' => 'Class\Dependency'], + 'array_configured' => ['banana'] + ], + 'Class\Interceptor' => [ + 'argument_type' => ['_i_' => 'Class\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\Dependency'], + 'array_configured' => [] + ], + + 'Class\DependencyIntercepted\Interceptor' => [], + 'Class\DependencyIntercepted' => [] + ], + 'preferences' => [ + 'ClassInterface' => 'Class', + ], + 'instanceTypes' => [ + 'virtualType' => 'Class' + ] + ]; + } + + /** + * Output config + * + * @return array + */ + private function getOutputConfig() + { + return [ + 'arguments' => [ + 'Class\Interceptor' => [ + 'argument_type' => ['_i_' => 'Class\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\Dependency'], + 'array_configured' => [ + 'argument_type' => ['_i_' => 'Class\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\Dependency'], + 'array' => [ + 'argument_type' => ['_i_' => 'Class\Dependency'], + 'argument_not_shared' => ['_ins_' => 'Class\DependencyIntercepted'], + ] + ] + ], + 'virtualType' => [ + 'argument_type' => ['_i_' => 'Class\DependencyIntercepted'], + 'argument_not_shared' => ['_ins_' => 'Class\Dependency'], + 'array_configured' => ['banana'] + ], + 'Class\DependencyIntercepted\Interceptor' => [] + ], + 'preferences' => [ + 'ClassInterface' => 'Class\Interceptor', + 'Class' => 'Class\Interceptor', + 'Class\DependencyIntercepted' => 'Class\DependencyIntercepted\Interceptor' + ], + 'instanceTypes' => [ + 'virtualType' => 'Class\Interceptor', + ] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/PreferencesResolvingTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/PreferencesResolvingTest.php new file mode 100644 index 0000000..52c06c3 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/Chain/PreferencesResolvingTest.php @@ -0,0 +1,194 @@ + [] + ]; + + $modification = new PreferencesResolving(); + $this->assertSame($inputConfig, $modification->modify($inputConfig)); + } + + public function testPreferencesResolvingModify() + { + $inputConfig = [ + 'arguments' => $this->getInputArguments(), + 'preferences' => $this->getPreferences() + ]; + $outputConfig = [ + 'arguments' => $this->getOutputArguments(), + 'preferences' => $this->getPreferences() + ]; + + $modification = new PreferencesResolving(); + $this->assertEquals($outputConfig, $modification->modify($inputConfig)); + } + + /** + * @return array + */ + private function getInputArguments() + { + return [ + 'SimpleClass' => [ + 'type_dependency' => [ + '_ins_' => 'Type\DependencyInterface', + ], + 'type_dependency_shared' => [ + '_i_' => 'Type\Dependency\SharedInterface', + ], + 'value' => [ + '_v_' => 'value', + ], + 'value_array' => [ + '_v_' => ['default_value1', 'default_value2'], + ], + 'value_null' => [ + '_vn_' => true, + ], + 'virtual_preferece' => [ + '_i_' => 'Type\DependencyInterface2' + ] + ], + 'ComplexClass' => [ + 'type_dependency_configured' => [ + '_ins_' => 'Type\Dependency\ConfiguredInterface', + ], + 'type_dependency_shared_configured' => [ + '_i_' => 'Type\Dependency\Shared\Configured', + ], + 'global_argument' => [ + '_a_' => 'global_argument_configured', + '_d_' => null + ], + 'global_argument_def' => [ + '_a_' => 'global_argument_configured', + '_d_' => [] + ], + 'value_configured' => [ + '_v_' => 'value_configured', + ], + 'value_array_configured' => [ + '_vac_' => [ + 'array_value' => 'value', + 'array_configured_instance' => [ + '_i_' => 'Type\Dependency\Shared\ConfiguredInterface', + ], + 'array_configured_array' => [ + 'array_array_value' => 'value', + 'array_array_configured_instance' => [ + '_ins_' => 'Type\Dependency\Shared\Configured', + ], + ], + 'array_global_argument' => [ + '_a_' => 'global_argument_configured', + '_d_' => null + ] + ], + ], + 'value_null' => [ + '_vn_' => true, + ], + ] + ]; + } + + /** + * @return array + */ + private function getOutputArguments() + { + return [ + 'SimpleClass' => [ + 'type_dependency' => [ + '_ins_' => 'Type\Dependency', + ], + 'type_dependency_shared' => [ + '_i_' => 'Type\Dependency\Shared', + ], + 'value' => [ + '_v_' => 'value', + ], + 'value_array' => [ + '_v_' => ['default_value1', 'default_value2'], + ], + 'value_null' => [ + '_vn_' => true, + ], + 'virtual_preferece' => [ + '_i_' => 'Type\DependencyVirtual3' + ] + ], + 'ComplexClass' => [ + 'type_dependency_configured' => [ + '_ins_' => 'Type\Dependency\Configured', + ], + 'type_dependency_shared_configured' => [ + '_i_' => 'Type\Dependency\Shared\ConfiguredPreference', + ], + 'global_argument' => [ + '_a_' => 'global_argument_configured', + '_d_' => null + ], + 'global_argument_def' => [ + '_a_' => 'global_argument_configured', + '_d_' => [] + ], + 'value_configured' => [ + '_v_' => 'value_configured', + ], + 'value_array_configured' => [ + '_vac_' => [ + 'array_value' => 'value', + 'array_configured_instance' => [ + '_i_' => 'Type\Dependency\Shared\ConfiguredPreference', + ], + 'array_configured_array' => [ + 'array_array_value' => 'value', + 'array_array_configured_instance' => [ + '_ins_' => 'Type\Dependency\Shared\ConfiguredPreference', + ], + ], + 'array_global_argument' => [ + '_a_' => 'global_argument_configured', + '_d_' => null + ] + ], + ], + 'value_null' => [ + '_vn_' => true, + ], + ] + ]; + } + + /** + * @return array + */ + private function getPreferences() + { + return [ + 'Type\DependencyInterface' => 'Type\Dependency', + 'Type\Dependency\SharedInterface' => 'Type\Dependency\Shared', + 'Type\Dependency\ConfiguredInterface' => 'Type\Dependency\Configured', + 'Type\Dependency\Shared\ConfiguredInterface' => 'Type\Dependency\Shared\ConfiguredPreference', + 'Type\Dependency\Shared\Configured' => 'Type\Dependency\Shared\ConfiguredPreference', + 'Type\DependencyInterface2' => 'Type\DependencyVirtual', + 'Type\DependencyVirtual' => 'Type\DependencyVirtual2', + 'Type\DependencyVirtual2' => 'Type\DependencyVirtual3' + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ModificationChainTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ModificationChainTest.php new file mode 100644 index 0000000..622100b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ModificationChainTest.php @@ -0,0 +1,80 @@ +getMockBuilder( + ModificationInterface::class + )->getMock(); + $modificationsList[] = $this->getMockBuilder( + ModificationInterface::class + )->getMock(); + + new ModificationChain($modificationsList); + } + + public function testConstructorException() + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Wrong modifier provided'); + $modificationsList = []; + $modificationsList[] = $this->getMockBuilder( + ModificationInterface::class + )->getMock(); + $modificationsList[] = $this->getMockBuilder( + ModificationInterface::class + )->getMock(); + $modificationsList[] = 'banana'; + + new ModificationChain($modificationsList); + } + + public function testModify() + { + $inputArray = [ + 'data' => [1, 2, 3] + ]; + + $expectedArray1 = [ + 'data' => [1, 2, 3, 1] + ]; + + $expectedArray2 = [ + 'data' => [1, 2, 3, 1, 1] + ]; + + $modifier1 = $this->getMockBuilder(ModificationInterface::class) + ->getMock(); + $modifier2 = $this->getMockBuilder(ModificationInterface::class) + ->getMock(); + + $modificationsList = [$modifier1, $modifier2]; + + $modifier1->expects($this->once()) + ->method('modify') + ->with($inputArray) + ->willReturn($expectedArray1); + + $modifier2->expects($this->once()) + ->method('modify') + ->with($expectedArray1) + ->willReturn($expectedArray2); + + $chain = new ModificationChain($modificationsList); + + $this->assertEquals($expectedArray2, $chain->modify($inputArray)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ReaderTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ReaderTest.php new file mode 100644 index 0000000..0e5a57c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ReaderTest.php @@ -0,0 +1,242 @@ +diContainerConfig = + $this->getMockForAbstractClass(ConfigInterface::class); + $this->configLoader = + $this->createMock(ConfigLoader::class); + + $this->argumentsResolverFactory = + $this->createMock(ArgumentsResolverFactory::class); + $this->argumentsResolver = $this->createMock(ArgumentsResolver::class); + $this->argumentsResolverFactory->expects($this->any()) + ->method('create') + ->willReturn($this->argumentsResolver); + $this->classReaderDecorator = + $this->createMock(ClassReaderDecorator::class); + $this->typeReader = $this->createMock(Type::class); + + $this->model = new Reader( + $this->diContainerConfig, + $this->configLoader, + $this->argumentsResolverFactory, + $this->classReaderDecorator, + $this->typeReader + ); + } + + public function testGenerateCachePerScopeGlobal() + { + $definitionCollection = $this->getDefinitionsCollection(); + $this->diContainerConfig->expects($this->any()) + ->method('getVirtualTypes') + ->willReturn($this->getVirtualTypes()); + $this->diContainerConfig->expects($this->any()) + ->method('getPreferences') + ->willReturn($this->getPreferences()); + + $getResolvedConstructorArgumentsMap = $this->getResolvedVirtualConstructorArgumentsMap( + $definitionCollection, + $this->getVirtualTypes() + ); + + $this->diContainerConfig->expects($this->any()) + ->method('getInstanceType') + ->willReturnMap($this->getInstanceTypeMap($this->getVirtualTypes())); + + $this->diContainerConfig->expects($this->any()) + ->method('getPreference') + ->willReturnMap($this->getPreferencesMap()); + + $isConcreteMap = []; + foreach ($definitionCollection->getInstancesNamesList() as $instanceType) { + $isConcreteMap[] = [$instanceType, strpos($instanceType, 'Interface') === false]; + + $getResolvedConstructorArgumentsMap[] = [ + $instanceType, + $definitionCollection->getInstanceArguments($instanceType), + $this->getResolvedArguments( + $definitionCollection->getInstanceArguments($instanceType) + ) + ]; + } + + $this->typeReader->expects($this->any()) + ->method('isConcrete') + ->willReturnMap($isConcreteMap); + $this->argumentsResolver->expects($this->any()) + ->method('getResolvedConstructorArguments') + ->willReturnMap($getResolvedConstructorArgumentsMap); + + $this->assertEquals( + $this->getExpectedGlobalConfig(), + $this->model->generateCachePerScope($definitionCollection, Area::AREA_GLOBAL) + ); + } + + /** + * @return array + */ + private function getExpectedGlobalConfig() + { + return [ + 'arguments' => [ + 'ConcreteType1' => ['resolved_argument1', 'resolved_argument2'], + 'ConcreteType2' => ['resolved_argument1', 'resolved_argument2'], + 'virtualType1' => ['resolved_argument1', 'resolved_argument2'] + ], + 'preferences' => $this->getPreferences(), + 'instanceTypes' => $this->getVirtualTypes(), + ]; + } + + /** + * @return Collection + */ + private function getDefinitionsCollection() + { + $definitionCollection = new Collection(); + $definitionCollection->addDefinition('ConcreteType1', ['argument1', 'argument2']); + $definitionCollection->addDefinition('ConcreteType2', ['argument1', 'argument2']); + $definitionCollection->addDefinition('Interface1', [null]); + + return $definitionCollection; + } + + /** + * @return array + */ + private function getVirtualTypes() + { + return ['virtualType1' => 'ConcreteType1']; + } + + /** + * @return array + */ + private function getPreferences() + { + return [ + 'Interface1' => 'ConcreteType1', + 'ThirdPartyInterface' => 'ConcreteType2' + ]; + } + + /** + * @return array + */ + private function getPreferencesMap() + { + return [ + ['ConcreteType1', 'ConcreteType1'], + ['ConcreteType2', 'ConcreteType2'], + ['Interface1', 'ConcreteType1'], + ['ThirdPartyInterface', 'ConcreteType2'] + ]; + } + + /** + * @param array $arguments + * @return array|null + */ + private function getResolvedArguments($arguments) + { + return empty($arguments) ? null : array_map( + function ($argument) { + return 'resolved_' . $argument; + }, + $arguments + ); + } + + /** + * @param array $virtualTypes + * @return array + */ + private function getInstanceTypeMap($virtualTypes) + { + $getInstanceTypeMap = []; + foreach ($virtualTypes as $virtualType => $concreteType) { + $getInstanceTypeMap[] = [$virtualType, $concreteType]; + } + + return $getInstanceTypeMap; + } + + /** + * @param Collection $definitionCollection + * @param array $virtualTypes + * @return array + */ + private function getResolvedVirtualConstructorArgumentsMap(Collection $definitionCollection, array $virtualTypes) + { + $getResolvedConstructorArgumentsMap = []; + foreach ($virtualTypes as $virtualType => $concreteType) { + $getResolvedConstructorArgumentsMap[] = [ + $virtualType, + $definitionCollection->getInstanceArguments($concreteType), + $this->getResolvedArguments( + $definitionCollection->getInstanceArguments($concreteType) + ) + ]; + } + return $getResolvedConstructorArgumentsMap; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/ConstructorArgumentTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/ConstructorArgumentTest.php new file mode 100644 index 0000000..c4ca518 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/ConstructorArgumentTest.php @@ -0,0 +1,24 @@ +assertEquals($argument[0], $model->getName()); + $this->assertEquals($argument[1], $model->getType()); + $this->assertTrue($model->isRequired()); + $this->assertNull($model->getDefaultValue()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Definition/CollectionTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Definition/CollectionTest.php new file mode 100644 index 0000000..fe05ec2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/Definition/CollectionTest.php @@ -0,0 +1,104 @@ + ['configuration', 'array', true, null]]; + } + + /** + * Returns initialized expected definitions for most cases + * + * @return array + */ + private function getExpectedDefinition() + { + return [self::INSTANCE_1 => $this->getArgument()]; + } + + protected function setUp(): void + { + $this->collectionMock = $this->getMockBuilder(Collection::class) + ->setMethods([])->getMock(); + $this->model = new Collection(); + } + + public function testAddDefinition() + { + $this->model->addDefinition(self::INSTANCE_1, $this->getArgument()); + $this->assertEquals($this->getExpectedDefinition(), $this->model->getCollection()); + } + + public function testInitialize() + { + $this->model->initialize([self::INSTANCE_1 => $this->getArgument()]); + $this->assertEquals($this->getExpectedDefinition(), $this->model->getCollection()); + } + + public function testHasInstance() + { + $this->model->addDefinition(self::INSTANCE_1, $this->getArgument()); + $this->assertTrue($this->model->hasInstance(self::INSTANCE_1)); + } + + public function testGetInstancesNamesList() + { + $this->model->addDefinition(self::INSTANCE_1, $this->getArgument()); + $this->assertEquals([self::INSTANCE_1], $this->model->getInstancesNamesList()); + } + + public function testGetInstanceArguments() + { + $this->model->addDefinition(self::INSTANCE_1, $this->getArgument()); + $this->assertEquals($this->getArgument(), $this->model->getInstanceArguments(self::INSTANCE_1)); + } + + public function testAddCollection() + { + $this->model->addDefinition(self::INSTANCE_1, $this->getArgument()); + $this->collectionMock->expects($this->any())->method('getCollection') + ->willReturn([self::INSTANCE_2 => $this->getArgument()]); + $this->model->addCollection($this->collectionMock); + $this->assertEquals( + [self::INSTANCE_1 => $this->getArgument(), self::INSTANCE_2 => $this->getArgument()], + $this->model->getCollection() + ); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/additional.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/additional.php new file mode 100644 index 0000000..3d652cb --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/additional.php @@ -0,0 +1,8 @@ +getObject(\Magento\Bootstrap\ModelFactory::class); diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Api/Data/SomeInterface.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Api/Data/SomeInterface.php new file mode 100644 index 0000000..0a57a6f --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Api/Data/SomeInterface.php @@ -0,0 +1,19 @@ +_objectManager = $objectManager; + } + + /** + * @param string $className + * @param array $data + * @return mixed + */ + public function create($className, array $data = []) + { + $instance = $this->_objectManager->create($className, $data); + return $instance; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Helper/Test.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Helper/Test.php new file mode 100644 index 0000000..56d575a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Helper/Test.php @@ -0,0 +1,56 @@ +_factory = $factory; + $this->_elementFactory = $elementFactory; + $this->_newElementFactory = $rightElementFactory; + } + + /** + * @param ElementFactory $factory + * @param array $data + */ + public function testHelper(ElementFactory $factory, array $data = []) + { + $factory->create(ElementFactory::class, ['data' => $data]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/DoubleColon.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/DoubleColon.php new file mode 100644 index 0000000..bc585a2 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/DoubleColon.php @@ -0,0 +1,20 @@ +factory = $factory; + } + + public function getSerializable(): \JsonSerializable + { + return new class() implements \JsonSerializable { + /** + * @inheritDoc + */ + public function jsonSerialize() + { + return [1, 2, 3]; + } + }; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/Test.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/Test.php new file mode 100644 index 0000000..8068ad8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/Model/Test.php @@ -0,0 +1,28 @@ +create(\Magento\SomeModule\Model\BlockFactory::class, ['data' => $data]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/adminhtml/system.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/adminhtml/system.xml new file mode 100644 index 0000000..1733ba0 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/adminhtml/system.xml @@ -0,0 +1,20 @@ + + + + +
+ + advanced + Magento_Config::advanced + + + Magento\Config\Block\System\Config\Form\Fieldset\Modules\DisableOutput\Proxy + +
+
+
diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/di.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/di.xml new file mode 100644 index 0000000..8332fd7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/di.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \Magento\SomeModule\Model\Element\Proxy + + \Magento\SomeModule\Model\Nested\Element\Proxy + + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/source/PhpExt.php/content b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/source/PhpExt.php/content new file mode 100644 index 0000000..62731e1 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/etc/source/PhpExt.php/content @@ -0,0 +1,21 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +/** + * This file exists for the sake of \Magento\Setup\Test\Unit\Module\Di\Code\Reader\ClassesScannerTest, in order + * to verify that PHP files are correctly scanned and things that are not PHP files (like this file and its parent + * directory) are not scanned. + */ + +/** + * True Function + * + * @return bool + */ +public function someTrueFunction() +{ + return true; +} + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/view/frontend/default.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/view/frontend/default.xml new file mode 100644 index 0000000..f06d926 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/code/Magento/SomeModule/view/frontend/default.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/design/adminhtml/default/backend/layout.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/design/adminhtml/default/backend/layout.xml new file mode 100644 index 0000000..fcc4a41 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/design/adminhtml/default/backend/layout.xml @@ -0,0 +1,8 @@ + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/additional.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/additional.xml new file mode 100644 index 0000000..fcc4a41 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/additional.xml @@ -0,0 +1,8 @@ + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/config.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/config.xml new file mode 100644 index 0000000..11794e4 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/config.xml @@ -0,0 +1,10 @@ + + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/di/config.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/di/config.xml new file mode 100644 index 0000000..58a80e8 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/app/etc/di/config.xml @@ -0,0 +1,22 @@ + + + + + + customStoreManagerProxy + + + + + customLayoutFactory + + + + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml new file mode 100644 index 0000000..6923294 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/var/generation/.keep b/magento/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/var/generation/.keep new file mode 100644 index 0000000..e69de29 diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/ContextTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/ContextTest.php new file mode 100644 index 0000000..2264e22 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/ContextTest.php @@ -0,0 +1,153 @@ +componentRegistrar = $this->createMock(ComponentRegistrar::class); + } + + /** + * @param array $context + * @param string $path + * @param array $pathValues + * @dataProvider dataProviderContextByPath + */ + public function testGetContextByPath($context, $path, $pathValues) + { + $this->componentRegistrar->expects($this->any()) + ->method('getPaths') + ->willReturnMap($pathValues); + $this->context = new Context($this->componentRegistrar); + $this->assertEquals($context, $this->context->getContextByPath($path)); + } + + /** + * @return array + */ + public function dataProviderContextByPath() + { + return [ + [ + [Context::CONTEXT_TYPE_MODULE, 'Magento_Module'], + '/app/code/Magento/Module/Block/Test.php', + [ + [Context::CONTEXT_TYPE_MODULE, ['Magento_Module' => '/app/code/Magento/Module']], + [Context::CONTEXT_TYPE_THEME, []], + ] + ], + [ + [Context::CONTEXT_TYPE_THEME, 'frontend/Some/theme'], + '/app/design/area/theme/test.phtml', + [ + [Context::CONTEXT_TYPE_MODULE, []], + [Context::CONTEXT_TYPE_THEME, ['frontend/Some/theme' => '/app/design/area/theme']], + ] + ], + [ + [Context::CONTEXT_TYPE_LIB, 'lib/web/module/test.phtml'], + '/lib/web/module/test.phtml', + [ + [Context::CONTEXT_TYPE_MODULE, []], + [Context::CONTEXT_TYPE_THEME, []], + ] + ], + ]; + } + + public function testGetContextByPathWithInvalidPath() + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Invalid path given: "invalid_path".'); + $this->componentRegistrar->expects($this->any()) + ->method('getPaths') + ->willReturnMap([ + [ComponentRegistrar::MODULE, ['/path/to/module']], + [ComponentRegistrar::THEME, ['/path/to/theme']] + ]); + $this->context = new Context($this->componentRegistrar); + $this->context->getContextByPath('invalid_path'); + } + + /** + * @param string $path + * @param array $context + * @param array $registrar + * @dataProvider dataProviderPathToLocaleDirectoryByContext + */ + public function testBuildPathToLocaleDirectoryByContext($path, $context, $registrar) + { + $paths = []; + foreach ($registrar as $module) { + $paths[$module[1]] = $module[2]; + } + $this->componentRegistrar->expects($this->any()) + ->method('getPath') + ->willReturnMap($registrar); + $this->context = new Context($this->componentRegistrar); + $this->assertEquals($path, $this->context->buildPathToLocaleDirectoryByContext($context[0], $context[1])); + } + + /** + * @return array + */ + public function dataProviderPathToLocaleDirectoryByContext() + { + return [ + [ + BP . '/app/code/Magento/Module/i18n/', + [Context::CONTEXT_TYPE_MODULE, 'Magento_Module'], + [[ComponentRegistrar::MODULE, 'Magento_Module', BP . '/app/code/Magento/Module']] + ], + [ + BP . '/app/design/frontend/Magento/luma/i18n/', + [Context::CONTEXT_TYPE_THEME, 'frontend/Magento/luma'], + [[ComponentRegistrar::THEME, 'frontend/Magento/luma', BP . '/app/design/frontend/Magento/luma']] + ], + + [ + null, + [Context::CONTEXT_TYPE_MODULE, 'Unregistered_Module'], + [[ComponentRegistrar::MODULE, 'Unregistered_Module', null]] + ], + [ + null, + [Context::CONTEXT_TYPE_THEME, 'frontend/Magento/unregistered'], + [[ComponentRegistrar::THEME, 'frontend/Magento/unregistered', null]] + ], + [BP . '/lib/web/i18n/', [Context::CONTEXT_TYPE_LIB, 'lib/web/module/test.phtml'], []], + ]; + } + + public function testBuildPathToLocaleDirectoryByContextWithInvalidType() + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Invalid context given: "invalid_type".'); + $this->componentRegistrar->expects($this->never()) + ->method('getPath'); + $this->context = new Context($this->componentRegistrar); + $this->context->buildPathToLocaleDirectoryByContext('invalid_type', 'Magento_Module'); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/GeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/GeneratorTest.php new file mode 100644 index 0000000..37f9290 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/GeneratorTest.php @@ -0,0 +1,220 @@ +parserMock = $this->createMock(Parser::class); + $this->contextualParserMock = $this->createMock(Contextual::class); + $this->writerMock = $this->getMockForAbstractClass(WriterInterface::class); + $this->factoryMock = $this->createMock(Factory::class); + $this->factoryMock->expects($this->any()) + ->method('createDictionaryWriter') + ->willReturn($this->writerMock); + + $this->optionsResolverFactory = + $this->createMock(ResolverFactory::class); + + $objectManagerHelper = new ObjectManager($this); + $this->generator = $objectManagerHelper->getObject( + Generator::class, + [ + 'parser' => $this->parserMock, + 'contextualParser' => $this->contextualParserMock, + 'factory' => $this->factoryMock, + 'optionsResolver' => $this->optionsResolverFactory + ] + ); + } + + /** + * @return void + */ + public function testCreatingDictionaryWriter(): void + { + $outputFilename = 'test'; + + $phrase = $this->createMock(Phrase::class); + $this->factoryMock->expects($this->once()) + ->method('createDictionaryWriter') + ->with($outputFilename)->willReturnSelf(); + $this->parserMock->expects($this->any())->method('getPhrases')->willReturn([$phrase]); + $options = []; + $optionResolver = $this->createMock(Resolver::class); + $optionResolver->expects($this->once()) + ->method('getOptions') + ->willReturn($options); + $this->optionsResolverFactory->expects($this->once()) + ->method('create') + ->with('', false) + ->willReturn($optionResolver); + $this->generator->generate('', $outputFilename); + $property = new \ReflectionProperty($this->generator, 'writer'); + $property->setAccessible(true); + $this->assertNull($property->getValue($this->generator)); + } + + /** + * @return void + */ + public function testUsingRightParserWhileWithoutContextParsing(): void + { + $baseDir = 'right_parser'; + $outputFilename = 'file.csv'; + $filesOptions = ['file1', 'file2']; + $optionResolver = + $this->createMock(Resolver::class); + $optionResolver->expects($this->once()) + ->method('getOptions') + ->willReturn($filesOptions); + + $this->factoryMock->expects($this->once()) + ->method('createDictionaryWriter') + ->with($outputFilename)->willReturnSelf(); + + $this->optionsResolverFactory->expects($this->once()) + ->method('create') + ->with($baseDir, false) + ->willReturn($optionResolver); + $this->parserMock->expects($this->once())->method('parse')->with($filesOptions); + $phrase = $this->createMock(Phrase::class); + $this->parserMock->expects($this->once())->method('getPhrases')->willReturn([$phrase]); + $this->generator->generate($baseDir, $outputFilename); + } + + /** + * @return void + */ + public function testUsingRightParserWhileWithContextParsing(): void + { + $baseDir = 'right_parser2'; + $outputFilename = 'file.csv'; + $filesOptions = ['file1', 'file2']; + $optionResolver = + $this->createMock(Resolver::class); + $optionResolver->expects($this->once()) + ->method('getOptions') + ->willReturn($filesOptions); + $this->optionsResolverFactory->expects($this->once()) + ->method('create') + ->with($baseDir, true) + ->willReturn($optionResolver); + + $this->contextualParserMock->expects($this->once())->method('parse')->with($filesOptions); + $phrase = $this->createMock(Phrase::class); + $this->contextualParserMock->expects($this->once())->method('getPhrases')->willReturn([$phrase]); + + $this->factoryMock->expects($this->once()) + ->method('createDictionaryWriter') + ->with($outputFilename)->willReturnSelf(); + + $this->generator->generate($baseDir, $outputFilename, true); + } + + /** + * @return void + */ + public function testWritingPhrases(): void + { + $baseDir = 'WritingPhrases'; + $filesOptions = ['file1', 'file2']; + $optionResolver = + $this->createMock(Resolver::class); + $optionResolver->expects($this->once()) + ->method('getOptions') + ->willReturn($filesOptions); + $this->optionsResolverFactory->expects($this->once()) + ->method('create') + ->with($baseDir, false) + ->willReturn($optionResolver); + + $phrases = [ + $this->createMock(Phrase::class), + $this->createMock(Phrase::class), + ]; + + $this->parserMock->expects($this->once())->method('getPhrases')->willReturn($phrases); + $this->writerMock + ->method('write') + ->withConsecutive([$phrases[0]], [$phrases[1]]); + + $this->generator->generate($baseDir, 'file.csv'); + } + + /** + * @return void + */ + public function testGenerateWithNoPhrases(): void + { + $this->expectException('UnexpectedValueException'); + $this->expectExceptionMessage('No phrases found in the specified dictionary file.'); + $baseDir = 'no_phrases'; + $outputFilename = 'no_file.csv'; + $filesOptions = ['file1', 'file2']; + $optionResolver = + $this->createMock(Resolver::class); + $optionResolver->expects($this->once()) + ->method('getOptions') + ->willReturn($filesOptions); + $this->optionsResolverFactory->expects($this->once()) + ->method('create') + ->with($baseDir, true) + ->willReturn($optionResolver); + + $this->contextualParserMock->expects($this->once())->method('parse')->with($filesOptions); + $this->contextualParserMock->expects($this->once())->method('getPhrases')->willReturn([]); + $this->generator->generate($baseDir, $outputFilename, true); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Loader/File/AbstractFileTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Loader/File/AbstractFileTest.php new file mode 100644 index 0000000..25f06cc --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Loader/File/AbstractFileTest.php @@ -0,0 +1,149 @@ +_dictionaryMock = $this->createMock(Dictionary::class); + $this->_factoryMock = $this->createMock(Factory::class); + } + + /** + * @return void + */ + public function testLoadWrongFile(): void + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Cannot open dictionary file: "wrong_file.csv".'); + $abstractLoaderMock = $this->getMockForAbstractClass( + AbstractFile::class, + [], + '', + false + ); + + /** @var AbstractFile $abstractLoaderMock */ + $abstractLoaderMock->load('wrong_file.csv'); + } + + /** + * @return void + */ + public function testLoad(): void + { + $abstractLoaderMock = $this->getMockForAbstractClass( + AbstractFile::class, + [$this->_factoryMock], + '', + true, + true, + true, + ['_openFile', '_readFile', '_closeFile'] + ); + $abstractLoaderMock + ->method('_readFile') + ->willReturnOnConsecutiveCalls( + ['phrase1', 'translation1'], + ['phrase2', 'translation2', 'context_type2', 'context_value2'] + ); + + $phraseFirstMock = $this->createMock(Phrase::class); + $phraseSecondMock = $this->createMock(Phrase::class); + + $this->_factoryMock->expects($this->once()) + ->method('createDictionary') + ->willReturn($this->_dictionaryMock); + $this->_factoryMock + ->method('createPhrase') + ->withConsecutive( + [ + [ + 'phrase' => 'phrase1', + 'translation' => 'translation1', + 'context_type' => '', + 'context_value' => '' + ] + ], + [ + [ + 'phrase' => 'phrase2', + 'translation' => 'translation2', + 'context_type' => 'context_type2', + 'context_value' => 'context_value2' + ] + ] + ) + ->willReturnOnConsecutiveCalls($phraseFirstMock, $phraseSecondMock); + + $this->_dictionaryMock + ->method('addPhrase') + ->withConsecutive([$phraseFirstMock], [$phraseSecondMock]); + + /** @var AbstractFile $abstractLoaderMock */ + $this->assertEquals($this->_dictionaryMock, $abstractLoaderMock->load('test.csv')); + } + + /** + * @return void + */ + public function testErrorsInPhraseCreating(): void + { + $this->expectException('RuntimeException'); + $this->expectExceptionMessage('Invalid row #1: "exception_message".'); + $abstractLoaderMock = $this->getMockForAbstractClass( + AbstractFile::class, + [$this->_factoryMock], + '', + true, + true, + true, + ['_openFile', '_readFile'] + ); + $abstractLoaderMock + ->method('_readFile') + ->withConsecutive() + ->willReturn(['phrase1', 'translation1']); + + $this->_factoryMock->expects($this->once()) + ->method('createDictionary') + ->willReturn($this->_dictionaryMock); + $this->_factoryMock + ->method('createPhrase') + ->willThrowException(new \DomainException('exception_message')); + + /** @var AbstractFile $abstractLoaderMock */ + $this->assertEquals($this->_dictionaryMock, $abstractLoaderMock->load('test.csv')); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverFactoryTest.php new file mode 100644 index 0000000..e4625ae --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverFactoryTest.php @@ -0,0 +1,42 @@ +getObject(ResolverFactory::class); + $this->assertInstanceOf( + ResolverFactory::DEFAULT_RESOLVER, + $resolverFactory->create('some_dir', true) + ); + } + + public function testCreateException() + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('stdClass doesn\'t implement ResolverInterface'); + $objectManagerHelper = new ObjectManager($this); + /** @var ResolverFactory $resolverFactory */ + $resolverFactory = $objectManagerHelper->getObject( + ResolverFactory::class, + [ + 'resolverClass' => 'stdClass' + ] + ); + $resolverFactory->create('some_dir', true); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverTest.php new file mode 100644 index 0000000..254a250 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverTest.php @@ -0,0 +1,157 @@ +createMock(ComponentRegistrar::class); + $root = __DIR__ . '/_files/source'; + $componentRegistrar->expects($this->any()) + ->method('getPaths') + ->willReturnMap( + [ + [ComponentRegistrar::MODULE, [$root . '/app/code/module1', $root . '/app/code/module2']], + [ComponentRegistrar::THEME, [$root . '/app/design']], + ] + ); + $directoryList = $this->createMock(DirectoryList::class); + $directoryList->expects($this->any())->method('getRoot')->willReturn('root'); + /** @var Resolver $resolver */ + $resolver = $objectManagerHelper->getObject( + Resolver::class, + [ + 'directory' => $directory, + 'withContext' => $withContext, + 'componentRegistrar' => $componentRegistrar, + 'directoryList' => $directoryList + ] + ); + $this->assertSame($result, $resolver->getOptions()); + } + + /** + * @return array + */ + public function getOptionsDataProvider() + { + $sourceFirst = __DIR__ . '/_files/source'; + $sourceSecond = __DIR__ . '/_files/source'; + return [ + [ + $sourceFirst, + true, + [ + [ + 'type' => 'php', + 'paths' => [ + $sourceFirst . '/app/code/module1/', + $sourceFirst . '/app/code/module2/', + $sourceFirst . '/app/design/' + ], + 'fileMask' => '/\.(php|phtml)$/', + ], + [ + 'type' => 'html', + 'paths' => [ + $sourceFirst . '/app/code/module1/', + $sourceFirst . '/app/code/module2/', + $sourceFirst . '/app/design/' + ], + 'fileMask' => '/\.html$/', + ], + [ + 'type' => 'js', + 'paths' => [ + $sourceFirst . '/app/code/module1/', + $sourceFirst . '/app/code/module2/', + $sourceFirst . '/app/design/', + $sourceFirst . '/lib/web/mage/', + $sourceFirst . '/lib/web/varien/', + ], + 'fileMask' => '/\.(js|phtml)$/' + ], + [ + 'type' => 'xml', + 'paths' => [ + $sourceFirst . '/app/code/module1/', + $sourceFirst . '/app/code/module2/', + $sourceFirst . '/app/design/' + ], + 'fileMask' => '/\.xml$/' + ] + ], + ], + [ + $sourceSecond, + false, + [ + ['type' => 'php', 'paths' => [$sourceSecond], 'fileMask' => '/\.(php|phtml)$/'], + ['type' => 'html', 'paths' => [$sourceSecond], 'fileMask' => '/\.html/'], + ['type' => 'js', 'paths' => [$sourceSecond], 'fileMask' => '/\.(js|phtml)$/'], + ['type' => 'xml', 'paths' => [$sourceSecond], 'fileMask' => '/\.xml$/'] + ] + ], + ]; + } + + /** + * @param string $directory + * @param bool $withContext + * @param string $message + * @dataProvider getOptionsWrongDirDataProvider + */ + public function testGetOptionsWrongDir($directory, $withContext, $message) + { + $componentRegistrar = $this->createMock(ComponentRegistrar::class); + $root = __DIR__ . '/_files/source'; + $componentRegistrar->expects($this->any()) + ->method('getPaths') + ->willReturn([$root . '/app/code/module1', $root . '/app/code/module2']); + $directoryList = $this->createMock(DirectoryList::class); + $objectManagerHelper = new ObjectManager($this); + /** @var Resolver $resolver */ + $resolver = $objectManagerHelper->getObject( + Resolver::class, + [ + 'directory' => $directory, + 'withContext' => $withContext, + 'componentRegistrar' => $componentRegistrar, + 'directoryList' => $directoryList + ] + ); + $this->expectException('\InvalidArgumentException'); + $this->expectExceptionMessage($message); + $resolver->getOptions(); + } + + /** + * @return array + */ + public function getOptionsWrongDirDataProvider() + { + return [ + ['not_exist', true, 'Specified path is not a Magento root directory'], + ['not_exist', false, 'Specified path doesn\'t exist'], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/code/module1/.gitignore b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/code/module1/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/code/module1/.gitignore @@ -0,0 +1 @@ + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/code/module2/.gitignore b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/code/module2/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/code/module2/.gitignore @@ -0,0 +1 @@ + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/design/.gitignore b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/design/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/app/design/.gitignore @@ -0,0 +1 @@ + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/lib/web/mage/.gitignore b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/lib/web/mage/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/lib/web/mage/.gitignore @@ -0,0 +1 @@ + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/lib/web/varien/.gitignore b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/lib/web/varien/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/_files/source/lib/web/varien/.gitignore @@ -0,0 +1 @@ + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/PhraseTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/PhraseTest.php new file mode 100644 index 0000000..629cee5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/PhraseTest.php @@ -0,0 +1,164 @@ +assertEquals($result, $phrase->{$getter}()); + } + + /** + * @return array + */ + public function dataProviderPhraseCreation() + { + return [ + [['phrase', 'translation'], 'getPhrase', 'phrase'], + [['phrase', 'translation'], 'getTranslation', 'translation'], + [['phrase', 'translation', 'context_type'], 'getContextType', 'context_type'], + [ + ['phrase', 'translation', 'context_type', 'context_value'], + 'getContextValue', + ['context_value'] + ], + [ + ['phrase', 'translation', 'context_type', ['context_value1', 'context_value2']], + 'getContextValue', + ['context_value1', 'context_value2'] + ], + [ + ['phrase', 'translation', 'context_type', 'context_value1,context_value2'], + 'getContextValue', + ['context_value1', 'context_value2'] + ] + ]; + } + + /** + * @param array $constructArguments + * @param string $message + * @dataProvider dataProviderWrongParametersWhilePhraseCreation + */ + public function testWrongParametersWhilePhraseCreation($constructArguments, $message) + { + $this->expectException('DomainException'); + $this->expectExceptionMessage($message); + + new Phrase(...array_values($constructArguments)); + } + + /** + * @return array + */ + public function dataProviderWrongParametersWhilePhraseCreation() + { + return [ + [[null, 'translation'], 'Missed phrase'], + [['phrase', null], 'Missed translation'], + [['phrase', 'translation', null, new \stdClass()], 'Wrong context type'] + ]; + } + + /** + * @param string $value + * @param string $setter + * @param string $getter + * @dataProvider dataProviderAccessorMethods + */ + public function testAccessorMethods($value, $setter, $getter) + { + $phrase = new Phrase('phrase', 'translation'); + $phrase->{$setter}($value); + + $this->assertEquals($value, $phrase->{$getter}()); + } + + /** + * @return array + */ + public function dataProviderAccessorMethods() + { + return [ + ['value1', 'setPhrase', 'getPhrase'], + ['value1', 'setTranslation', 'getTranslation'], + ['value1', 'setContextType', 'getContextType'], + [['value1'], 'setContextValue', 'getContextValue'] + ]; + } + + public function testAddContextValue() + { + $phrase = new Phrase('phrase', 'translation', 'context_type', 'context_value1'); + $phrase->addContextValue('context_value2'); + $phrase->addContextValue('context_value3'); + + $this->assertEquals(['context_value1', 'context_value2', 'context_value3'], $phrase->getContextValue()); + } + + public function testContextValueDuplicationResolving() + { + $phrase = new Phrase('phrase', 'translation', 'context_type', 'context_value1'); + $phrase->addContextValue('context_value1'); + $phrase->addContextValue('context_value1'); + + $this->assertEquals(['context_value1'], $phrase->getContextValue()); + } + + public function testAddEmptyContextValue() + { + $this->expectException('DomainException'); + $this->expectExceptionMessage('Context value is empty'); + $phrase = new Phrase('phrase', 'translation', 'context_type', 'context_value1'); + $phrase->addContextValue(null); + } + + public function testContextValueReset() + { + $phrase = new Phrase('phrase', 'translation', 'context_type', 'context_value1'); + $phrase->addContextValue('context_value2'); + $phrase->setContextValue(null); + + $this->assertEquals([], $phrase->getContextValue()); + } + + public function testGetContextValueAsString() + { + $phrase = new Phrase('phrase', 'translation', 'context_type', 'context_value1'); + $phrase->addContextValue('context_value2'); + $phrase->addContextValue('context_value3'); + + $this->assertEquals('context_value1,context_value2,context_value3', $phrase->getContextValueAsString()); + } + + public function testGetContextValueAsStringWithCustomSeparator() + { + $phrase = new Phrase('phrase', 'translation', 'context_type', 'context_value1'); + $phrase->addContextValue('context_value2'); + $phrase->addContextValue('context_value3'); + + $this->assertEquals('context_value1::context_value2::context_value3', $phrase->getContextValueAsString('::')); + } + + public function testGetKey() + { + $phrase = new Phrase('phrase', 'translation', 'context_type', 'context_value1'); + $this->assertEquals('phrase::context_type', $phrase->getKey()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/Csv/StdoTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/Csv/StdoTest.php new file mode 100644 index 0000000..0ff6523 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/Csv/StdoTest.php @@ -0,0 +1,21 @@ +markTestSkipped('Skipped in #27500 due to testing protected/private methods and properties'); + $writer = new Stdo(); + $this->assertAttributeEquals(STDOUT, '_fileHandler', $writer); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/CsvTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/CsvTest.php new file mode 100644 index 0000000..7ff2faf --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/CsvTest.php @@ -0,0 +1,172 @@ +_testFile = str_replace('\\', '/', realpath(dirname(__FILE__))) . '/_files/test.csv'; + + $this->_phraseFirstMock = $this->createMock(Phrase::class); + $this->_phraseSecondMock = $this->createMock(Phrase::class); + } + + protected function tearDown(): void + { + if (file_exists($this->_testFile)) { + unlink($this->_testFile); + } + } + + public function testWrongOutputFile() + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Cannot open file for write dictionary: "wrong/path"'); + $objectManagerHelper = new ObjectManager($this); + $objectManagerHelper->getObject( + Csv::class, + ['outputFilename' => 'wrong/path'] + ); + } + + public function testWrite() + { + $this->_phraseFirstMock->expects( + $this->once() + )->method( + 'getCompiledPhrase' + )->willReturn( + "phrase1_quote'" + ); + $this->_phraseFirstMock->expects( + $this->once() + )->method( + 'getCompiledTranslation' + )->willReturn( + "translation1_quote'" + ); + $this->_phraseFirstMock->expects( + $this->once() + )->method( + 'getContextType' + )->willReturn( + "context_type1_quote\\'" + ); + $this->_phraseFirstMock->expects( + $this->once() + )->method( + 'getContextValueAsString' + )->willReturn( + "content_value1_quote\\'" + ); + + $this->_phraseSecondMock->expects( + $this->once() + )->method( + 'getCompiledPhrase' + )->willReturn( + "phrase2_quote'" + ); + $this->_phraseSecondMock->expects( + $this->once() + )->method( + 'getCompiledTranslation' + )->willReturn( + "translation2_quote'" + ); + $this->_phraseSecondMock->expects( + $this->once() + )->method( + 'getContextType' + )->willReturn( + "context_type2_quote\\'" + ); + $this->_phraseSecondMock->expects( + $this->once() + )->method( + 'getContextValueAsString' + )->willReturn( + "content_value2_quote\\'" + ); + + $objectManagerHelper = new ObjectManager($this); + /** @var Csv $writer */ + $writer = $objectManagerHelper->getObject( + Csv::class, + ['outputFilename' => $this->_testFile] + ); + $writer->write($this->_phraseFirstMock); + $writer->write($this->_phraseSecondMock); + + $expected = <<assertEquals($expected, file_get_contents($this->_testFile)); + } + + public function testWriteWithoutContext() + { + $this->_phraseFirstMock->expects($this->once()) + ->method('getCompiledPhrase') + ->willReturn('phrase1'); + $this->_phraseFirstMock->expects($this->once()) + ->method('getCompiledTranslation') + ->willReturn('translation1'); + $this->_phraseFirstMock->expects($this->once())->method('getContextType')->willReturn(''); + + $this->_phraseSecondMock->expects($this->once()) + ->method('getCompiledPhrase') + ->willReturn('phrase2'); + $this->_phraseSecondMock->expects($this->once()) + ->method('getCompiledTranslation') + ->willReturn('translation2'); + $this->_phraseSecondMock->expects($this->once()) + ->method('getContextType') + ->willReturn('context_type2'); + $this->_phraseSecondMock->expects($this->once()) + ->method('getContextValueAsString') + ->willReturn(''); + + $objectManagerHelper = new ObjectManager($this); + /** @var Csv $writer */ + $writer = $objectManagerHelper->getObject( + Csv::class, + ['outputFilename' => $this->_testFile] + ); + $writer->write($this->_phraseFirstMock); + $writer->write($this->_phraseSecondMock); + + $expected = "phrase1,translation1\nphrase2,translation2\n"; + $this->assertEquals($expected, file_get_contents($this->_testFile)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/_files/.gitignore b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/_files/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Writer/_files/.gitignore @@ -0,0 +1 @@ + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/DictionaryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/DictionaryTest.php new file mode 100644 index 0000000..1f8af87 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/DictionaryTest.php @@ -0,0 +1,54 @@ +_dictionary = $objectManagerHelper->getObject(Dictionary::class); + } + + public function testPhraseCollecting() + { + $phraseFirstMock = $this->createMock(Phrase::class); + $phraseSecondMock = $this->createMock(Phrase::class); + + $this->_dictionary->addPhrase($phraseFirstMock); + $this->_dictionary->addPhrase($phraseSecondMock); + + $this->assertEquals([$phraseFirstMock, $phraseSecondMock], $this->_dictionary->getPhrases()); + } + + public function testGetDuplicates() + { + $phraseFirstMock = $this->createMock(Phrase::class); + $phraseFirstMock->expects($this->once())->method('getKey')->willReturn('key_1'); + $phraseSecondMock = $this->createMock(Phrase::class); + $phraseSecondMock->expects($this->once())->method('getKey')->willReturn('key_1'); + $phraseThirdMock = $this->createMock(Phrase::class); + $phraseThirdMock->expects($this->once())->method('getKey')->willReturn('key_3'); + + $this->_dictionary->addPhrase($phraseFirstMock); + $this->_dictionary->addPhrase($phraseSecondMock); + $this->_dictionary->addPhrase($phraseThirdMock); + + $this->assertEquals([[$phraseFirstMock, $phraseSecondMock]], $this->_dictionary->getDuplicates()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/FactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/FactoryTest.php new file mode 100644 index 0000000..ac26a69 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/FactoryTest.php @@ -0,0 +1,66 @@ +factory = $objectManagerHelper->getObject(Factory::class); + } + + /** + * @param string $expectedInstance + * @param string $fileName + * @dataProvider createDictionaryWriterDataProvider + */ + public function testCreateDictionaryWriter($expectedInstance, $fileName) + { + $this->assertInstanceOf( + $expectedInstance, + $this->factory->createDictionaryWriter($fileName) + ); + } + + /** + * @return array + */ + public function createDictionaryWriterDataProvider() + { + return [ + [ + Csv::class, + TESTS_TEMP_DIR . '/filename.invalid_type', + ], + [ + Csv::class, + TESTS_TEMP_DIR . '/filename' + ], + [ + Csv::class, + TESTS_TEMP_DIR . '/filename.csv' + ], + [ + Stdo::class, + '' + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/FilesCollectorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/FilesCollectorTest.php new file mode 100644 index 0000000..57d3397 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/FilesCollectorTest.php @@ -0,0 +1,46 @@ +_testDir = str_replace('\\', '/', realpath(dirname(__FILE__))) . '/_files/files_collector/'; + + $objectManagerHelper = new ObjectManager($this); + $this->_filesCollector = $objectManagerHelper->getObject(FilesCollector::class); + } + + public function testGetFilesWithoutMask() + { + $expectedResult = [$this->_testDir . 'default.xml', $this->_testDir . 'file.js']; + $files = $this->_filesCollector->getFiles([$this->_testDir]); + $this->assertEquals($expectedResult, $files); + } + + public function testGetFilesWithMask() + { + $expectedResult = [$this->_testDir . 'file.js']; + $this->assertEquals($expectedResult, $this->_filesCollector->getFiles([$this->_testDir], '/\.js$/')); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/LocaleTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/LocaleTest.php new file mode 100644 index 0000000..2cf7aba --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/LocaleTest.php @@ -0,0 +1,28 @@ +expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Target locale must match the following format: "aa_AA".'); + new Locale('wrong_locale'); + } + + public function testToStringConvert() + { + $locale = new Locale('de_DE'); + + $this->assertEquals('de_DE', (string)$locale); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/GeneratorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/GeneratorTest.php new file mode 100644 index 0000000..2d0bb61 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/GeneratorTest.php @@ -0,0 +1,148 @@ +dictionaryLoaderMock = + $this->getMockForAbstractClass(FileInterface::class); + $this->packWriterMock = $this->getMockForAbstractClass(WriterInterface::class); + $this->factoryMock = $this->createMock(Factory::class); + $this->dictionaryMock = $this->createMock(Dictionary::class); + + $objectManagerHelper = new ObjectManager($this); + $this->_generator = $objectManagerHelper->getObject( + Generator::class, + [ + 'dictionaryLoader' => $this->dictionaryLoaderMock, + 'packWriter' => $this->packWriterMock, + 'factory' => $this->factoryMock + ] + ); + } + + public function testGenerate() + { + $dictionaryPath = 'dictionary_path'; + $localeString = 'locale'; + $mode = 'mode'; + $allowDuplicates = true; + $localeMock = $this->createMock(Locale::class); + + $phrases = [$this->createMock(Phrase::class)]; + $this->dictionaryMock->expects($this->once()) + ->method('getPhrases') + ->willReturn([$phrases]); + + $this->factoryMock->expects($this->once()) + ->method('createLocale') + ->with($localeString) + ->willReturn($localeMock); + $this->dictionaryLoaderMock->expects($this->once()) + ->method('load') + ->with($dictionaryPath) + ->willReturn($this->dictionaryMock); + $this->packWriterMock->expects($this->once()) + ->method('writeDictionary') + ->with($this->dictionaryMock, $localeMock, $mode); + + $this->_generator->generate($dictionaryPath, $localeString, $mode, $allowDuplicates); + } + + public function testGenerateEmptyFile() + { + $this->expectException('UnexpectedValueException'); + $this->expectExceptionMessage('No phrases have been found by the specified path.'); + $dictionaryPath = 'dictionary_path'; + $localeString = 'locale'; + $mode = 'mode'; + $allowDuplicates = true; + $localeMock = $this->createMock(Locale::class); + + $this->factoryMock->expects($this->once()) + ->method('createLocale') + ->with($localeString) + ->willReturn($localeMock); + $this->dictionaryLoaderMock->expects($this->once()) + ->method('load') + ->with($dictionaryPath) + ->willReturn($this->dictionaryMock); + $this->dictionaryMock->expects($this->once()) + ->method('getPhrases') + ->willReturn([]); + + $this->_generator->generate($dictionaryPath, $localeString, $mode, $allowDuplicates); + } + + public function testGenerateWithNotAllowedDuplicatesAndDuplicatesExist() + { + $error = "Duplicated translation is found, but it is not allowed.\n" + . "The phrase \"phrase1\" is translated in 1 places.\n" + . "The phrase \"phrase2\" is translated in 1 places.\n"; + $this->expectException('\RuntimeException'); + $this->expectExceptionMessage($error); + + $allowDuplicates = false; + + $phraseFirstMock = $this->createMock(Phrase::class); + $phraseFirstMock->expects($this->once())->method('getPhrase')->willReturn('phrase1'); + $phraseSecondMock = $this->createMock(Phrase::class); + $phraseSecondMock->expects($this->once())->method('getPhrase')->willReturn('phrase2'); + + $this->dictionaryLoaderMock->expects($this->any()) + ->method('load') + ->willReturn($this->dictionaryMock); + $phrases = [$this->createMock(Phrase::class)]; + $this->dictionaryMock->expects($this->once()) + ->method('getPhrases') + ->willReturn([$phrases]); + $this->dictionaryMock->expects($this->once()) + ->method('getDuplicates') + ->willReturn([[$phraseFirstMock], [$phraseSecondMock]]); + + $this->_generator->generate('dictionary_path', 'locale', 'mode', $allowDuplicates); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/Writer/File/CsvTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/Writer/File/CsvTest.php new file mode 100644 index 0000000..4dcba3e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/Writer/File/CsvTest.php @@ -0,0 +1,213 @@ +contextMock = $this->createMock(Context::class); + $this->localeMock = $this->createMock(Locale::class); + $this->dictionaryMock = $this->createMock(Dictionary::class); + $this->phraseMock = $this->createMock(Phrase::class); + $this->factoryMock = $this->createMock(Factory::class); + + $constructorArguments = $objectManagerHelper->getConstructArguments( + Csv::class, + [ + 'context' => $this->contextMock, + 'factory' => $this->factoryMock + ] + ); + $this->object = $objectManagerHelper->getObject(Csv::class, $constructorArguments); + } + + /** + * @param string $contextType + * @param array $contextValue + * @dataProvider writeDictionaryWithRuntimeExceptionDataProvider + * @return void + */ + public function testWriteDictionaryWithRuntimeException($contextType, $contextValue) + { + $this->expectException('RuntimeException'); + $this->configureGeneralPhrasesMock($contextType, $contextValue); + + $this->object->writeDictionary($this->dictionaryMock, $this->localeMock); + } + + /** + * @return array + */ + public function writeDictionaryWithRuntimeExceptionDataProvider() + { + return [ + ['', []], + ['module', []], + ['', ['Magento_Module']] + ]; + } + + /** + * @return void + */ + public function testWriteDictionaryWithInvalidArgumentException() + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Some error. Row #1.'); + $contextType = 'module'; + $contextValue = 'Magento_Module'; + + $this->configureGeneralPhrasesMock($contextType, [$contextValue]); + + $this->contextMock->expects($this->once()) + ->method('buildPathToLocaleDirectoryByContext') + ->with($contextType, $contextValue) + ->willThrowException(new \InvalidArgumentException('Some error.')); + + $this->object->writeDictionary($this->dictionaryMock, $this->localeMock); + } + + /** + * @return void + */ + public function testWriteDictionaryWherePathIsNull() + { + $contextType = 'module'; + $contextValue = 'Magento_Module'; + + $this->configureGeneralPhrasesMock($contextType, [$contextValue]); + + $this->contextMock->expects($this->once()) + ->method('buildPathToLocaleDirectoryByContext') + ->with($contextType, $contextValue) + ->willReturn(null); + + $this->phraseMock->expects($this->never()) + ->method('setContextType'); + $this->phraseMock->expects($this->never()) + ->method('setContextValue'); + + $this->object->writeDictionary($this->dictionaryMock, $this->localeMock); + } + + /** + * @return void + */ + public function testWriteDictionary() + { + $contextType = 'module'; + $contextValue = 'Magento_Module'; + $path = '/some/path/'; + $phrase = 'Phrase'; + $locale = 'en_EN'; + $file = $path . $locale . '.' . Csv::FILE_EXTENSION; + + $this->configureGeneralPhrasesMock($contextType, [$contextValue]); + + $this->phraseMock->expects($this->once()) + ->method('getPhrase') + ->willReturn($phrase); + $this->phraseMock->expects($this->once()) + ->method('setContextType') + ->with(null); + $this->phraseMock->expects($this->once()) + ->method('setContextValue') + ->with(null); + $this->localeMock->expects($this->once()) + ->method('__toString') + ->willReturn($locale); + + $this->contextMock->expects($this->once()) + ->method('buildPathToLocaleDirectoryByContext') + ->with($contextType, $contextValue) + ->willReturn($path); + + $writerMock = $this->getMockForAbstractClass(WriterInterface::class); + $writerMock->expects($this->once()) + ->method('write') + ->with($this->phraseMock); + $this->factoryMock->expects($this->once()) + ->method('createDictionaryWriter') + ->with($file) + ->willReturn($writerMock); + + $this->object->writeDictionary($this->dictionaryMock, $this->localeMock); + } + + /** + * @param string $contextType + * @param array $contextValue + * @return void + */ + private function configureGeneralPhrasesMock($contextType, $contextValue) + { + $this->phraseMock->expects($this->any()) + ->method('getContextType') + ->willReturn($contextType); + $this->phraseMock->expects($this->any()) + ->method('getContextValue') + ->willReturn($contextValue); + + $this->dictionaryMock->expects($this->once()) + ->method('getPhrases') + ->willReturn([$this->phraseMock]); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/Writer/File/_files/ioMock.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/Writer/File/_files/ioMock.php new file mode 100644 index 0000000..49cf1a7 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/Writer/File/_files/ioMock.php @@ -0,0 +1,41 @@ +_parserMock = $this->getMockForAbstractClass( + AbstractParser::class, + [], + '', + false + ); + } + + /** + * @param array $options + * @param string $message + * @dataProvider dataProviderForValidateOptions + */ + public function testValidateOptions($options, $message) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage($message); + + $this->_parserMock->addAdapter( + 'php', + $this->getMockForAbstractClass(AdapterInterface::class) + ); + $this->_parserMock->parse($options); + } + + /** + * @return array + */ + public function dataProviderForValidateOptions() + { + return [ + [[['paths' => []]], 'Missed "type" in parser options.'], + [[['type' => '', 'paths' => []]], 'Missed "type" in parser options.'], + [ + [['type' => 'wrong_type', 'paths' => []]], + 'Adapter is not set for type "wrong_type".' + ], + [[['type' => 'php']], '"paths" in parser options must be array.'], + [[['type' => 'php', 'paths' => '']], '"paths" in parser options must be array.'] + ]; + } + + public function getPhrases() + { + $this->assertIsArray($this->_parserMock->getPhrases()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/AbstractAdapterTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/AbstractAdapterTest.php new file mode 100644 index 0000000..c7a9abe --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/AbstractAdapterTest.php @@ -0,0 +1,76 @@ +_adapterMock = $this->getMockForAbstractClass( + AbstractAdapter::class, + [], + '', + false, + true, + true, + ['_parse'] + ); + $this->_adapterReflection = new \ReflectionMethod( + AbstractAdapter::class, + '_addPhrase' + ); + $this->_adapterReflection->setAccessible(true); + } + + public function testParse() + { + $this->_adapterMock->expects($this->once())->method('_parse'); + + $this->_adapterMock->parse('file1'); + } + + public function getPhrases() + { + $this->assertIsArray($this->_adapterMock->getPhrases()); + } + + public function testAddPhrase() + { + $phrase = 'test phrase'; + $line = 2; + $expected = [ + [ + 'phrase' => $phrase, + 'file' => null, + 'line' => $line, + 'quote' => '' + ] + ]; + $this->_adapterReflection->invoke($this->_adapterMock, $phrase, $line); + $actual = $this->_adapterMock->getPhrases(); + $this->assertEquals($expected, $actual); + + $this->_adapterReflection->invoke($this->_adapterMock, '', ''); + $actual = $this->_adapterMock->getPhrases(); + $this->assertEquals($expected, $actual); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/HtmlTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/HtmlTest.php new file mode 100644 index 0000000..0e58067 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/HtmlTest.php @@ -0,0 +1,151 @@ +testFile = str_replace('\\', '/', realpath(__DIR__)) . '/_files/email.html'; + $this->model = new Html(); + } + + public function testParse() + { + $expectedResult = [ + [ + 'phrase' => 'Phrase 1', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '\'', + ], + [ + 'phrase' => 'Phrase 2 with %a_lot of extra info for the brilliant %customer_name.', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '"', + ], + [ + 'phrase' => 'This is test data', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + // `I18N` is not parsed - bindings are case-sensitive + [ + 'phrase' => 'This is test data at right side of attr', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + 'phrase' => 'This is \\\' test \\\' data', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + 'phrase' => 'This is \\" test \\" data', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + 'phrase' => 'This is test data with a quote after', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + 'phrase' => 'This is test data with space after ', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + 'phrase' => '\\\'', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + 'phrase' => '\\\\\\\\ ', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + 'phrase' => 'This is test content in translate tag', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + // `` tag is not parsed - only lowercase tags are accepted + [ + 'phrase' => 'This is test content in translate attribute', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + // `TRANSLATE` attribute is not parsed - only lowercase attribute names are accepted + // `$T()` is not parsed - function names in JS are case-sensitive + [ + // en_US.csv: "This is ' test ' data for attribute translation with single quotes","This is ' test ' data for attribute translation with single quotes" + 'phrase' => 'This is \\\' test \\\' data for attribute translation with single quotes', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + // en_US.csv: "This is test data for attribute translation with a quote after''","This is test data for attribute translation with a quote after''" + 'phrase' => 'This is test data for attribute translation with a quote after\\\'\\\'', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + // en_US.csv: "This is test data for attribute translation with a quote after' ' ","This is test data for attribute translation with a quote after' ' " + 'phrase' => 'This is test data for attribute translation with a quote after\\\' \\\' ', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + // en_US.csv: "Attribute translation - Placeholder","Attribute translation - Placeholder" + 'phrase' => 'Attribute translation - Placeholder', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ], + [ + // en_US.csv: "Attribute translation - Title","Attribute translation - Title" + 'phrase' => 'Attribute translation - Title', + 'file' => $this->testFile, + 'line' => '', + 'quote' => '', + ] + ]; + + $this->model->parse($this->testFile); + + $this->assertEquals($expectedResult, $this->model->getPhrases()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/JsTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/JsTest.php new file mode 100644 index 0000000..0139f2a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/JsTest.php @@ -0,0 +1,79 @@ +_testFile = str_replace('\\', '/', realpath(dirname(__FILE__))) . '/_files/file.js'; + $this->_stringsCount = count(file($this->_testFile)); + + $this->_adapter = (new ObjectManager($this))->getObject(Js::class); + } + + public function testParse() + { + $expectedResult = [ + [ + 'phrase' => 'Phrase 1', + 'file' => $this->_testFile, + 'line' => $this->_stringsCount - 4, + 'quote' => Phrase::QUOTE_SINGLE, + ], + [ + 'phrase' => 'Phrase 2 %1', + 'file' => $this->_testFile, + 'line' => $this->_stringsCount - 3, + 'quote' => Phrase::QUOTE_DOUBLE + ], + [ + 'phrase' => 'Field ', + 'file' => $this->_testFile, + 'line' => $this->_stringsCount - 2, + 'quote' => Phrase::QUOTE_SINGLE + ], + [ + 'phrase' => ' is required.', + 'file' => $this->_testFile, + 'line' => $this->_stringsCount - 2, + 'quote' => Phrase::QUOTE_SINGLE + ], + [ + 'phrase' => 'Welcome, %1!', + 'file' => $this->_testFile, + 'line' => $this->_stringsCount - 1, + 'quote' => Phrase::QUOTE_SINGLE + ] + ]; + + $this->_adapter->parse($this->_testFile); + + $this->assertEquals($expectedResult, $this->_adapter->getPhrases()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollectorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollectorTest.php new file mode 100644 index 0000000..7ddcb8e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollectorTest.php @@ -0,0 +1,230 @@ +objectManager = new ObjectManager($this); + $this->tokenizerMock = $this->getMockBuilder(Tokenizer::class) + ->disableOriginalConstructor() + ->getMock(); + $this->phraseCollector = $this->objectManager->getObject( + PhraseCollector::class, + [ + 'tokenizer' => $this->tokenizerMock + ] + ); + } + + /** + * @covers \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\PhraseCollector::parse + * + * @param string $file + * @param array $isEndOfLoopReturnValues + * @param array $getNextRealTokenReturnValues + * @param array $getFunctionArgumentsTokensReturnValues + * @param array $isMatchingClassReturnValues + * @param array $result + * @dataProvider testParseDataProvider + */ + public function testParse( + $file, + array $isEndOfLoopReturnValues, + array $getNextRealTokenReturnValues, + array $getFunctionArgumentsTokensReturnValues, + array $isMatchingClassReturnValues, + array $result + ) { + $matchingClass = 'Phrase'; + + $this->tokenizerMock->expects($this->once()) + ->method('parse') + ->with($file); + $this->tokenizerMock->expects($this->atLeastOnce()) + ->method('isEndOfLoop') + ->will(call_user_func_array( + [$this, 'onConsecutiveCalls'], + $isEndOfLoopReturnValues + )); + $this->tokenizerMock->expects($this->any()) + ->method('getNextRealToken') + ->will(call_user_func_array( + [$this, 'onConsecutiveCalls'], + $getNextRealTokenReturnValues + )); + $this->tokenizerMock->expects($this->any()) + ->method('getFunctionArgumentsTokens') + ->will(call_user_func_array( + [$this, 'onConsecutiveCalls'], + $getFunctionArgumentsTokensReturnValues + )); + $this->tokenizerMock->expects($this->any()) + ->method('isMatchingClass') + ->with($matchingClass) + ->will(call_user_func_array( + [$this, 'onConsecutiveCalls'], + $isMatchingClassReturnValues + )); + + $this->phraseCollector->setIncludeObjects(); + $this->phraseCollector->parse($file); + $this->assertEquals($result, $this->phraseCollector->getPhrases()); + } + + /** + * @return array + */ + public function testParseDataProvider() + { + $file = 'path/to/file.php'; + $line = 110; + return [ + /* Test simulates parsing of the following code: + * + * $phrase1 = new \Magento\Framework\Phrase('Testing'); + * $phrase2 = __('More testing'); + */ + 'two phrases' => [ + 'file' => $file, + 'isEndOfLoopReturnValues' => [ + false, //before $phrase1 + false, //at $phrase1 + false, //at = + false, //at new + false, //at ; + false, //at $phrase2 + false, //at = + false, //at __ + false, //at ; + true //after ; + ], + 'getNextRealTokenReturnValues' => [ + $this->createToken(false, false, false, false, '$phrase1'), + $this->createToken(false, false, false, false, '='), + $this->createToken(false, false, true, false, 'new', $line), + $this->createToken(false, false, false, false, ';'), + $this->createToken(false, false, false, false, '$phrase2'), + $this->createToken(false, false, false, false, '='), + $this->createToken(true, false, false, false, '__', $line), + $this->createToken(false, true, false, false, '('), + $this->createToken(false, false, false, false, ';'), + false + ], + 'getFunctionArgumentsTokensReturnValues' => [ + [[$this->createToken(false, false, false, true, '\'Testing\'')]], // 'Testing') + [[$this->createToken(false, false, false, true, '\'More testing\'')]] // 'More testing') + ], + 'isMatchingClassReturnValues' => [ + true // \Magento\Framework\Phrase( + ], + 'result' => [ + [ + 'phrase' => '\'Testing\'', + 'arguments' => 0, + 'file' => $file, + 'line' => $line + ], + [ + 'phrase' => '\'More testing\'', + 'arguments' => 0, + 'file' => $file, + 'line' => $line + ] + ] + ] + ]; + } + + /** + * @param bool $isEqualFunctionReturnValue + * @param bool $isOpenBraceReturnValue + * @param bool $isNewReturnValue + * @param bool $isConstantEncapsedString + * @param string $value + * @param int|null $line + * @return Token|MockObject + */ + protected function createToken( + $isEqualFunctionReturnValue, + $isOpenBraceReturnValue, + $isNewReturnValue, + $isConstantEncapsedString, + $value, + $line = null + ) { + $token = $this->getMockBuilder(Token::class) + ->disableOriginalConstructor() + ->getMock(); + $token->expects($this->any()) + ->method('isEqualFunction') + ->with('__') + ->willReturn($isEqualFunctionReturnValue); + $token->expects($this->any()) + ->method('isOpenBrace') + ->willReturn($isOpenBraceReturnValue); + $token->expects($this->any()) + ->method('isNew') + ->willReturn($isNewReturnValue); + $token->expects($this->any()) + ->method('isConstantEncapsedString') + ->willReturn($isConstantEncapsedString); + $token->expects($this->any()) + ->method('getValue') + ->willReturn($value); + $token->expects($this->any()) + ->method('getLine') + ->willReturn($line); + return $token; + } + + public function testCollectPhrases() + { + $firstPart = "'first part'"; + $firstPartToken = new Token(\T_CONSTANT_ENCAPSED_STRING, $firstPart); + $concatenationToken = new Token('.', '.'); + $secondPart = "' second part'"; + $secondPartToken = new Token(\T_CONSTANT_ENCAPSED_STRING, $secondPart); + $phraseTokens = [$firstPartToken, $concatenationToken, $secondPartToken]; + $phraseString = "'first part' . ' second part'"; + + $reflectionMethod = new \ReflectionMethod( + PhraseCollector::class, + '_collectPhrase' + ); + + $reflectionMethod->setAccessible(true); + $this->assertSame($phraseString, $reflectionMethod->invoke($this->phraseCollector, $phraseTokens)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/TokenTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/TokenTest.php new file mode 100644 index 0000000..df96035 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/TokenTest.php @@ -0,0 +1,136 @@ +objectManager = new ObjectManager($this); + } + + /** + * @covers \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token::isNew + * + * @param int $name + * @param string $value + * @param bool $result + * @dataProvider testIsNewDataProvider + */ + public function testIsNew($name, $value, $result) + { + $token = $this->createToken($name, $value); + $this->assertEquals($result, $token->isNew()); + } + + /** + * @covers \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token::isNamespaceSeparator + * + * @param int $name + * @param string $value + * @param bool $result + * @dataProvider testIsNamespaceSeparatorDataProvider + */ + public function testIsNamespaceSeparator($name, $value, $result) + { + $token = $this->createToken($name, $value); + $this->assertEquals($result, $token->isNamespaceSeparator()); + } + + /** + * @covers \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token::isIdentifier + * + * @param int $name + * @param string $value + * @param bool $result + * @dataProvider testIsIdentifierDataProvider + */ + public function testIsIdentifier($name, $value, $result) + { + $token = $this->createToken($name, $value); + $this->assertEquals($result, $token->isIdentifier()); + } + + /** + * @return array + */ + public function testIsNewDataProvider() + { + return [ + 'new' => ['name' => T_NEW, 'value' => 'new', 'result' => true], + 'namespace' => ['name' => T_NS_SEPARATOR, 'value' => '\\', 'result' => false], + 'identifier' => ['name' => T_STRING, 'value' => '__', 'result' => false] + ]; + } + + /** + * @return array + */ + public function testIsNamespaceSeparatorDataProvider() + { + return [ + 'new' => ['name' => T_NEW, 'value' => 'new', 'result' => false], + 'namespace' => ['name' => T_NS_SEPARATOR, 'value' => '\\', 'result' => true], + 'identifier' => ['name' => T_STRING, 'value' => '__', 'result' => false] + ]; + } + + /** + * @return array + */ + public function testIsIdentifierDataProvider() + { + return [ + 'new' => ['name' => T_NEW, 'value' => 'new', 'result' => false], + 'namespace' => ['name' => T_NS_SEPARATOR, 'value' => '\\', 'result' => false], + 'identifier' => ['name' => T_STRING, 'value' => '__', 'result' => true] + ]; + } + + /** + * @param int $name + * @param string $value + * @return Token + */ + protected function createToken($name, $value) + { + $line = 110; + return $this->objectManager->getObject( + Token::class, + [ + 'name' => $name, + 'value' => $value, + 'line' => $line + ] + ); + } + + public function testIsConcatenateOperatorTrue() + { + $token = new Token('.', '.'); + $this->assertTrue($token->isConcatenateOperator()); + } + + public function testIsConcatenateOperatorFalse() + { + $token = new Token(',', ','); + $this->assertFalse($token->isConcatenateOperator()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/TokenizerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/TokenizerTest.php new file mode 100644 index 0000000..819fb79 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/TokenizerTest.php @@ -0,0 +1,119 @@ +objectManager = new ObjectManager($this); + $this->tokenizer = $this->objectManager->getObject( + Tokenizer::class + ); + } + + /** + * @covers \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer::isMatchingClass + */ + public function testIsMatchingClass() + { + $class = 'Phrase'; + $this->parseFile(); + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // new + $this->assertTrue($this->tokenizer->isMatchingClass($class)); // \Magento\Framework\Phrase( + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // 'Testing' + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // ) + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // ; + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // new + $this->assertTrue($this->tokenizer->isMatchingClass($class)); // Phrase( + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // 'More testing' + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // ) + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // ; + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // new + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // \Magento\Framework\DataObject( + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // ) + $this->assertFalse($this->tokenizer->isMatchingClass($class)); // ; + } + + /** + * Test getting next Real token for PHP > 8, where namespaced names are treated as single token. + * + * @requires PHP >= 8.0 + * @return void + */ + public function testGetNextRealTokenWhenNamespaceIsSingleToken(): void + { + $this->parseFile(); + $this->assertEquals('new', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('\\Magento\\Framework\\Phrase', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('(', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('\'Testing\'', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals(')', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals(';', $this->tokenizer->getNextRealToken()->getValue()); + } + + /** + * @covers \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer::getNextRealToken + * @requires PHP < 8.0 + */ + public function testGetNextRealToken() + { + $this->parseFile(); + $this->assertEquals('new', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('\\', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('Magento', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('\\', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('Framework', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('\\', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('Phrase', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('(', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals('\'Testing\'', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals(')', $this->tokenizer->getNextRealToken()->getValue()); + $this->assertEquals(';', $this->tokenizer->getNextRealToken()->getValue()); + } + + /** + * @covers \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer::isEndOfLoop + * @requires PHP < 8.0 + */ + public function testIsEndOfLoop() + { + $this->parseFile(); + //We have 27 total tokens in objectsCode.php file (excluding whitespaces) + //So the isEndOfLoop function should return true after we pick 28th non-existent token + for ($i = 0; $i < 28; $i++) { + $this->assertFalse($this->tokenizer->isEndOfLoop()); + $this->tokenizer->getNextRealToken(); + } + $this->assertTrue($this->tokenizer->isEndOfLoop()); + } + + protected function parseFile() + { + $file = __DIR__ . '/_files/objectsCode.php.txt'; + $this->tokenizer->parse($file); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/_files/objectsCode.php.txt b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/_files/objectsCode.php.txt new file mode 100644 index 0000000..cf0c4a5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/_files/objectsCode.php.txt @@ -0,0 +1,5 @@ +_phraseCollectorMock = + $this->createMock(PhraseCollector::class); + + $objectManagerHelper = new ObjectManager($this); + $this->_adapter = $objectManagerHelper->getObject( + Php::class, + ['phraseCollector' => $this->_phraseCollectorMock] + ); + } + + public function testParse() + { + $expectedResult = [['phrase' => 'phrase1', 'file' => 'file1', 'line' => 15, 'quote' => '']]; + + $this->_phraseCollectorMock->expects($this->once())->method('parse')->with('file1'); + $this->_phraseCollectorMock->expects( + $this->once() + )->method( + 'getPhrases' + )->willReturn( + [['phrase' => 'phrase1', 'file' => 'file1', 'line' => 15]] + ); + + $this->_adapter->parse('file1'); + $this->assertEquals($expectedResult, $this->_adapter->getPhrases()); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/XmlTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/XmlTest.php new file mode 100644 index 0000000..acc077c --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/XmlTest.php @@ -0,0 +1,73 @@ +_adapter = $objectManagerHelper->getObject(Xml::class); + } + + /** + * @dataProvider parseDataProvider + * @param string $file + * @param array $expectedResult + * @return void + */ + public function testParse(string $file, array $expectedResult) + { + $this->_adapter->parse($file); + + $this->assertEquals($expectedResult, $this->_adapter->getPhrases()); + } + + /** + * Provide files and parse results for testParse. + * + * @return array + */ + public function parseDataProvider() + { + $default = str_replace('\\', '/', realpath(dirname(__FILE__))) . '/_files/default.xml'; + $defaultDi = str_replace('\\', '/', realpath(dirname(__FILE__))) . '/_files/default_di.xml'; + + return [ + [ + 'file' => $default, + 'expectedResult' => [ + ['phrase' => 'Phrase 2', 'file' => $default, 'line' => '', 'quote' => ''], + ['phrase' => 'Phrase 3', 'file' => $default, 'line' => '', 'quote' => ''], + ['phrase' => 'Phrase 1', 'file' => $default, 'line' => '', 'quote' => ''], + ['phrase' => 'Comment from new line.', 'file' => $default, 'line' => '', 'quote' => ''], + ], + ], + [ + 'file' => $defaultDi, + 'expectedResult' => [ + ['phrase' => 'Phrase 1', 'file' => $defaultDi, 'line' => '', 'quote' => ''], + ], + ], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/default.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/default.xml new file mode 100644 index 0000000..510ff16 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/default.xml @@ -0,0 +1,23 @@ + + + + + + Phrase 1 + + Phrase 3 + + + Phrase 1 + + + + + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/default_di.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/default_di.xml new file mode 100644 index 0000000..d65b86a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/default_di.xml @@ -0,0 +1,13 @@ + + + + + + Phrase 1 + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/email.html b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/email.html new file mode 100644 index 0000000..36d7f91 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/email.html @@ -0,0 +1,43 @@ + + + + + + + + +

{{trans 'Phrase 1'}}

+ + {{trans + "Phrase 2 with %a_lot of extra info for the brilliant %customer_name." + + %a_lot="$order.foo" + %customer_name=$customer_name + }} + + + + + + + + + + + + + + + + + + + + + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/file.js b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/file.js new file mode 100644 index 0000000..85bcd52 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/_files/file.js @@ -0,0 +1,12 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +(function() { + $.mage.__('Phrase 1'); + $.mage.__('Phrase 1'); + $.mage.__("Phrase 2 %1"); + let message = $t('Field ') + field + $t(' is required.'); + let html = $t('Welcome, %1!').replace('%1', 'John Doe'); +}); diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/ParserTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/ParserTest.php new file mode 100644 index 0000000..603c7f6 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/ParserTest.php @@ -0,0 +1,219 @@ +filesCollector = $this->createMock(FilesCollector::class); + $this->factory = $this->createMock(Factory::class); + + $this->parser = new Parser\Parser($this->filesCollector, $this->factory); + } + + /** + * @param array $options + * @param array $phpFiles + * @param array $jsFiles + * @param array $phpMap + * @param array $jsMap + * @param array $phraseFactoryMap + * @param array $expectedResult + * @dataProvider addPhraseDataProvider + */ + public function testAddPhrase($options, $phpFiles, $jsFiles, $phpMap, $jsMap, $phraseFactoryMap, $expectedResult) + { + // 1. Create mocks + $phpAdapter = new AdapterStub(); + $jsAdapter = new AdapterStub(); + + // 2. Set mocks + $this->parser->addAdapter('php', $phpAdapter); + $this->parser->addAdapter('js', $jsAdapter); + + //3. Set fixtures + $phpAdapter->setValueMap($phpMap); + $jsAdapter->setValueMap($jsMap); + + $this->factory->expects($this->any()) + ->method('createPhrase') + ->with() + ->willReturnMap($phraseFactoryMap); + + //4. Set expectations + $this->filesCollector->expects($this->any()) + ->method('getFiles') + ->willReturnMap([ + [$options[0]['paths'], '', $phpFiles], + [$options[1]['paths'], '', $jsFiles], + ]); + + $result = $this->parser->parse($options); + $this->assertEquals($expectedResult, $result); + } + + /** + * @return array + */ + public function addPhraseDataProvider() + { + $phraseMock1 = $this->createMock(Phrase::class); + $phraseMock2 = $this->createMock(Phrase::class); + $phraseMock3 = $this->createMock(Phrase::class); + $phraseMock4 = $this->createMock(Phrase::class); + $phraseMock5 = $this->createMock(Phrase::class); + $phraseMock6 = $this->createMock(Phrase::class); + $phraseMock7 = $this->createMock(Phrase::class); + $phraseMock8 = $this->createMock(Phrase::class); + + $phraseMock1->expects($this->any())->method('getCompiledPhrase')->willReturn('php phrase111'); + $phraseMock2->expects($this->any())->method('getCompiledPhrase')->willReturn('php phrase112'); + $phraseMock3->expects($this->any())->method('getCompiledPhrase')->willReturn('php phrase121'); + $phraseMock4->expects($this->any())->method('getCompiledPhrase')->willReturn('php phrase122'); + $phraseMock5->expects($this->any())->method('getCompiledPhrase')->willReturn('js phrase111'); + $phraseMock6->expects($this->any())->method('getCompiledPhrase')->willReturn('js phrase112'); + $phraseMock7->expects($this->any())->method('getCompiledPhrase')->willReturn('js phrase121'); + $phraseMock8->expects($this->any())->method('getCompiledPhrase')->willReturn('js phrase122'); + + return [ + [ + 'options' => [ + ['type' => 'php', 'paths' => ['php/path/1', 'php/path/2']], + ['type' => 'js', 'paths' => ['js/path/1', 'js/path/2']], + ], + 'phpFiles' => ['php/path1/file11', 'php/path1/file12', 'php/path2/file21'], + 'jsFiles' => ['js/path1/file11', 'js/path1/file12', 'js/path2/file21'], + 'phpMap' => [ + 'php/path1/file11' => [ + [ + 'phrase' => 'php phrase111', + 'quote' => "'" + ], + [ 'phrase' => 'php phrase112', + 'quote' => '"' + ] + ], + 'php/path1/file12' => [ + [ + 'phrase' => 'php phrase121', + 'quote' => "'" + ], + [ 'phrase' => 'php phrase122', + 'quote' => '"' + ] + ], + 'php/path2/file21' => [] + ], + 'jsMap' => [ + 'js/path1/file11' => [ + [ + 'phrase' => 'js phrase111', + 'quote' => "'" + ], + [ 'phrase' => 'js phrase112', + 'quote' => '"' + ] + ], + 'js/path1/file12' => [ + [ + 'phrase' => 'js phrase121', + 'quote' => "'" + ], + [ 'phrase' => 'js phrase122', + 'quote' => '"' + ] + ], + 'js/path2/file21' => [] + ], + 'phraseFactoryMap' => [ + [['phrase' => 'php phrase111', 'translation' => 'php phrase111', 'quote' => "'"], $phraseMock1], + [['phrase' => 'php phrase112', 'translation' => 'php phrase112', 'quote' => '"'], $phraseMock2], + [['phrase' => 'php phrase121', 'translation' => 'php phrase121', 'quote' => "'"], $phraseMock3], + [['phrase' => 'php phrase122', 'translation' => 'php phrase122', 'quote' => '"'], $phraseMock4], + [['phrase' => 'js phrase111', 'translation' => 'js phrase111', 'quote' => "'"], $phraseMock5], + [['phrase' => 'js phrase112', 'translation' => 'js phrase112', 'quote' => '"'], $phraseMock6], + [['phrase' => 'js phrase121', 'translation' => 'js phrase121', 'quote' => "'"], $phraseMock7], + [['phrase' => 'js phrase122', 'translation' => 'js phrase122', 'quote' => '"'], $phraseMock8], + ], + 'expectedResult' => [ + 'php phrase111' => $phraseMock1, + 'php phrase112' => $phraseMock2, + 'php phrase121' => $phraseMock3, + 'php phrase122' => $phraseMock4, + 'js phrase111' => $phraseMock5, + 'js phrase112' => $phraseMock6, + 'js phrase121' => $phraseMock7, + 'js phrase122' => $phraseMock8, + ], + ] + ]; + } +} + +// @codingStandardsIgnoreStart +class AdapterStub implements AdapterInterface +{ + /** + * @var string + */ + private $file; + + /** + * @var array + */ + private $map = []; + + /** + * {@inheritdoc} + */ + public function parse($file) + { + $this->file = $file; + } + + /** + * {@inheritdoc} + */ + public function getPhrases() + { + return $this->map[$this->file]; + } + + /** + * @param array $map + */ + public function setValueMap($map) + { + $this->map = $map; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/_files/files_collector/default.xml b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/_files/files_collector/default.xml new file mode 100644 index 0000000..77edb38 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/_files/files_collector/default.xml @@ -0,0 +1,18 @@ + + + + + + Phrase 1 + + Phrase 3 + + + Phrase 1 + + diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/_files/files_collector/file.js b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/_files/files_collector/file.js new file mode 100644 index 0000000..88cfe5e --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/I18n/_files/files_collector/file.js @@ -0,0 +1,10 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +(function() { + $.mage.__('Phrase 1'); + $.mage.__('Phrase 1'); + $.mage.__('Phrase 2 %1'); +}); diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/ResourceFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/ResourceFactoryTest.php new file mode 100644 index 0000000..d0b4a00 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/ResourceFactoryTest.php @@ -0,0 +1,45 @@ +getMockBuilder(ServiceLocatorInterface::class) + ->onlyMethods(['get']) + ->getMockForAbstractClass(); + $connectionFactory = new ConnectionFactory($serviceLocatorMock); + $serviceLocatorMock + ->expects($this->once()) + ->method('get') + ->with(ConnectionFactory::class) + ->willReturn($connectionFactory); + $this->resourceFactory = new ResourceFactory($serviceLocatorMock); + } + + public function testCreate() + { + $resource = $this->resourceFactory->create( + $this->createMock(DeploymentConfig::class) + ); + $this->assertInstanceOf(ResourceConnection::class, $resource); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Setup/ResourceConfigTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Setup/ResourceConfigTest.php new file mode 100644 index 0000000..4731e4d --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Setup/ResourceConfigTest.php @@ -0,0 +1,38 @@ +assertEquals($connectionName, $resourceConfig->getConnectionName($resourceName)); + } + + /** + * @return array + */ + public function getConnectionNameDataProvider() + { + return [ + 'validResourceName' => ['validResourceName'], + 'invalidResourceName' => ['invalidResourceName'], + 'blankResourceName' => [''] + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/Setup/SetupCacheTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/Setup/SetupCacheTest.php new file mode 100644 index 0000000..37ec4bb --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/Setup/SetupCacheTest.php @@ -0,0 +1,107 @@ +object = new SetupCache(); + } + + public function testSetRow() + { + $table = 'table'; + $parentId = 'parent'; + $rowId = 'row'; + $data = new \stdClass(); + + $this->object->setRow($table, $parentId, $rowId, $data); + $this->assertSame($data, $this->object->get($table, $parentId, $rowId)); + } + + public function testSetField() + { + $table = 'table'; + $parentId = 'parent'; + $rowId = 'row'; + $field = 'field'; + $data = new \stdClass(); + + $this->object->setField($table, $parentId, $rowId, $field, $data); + $this->assertSame($data, $this->object->get($table, $parentId, $rowId, $field)); + } + + /** + * @dataProvider getNonexistentDataProvider + * @param string $field + */ + public function testGetNonexistent($field) + { + $this->assertFalse($this->object->get('table', 'parent', 'row', $field)); + } + + /** + * @return array + */ + public function getNonexistentDataProvider() + { + return [ + [null], + ['field'], + ]; + } + + public function testRemove() + { + $table = 'table'; + $parentId = 'parent'; + $rowId = 'row'; + $data = new \stdClass(); + + $this->object->setRow($table, $parentId, $rowId, $data); + $this->object->remove($table, $parentId, $rowId, $data); + $this->assertFalse($this->object->get($table, $parentId, $rowId)); + } + + /** + * @dataProvider hasDataProvider + * @param string $table + * @param string $parentId + * @param string $rowId + * @param string $field + * @param bool $expected + */ + public function testHas($table, $parentId, $rowId, $field, $expected) + { + $this->object->setField('table', 'parent', 'row', 'field', 'data'); + $this->assertSame($expected, $this->object->has($table, $parentId, $rowId, $field)); + } + + /** + * @return array + */ + public function hasDataProvider() + { + return [ + 'existing' => ['table', 'parent', 'row', 'field', true], + 'nonexistent field' => ['table', 'parent', 'row', 'other_field', false], + 'nonexistent row' => ['table', 'parent', 'other_row', 'field', false], + 'nonexistent parent' => ['table', 'other_parent', 'row', 'field', false], + 'nonexistent table' => ['other_table', 'parent', 'row', 'field', false], + ]; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/SetupFactoryTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/SetupFactoryTest.php new file mode 100644 index 0000000..b2f47b5 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/SetupFactoryTest.php @@ -0,0 +1,52 @@ +getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManager->expects($this->once()) + ->method('get') + ->with(ResourceConnection::class) + ->willReturn($this->createMock(ResourceConnection::class)); + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->expects($this->once())->method('get')->willReturn($objectManager); + $factory = new SetupFactory($objectManagerProvider); + $this->assertInstanceOf(Setup::class, $factory->create()); + } + + public function testCreateWithParam() + { + $objectManager = $this->getMockForAbstractClass( + ObjectManagerInterface::class, + [], + '', + false + ); + $objectManager->expects($this->never())->method('get'); + $resource = $this->createMock(ResourceConnection::class); + $objectManagerProvider = $this->createMock(ObjectManagerProvider::class); + $objectManagerProvider->expects($this->once())->method('get')->willReturn($objectManager); + $factory = new SetupFactory($objectManagerProvider); + $this->assertInstanceOf(Setup::class, $factory->create($resource)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Module/SetupTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Module/SetupTest.php new file mode 100644 index 0000000..70b8f03 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Module/SetupTest.php @@ -0,0 +1,89 @@ +resourceModelMock = $this->createMock(ResourceConnection::class); + $this->connection = $this->getMockForAbstractClass(AdapterInterface::class); + $this->resourceModelMock->expects($this->any()) + ->method('getConnection') + ->with(self::CONNECTION_NAME) + ->willReturn($this->connection); + $this->resourceModelMock->expects($this->any()) + ->method('getConnectionByName') + ->with(ResourceConnection::DEFAULT_CONNECTION) + ->willReturn($this->connection); + $this->setup = new Setup($this->resourceModelMock, self::CONNECTION_NAME); + } + + public function testGetIdxName() + { + $tableName = 'table'; + $fields = ['field']; + $indexType = 'index_type'; + $expectedIdxName = 'idxName'; + + $this->resourceModelMock->expects($this->once()) + ->method('getTableName') + ->with($tableName) + ->willReturn($tableName); + + $this->connection->expects($this->once()) + ->method('getIndexName') + ->with($tableName, $fields, $indexType) + ->willReturn($expectedIdxName); + + $this->assertEquals('idxName', $this->setup->getIdxName($tableName, $fields, $indexType)); + } + + public function testGetFkName() + { + $tableName = 'table'; + $refTable = 'ref_table'; + $columnName = 'columnName'; + $refColumnName = 'refColumnName'; + + $this->resourceModelMock->expects($this->once()) + ->method('getTableName') + ->with($tableName) + ->willReturn($tableName); + + $this->connection->expects($this->once()) + ->method('getForeignKeyName') + ->with($tableName, $columnName, $refTable, $refColumnName) + ->willReturn('fkName'); + + $this->assertEquals('fkName', $this->setup->getFkName($tableName, $columnName, $refTable, $refColumnName)); + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Mvc/Bootstrap/InitParamListenerTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Mvc/Bootstrap/InitParamListenerTest.php new file mode 100644 index 0000000..e8bf006 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Mvc/Bootstrap/InitParamListenerTest.php @@ -0,0 +1,272 @@ +listener = new InitParamListener(); + } + + public function testAttach() + { + $events = $this->prepareEventManager(); + $this->listener->attach($events); + } + + public function testDetach() + { + $events = $this->prepareEventManager(); + $this->listener->attach($events); + $events->expects($this->once())->method('detach')->with([$this->listener, 'onBootstrap'])->willReturn(true); + $this->listener->detach($events); + } + + public function testOnBootstrap() + { + /** @var MvcEvent|MockObject $mvcEvent */ + $mvcEvent = $this->createMock(MvcEvent::class); + $mvcApplication = $this->getMockBuilder(Application::class) + ->disableOriginalConstructor() + ->getMock(); + $mvcEvent->expects($this->once())->method('getApplication')->willReturn($mvcApplication); + $serviceManager = $this->createMock(ServiceManager::class); + $initParams[AppBootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS][DirectoryList::ROOT] = ['path' => '/test']; + $serviceManager->expects($this->once())->method('get') + ->willReturn($initParams); + $serviceManager->expects($this->exactly(2))->method('setService') + ->withConsecutive( + [ + DirectoryList::class, + $this->isInstanceOf(DirectoryList::class), + ], + [ + Filesystem::class, + $this->isInstanceOf(Filesystem::class), + ] + ); + $mvcApplication->expects($this->any())->method('getServiceManager')->willReturn($serviceManager); + + $eventManager = $this->getMockForAbstractClass(EventManagerInterface::class); + $mvcApplication->expects($this->any())->method('getEventManager')->willReturn($eventManager); + $eventManager->expects($this->any())->method('attach'); + + $this->listener->onBootstrap($mvcEvent); + } + + public function testCreateDirectoryList() + { + $initParams[AppBootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] = + [DirectoryList::ROOT => [DirectoryList::PATH => '/test/root']]; + + $directoryList = $this->listener->createDirectoryList($initParams); + $this->assertEquals('/test/root/app', $directoryList->getPath(DirectoryList::APP)); + } + + public function testCreateDirectoryListException() + { + $this->expectException('LogicException'); + $this->expectExceptionMessage('Magento root directory is not specified.'); + $this->listener->createDirectoryList([]); + } + + /** + * @param array $zfAppConfig Data that comes from Laminas Framework Application config + * @param array $env Config that comes from SetEnv + * @param array|string|null $argv Argv + * @param array $expectedArray Expected result array + * + * @dataProvider createServiceDataProvider + */ + public function testCreateService($zfAppConfig, $env, $argv, $expectedArray) + { + foreach ($env as $envKey => $envValue) { + $_SERVER[$envKey] = $envValue; + } + $listener = new InitParamListener(); + /** + * @var ServiceLocatorInterface|MockObject $serviceLocator + */ + $serviceLocator = $this->getMockForAbstractClass(ServiceLocatorInterface::class); + $mvcApplication = $this->getMockBuilder(Application::class) + ->disableOriginalConstructor() + ->getMock(); + + if ($argv !== null) { + $zfAppConfig['argv'] = $argv; + $expectedArray['argv'] = $argv; + } + + $mvcApplication->expects($this->any())->method('getConfig')->willReturn( + $zfAppConfig ? [InitParamListener::BOOTSTRAP_PARAM => $zfAppConfig] : [] + ); + + $serviceLocator->expects($this->once())->method('get')->with('Application') + ->willReturn($mvcApplication); + + $this->assertEquals($expectedArray, $listener->createService($serviceLocator)); + } + + /** + * @return array + */ + public function createServiceDataProvider() + { + return [ + 'none' => [ + [], //zfAppConfig + [], //env + null, //argv + [] //expectedArray + ], + 'mage_mode App' => [ + ['MAGE_MODE' => 'developer'], + [], + '', //test non array value + ['MAGE_MODE' => 'developer'] + ], + 'mage_mode Env' => [ + [], + ['MAGE_MODE' => 'developer'], + null, + ['MAGE_MODE' => 'developer'] + ], + 'mage_mode CLI' => [ + [], + [], + ['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer'], + ['MAGE_MODE' => 'developer'] + ], + 'one MAGE_DIRS CLI' => [ + [], + [], + ['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer&MAGE_DIRS[base][path]=/var/www/magento2'], + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2']], 'MAGE_MODE' => 'developer'], + ], + 'two MAGE_DIRS CLI' => [ + [], + [], + ['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer&MAGE_DIRS[base][path]=/var/www/magento2&MAGE_DIRS[cache][path]=/tmp/cache'], + [ + 'MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2'], 'cache' => ['path' => '/tmp/cache']], + 'MAGE_MODE' => 'developer', + ], + ], + 'mage_mode only' => [ + [], + [], + ['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer'], + ['MAGE_MODE' => 'developer'] + ], + 'MAGE_DIRS Env' => [ + [], + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2']], 'MAGE_MODE' => 'developer'], + null, + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2']], 'MAGE_MODE' => 'developer'], + ], + 'two MAGE_DIRS' => [ + [], + [], + ['bin/magento', 'setup:install', '--magento-init-params=MAGE_MODE=developer&MAGE_DIRS[base][path]=/var/www/magento2&MAGE_DIRS[cache][path]=/tmp/cache'], + [ + 'MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2'], 'cache' => ['path' => '/tmp/cache']], + 'MAGE_MODE' => 'developer', + ], + ], + 'Env overwrites App' => [ + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/App']], 'MAGE_MODE' => 'developer'], + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/Env']], 'MAGE_MODE' => 'developer'], + ['bin/magento', 'setup:install'], + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/Env']], 'MAGE_MODE' => 'developer'], + ], + 'CLI overwrites Env' => [ + ['MAGE_MODE' => 'developer'], + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/Env']]], + ['bin/magento', 'setup:install', '--magento-init-params=MAGE_DIRS[base][path]=/var/www/magento2/CLI'], + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/CLI']], 'MAGE_MODE' => 'developer'], + ], + 'CLI overwrites All' => [ + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/App']], 'MAGE_MODE' => 'production'], + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/Env']]], + ['bin/magento', 'setup:install', '--magento-init-params=MAGE_DIRS[base][path]=/var/www/magento2/CLI'], + ['MAGE_DIRS' => ['base' => ['path' => '/var/www/magento2/CLI']], 'MAGE_MODE' => 'developer'], + ], + ]; + } + + public function testCreateFilesystem() + { + $testPath = 'test/path/'; + + /** + * @var DirectoryList| + * \PHPUnit\Framework\MockObject\MockObject $directoryList + */ + $directoryList = $this->getMockBuilder(DirectoryList::class) + ->disableOriginalConstructor() + ->getMock(); + $directoryList->expects($this->any())->method('getPath')->willReturn($testPath); + $filesystem = $this->listener->createFilesystem($directoryList); + + // Verifies the filesystem was created with the directory list passed in + $this->assertEquals($testPath, $filesystem->getDirectoryRead('app')->getAbsolutePath()); + } + + /** + * Prepare the event manager with a SharedEventManager, it will expect attach() to be called once. + * + * @return MockObject + */ + private function prepareEventManager() + { + $this->callbacks[] = [$this->listener, 'onBootstrap']; + + /** @var EventManagerInterface|MockObject $events */ + $eventManager = $this->getMockForAbstractClass(EventManagerInterface::class); + + $sharedManager = $this->createMock(SharedEventManager::class); + $sharedManager->expects($this->once())->method('attach')->with( + Application::class, + MvcEvent::EVENT_BOOTSTRAP, + [$this->listener, 'onBootstrap'] + ); + + $sharedManager->expects($this->once())->method('getListeners')->willReturn($this->callbacks); + $eventManager->expects($this->once())->method('getSharedManager')->willReturn($sharedManager); + + return $eventManager; + } +} diff --git a/magento/setup/src/Magento/Setup/Test/Unit/Validator/DbValidatorTest.php b/magento/setup/src/Magento/Setup/Test/Unit/Validator/DbValidatorTest.php new file mode 100644 index 0000000..385624b --- /dev/null +++ b/magento/setup/src/Magento/Setup/Test/Unit/Validator/DbValidatorTest.php @@ -0,0 +1,182 @@ +connectionFactory = $this->createMock(ConnectionFactory::class); + $this->connection = $this->getMockForAbstractClass(AdapterInterface::class); + $this->connectionFactory->expects($this->any())->method('create')->willReturn($this->connection); + $this->dbValidator = new DbValidator($this->connectionFactory); + } + + public function testCheckDatabaseConnection() + { + $this->connection + ->expects($this->exactly(2)) + ->method('fetchOne') + ->with('SELECT version()') + ->willReturn('5.6.0-0ubuntu0.12.04.1'); + $pdo = $this->getMockForAbstractClass(\Zend_Db_Statement_Interface::class, [], '', false); + $this->connection + ->expects($this->atLeastOnce()) + ->method('query') + ->willReturn($pdo); + + $listOfPrivileges = [ + ['SELECT'], + ['INSERT'], + ['UPDATE'], + ['DELETE'], + ['CREATE'], + ['DROP'], + ['INDEX'], + ['ALTER'], + ['CREATE TEMPORARY TABLES'], + ['LOCK TABLES'], + ['EXECUTE'], + ['CREATE VIEW'], + ['SHOW VIEW'], + ['CREATE ROUTINE'], + ['ALTER ROUTINE'], + ['TRIGGER'], + ]; + $accessibleDbs = ['some_db', 'name', 'another_db']; + + $pdo->expects($this->atLeastOnce()) + ->method('fetchAll') + ->willReturnMap( + [ + [\PDO::FETCH_COLUMN, 0, $accessibleDbs], + [\PDO::FETCH_NUM, null, $listOfPrivileges] + ] + ); + $this->assertTrue($this->dbValidator->checkDatabaseConnection('name', 'host', 'user', 'password')); + $this->assertTrue($this->dbValidator->checkDatabaseConnection('name', 'host:3339', 'user', 'password')); + } + + public function testCheckDatabaseConnectionNotEnoughPrivileges() + { + $this->expectException('Magento\Setup\Exception'); + $this->expectExceptionMessage('Database user does not have enough privileges.'); + $this->connection + ->expects($this->once()) + ->method('fetchOne') + ->with('SELECT version()') + ->willReturn('5.6.0-0ubuntu0.12.04.1'); + $pdo = $this->getMockForAbstractClass(\Zend_Db_Statement_Interface::class, [], '', false); + $this->connection + ->expects($this->atLeastOnce()) + ->method('query') + ->willReturn($pdo); + $listOfPrivileges = [['SELECT']]; + $accessibleDbs = ['some_db', 'name', 'another_db']; + + $pdo->expects($this->atLeastOnce()) + ->method('fetchAll') + ->willReturnMap( + [ + [\PDO::FETCH_COLUMN, 0, $accessibleDbs], + [\PDO::FETCH_NUM, null, $listOfPrivileges] + ] + ); + $this->dbValidator->checkDatabaseConnection('name', 'host', 'user', 'password'); + } + + public function testCheckDatabaseConnectionDbNotAccessible() + { + $this->expectException('Magento\Setup\Exception'); + $this->expectExceptionMessage( + 'Database \'name\' does not exist or specified database server user does not have' + ); + $this->connection + ->expects($this->once()) + ->method('fetchOne') + ->with('SELECT version()') + ->willReturn('5.6.0-0ubuntu0.12.04.1'); + $pdo = $this->getMockForAbstractClass(\Zend_Db_Statement_Interface::class, [], '', false); + $this->connection + ->expects($this->atLeastOnce()) + ->method('query') + ->willReturn($pdo); + + $pdo->expects($this->atLeastOnce()) + ->method('fetchAll') + ->willThrowException( + new \Zend_Db_Statement_Exception("1044 - Access denied for user 'user'@'host' to database 'name'") + ); + + $this->dbValidator->checkDatabaseConnection('name', 'host', 'user', 'password'); + } + + public function testCheckDatabaseTablePrefix() + { + $this->assertTrue($this->dbValidator->checkDatabaseTablePrefix('test')); + } + + public function testCheckDatabaseTablePrefixWrongFormat() + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Please correct the table prefix format'); + $this->assertTrue($this->dbValidator->checkDatabaseTablePrefix('_wrong_format')); + } + + public function testCheckDatabaseTablePrefixWrongLength() + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage('Table prefix length can\'t be more than'); + $this->assertTrue( + $this->dbValidator->checkDatabaseTablePrefix('mvbXzXzItSIr0wrZW3gqgV2UKrWiK1Mj7bkBlW72rZW3gqgV2UKrWiK1M') + ); + } + + public function testCheckDatabaseConnectionFailed() + { + $this->expectException('Magento\Setup\Exception'); + $this->expectExceptionMessage('Database connection failure.'); + $connectionFactory = $this->createMock(ConnectionFactory::class); + $connectionFactory->expects($this->once())->method('create')->willReturn(false); + $this->dbValidator = new DbValidator($connectionFactory); + $this->dbValidator->checkDatabaseConnection('name', 'host', 'user', 'password'); + } + + public function testCheckDatabaseConnectionIncompatible() + { + $this->expectException('Magento\Setup\Exception'); + $this->expectExceptionMessage('Sorry, but we support MySQL version'); + $this->connection + ->expects($this->once()) + ->method('fetchOne') + ->with('SELECT version()') + ->willReturn('5.5.40-0ubuntu0.12.04.1'); + $this->dbValidator->checkDatabaseConnection('name', 'host', 'user', 'password'); + } +} diff --git a/magento/setup/src/Magento/Setup/Validator/DbValidator.php b/magento/setup/src/Magento/Setup/Validator/DbValidator.php new file mode 100644 index 0000000..f93c71a --- /dev/null +++ b/magento/setup/src/Magento/Setup/Validator/DbValidator.php @@ -0,0 +1,222 @@ +connectionFactory = $connectionFactory; + } + + /** + * Check if database table prefix is valid + * + * @param string $prefix + * @return bool + * @throws \InvalidArgumentException + */ + public function checkDatabaseTablePrefix($prefix) + { + //The table prefix should contain only letters (a-z), numbers (0-9) or underscores (_); + // the first character should be a letter. + if ($prefix !== '' && !preg_match('/^([a-zA-Z])([[:alnum:]_]+)$/', $prefix)) { + throw new \InvalidArgumentException( + 'Please correct the table prefix format, should contain only numbers, letters or underscores.' + .' The first character should be a letter.' + ); + } + + if (strlen($prefix) > self::DB_PREFIX_LENGTH) { + throw new \InvalidArgumentException( + 'Table prefix length can\'t be more than ' . self::DB_PREFIX_LENGTH . ' characters.' + ); + } + + return true; + } + + /** + * Checks Database Connection + * + * @param string $dbName + * @param string $dbHost + * @param string $dbUser + * @param string $dbPass + * @return bool + * @throws \Magento\Setup\Exception + * @deprecated + */ + public function checkDatabaseConnection($dbName, $dbHost, $dbUser, $dbPass = '') + { + return $this->checkDatabaseConnectionWithDriverOptions($dbName, $dbHost, $dbUser, $dbPass, []); + } + + /** + * Checks Database Connection with Driver Options + * + * @param string $dbName + * @param string $dbHost + * @param string $dbUser + * @param string $dbPass + * @param array $driverOptions + * @return bool + * @throws \Magento\Setup\Exception + */ + public function checkDatabaseConnectionWithDriverOptions( + $dbName, + $dbHost, + $dbUser, + $dbPass = '', + $driverOptions = [] + ) { + // establish connection to information_schema view to retrieve information about user and table privileges + $connection = $this->connectionFactory->create( + [ + ConfigOptionsListConstants::KEY_NAME => 'information_schema', + ConfigOptionsListConstants::KEY_HOST => $dbHost, + ConfigOptionsListConstants::KEY_USER => $dbUser, + ConfigOptionsListConstants::KEY_PASSWORD => $dbPass, + ConfigOptionsListConstants::KEY_ACTIVE => true, + ConfigOptionsListConstants::KEY_DRIVER_OPTIONS => $driverOptions, + ] + ); + + if (!$connection) { + throw new \Magento\Setup\Exception('Database connection failure.'); + } + + $mysqlVersion = $connection->fetchOne('SELECT version()'); + if ($mysqlVersion) { + if (preg_match('/^([0-9\.]+)/', $mysqlVersion, $matches)) { + if (isset($matches[1]) && !empty($matches[1])) { + if (version_compare($matches[1], Installer::MYSQL_VERSION_REQUIRED) < 0) { + throw new \Magento\Setup\Exception( + 'Sorry, but we support MySQL version ' . Installer::MYSQL_VERSION_REQUIRED . ' or later.' + ); + } + } + } + } + + return $this->checkDatabaseName($connection, $dbName) && $this->checkDatabasePrivileges($connection, $dbName); + } + + /** + * Checks if specified database exists and visible to current user + * + * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection + * @param string $dbName + * @return bool + * @throws \Magento\Setup\Exception + */ + private function checkDatabaseName(\Magento\Framework\DB\Adapter\AdapterInterface $connection, $dbName) + { + try { + $query = sprintf("SHOW TABLES FROM `%s`", $dbName); + $connection->query($query)->fetchAll(\PDO::FETCH_COLUMN, 0); + return true; + } catch (\Exception $e) { + throw new \Magento\Setup\Exception( + "Database '{$dbName}' does not exist " + . "or specified database server user does not have privileges to access this database." + ); + } + } + + /** + * Checks database privileges + * + * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection + * @param string $dbName + * @return bool + * @throws \Magento\Setup\Exception + */ + private function checkDatabasePrivileges(\Magento\Framework\DB\Adapter\AdapterInterface $connection, $dbName) + { + $requiredPrivileges = [ + 'SELECT', + 'INSERT', + 'UPDATE', + 'DELETE', + 'CREATE', + 'DROP', + 'INDEX', + 'ALTER', + 'CREATE TEMPORARY TABLES', + 'LOCK TABLES', + 'EXECUTE', + 'CREATE VIEW', + 'SHOW VIEW', + 'CREATE ROUTINE', + 'ALTER ROUTINE', + 'TRIGGER' + ]; + + // check global privileges + // phpcs:ignore Magento2.SQL.RawQuery + $userPrivilegesQuery = "SELECT PRIVILEGE_TYPE FROM USER_PRIVILEGES " + . "WHERE REPLACE(GRANTEE, '\'', '') = current_user()"; + $grantInfo = $connection->query($userPrivilegesQuery)->fetchAll(\PDO::FETCH_NUM); + if (empty(array_diff($requiredPrivileges, $this->parseGrantInfo($grantInfo)))) { + return true; + } + + // check database privileges + // phpcs:ignore Magento2.SQL.RawQuery + $schemaPrivilegesQuery = "SELECT PRIVILEGE_TYPE FROM SCHEMA_PRIVILEGES " . + "WHERE '$dbName' LIKE TABLE_SCHEMA AND REPLACE(GRANTEE, '\'', '') = current_user()"; + $grantInfo = $connection->query($schemaPrivilegesQuery)->fetchAll(\PDO::FETCH_NUM); + if (empty(array_diff($requiredPrivileges, $this->parseGrantInfo($grantInfo)))) { + return true; + } + + $errorMessage = 'Database user does not have enough privileges. Please make sure ' + . implode(', ', $requiredPrivileges) . " privileges are granted to database '{$dbName}'."; + throw new \Magento\Setup\Exception($errorMessage); + } + + /** + * Parses query result + * + * @param array $grantInfo + * @return array + */ + private function parseGrantInfo(array $grantInfo) + { + $result = []; + foreach ($grantInfo as $grantRow) { + $result[] = $grantRow[0]; + } + return $result; + } +} diff --git a/magento/setup/src/Magento/Setup/Validator/ElasticsearchConnectionValidator.php b/magento/setup/src/Magento/Setup/Validator/ElasticsearchConnectionValidator.php new file mode 100644 index 0000000..7ec3251 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Validator/ElasticsearchConnectionValidator.php @@ -0,0 +1,67 @@ +buildConfig($options); + + $elasticsearchClient = \Elasticsearch\ClientBuilder::fromConfig($config, true); + $elasticsearchClient->ping(); + + return true; + } + + /** + * Construct elasticsearch connection string + * + * @param array $options + * @return array + * @throws SetupException + */ + private function buildConfig(array $options) + { + $hostname = preg_replace('/http[s]?:\/\//i', '', $options['hostname']); + // @codingStandardsIgnoreStart + $protocol = parse_url($options['hostname'], PHP_URL_SCHEME); + // @codingStandardsIgnoreEnd + if (!$protocol) { + $protocol = 'http'; + } + + $authString = ''; + if (isset($options['enableAuth']) && true === $options['enableAuth']) { + if (empty($options['username']) || empty($options['password'])) { + throw new SetupException( + 'Search engine misconfiguration. Username and password must be set if authentication is enabled' + ); + } + $authString = "{$options['username']}:{$options['password']}@"; + } + $portString = empty($options['port']) ? '' : ':' . $options['port']; + $host = $protocol . '://' . $authString . $hostname . $portString; + $options['hosts'] = [$host]; + + return $options; + } +} diff --git a/magento/setup/src/Magento/Setup/Validator/RedisConnectionValidator.php b/magento/setup/src/Magento/Setup/Validator/RedisConnectionValidator.php new file mode 100644 index 0000000..58696b9 --- /dev/null +++ b/magento/setup/src/Magento/Setup/Validator/RedisConnectionValidator.php @@ -0,0 +1,50 @@ + '', + 'port' => '', + 'db' => '', + 'password' => null, + 'timeout' => null, + 'persistent' => '' + ]; + + $config = array_merge($default, $redisOptions); + + try { + $redisClient = new \Credis_Client( + $config['host'], + $config['port'], + $config['timeout'], + $config['persistent'], + $config['db'], + $config['password'] + ); + $redisClient->setMaxConnectRetries(1); + $redisClient->connect(); + } catch (\CredisException $e) { + return false; + } + + return true; + } +} diff --git a/magento/setup/src/Magento/Setup/registration.php b/magento/setup/src/Magento/Setup/registration.php new file mode 100644 index 0000000..bff16d9 --- /dev/null +++ b/magento/setup/src/Magento/Setup/registration.php @@ -0,0 +1,9 @@ + + order allow,deny + deny from all + += 2.4> + Require all denied + + diff --git a/magento/setup/view/magento/setup/index.phtml b/magento/setup/view/magento/setup/index.phtml new file mode 100644 index 0000000..9c8b147 --- /dev/null +++ b/magento/setup/view/magento/setup/index.phtml @@ -0,0 +1,71 @@ + + + + + + + + Magento + + + + + + + + + +
+
+
+ +

Version

+

+ Welcome to Magento Admin, your online store headquarters. +
+ Please review Terms & Agreement + and read Getting Started + to learn how to install Magento using the command line. +

+
+ +
+
+ + diff --git a/magento/setup/view/styles/lib/variables/_buttons.less b/magento/setup/view/styles/lib/variables/_buttons.less new file mode 100644 index 0000000..847d94f --- /dev/null +++ b/magento/setup/view/styles/lib/variables/_buttons.less @@ -0,0 +1,15 @@ +// /** +// * Copyright © Magento, Inc. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Buttons +// --------------------------------------------- + +// Sizes + +@btn__base__font-size: 1.6rem; +@btn__base__padding-top: .45em; +@btn__base__padding-bottom: @btn__base__padding-top; +@btn__height__base: @btn__base__font-size * @base__line-height + @btn__base__font-size * @btn__base__padding-top + @btn__base__font-size * @btn__base__padding-bottom; diff --git a/magento/setup/view/styles/lib/variables/_colors.less b/magento/setup/view/styles/lib/variables/_colors.less new file mode 100644 index 0000000..a72dc69 --- /dev/null +++ b/magento/setup/view/styles/lib/variables/_colors.less @@ -0,0 +1,42 @@ +// /** +// * Copyright © Magento, Inc. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Colors +// --------------------------------------------- + +@color-brownie: #514943; +@color-brownie-light: #676056; +@color-gray65: #a6a6a6; +@color-gray68: #adadad; +@color-gray75: #bfbfbf; +@color-gray80: #ccc; +@color-gray82: #d1d1d1; +@color-gray83: #d4d4d4; +@color-gray84: #d6d6d6; +@color-gray85: #d9d9d9; +@color-gray98: #fafafa; +@color-lazy-sun: #fffbbb; +@color-blue-dodger: #008bdb; +@color-blue-pure: #007bdb; +@color-green-apple: #79a22e; +@color-green-islamic: #090; +@color-dark-brownie: #41362f; +@color-brown-darker: #41362f; +@color-phoenix-down: #e04f00; +@color-phoenix: #eb5202; +@color-phoenix-almost-rise: #ef672f; +@color-phoenix-rise: #f65405; +@color-tomato-brick: #e22626; +@color-strawberry-milkshake: #ee7d7d; +@color-cyan-light: #e0f6fe; +@color-pink: #fcc; + +// Nesting colors +@color-prime: @color-phoenix; +@color-tertiary: @color-brownie; +@color-success: @color-green-apple; +@color-warning: @color-phoenix-almost-rise; +@color-failed: @color-tomato-brick; diff --git a/magento/setup/view/styles/lib/variables/_typography.less b/magento/setup/view/styles/lib/variables/_typography.less new file mode 100644 index 0000000..fa9ccd9 --- /dev/null +++ b/magento/setup/view/styles/lib/variables/_typography.less @@ -0,0 +1,8 @@ +// /** +// * Copyright © Magento, Inc. All rights reserved. +// * See COPYING.txt for license details. +// */ + +@base__color: @color-gray19; +@base__font-size: 1.4rem; +@base__line-height: 1.4;