From 5923b42727c28b846a004b6092d815d29e54bf80 Mon Sep 17 00:00:00 2001 From: v-kaywon Date: Thu, 30 Nov 2017 17:34:20 -0800 Subject: [PATCH] fix double reclaring KSP function; fixed tests with emulate prepare or direct query --- .../pdo_sqlsrv/MsCommon_mid-refactor.inc | 9 +- .../pdo_sqlsrv/pdo_040_error_information.phpt | 8 +- ...do_092_emulate_prepare_statement_utf8.phpt | 6 +- .../pdo_138_unicode_column_name.phpt | 20 ++-- .../pdo_140_emulate_prepare_mix_binary.phpt | 101 +++++++++--------- .../pdo_ae_unsupported_stmt_attr.phpt | 6 +- .../pdo_prepare_emulatePrepare_binary.phpt | 6 +- .../pdo_prepare_emulatePrepare_char.phpt | 2 +- .../pdo_prepare_emulatePrepare_datetime.phpt | 2 +- .../pdo_prepare_emulatePrepare_decimal.phpt | 4 +- .../pdo_prepare_emulatePrepare_float.phpt | 4 +- .../pdo_prepare_emulatePrepare_int.phpt | 4 +- .../pdo_prepare_emulatePrepare_money.phpt | 4 +- .../pdo_prepare_emulatePrepare_unicode.phpt | 2 +- 14 files changed, 93 insertions(+), 85 deletions(-) diff --git a/test/functional/pdo_sqlsrv/MsCommon_mid-refactor.inc b/test/functional/pdo_sqlsrv/MsCommon_mid-refactor.inc index ca99ae8b..7a6d5d1a 100644 --- a/test/functional/pdo_sqlsrv/MsCommon_mid-refactor.inc +++ b/test/functional/pdo_sqlsrv/MsCommon_mid-refactor.inc @@ -81,7 +81,7 @@ function getDSN($sqlsrvserver, $database, $keywords = '', $disableCE = false) $dsn .= "ColumnEncryption=Enabled;"; } if ($keystore == "ksp" && !$disableCE) { - require('AE_Ksp.inc'); + require_once('AE_Ksp.inc'); $ksp_path = getKSPPath(); $dsn .= "CEKeystoreProvider=$ksp_path;CEKeystoreName=$ksp_name;CEKeystoreEncryptKey=$encrypt_key;"; } @@ -523,6 +523,13 @@ function isColEncrypted() } } + +function isAEConnected() +{ + require('MsSetup.inc'); + return $keystore != "none"; +} + function teardown() { // TBD diff --git a/test/functional/pdo_sqlsrv/pdo_040_error_information.phpt b/test/functional/pdo_sqlsrv/pdo_040_error_information.phpt index 93036cbb..93b6e2fd 100644 --- a/test/functional/pdo_sqlsrv/pdo_040_error_information.phpt +++ b/test/functional/pdo_sqlsrv/pdo_040_error_information.phpt @@ -8,11 +8,11 @@ require_once("MsCommon_mid-refactor.inc"); try { // Connect - $conn = connect(); + $conn = connect(); // Create table $tableName = 'pdo_040test'; - // common function insertRow() is not used here since the test deliberately + // common function insertRow() is not used here since the test deliberately // executes an invalid insertion statement // thus it's not necessary to create an encrypted column for testing column encryption $sql = "CREATE TABLE $tableName (code INT)"; @@ -31,7 +31,7 @@ try { } catch (PDOException $e) { $error = $e->errorInfo; $success = false; - if (!isColEncrypted()) { + if (!isAEConnected()) { // 21S01 is the expected ODBC Column name or number of supplied values does not match table definition error if ($error[0] === "21S01") { $success = true; @@ -41,7 +41,7 @@ try { if ($error[0] === "07009") { $success = true; } - } + } if ($success) { print "Done"; } else { diff --git a/test/functional/pdo_sqlsrv/pdo_092_emulate_prepare_statement_utf8.phpt b/test/functional/pdo_sqlsrv/pdo_092_emulate_prepare_statement_utf8.phpt index 24ab4c15..2c63654c 100644 --- a/test/functional/pdo_sqlsrv/pdo_092_emulate_prepare_statement_utf8.phpt +++ b/test/functional/pdo_sqlsrv/pdo_092_emulate_prepare_statement_utf8.phpt @@ -15,7 +15,7 @@ try { // Always Encrypted does not support using DIRECT_QUERY for binding parameters // see https://github.com/Microsoft/msphpsql/wiki/Features#aebindparam $pdo_options = []; - if (!isColEncrypted()) { + if (!isAEConnected()) { $pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = true; } $pdo_options[PDO::ATTR_CURSOR] = PDO::CURSOR_SCROLL; @@ -35,13 +35,13 @@ try { $st->execute(['p0' => $name]); // Always Encrypted does not support emulate prepare - if (!isColEncrypted()) { + if (!isAEConnected()) { $pdo_options[PDO::ATTR_EMULATE_PREPARES] = true; } $st = $connection->prepare("INSERT INTO $tbname (name) VALUES (:p0)", $pdo_options); $st->execute(['p0' => $name2]); - if (!isColEncrypted()) { + if (!isAEConnected()) { $statement1 = $connection->prepare("SELECT * FROM $tbname WHERE NAME LIKE :p0", $pdo_options); $statement1->execute(['p0' => "$prefix%"]); $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false; diff --git a/test/functional/pdo_sqlsrv/pdo_138_unicode_column_name.phpt b/test/functional/pdo_sqlsrv/pdo_138_unicode_column_name.phpt index bb4ddd92..3f30a605 100644 --- a/test/functional/pdo_sqlsrv/pdo_138_unicode_column_name.phpt +++ b/test/functional/pdo_sqlsrv/pdo_138_unicode_column_name.phpt @@ -11,13 +11,13 @@ Github 138. Test for Unicode Column Metadata. * @param mixed $query * @return PDOStatement */ -function prepare($connection, $query) { +function prepare($connection, $query) +{ $pdo_options = array(); // emulate and binding parameter with direct query are not support in Always Encrypted - if ( !isColEncrypted() ) - { - $pdo_options[PDO::ATTR_EMULATE_PREPARES] = TRUE; - $pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = TRUE; + if (!isAEConnected()) { + $pdo_options[PDO::ATTR_EMULATE_PREPARES] = true; + $pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = true; } $pdo_options[PDO::ATTR_CURSOR] = PDO::CURSOR_SCROLL; $pdo_options[PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE] = PDO::SQLSRV_CURSOR_BUFFERED; @@ -35,7 +35,7 @@ try { // Create Table $tbname = "mytáble"; - createTable( $connection, $tbname, array( new ColumnMeta( "nchar(10)", "id" ), new ColumnMeta( "nchar(10)", "väriable" ), new ColumnMeta( "nchar(10)", "tésting" ))); + createTable($connection, $tbname, array( new ColumnMeta("nchar(10)", "id"), new ColumnMeta("nchar(10)", "väriable"), new ColumnMeta("nchar(10)", "tésting"))); $query = "INSERT INTO $tbname (id, tésting, väriable) VALUES (:db_insert0, :db_insert1, :db_insert2)"; @@ -55,9 +55,9 @@ try { while ($row = $st->fetchAll()) { $row = reset($row); - echo (isset($row['id']) ? "OK" : "FAIL") , "\n"; - echo (isset($row['tésting']) ? "OK" : "FAIL") , "\n"; - echo (isset($row['väriable']) ? "OK" : "FAIL") , "\n"; + echo(isset($row['id']) ? "OK" : "FAIL") , "\n"; + echo(isset($row['tésting']) ? "OK" : "FAIL") , "\n"; + echo(isset($row['väriable']) ? "OK" : "FAIL") , "\n"; } for ($i = 0; $i < $st->columnCount(); $i++) { @@ -79,4 +79,4 @@ OK OK id väriable -tésting \ No newline at end of file +tésting diff --git a/test/functional/pdo_sqlsrv/pdo_140_emulate_prepare_mix_binary.phpt b/test/functional/pdo_sqlsrv/pdo_140_emulate_prepare_mix_binary.phpt index a7420878..12b9d72f 100644 --- a/test/functional/pdo_sqlsrv/pdo_140_emulate_prepare_mix_binary.phpt +++ b/test/functional/pdo_sqlsrv/pdo_140_emulate_prepare_mix_binary.phpt @@ -4,22 +4,23 @@ Test emulate prepare with mix bound param encodings including binary data --FILE-- &$field_value) { - $placeholder = $placeholder_prefix . $max_placeholder++; - if (isset($columnInformation['blobs'][$field_name])) { - $this->bindParam($placeholder, $field_value, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY); - } - else { - // Even though not a blob, make sure we retain a copy of these values. - $this->bindParam($placeholder, $field_value, PDO::PARAM_STR); - } +class MyStatement extends PDOStatement +{ + public function BindValues(array &$values, $placeholder_prefix, $columnInformation) + { + $max_placeholder = 0; + foreach ($values as $field_name => &$field_value) { + $placeholder = $placeholder_prefix . $max_placeholder++; + if (isset($columnInformation['blobs'][$field_name])) { + $this->bindParam($placeholder, $field_value, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY); + } else { + // Even though not a blob, make sure we retain a copy of these values. + $this->bindParam($placeholder, $field_value, PDO::PARAM_STR); + } + } } - } } - + //******************************************************* // TEST BEGIN //******************************************************* @@ -34,37 +35,37 @@ try { dropTable($cnn, $tbname); $pdo_options = array(); - if (!isColEncrypted()) { - $pdo_options[PDO::ATTR_EMULATE_PREPARES] = TRUE; - $pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = TRUE; - - $cm_arr = array(new ColumnMeta("int", "wid", "IDENTITY(1,1) NOT NULL"), - new ColumnMeta("int", "uid", "NOT NULL CONSTRAINT [watchdog_uid_df] DEFAULT ((0))"), - new ColumnMeta("nvarchar(64)", "type", "NOT NULL CONSTRAINT [watchdog_type_df] DEFAULT ('')"), - new ColumnMeta("nvarchar(max)", "message", "NOT NULL"), - new ColumnMeta("varbinary(max)", "variables", "NOT NULL"), - new ColumnMeta("smallint", "severity", "NOT NULL CONSTRAINT [watchdog_severity_df] DEFAULT ((0))"), - new ColumnMeta("nvarchar(255)", "link", "NULL CONSTRAINT [watchdog_link_df] DEFAULT ('')"), - new ColumnMeta("nvarchar(max)", "location", "NOT NULL"), - new ColumnMeta("nvarchar(max)", "referer", "NULL"), - new ColumnMeta("nvarchar(128)", "hostname", "NOT NULL CONSTRAINT [watchdog_hostname_df] DEFAULT ('')"), + if (!isAEConnected()) { + $pdo_options[PDO::ATTR_EMULATE_PREPARES] = true; + $pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = true; + + $cm_arr = array(new ColumnMeta("int", "wid", "IDENTITY(1,1) NOT NULL"), + new ColumnMeta("int", "uid", "NOT NULL CONSTRAINT [watchdog_uid_df] DEFAULT ((0))"), + new ColumnMeta("nvarchar(64)", "type", "NOT NULL CONSTRAINT [watchdog_type_df] DEFAULT ('')"), + new ColumnMeta("nvarchar(max)", "message", "NOT NULL"), + new ColumnMeta("varbinary(max)", "variables", "NOT NULL"), + new ColumnMeta("smallint", "severity", "NOT NULL CONSTRAINT [watchdog_severity_df] DEFAULT ((0))"), + new ColumnMeta("nvarchar(255)", "link", "NULL CONSTRAINT [watchdog_link_df] DEFAULT ('')"), + new ColumnMeta("nvarchar(max)", "location", "NOT NULL"), + new ColumnMeta("nvarchar(max)", "referer", "NULL"), + new ColumnMeta("nvarchar(128)", "hostname", "NOT NULL CONSTRAINT [watchdog_hostname_df] DEFAULT ('')"), new ColumnMeta("int", "timestamp", "NOT NULL CONSTRAINT [watchdog_timestamp_df] DEFAULT ((0))")); } else { // Emulate prepare and using direct query for binding parameters are not supported in Always encrypted - $pdo_options[PDO::ATTR_EMULATE_PREPARES] = FALSE; - $pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = FALSE; - + $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false; + $pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = false; + // Default constraints are unsupported on encrypted columns - $cm_arr = array(new ColumnMeta("int", "wid", "IDENTITY(1,1) NOT NULL"), - new ColumnMeta("int", "uid", "NOT NULL"), - new ColumnMeta("nvarchar(64)", "type", "NOT NULL"), - new ColumnMeta("nvarchar(max)", "message", "NOT NULL"), - new ColumnMeta("varbinary(max)", "variables", "NOT NULL"), - new ColumnMeta("smallint", "severity", "NOT NULL"), - new ColumnMeta("nvarchar(255)", "link"), - new ColumnMeta("nvarchar(max)", "location", "NOT NULL"), - new ColumnMeta("nvarchar(max)", "referer"), - new ColumnMeta("nvarchar(128)", "hostname", "NOT NULL"), + $cm_arr = array(new ColumnMeta("int", "wid", "IDENTITY(1,1) NOT NULL"), + new ColumnMeta("int", "uid", "NOT NULL"), + new ColumnMeta("nvarchar(64)", "type", "NOT NULL"), + new ColumnMeta("nvarchar(max)", "message", "NOT NULL"), + new ColumnMeta("varbinary(max)", "variables", "NOT NULL"), + new ColumnMeta("smallint", "severity", "NOT NULL"), + new ColumnMeta("nvarchar(255)", "link"), + new ColumnMeta("nvarchar(max)", "location", "NOT NULL"), + new ColumnMeta("nvarchar(max)", "referer"), + new ColumnMeta("nvarchar(128)", "hostname", "NOT NULL"), new ColumnMeta("int", "timestamp", "NOT NULL")); } @@ -73,9 +74,9 @@ try { $cd_arr = array(); foreach ($cm_arr as $cm) { - array_push( $cd_arr, $cm->getColDef()); + array_push($cd_arr, $cm->getColDef()); } - + $tablescript = "CREATE TABLE [dbo].[$tbname]( $cd_arr[0], $cd_arr[1], $cd_arr[2], $cd_arr[3], $cd_arr[4], $cd_arr[5], $cd_arr[6], $cd_arr[7], $cd_arr[8], $cd_arr[9], $cd_arr[10], CONSTRAINT [watchdog_pkey] PRIMARY KEY CLUSTERED @@ -83,20 +84,20 @@ try { [wid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]"; - + // Recreate $st = $cnn->prepare($tablescript); - $st->execute(); - + $st->execute(); + $query = "INSERT INTO [$tbname] ([uid], [type], [message], [variables], [severity], [link], [location], [referer], [hostname], [timestamp]) OUTPUT (Inserted.wid) VALUES (:db_insert0, :db_insert1, :db_insert2, :db_insert3, :db_insert4, :db_insert5, :db_insert6, :db_insert7, :db_insert8, :db_insert9)"; - + $values_encoded = 'YToxMDp7czozOiJ1aWQiO2k6MDtzOjQ6InR5cGUiO3M6MzoicGhwIjtzOjc6Im1lc3NhZ2UiO3M6NTE6IiV0eXBlOiBAbWVzc2FnZSBpbiAlZnVuY3Rpb24gKGxpbmUgJWxpbmUgb2YgJWZpbGUpLiI7czo5OiJ2YXJpYWJsZXMiO3M6MjE4ODoiYTo1OntzOjU6IiV0eXBlIjtzOjQ1OiJEcnVwYWxcQ29yZVxEYXRhYmFzZVxEYXRhYmFzZUV4Y2VwdGlvbldyYXBwZXIiO3M6ODoiQG1lc3NhZ2UiO3M6MTkxMzoiU1FMU1RBVEVbSU1TU1BdOiBBbiBlcnJvciBvY2N1cnJlZCB0cmFuc2xhdGluZyB0aGUgcXVlcnkgc3RyaW5nIHRvIFVURi0xNjogTm8gbWFwcGluZyBmb3IgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGV4aXN0cyBpbiB0aGUgdGFyZ2V0IG11bHRpLWJ5dGUgY29kZSBwYWdlLg0KLjogTUVSR0UgSU5UTyBbY2FjaGVfZGF0YV0gX3RhcmdldA0KVVNJTkcgKFNFTEVDVCBULiogRlJPTSAodmFsdWVzKDpkYl9pbnNlcnRfcGxhY2Vob2xkZXJfMCwgOmRiX2luc2VydF9wbGFjZWhvbGRlcl8xLCA6ZGJfaW5zZXJ0X3BsYWNlaG9sZGVyXzIsIDpkYl9pbnNlcnRfcGxhY2Vob2xkZXJfMywgOmRiX2luc2VydF9wbGFjZWhvbGRlcl80LCA6ZGJfaW5zZXJ0X3BsYWNlaG9sZGVyXzUsIDpkYl9pbnNlcnRfcGxhY2Vob2xkZXJfNikpIGFzIFQoW2NpZF0sIFtleHBpcmVdLCBbY3JlYXRlZF0sIFt0YWdzXSwgW2NoZWNrc3VtXSwgW2RhdGFdLCBbc2VyaWFsaXplZF0pKSBfc291cmNlDQpPTiBfdGFyZ2V0LltjaWRdID0gX3NvdXJjZS5bY2lkXQ0KV0hFTiBNQVRDSEVEIFRIRU4gVVBEQVRFIFNFVCBfdGFyZ2V0LltleHBpcmVdID0gX3NvdXJjZS5bZXhwaXJlXSwgX3RhcmdldC5bY3JlYXRlZF0gPSBfc291cmNlLltjcmVhdGVkXSwgX3RhcmdldC5bdGFnc10gPSBfc291cmNlLlt0YWdzXSwgX3RhcmdldC5bY2hlY2tzdW1dID0gX3NvdXJjZS5bY2hlY2tzdW1dLCBfdGFyZ2V0LltkYXRhXSA9IF9zb3VyY2UuW2RhdGFdLCBfdGFyZ2V0LltzZXJpYWxpemVkXSA9IF9zb3VyY2UuW3NlcmlhbGl6ZWRdDQpXSEVOIE5PVCBNQVRDSEVEIFRIRU4gSU5TRVJUIChbY2lkXSwgW2V4cGlyZV0sIFtjcmVhdGVkXSwgW3RhZ3NdLCBbY2hlY2tzdW1dLCBbZGF0YV0sIFtzZXJpYWxpemVkXSkgVkFMVUVTIChfc291cmNlLltjaWRdLCBfc291cmNlLltleHBpcmVdLCBfc291cmNlLltjcmVhdGVkXSwgX3NvdXJjZS5bdGFnc10sIF9zb3VyY2UuW2NoZWNrc3VtXSwgX3NvdXJjZS5bZGF0YV0sIF9zb3VyY2UuW3NlcmlhbGl6ZWRdKQ0KT1VUUFVUICRhY3Rpb247OyBBcnJheQooCiAgICBbOmRiX2luc2VydF9wbGFjZWhvbGRlcl8wXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW3ZhbHVlXSA9PiByb3V0ZTovOlhERUJVR19TRVNTSU9OX1NUQVJUPTU4RTFDMUM0CiAgICAgICAgICAgIFtkYXRhdHlwZV0gPT4gMgogICAgICAgICkKCiAgICBbOmRiX2luc2VydF9wbGFjZWhvbGRlcl8xXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW3ZhbHVlXSA9PiAtMQogICAgICAgICAgICBbZGF0YXR5cGVdID0+IDIKICAgICAgICApCgogICAgWzpkYl9pbnNlcnRfcGxhY2Vob2xkZXJfMl0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFt2YWx1ZV0gPT4gMTQ3MDIwNTc3My43CiAgICAgICAgICAgIFtkYXRhdHlwZV0gPT4gMgogICAgICAgICkKCiAgICBbOmRiX2luc2VydF9wbGFjZWhvbGRlcl8zXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW3ZhbHVlXSA9PiByb3V0ZV9tYXRjaAogICAgICAgICAgICBbZGF0YXR5cGVdID0+IDIKICAgICAgICApCgogICAgWzpkYl9pbnNlcnRfcGxhY2Vob2xkZXJfNF0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFt2YWx1ZV0gPT4gNAogICAgICAgICAgICBbZGF0YXR5cGVdID0+IDIKICAgICAgICApCgogICAgWzpkYl9pbnNlcnRfcGxhY2Vob2xkZXJfNV0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFt2YWx1ZV0gPT4gUmVzb3VyY2UgaWQgIzQKICAgICAgICAgICAgW2RhdGF0eXBlXSA9PiAzCiAgICAgICAgKQoKICAgIFs6ZGJfaW5zZXJ0X3BsYWNlaG9sZGVyXzZdID0+IEFycmF5CiAgICAgICAgKAogICAgICAgICAgICBbdmFsdWVdID0+IDEKICAgICAgICAgICAgW2RhdGF0eXBlXSA9PiAyCiAgICAgICAgKQoKKQoiO3M6OToiJWZ1bmN0aW9uIjtzOjY1OiJEcnVwYWxcQ29yZVxSb3V0aW5nXFJvdXRlUHJvdmlkZXItPmdldFJvdXRlQ29sbGVjdGlvbkZvclJlcXVlc3QoKSI7czo1OiIlZmlsZSI7czo1MjoiRDpcZDhcY29yZVxsaWJcRHJ1cGFsXENvcmVcUm91dGluZ1xSb3V0ZVByb3ZpZGVyLnBocCI7czo1OiIlbGluZSI7aToxNjc7fSI7czo4OiJzZXZlcml0eSI7aTozO3M6NDoibGluayI7czowOiIiO3M6ODoibG9jYXRpb24iO3M6NjQ6Imh0dHA6Ly9sb2NhbC5kN3Rlc3QuY29tL2luZGV4LnBocC8/WERFQlVHX1NFU1NJT05fU1RBUlQ9NThFMUMxQzQiO3M6NzoicmVmZXJlciI7czowOiIiO3M6ODoiaG9zdG5hbWUiO3M6OToiMTI3LjAuMC4xIjtzOjk6InRpbWVzdGFtcCI7aToxNDcwMjA1Nzc0O30='; $columninformation_encoded = 'YTo3OntzOjg6ImlkZW50aXR5IjtzOjM6IndpZCI7czoxMDoiaWRlbnRpdGllcyI7YToxOntzOjM6IndpZCI7czozOiJ3aWQiO31zOjc6ImNvbHVtbnMiO2E6MTE6e3M6Mzoid2lkIjthOjE0OntzOjQ6Im5hbWUiO3M6Mzoid2lkIjtzOjEwOiJtYXhfbGVuZ3RoIjtpOjQ7czo5OiJwcmVjaXNpb24iO2k6MTA7czoxNDoiY29sbGF0aW9uX25hbWUiO047czoxMToiaXNfbnVsbGFibGUiO2k6MDtzOjE0OiJpc19hbnNpX3BhZGRlZCI7aTowO3M6MTE6ImlzX2lkZW50aXR5IjtpOjE7czoxMToiaXNfY29tcHV0ZWQiO2k6MDtzOjQ6InR5cGUiO3M6MzoiaW50IjtzOjEwOiJkZWZpbml0aW9uIjtOO3M6MTM6ImRlZmF1bHRfdmFsdWUiO047czoxMToic3Fsc3J2X3R5cGUiO3M6MzoiaW50IjtzOjEyOiJkZXBlbmRlbmNpZXMiO2E6MDp7fXM6NzoiaW5kZXhlcyI7YToxOntpOjA7czoxMzoid2F0Y2hkb2dfcGtleSI7fX1zOjM6InVpZCI7YToxNDp7czo0OiJuYW1lIjtzOjM6InVpZCI7czoxMDoibWF4X2xlbmd0aCI7aTo0O3M6OToicHJlY2lzaW9uIjtpOjEwO3M6MTQ6ImNvbGxhdGlvbl9uYW1lIjtOO3M6MTE6ImlzX251bGxhYmxlIjtpOjA7czoxNDoiaXNfYW5zaV9wYWRkZWQiO2k6MDtzOjExOiJpc19pZGVudGl0eSI7aTowO3M6MTE6ImlzX2NvbXB1dGVkIjtpOjA7czo0OiJ0eXBlIjtzOjM6ImludCI7czoxMDoiZGVmaW5pdGlvbiI7TjtzOjEzOiJkZWZhdWx0X3ZhbHVlIjtzOjU6IigoMCkpIjtzOjExOiJzcWxzcnZfdHlwZSI7czozOiJpbnQiO3M6MTI6ImRlcGVuZGVuY2llcyI7YTowOnt9czo3OiJpbmRleGVzIjthOjE6e2k6MDtzOjc6InVpZF9pZHgiO319czo0OiJ0eXBlIjthOjE0OntzOjQ6Im5hbWUiO3M6NDoidHlwZSI7czoxMDoibWF4X2xlbmd0aCI7aTo2NDtzOjk6InByZWNpc2lvbiI7aTowO3M6MTQ6ImNvbGxhdGlvbl9uYW1lIjtzOjIwOiJMYXRpbjFfR2VuZXJhbF9DSV9BSSI7czoxMToiaXNfbnVsbGFibGUiO2k6MDtzOjE0OiJpc19hbnNpX3BhZGRlZCI7aToxO3M6MTE6ImlzX2lkZW50aXR5IjtpOjA7czoxMToiaXNfY29tcHV0ZWQiO2k6MDtzOjQ6InR5cGUiO3M6NzoidmFyY2hhciI7czoxMDoiZGVmaW5pdGlvbiI7TjtzOjEzOiJkZWZhdWx0X3ZhbHVlIjtzOjQ6IignJykiO3M6MTE6InNxbHNydl90eXBlIjtzOjExOiJ2YXJjaGFyKDY0KSI7czoxMjoiZGVwZW5kZW5jaWVzIjthOjA6e31zOjc6ImluZGV4ZXMiO2E6MTp7aTowO3M6ODoidHlwZV9pZHgiO319czo3OiJtZXNzYWdlIjthOjEzOntzOjQ6Im5hbWUiO3M6NzoibWVzc2FnZSI7czoxMDoibWF4X2xlbmd0aCI7aTotMTtzOjk6InByZWNpc2lvbiI7aTowO3M6MTQ6ImNvbGxhdGlvbl9uYW1lIjtzOjIwOiJMYXRpbjFfR2VuZXJhbF9DSV9BSSI7czoxMToiaXNfbnVsbGFibGUiO2k6MDtzOjE0OiJpc19hbnNpX3BhZGRlZCI7aToxO3M6MTE6ImlzX2lkZW50aXR5IjtpOjA7czoxMToiaXNfY29tcHV0ZWQiO2k6MDtzOjQ6InR5cGUiO3M6ODoibnZhcmNoYXIiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7TjtzOjExOiJzcWxzcnZfdHlwZSI7czoxMzoibnZhcmNoYXIobWF4KSI7czoxMjoiZGVwZW5kZW5jaWVzIjthOjA6e319czo5OiJ2YXJpYWJsZXMiO2E6MTM6e3M6NDoibmFtZSI7czo5OiJ2YXJpYWJsZXMiO3M6MTA6Im1heF9sZW5ndGgiO2k6LTE7czo5OiJwcmVjaXNpb24iO2k6MDtzOjE0OiJjb2xsYXRpb25fbmFtZSI7TjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjE7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czo5OiJ2YXJiaW5hcnkiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7TjtzOjExOiJzcWxzcnZfdHlwZSI7czoxNDoidmFyYmluYXJ5KG1heCkiO3M6MTI6ImRlcGVuZGVuY2llcyI7YTowOnt9fXM6ODoic2V2ZXJpdHkiO2E6MTQ6e3M6NDoibmFtZSI7czo4OiJzZXZlcml0eSI7czoxMDoibWF4X2xlbmd0aCI7aToyO3M6OToicHJlY2lzaW9uIjtpOjU7czoxNDoiY29sbGF0aW9uX25hbWUiO047czoxMToiaXNfbnVsbGFibGUiO2k6MDtzOjE0OiJpc19hbnNpX3BhZGRlZCI7aTowO3M6MTE6ImlzX2lkZW50aXR5IjtpOjA7czoxMToiaXNfY29tcHV0ZWQiO2k6MDtzOjQ6InR5cGUiO3M6ODoic21hbGxpbnQiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7czo1OiIoKDApKSI7czoxMToic3Fsc3J2X3R5cGUiO3M6ODoic21hbGxpbnQiO3M6MTI6ImRlcGVuZGVuY2llcyI7YTowOnt9czo3OiJpbmRleGVzIjthOjE6e2k6MDtzOjEyOiJzZXZlcml0eV9pZHgiO319czo0OiJsaW5rIjthOjEzOntzOjQ6Im5hbWUiO3M6NDoibGluayI7czoxMDoibWF4X2xlbmd0aCI7aTotMTtzOjk6InByZWNpc2lvbiI7aTowO3M6MTQ6ImNvbGxhdGlvbl9uYW1lIjtzOjIwOiJMYXRpbjFfR2VuZXJhbF9DSV9BSSI7czoxMToiaXNfbnVsbGFibGUiO2k6MTtzOjE0OiJpc19hbnNpX3BhZGRlZCI7aToxO3M6MTE6ImlzX2lkZW50aXR5IjtpOjA7czoxMToiaXNfY29tcHV0ZWQiO2k6MDtzOjQ6InR5cGUiO3M6ODoibnZhcmNoYXIiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7TjtzOjExOiJzcWxzcnZfdHlwZSI7czoxMzoibnZhcmNoYXIobWF4KSI7czoxMjoiZGVwZW5kZW5jaWVzIjthOjA6e319czo4OiJsb2NhdGlvbiI7YToxMzp7czo0OiJuYW1lIjtzOjg6ImxvY2F0aW9uIjtzOjEwOiJtYXhfbGVuZ3RoIjtpOi0xO3M6OToicHJlY2lzaW9uIjtpOjA7czoxNDoiY29sbGF0aW9uX25hbWUiO3M6MjA6IkxhdGluMV9HZW5lcmFsX0NJX0FJIjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjE7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czo4OiJudmFyY2hhciI7czoxMDoiZGVmaW5pdGlvbiI7TjtzOjEzOiJkZWZhdWx0X3ZhbHVlIjtOO3M6MTE6InNxbHNydl90eXBlIjtzOjEzOiJudmFyY2hhcihtYXgpIjtzOjEyOiJkZXBlbmRlbmNpZXMiO2E6MDp7fX1zOjc6InJlZmVyZXIiO2E6MTM6e3M6NDoibmFtZSI7czo3OiJyZWZlcmVyIjtzOjEwOiJtYXhfbGVuZ3RoIjtpOi0xO3M6OToicHJlY2lzaW9uIjtpOjA7czoxNDoiY29sbGF0aW9uX25hbWUiO3M6MjA6IkxhdGluMV9HZW5lcmFsX0NJX0FJIjtzOjExOiJpc19udWxsYWJsZSI7aToxO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjE7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czo4OiJudmFyY2hhciI7czoxMDoiZGVmaW5pdGlvbiI7TjtzOjEzOiJkZWZhdWx0X3ZhbHVlIjtOO3M6MTE6InNxbHNydl90eXBlIjtzOjEzOiJudmFyY2hhcihtYXgpIjtzOjEyOiJkZXBlbmRlbmNpZXMiO2E6MDp7fX1zOjg6Imhvc3RuYW1lIjthOjEzOntzOjQ6Im5hbWUiO3M6ODoiaG9zdG5hbWUiO3M6MTA6Im1heF9sZW5ndGgiO2k6MTI4O3M6OToicHJlY2lzaW9uIjtpOjA7czoxNDoiY29sbGF0aW9uX25hbWUiO3M6MjA6IkxhdGluMV9HZW5lcmFsX0NJX0FJIjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjE7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czo3OiJ2YXJjaGFyIjtzOjEwOiJkZWZpbml0aW9uIjtOO3M6MTM6ImRlZmF1bHRfdmFsdWUiO3M6NDoiKCcnKSI7czoxMToic3Fsc3J2X3R5cGUiO3M6MTI6InZhcmNoYXIoMTI4KSI7czoxMjoiZGVwZW5kZW5jaWVzIjthOjA6e319czo5OiJ0aW1lc3RhbXAiO2E6MTM6e3M6NDoibmFtZSI7czo5OiJ0aW1lc3RhbXAiO3M6MTA6Im1heF9sZW5ndGgiO2k6NDtzOjk6InByZWNpc2lvbiI7aToxMDtzOjE0OiJjb2xsYXRpb25fbmFtZSI7TjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjA7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czozOiJpbnQiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7czo1OiIoKDApKSI7czoxMToic3Fsc3J2X3R5cGUiO3M6MzoiaW50IjtzOjEyOiJkZXBlbmRlbmNpZXMiO2E6MDp7fX19czoxMzoiY29sdW1uc19jbGVhbiI7YToxMTp7czozOiJ3aWQiO2E6MTM6e3M6NDoibmFtZSI7czozOiJ3aWQiO3M6MTA6Im1heF9sZW5ndGgiO2k6NDtzOjk6InByZWNpc2lvbiI7aToxMDtzOjE0OiJjb2xsYXRpb25fbmFtZSI7TjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjA7czoxMToiaXNfaWRlbnRpdHkiO2k6MTtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czozOiJpbnQiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7TjtzOjExOiJzcWxzcnZfdHlwZSI7czozOiJpbnQiO3M6NzoiaW5kZXhlcyI7YToxOntpOjA7czoxMzoid2F0Y2hkb2dfcGtleSI7fX1zOjM6InVpZCI7YToxMzp7czo0OiJuYW1lIjtzOjM6InVpZCI7czoxMDoibWF4X2xlbmd0aCI7aTo0O3M6OToicHJlY2lzaW9uIjtpOjEwO3M6MTQ6ImNvbGxhdGlvbl9uYW1lIjtOO3M6MTE6ImlzX251bGxhYmxlIjtpOjA7czoxNDoiaXNfYW5zaV9wYWRkZWQiO2k6MDtzOjExOiJpc19pZGVudGl0eSI7aTowO3M6MTE6ImlzX2NvbXB1dGVkIjtpOjA7czo0OiJ0eXBlIjtzOjM6ImludCI7czoxMDoiZGVmaW5pdGlvbiI7TjtzOjEzOiJkZWZhdWx0X3ZhbHVlIjtzOjU6IigoMCkpIjtzOjExOiJzcWxzcnZfdHlwZSI7czozOiJpbnQiO3M6NzoiaW5kZXhlcyI7YToxOntpOjA7czo3OiJ1aWRfaWR4Ijt9fXM6NDoidHlwZSI7YToxMzp7czo0OiJuYW1lIjtzOjQ6InR5cGUiO3M6MTA6Im1heF9sZW5ndGgiO2k6NjQ7czo5OiJwcmVjaXNpb24iO2k6MDtzOjE0OiJjb2xsYXRpb25fbmFtZSI7czoyMDoiTGF0aW4xX0dlbmVyYWxfQ0lfQUkiO3M6MTE6ImlzX251bGxhYmxlIjtpOjA7czoxNDoiaXNfYW5zaV9wYWRkZWQiO2k6MTtzOjExOiJpc19pZGVudGl0eSI7aTowO3M6MTE6ImlzX2NvbXB1dGVkIjtpOjA7czo0OiJ0eXBlIjtzOjc6InZhcmNoYXIiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7czo0OiIoJycpIjtzOjExOiJzcWxzcnZfdHlwZSI7czoxMToidmFyY2hhcig2NCkiO3M6NzoiaW5kZXhlcyI7YToxOntpOjA7czo4OiJ0eXBlX2lkeCI7fX1zOjc6Im1lc3NhZ2UiO2E6MTI6e3M6NDoibmFtZSI7czo3OiJtZXNzYWdlIjtzOjEwOiJtYXhfbGVuZ3RoIjtpOi0xO3M6OToicHJlY2lzaW9uIjtpOjA7czoxNDoiY29sbGF0aW9uX25hbWUiO3M6MjA6IkxhdGluMV9HZW5lcmFsX0NJX0FJIjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjE7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czo4OiJudmFyY2hhciI7czoxMDoiZGVmaW5pdGlvbiI7TjtzOjEzOiJkZWZhdWx0X3ZhbHVlIjtOO3M6MTE6InNxbHNydl90eXBlIjtzOjEzOiJudmFyY2hhcihtYXgpIjt9czo5OiJ2YXJpYWJsZXMiO2E6MTI6e3M6NDoibmFtZSI7czo5OiJ2YXJpYWJsZXMiO3M6MTA6Im1heF9sZW5ndGgiO2k6LTE7czo5OiJwcmVjaXNpb24iO2k6MDtzOjE0OiJjb2xsYXRpb25fbmFtZSI7TjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjE7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czo5OiJ2YXJiaW5hcnkiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7TjtzOjExOiJzcWxzcnZfdHlwZSI7czoxNDoidmFyYmluYXJ5KG1heCkiO31zOjg6InNldmVyaXR5IjthOjEzOntzOjQ6Im5hbWUiO3M6ODoic2V2ZXJpdHkiO3M6MTA6Im1heF9sZW5ndGgiO2k6MjtzOjk6InByZWNpc2lvbiI7aTo1O3M6MTQ6ImNvbGxhdGlvbl9uYW1lIjtOO3M6MTE6ImlzX251bGxhYmxlIjtpOjA7czoxNDoiaXNfYW5zaV9wYWRkZWQiO2k6MDtzOjExOiJpc19pZGVudGl0eSI7aTowO3M6MTE6ImlzX2NvbXB1dGVkIjtpOjA7czo0OiJ0eXBlIjtzOjg6InNtYWxsaW50IjtzOjEwOiJkZWZpbml0aW9uIjtOO3M6MTM6ImRlZmF1bHRfdmFsdWUiO3M6NToiKCgwKSkiO3M6MTE6InNxbHNydl90eXBlIjtzOjg6InNtYWxsaW50IjtzOjc6ImluZGV4ZXMiO2E6MTp7aTowO3M6MTI6InNldmVyaXR5X2lkeCI7fX1zOjQ6ImxpbmsiO2E6MTI6e3M6NDoibmFtZSI7czo0OiJsaW5rIjtzOjEwOiJtYXhfbGVuZ3RoIjtpOi0xO3M6OToicHJlY2lzaW9uIjtpOjA7czoxNDoiY29sbGF0aW9uX25hbWUiO3M6MjA6IkxhdGluMV9HZW5lcmFsX0NJX0FJIjtzOjExOiJpc19udWxsYWJsZSI7aToxO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjE7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czo4OiJudmFyY2hhciI7czoxMDoiZGVmaW5pdGlvbiI7TjtzOjEzOiJkZWZhdWx0X3ZhbHVlIjtOO3M6MTE6InNxbHNydl90eXBlIjtzOjEzOiJudmFyY2hhcihtYXgpIjt9czo4OiJsb2NhdGlvbiI7YToxMjp7czo0OiJuYW1lIjtzOjg6ImxvY2F0aW9uIjtzOjEwOiJtYXhfbGVuZ3RoIjtpOi0xO3M6OToicHJlY2lzaW9uIjtpOjA7czoxNDoiY29sbGF0aW9uX25hbWUiO3M6MjA6IkxhdGluMV9HZW5lcmFsX0NJX0FJIjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjE7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czo4OiJudmFyY2hhciI7czoxMDoiZGVmaW5pdGlvbiI7TjtzOjEzOiJkZWZhdWx0X3ZhbHVlIjtOO3M6MTE6InNxbHNydl90eXBlIjtzOjEzOiJudmFyY2hhcihtYXgpIjt9czo3OiJyZWZlcmVyIjthOjEyOntzOjQ6Im5hbWUiO3M6NzoicmVmZXJlciI7czoxMDoibWF4X2xlbmd0aCI7aTotMTtzOjk6InByZWNpc2lvbiI7aTowO3M6MTQ6ImNvbGxhdGlvbl9uYW1lIjtzOjIwOiJMYXRpbjFfR2VuZXJhbF9DSV9BSSI7czoxMToiaXNfbnVsbGFibGUiO2k6MTtzOjE0OiJpc19hbnNpX3BhZGRlZCI7aToxO3M6MTE6ImlzX2lkZW50aXR5IjtpOjA7czoxMToiaXNfY29tcHV0ZWQiO2k6MDtzOjQ6InR5cGUiO3M6ODoibnZhcmNoYXIiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7TjtzOjExOiJzcWxzcnZfdHlwZSI7czoxMzoibnZhcmNoYXIobWF4KSI7fXM6ODoiaG9zdG5hbWUiO2E6MTI6e3M6NDoibmFtZSI7czo4OiJob3N0bmFtZSI7czoxMDoibWF4X2xlbmd0aCI7aToxMjg7czo5OiJwcmVjaXNpb24iO2k6MDtzOjE0OiJjb2xsYXRpb25fbmFtZSI7czoyMDoiTGF0aW4xX0dlbmVyYWxfQ0lfQUkiO3M6MTE6ImlzX251bGxhYmxlIjtpOjA7czoxNDoiaXNfYW5zaV9wYWRkZWQiO2k6MTtzOjExOiJpc19pZGVudGl0eSI7aTowO3M6MTE6ImlzX2NvbXB1dGVkIjtpOjA7czo0OiJ0eXBlIjtzOjc6InZhcmNoYXIiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7czo0OiIoJycpIjtzOjExOiJzcWxzcnZfdHlwZSI7czoxMjoidmFyY2hhcigxMjgpIjt9czo5OiJ0aW1lc3RhbXAiO2E6MTI6e3M6NDoibmFtZSI7czo5OiJ0aW1lc3RhbXAiO3M6MTA6Im1heF9sZW5ndGgiO2k6NDtzOjk6InByZWNpc2lvbiI7aToxMDtzOjE0OiJjb2xsYXRpb25fbmFtZSI7TjtzOjExOiJpc19udWxsYWJsZSI7aTowO3M6MTQ6ImlzX2Fuc2lfcGFkZGVkIjtpOjA7czoxMToiaXNfaWRlbnRpdHkiO2k6MDtzOjExOiJpc19jb21wdXRlZCI7aTowO3M6NDoidHlwZSI7czozOiJpbnQiO3M6MTA6ImRlZmluaXRpb24iO047czoxMzoiZGVmYXVsdF92YWx1ZSI7czo1OiIoKDApKSI7czoxMToic3Fsc3J2X3R5cGUiO3M6MzoiaW50Ijt9fXM6NToiYmxvYnMiO2E6MTp7czo5OiJ2YXJpYWJsZXMiO2I6MTt9czo3OiJpbmRleGVzIjthOjQ6e3M6MTM6IndhdGNoZG9nX3BrZXkiO2E6MTU6e3M6MTA6ImluZGV4X25hbWUiO3M6MTM6IndhdGNoZG9nX3BrZXkiO3M6OToidHlwZV9kZXNjIjtzOjk6IkNMVVNURVJFRCI7czo5OiJpc191bmlxdWUiO2k6MTtzOjEzOiJkYXRhX3NwYWNlX2lkIjtpOjE7czoxNDoiaWdub3JlX2R1cF9rZXkiO2k6MDtzOjE0OiJpc19wcmltYXJ5X2tleSI7aToxO3M6MjA6ImlzX3VuaXF1ZV9jb25zdHJhaW50IjtpOjA7czoxMToiZmlsbF9mYWN0b3IiO2k6MDtzOjk6ImlzX3BhZGRlZCI7aTowO3M6MTE6ImlzX2Rpc2FibGVkIjtpOjA7czoxNToiaXNfaHlwb3RoZXRpY2FsIjtpOjA7czoxNToiYWxsb3dfcm93X2xvY2tzIjtpOjE7czoxNjoiYWxsb3dfcGFnZV9sb2NrcyI7aToxO3M6MTg6ImlzX2luY2x1ZGVkX2NvbHVtbiI7aTowO3M6NzoiY29sdW1ucyI7YToxOntpOjE7YTozOntzOjQ6Im5hbWUiO3M6Mzoid2lkIjtzOjE3OiJpc19kZXNjZW5kaW5nX2tleSI7aTowO3M6MTE6ImtleV9vcmRpbmFsIjtpOjE7fX19czo4OiJ0eXBlX2lkeCI7YToxNTp7czoxMDoiaW5kZXhfbmFtZSI7czo4OiJ0eXBlX2lkeCI7czo5OiJ0eXBlX2Rlc2MiO3M6MTI6Ik5PTkNMVVNURVJFRCI7czo5OiJpc191bmlxdWUiO2k6MDtzOjEzOiJkYXRhX3NwYWNlX2lkIjtpOjE7czoxNDoiaWdub3JlX2R1cF9rZXkiO2k6MDtzOjE0OiJpc19wcmltYXJ5X2tleSI7aTowO3M6MjA6ImlzX3VuaXF1ZV9jb25zdHJhaW50IjtpOjA7czoxMToiZmlsbF9mYWN0b3IiO2k6MDtzOjk6ImlzX3BhZGRlZCI7aTowO3M6MTE6ImlzX2Rpc2FibGVkIjtpOjA7czoxNToiaXNfaHlwb3RoZXRpY2FsIjtpOjA7czoxNToiYWxsb3dfcm93X2xvY2tzIjtpOjE7czoxNjoiYWxsb3dfcGFnZV9sb2NrcyI7aToxO3M6MTg6ImlzX2luY2x1ZGVkX2NvbHVtbiI7aTowO3M6NzoiY29sdW1ucyI7YToxOntpOjE7YTozOntzOjQ6Im5hbWUiO3M6NDoidHlwZSI7czoxNzoiaXNfZGVzY2VuZGluZ19rZXkiO2k6MDtzOjExOiJrZXlfb3JkaW5hbCI7aToxO319fXM6NzoidWlkX2lkeCI7YToxNTp7czoxMDoiaW5kZXhfbmFtZSI7czo3OiJ1aWRfaWR4IjtzOjk6InR5cGVfZGVzYyI7czoxMjoiTk9OQ0xVU1RFUkVEIjtzOjk6ImlzX3VuaXF1ZSI7aTowO3M6MTM6ImRhdGFfc3BhY2VfaWQiO2k6MTtzOjE0OiJpZ25vcmVfZHVwX2tleSI7aTowO3M6MTQ6ImlzX3ByaW1hcnlfa2V5IjtpOjA7czoyMDoiaXNfdW5pcXVlX2NvbnN0cmFpbnQiO2k6MDtzOjExOiJmaWxsX2ZhY3RvciI7aTowO3M6OToiaXNfcGFkZGVkIjtpOjA7czoxMToiaXNfZGlzYWJsZWQiO2k6MDtzOjE1OiJpc19oeXBvdGhldGljYWwiO2k6MDtzOjE1OiJhbGxvd19yb3dfbG9ja3MiO2k6MTtzOjE2OiJhbGxvd19wYWdlX2xvY2tzIjtpOjE7czoxODoiaXNfaW5jbHVkZWRfY29sdW1uIjtpOjA7czo3OiJjb2x1bW5zIjthOjE6e2k6MTthOjM6e3M6NDoibmFtZSI7czozOiJ1aWQiO3M6MTc6ImlzX2Rlc2NlbmRpbmdfa2V5IjtpOjA7czoxMToia2V5X29yZGluYWwiO2k6MTt9fX1zOjEyOiJzZXZlcml0eV9pZHgiO2E6MTU6e3M6MTA6ImluZGV4X25hbWUiO3M6MTI6InNldmVyaXR5X2lkeCI7czo5OiJ0eXBlX2Rlc2MiO3M6MTI6Ik5PTkNMVVNURVJFRCI7czo5OiJpc191bmlxdWUiO2k6MDtzOjEzOiJkYXRhX3NwYWNlX2lkIjtpOjE7czoxNDoiaWdub3JlX2R1cF9rZXkiO2k6MDtzOjE0OiJpc19wcmltYXJ5X2tleSI7aTowO3M6MjA6ImlzX3VuaXF1ZV9jb25zdHJhaW50IjtpOjA7czoxMToiZmlsbF9mYWN0b3IiO2k6MDtzOjk6ImlzX3BhZGRlZCI7aTowO3M6MTE6ImlzX2Rpc2FibGVkIjtpOjA7czoxNToiaXNfaHlwb3RoZXRpY2FsIjtpOjA7czoxNToiYWxsb3dfcm93X2xvY2tzIjtpOjE7czoxNjoiYWxsb3dfcGFnZV9sb2NrcyI7aToxO3M6MTg6ImlzX2luY2x1ZGVkX2NvbHVtbiI7aTowO3M6NzoiY29sdW1ucyI7YToxOntpOjE7YTozOntzOjQ6Im5hbWUiO3M6ODoic2V2ZXJpdHkiO3M6MTc6ImlzX2Rlc2NlbmRpbmdfa2V5IjtpOjA7czoxMToia2V5X29yZGluYWwiO2k6MTt9fX19czoxNzoicHJpbWFyeV9rZXlfaW5kZXgiO3M6MTM6IndhdGNoZG9nX3BrZXkiO30='; - + $values = unserialize(base64_decode($values_encoded)); $columnInformation = unserialize(base64_decode($columninformation_encoded)); - + /** @var MyStatement */ $st = $cnn->prepare($query, $pdo_options); @@ -191,4 +192,4 @@ OUTPUT $action;; Array ["timestamp"]=> string(10) "1470205774" } -} \ No newline at end of file +} diff --git a/test/functional/pdo_sqlsrv/pdo_ae_unsupported_stmt_attr.phpt b/test/functional/pdo_sqlsrv/pdo_ae_unsupported_stmt_attr.phpt index 8f689f76..a1b38075 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_unsupported_stmt_attr.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_unsupported_stmt_attr.phpt @@ -1,5 +1,5 @@ --TEST-- -Test error from preparing a parameterized query with direct query or emulate prepare when Column Encryption is enabled +Test error from preparing a parameterized query with direct query or emulate prepare when Column Encryption is enabled --SKIPIF-- --FILE-- @@ -21,7 +21,7 @@ try { } catch (PDOException $e) { $error = $e->errorInfo; // expects an exception if Column Encryption is enabled - if (isColEncrypted()) { + if (isAEConnected()) { if ($error[0] != "IMSSP" || $error[1] != -81 || $error[2] != "Parameterized statement with attribute PDO::SQLSRV_ATTR_DIRECT_QUERY is not supported in a Column Encryption enabled Connection.") { @@ -40,7 +40,7 @@ try { } catch (PDOException $e) { $error = $e->errorInfo; // expects an exception if Column Encryption is enabled - if (isColEncrypted()) { + if (isAEConnected()) { if ($error[0] != "IMSSP" || $error[1] != -82 || $error[2] != "Parameterized statement with attribute PDO::ATTR_EMULATE_PREPARES is not supported in a Column Encryption enabled Connection.") { diff --git a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_binary.phpt b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_binary.phpt index f31e0893..2fda606b 100644 --- a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_binary.phpt +++ b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_binary.phpt @@ -35,7 +35,7 @@ try { $cnn->exec("TRUNCATE TABLE $tbname"); //EMULATE PREPARE with SQLSRV_ENCODING_BINARY - if (!isColEncrypted()) { + if (!isAEConnected()) { // Emulate prepare does not work fro encrypted columns $pdo_options[PDO::ATTR_EMULATE_PREPARES] = true; } @@ -59,10 +59,10 @@ try { $st->bindParam(':p0', $p, PDO::PARAM_LOB); $st->execute(); $error = $st->errorInfo(); - if (!isColEncrypted() && $error[0] !== "42000") { + if (!isAEConnected() && $error[0] !== "42000") { echo "Error 42000 is expected: Implicit conversion from data type varchar to varbinary(max) is not allowed.\n"; var_dump($error); - } elseif (isColEncrypted() && $error[0] != "22018") { + } elseif (isAEConnected() && $error[0] != "22018") { echo "Error 22018 is expected: Invalid character value for cast specification.\n"; var_dump($error); } else { diff --git a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_char.phpt b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_char.phpt index 7776f143..569c5a7b 100644 --- a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_char.phpt +++ b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_char.phpt @@ -30,7 +30,7 @@ try { //prepare with emulate prepare and no bind param options print_r("Prepare with emulate prepare and no bindParam options:\n"); - if (!isColEncrypted()) { + if (!isAEConnected()) { $options = array(PDO::ATTR_EMULATE_PREPARES => true); } $stmt = $conn->prepare($query, $options); diff --git a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_datetime.phpt b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_datetime.phpt index 38f4c0dc..8236318f 100644 --- a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_datetime.phpt +++ b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_datetime.phpt @@ -29,7 +29,7 @@ try { print_r($row); //with emulate prepare and no bind param options - if (!isColEncrypted()) { + if (!isAEConnected()) { // emulate prepare is not supported in encrypted columns $options = array(PDO::ATTR_EMULATE_PREPARES => true); } diff --git a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_decimal.phpt b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_decimal.phpt index 48ffca2b..93899043 100644 --- a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_decimal.phpt +++ b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_decimal.phpt @@ -10,7 +10,7 @@ try { $conn = connect("", array(), PDO::ERRMODE_SILENT); $tableName = "number_types"; - if (!isColEncrypted()) { + if (!isAEConnected()) { createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float")); } else { // money is not supported for column encryption, use decimal(19,4) instead @@ -35,7 +35,7 @@ try { //with emulate prepare and no bind param options print_r("Prepare with emulate prepare and no bind param options:\n"); - if (!isColEncrypted()) { + if (!isAEConnected()) { // emulate prepare is not supported for encrypted columns $options = array(PDO::ATTR_EMULATE_PREPARES => true); } diff --git a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_float.phpt b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_float.phpt index 2ac8145c..eea43902 100644 --- a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_float.phpt +++ b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_float.phpt @@ -10,7 +10,7 @@ try { $conn = connect("", array(), PDO::ERRMODE_SILENT); $tableName = "number_types"; - if (!isColEncrypted()) { + if (!isAEConnected()) { createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float")); } else { // money is not supported for column encryption, use decimal(19,4) instead @@ -35,7 +35,7 @@ try { //with emulate prepare and no bind param options print_r("Prepare with emulate prepare and no bind param options:\n"); - if (!isColEncrypted()) { + if (!isAEConnected()) { // emulate prepare is not supported for encrypted columns $options = array(PDO::ATTR_EMULATE_PREPARES => true); } diff --git a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_int.phpt b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_int.phpt index 8950e244..88ec102d 100644 --- a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_int.phpt +++ b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_int.phpt @@ -29,7 +29,7 @@ try { // prepare with emulate prepare print_r("Prepare with emulate prepare and no bindParam options:\n"); - if (!isColEncrypted()) { + if (!isAEConnected()) { // emulate prepare is not supported for encrypted columns $options = array(PDO::ATTR_EMULATE_PREPARES => true); } @@ -39,7 +39,7 @@ try { $row = $stmt->fetch(PDO::FETCH_ASSOC); print_r($row); - if (!isColEncrypted()) { + if (!isAEConnected()) { // without emulate prepare, binding PARAM_INT with SQLSRV_ENCODING_SYSTEM is not allowed // thus the following will not be tested when Column Encryption is enabled diff --git a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_money.phpt b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_money.phpt index d152ed16..ee4b3699 100644 --- a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_money.phpt +++ b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_money.phpt @@ -10,7 +10,7 @@ try { $conn = connect("", array(), PDO::ERRMODE_SILENT); $tableName = "number_types"; - if (!isColEncrypted()) { + if (!isAEConnected()) { createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float")); } else { // money is not supported for column encryption, use decimal(19,4) instead @@ -35,7 +35,7 @@ try { //with emulate prepare and no bind param options print_r("Prepare with emulate prepare and no bind param options:\n"); - if (!isColEncrypted()) { + if (!isAEConnected()) { // emulate prepare is not supported for encrypted columns $options = array(PDO::ATTR_EMULATE_PREPARES => true); } diff --git a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_unicode.phpt b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_unicode.phpt index 52559e4d..19e9f8fd 100644 --- a/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_unicode.phpt +++ b/test/functional/pdo_sqlsrv/pdo_prepare_emulatePrepare_unicode.phpt @@ -48,7 +48,7 @@ try { //with emulate prepare and no bind param options print_r("Prepare with emulate prepare and no bindParam options:\n"); - if (!isColEncrypted()) { + if (!isAEConnected()) { $options = array(PDO::ATTR_EMULATE_PREPARES => true); } else { $options = array(PDO::ATTR_EMULATE_PREPARES => false);