You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@griffin.apache.org by gu...@apache.org on 2017/10/10 06:44:55 UTC

[1/4] incubator-griffin git commit: Update dsl modification

Repository: incubator-griffin
Updated Branches:
  refs/heads/master 43f9dbf7b -> 417c931f2


http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/test/scala/org/apache/griffin/measure/process/BatchProcessTest.scala
----------------------------------------------------------------------
diff --git a/measure/src/test/scala/org/apache/griffin/measure/process/BatchProcessTest.scala b/measure/src/test/scala/org/apache/griffin/measure/process/BatchProcessTest.scala
index a1e4854..845a051 100644
--- a/measure/src/test/scala/org/apache/griffin/measure/process/BatchProcessTest.scala
+++ b/measure/src/test/scala/org/apache/griffin/measure/process/BatchProcessTest.scala
@@ -1,146 +1,146 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
-*/
-package org.apache.griffin.measure.process
-
-import org.apache.griffin.measure.config.params.env._
-import org.apache.griffin.measure.config.params.user._
-import org.apache.griffin.measure.config.params._
-import org.apache.griffin.measure.config.reader.ParamReaderFactory
-import org.apache.griffin.measure.config.validator.AllParamValidator
-import org.apache.griffin.measure.log.Loggable
-import org.apache.griffin.measure.persist.PersistThreadPool
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-import org.scalatest.{BeforeAndAfter, FunSuite, Matchers}
-
-import scala.util.{Failure, Success, Try}
-
-@RunWith(classOf[JUnitRunner])
-class BatchProcessTest extends FunSuite with Matchers with BeforeAndAfter with Loggable {
-
-  val envFile = "src/test/resources/env-test.json"
-  val confFile = "src/test/resources/config-test-profiling.json"
-//  val confFile = "src/test/resources/config-test-accuracy.json"
-
-  val envFsType = "local"
-  val userFsType = "local"
-
-  val args = Array(envFile, confFile)
-
-  var allParam: AllParam = _
-
-  before {
-    // read param files
-    val envParam = readParamFile[EnvParam](envFile, envFsType) match {
-      case Success(p) => p
-      case Failure(ex) => {
-        error(ex.getMessage)
-        sys.exit(-2)
-      }
-    }
-    val userParam = readParamFile[UserParam](confFile, userFsType) match {
-      case Success(p) => p
-      case Failure(ex) => {
-        error(ex.getMessage)
-        sys.exit(-2)
-      }
-    }
-    allParam = AllParam(envParam, userParam)
-
-    // validate param files
-    validateParams(allParam) match {
-      case Failure(ex) => {
-        error(ex.getMessage)
-        sys.exit(-3)
-      }
-      case _ => {
-        info("params validation pass")
-      }
-    }
-  }
-
-  test ("batch process") {
-    val procType = ProcessType(allParam.userParam.procType)
-    val proc: DqProcess = procType match {
-      case BatchProcessType => BatchDqProcess(allParam)
-      case StreamingProcessType => StreamingDqProcess(allParam)
-      case _ => {
-        error(s"${procType} is unsupported process type!")
-        sys.exit(-4)
-      }
-    }
-
-    // process init
-    proc.init match {
-      case Success(_) => {
-        info("process init success")
-      }
-      case Failure(ex) => {
-        error(s"process init error: ${ex.getMessage}")
-        shutdown
-        sys.exit(-5)
-      }
-    }
-
-    // process run
-    proc.run match {
-      case Success(_) => {
-        info("process run success")
-      }
-      case Failure(ex) => {
-        error(s"process run error: ${ex.getMessage}")
-
-        if (proc.retriable) {
-          throw ex
-        } else {
-          shutdown
-          sys.exit(-5)
-        }
-      }
-    }
-
-    // process end
-    proc.end match {
-      case Success(_) => {
-        info("process end success")
-      }
-      case Failure(ex) => {
-        error(s"process end error: ${ex.getMessage}")
-        shutdown
-        sys.exit(-5)
-      }
-    }
-
-    shutdown
-  }
-
-  private def readParamFile[T <: Param](file: String, fsType: String)(implicit m : Manifest[T]): Try[T] = {
-    val paramReader = ParamReaderFactory.getParamReader(file, fsType)
-    paramReader.readConfig[T]
-  }
-
-  private def validateParams(allParam: AllParam): Try[Boolean] = {
-    val allParamValidator = AllParamValidator()
-    allParamValidator.validate(allParam)
-  }
-
-  private def shutdown(): Unit = {
-    PersistThreadPool.shutdown
-  }
-}
+///*
+//Licensed to the Apache Software Foundation (ASF) under one
+//or more contributor license agreements.  See the NOTICE file
+//distributed with this work for additional information
+//regarding copyright ownership.  The ASF licenses this file
+//to you 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.
+//*/
+//package org.apache.griffin.measure.process
+//
+//import org.apache.griffin.measure.config.params.env._
+//import org.apache.griffin.measure.config.params.user._
+//import org.apache.griffin.measure.config.params._
+//import org.apache.griffin.measure.config.reader.ParamReaderFactory
+//import org.apache.griffin.measure.config.validator.AllParamValidator
+//import org.apache.griffin.measure.log.Loggable
+//import org.apache.griffin.measure.persist.PersistThreadPool
+//import org.junit.runner.RunWith
+//import org.scalatest.junit.JUnitRunner
+//import org.scalatest.{BeforeAndAfter, FunSuite, Matchers}
+//
+//import scala.util.{Failure, Success, Try}
+//
+//@RunWith(classOf[JUnitRunner])
+//class BatchProcessTest extends FunSuite with Matchers with BeforeAndAfter with Loggable {
+//
+//  val envFile = "src/test/resources/env-test.json"
+//  val confFile = "src/test/resources/config-test-profiling.json"
+////  val confFile = "src/test/resources/config-test-accuracy.json"
+//
+//  val envFsType = "local"
+//  val userFsType = "local"
+//
+//  val args = Array(envFile, confFile)
+//
+//  var allParam: AllParam = _
+//
+//  before {
+//    // read param files
+//    val envParam = readParamFile[EnvParam](envFile, envFsType) match {
+//      case Success(p) => p
+//      case Failure(ex) => {
+//        error(ex.getMessage)
+//        sys.exit(-2)
+//      }
+//    }
+//    val userParam = readParamFile[UserParam](confFile, userFsType) match {
+//      case Success(p) => p
+//      case Failure(ex) => {
+//        error(ex.getMessage)
+//        sys.exit(-2)
+//      }
+//    }
+//    allParam = AllParam(envParam, userParam)
+//
+//    // validate param files
+//    validateParams(allParam) match {
+//      case Failure(ex) => {
+//        error(ex.getMessage)
+//        sys.exit(-3)
+//      }
+//      case _ => {
+//        info("params validation pass")
+//      }
+//    }
+//  }
+//
+//  test ("batch process") {
+//    val procType = ProcessType(allParam.userParam.procType)
+//    val proc: DqProcess = procType match {
+//      case BatchProcessType => BatchDqProcess(allParam)
+//      case StreamingProcessType => StreamingDqProcess(allParam)
+//      case _ => {
+//        error(s"${procType} is unsupported process type!")
+//        sys.exit(-4)
+//      }
+//    }
+//
+//    // process init
+//    proc.init match {
+//      case Success(_) => {
+//        info("process init success")
+//      }
+//      case Failure(ex) => {
+//        error(s"process init error: ${ex.getMessage}")
+//        shutdown
+//        sys.exit(-5)
+//      }
+//    }
+//
+//    // process run
+//    proc.run match {
+//      case Success(_) => {
+//        info("process run success")
+//      }
+//      case Failure(ex) => {
+//        error(s"process run error: ${ex.getMessage}")
+//
+//        if (proc.retriable) {
+//          throw ex
+//        } else {
+//          shutdown
+//          sys.exit(-5)
+//        }
+//      }
+//    }
+//
+//    // process end
+//    proc.end match {
+//      case Success(_) => {
+//        info("process end success")
+//      }
+//      case Failure(ex) => {
+//        error(s"process end error: ${ex.getMessage}")
+//        shutdown
+//        sys.exit(-5)
+//      }
+//    }
+//
+//    shutdown
+//  }
+//
+//  private def readParamFile[T <: Param](file: String, fsType: String)(implicit m : Manifest[T]): Try[T] = {
+//    val paramReader = ParamReaderFactory.getParamReader(file, fsType)
+//    paramReader.readConfig[T]
+//  }
+//
+//  private def validateParams(allParam: AllParam): Try[Boolean] = {
+//    val allParamValidator = AllParamValidator()
+//    allParamValidator.validate(allParam)
+//  }
+//
+//  private def shutdown(): Unit = {
+//    PersistThreadPool.shutdown
+//  }
+//}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/test/scala/org/apache/griffin/measure/process/JsonParseTest.scala
----------------------------------------------------------------------
diff --git a/measure/src/test/scala/org/apache/griffin/measure/process/JsonParseTest.scala b/measure/src/test/scala/org/apache/griffin/measure/process/JsonParseTest.scala
index b119d76..1273bcf 100644
--- a/measure/src/test/scala/org/apache/griffin/measure/process/JsonParseTest.scala
+++ b/measure/src/test/scala/org/apache/griffin/measure/process/JsonParseTest.scala
@@ -1,91 +1,249 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
-*/
-package org.apache.griffin.measure.process
-
-import org.apache.griffin.measure.config.params._
-import org.apache.griffin.measure.config.params.env._
-import org.apache.griffin.measure.config.params.user._
-import org.apache.griffin.measure.config.reader.ParamReaderFactory
-import org.apache.griffin.measure.config.validator.AllParamValidator
-import org.apache.griffin.measure.log.Loggable
-import org.apache.griffin.measure.persist.PersistThreadPool
-import org.apache.griffin.measure.process.engine.DataFrameOprs
-import org.apache.griffin.measure.utils.{HdfsUtil, JsonUtil}
-import org.apache.hadoop.hive.ql.exec.UDF
-import org.apache.spark.{SparkConf, SparkContext}
-import org.apache.spark.sql._
-import org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema
-import org.apache.spark.sql.expressions.UserDefinedAggregateFunction
-import org.apache.spark.sql.hive.HiveContext
-import org.apache.spark.sql.types._
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-import org.scalatest.{BeforeAndAfter, FunSuite, Matchers}
-
-import scala.collection.mutable.WrappedArray
-import scala.util.{Failure, Success, Try}
-
-@RunWith(classOf[JUnitRunner])
-class JsonParseTest extends FunSuite with Matchers with BeforeAndAfter with Loggable {
-
-  var sparkContext: SparkContext = _
-  var sqlContext: SQLContext = _
-
-  before {
-    val conf = new SparkConf().setAppName("test json").setMaster("local[*]")
-    sparkContext = new SparkContext(conf)
-    sparkContext.setLogLevel("WARN")
-//    sqlContext = new HiveContext(sparkContext)
-    sqlContext = new SQLContext(sparkContext)
-  }
-
-  test ("json test") {
-    // 0. prepare data
-//    val dt =
-//      """
-//        |{"name": "s1", "age": 12, "items": [1, 2, 3],
-//        |"subs": [{"id": 1, "type": "seed"}, {"id": 2, "type": "frog"}],
-//        |"inner": {"a": 1, "b": 2}, "jstr": "{\"s1\": \"aaa\", \"s2\": 123}"
-//        |}""".stripMargin
-//    val rdd0 = sparkContext.parallelize(Seq(dt)).map(Row(_))
-    val rdd0 = sparkContext.textFile("src/test/resources/input.msg").map(Row(_))
-
-    val vtp = StructField("value", StringType)
-    val df0 = sqlContext.createDataFrame(rdd0, StructType(Array(vtp)))
-    df0.registerTempTable("src")
-
-//    val fromJson2Array = (s: String) => {
-//      JsonUtil.fromJson[Seq[String]](s)
-//    }
-//    sqlContext.udf.register("from_json_to_array", fromJson2Array)
+///*
+//Licensed to the Apache Software Foundation (ASF) under one
+//or more contributor license agreements.  See the NOTICE file
+//distributed with this work for additional information
+//regarding copyright ownership.  The ASF licenses this file
+//to you 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.
+//*/
+//package org.apache.griffin.measure.process
+//
+//import org.apache.griffin.measure.config.params._
+//import org.apache.griffin.measure.config.params.env._
+//import org.apache.griffin.measure.config.params.user._
+//import org.apache.griffin.measure.config.reader.ParamReaderFactory
+//import org.apache.griffin.measure.config.validator.AllParamValidator
+//import org.apache.griffin.measure.log.Loggable
+//import org.apache.griffin.measure.persist.PersistThreadPool
+//import org.apache.griffin.measure.process.engine.DataFrameOprs
+//import org.apache.griffin.measure.utils.{HdfsUtil, JsonUtil}
+//import org.apache.hadoop.hive.ql.exec.UDF
+//import org.apache.spark.{SparkConf, SparkContext}
+//import org.apache.spark.sql._
+//import org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema
+//import org.apache.spark.sql.expressions.UserDefinedAggregateFunction
+//import org.apache.spark.sql.hive.HiveContext
+//import org.apache.spark.sql.types._
+//import org.junit.runner.RunWith
+//import org.scalatest.junit.JUnitRunner
+//import org.scalatest.{BeforeAndAfter, FunSuite, Matchers}
+//
+//import scala.collection.mutable.WrappedArray
+//import scala.util.{Failure, Success, Try}
+//
+//@RunWith(classOf[JUnitRunner])
+//class JsonParseTest extends FunSuite with Matchers with BeforeAndAfter with Loggable {
+//
+//  var sparkContext: SparkContext = _
+//  var sqlContext: SQLContext = _
+//
+//  before {
+//    val conf = new SparkConf().setAppName("test json").setMaster("local[*]")
+//    sparkContext = new SparkContext(conf)
+//    sparkContext.setLogLevel("WARN")
+////    sqlContext = new HiveContext(sparkContext)
+//    sqlContext = new SQLContext(sparkContext)
+//  }
+//
+//  test ("json test") {
+//    // 0. prepare data
+////    val dt =
+////      """
+////        |{"name": "s1", "age": 12, "items": [1, 2, 3],
+////        |"subs": [{"id": 1, "type": "seed"}, {"id": 2, "type": "frog"}],
+////        |"inner": {"a": 1, "b": 2}, "jstr": "{\"s1\": \"aaa\", \"s2\": 123}"
+////        |}""".stripMargin
+////    val rdd0 = sparkContext.parallelize(Seq(dt)).map(Row(_))
+//    val rdd0 = sparkContext.textFile("src/test/resources/input.msg").map(Row(_))
+//
+//    val vtp = StructField("value", StringType)
+//    val df0 = sqlContext.createDataFrame(rdd0, StructType(Array(vtp)))
+//    df0.registerTempTable("src")
+//
+////    val fromJson2Array = (s: String) => {
+////      JsonUtil.fromJson[Seq[String]](s)
+////    }
+////    sqlContext.udf.register("from_json_to_array", fromJson2Array)
+////
+////    val df2 = sqlContext.sql("SELECT explode(from_json_to_array(get_json_object(value, '$.seeds'))) as value FROM src")
+////    df2.printSchema
+////    df2.show(10)
+////    df2.registerTempTable("df2")
+//
 //
-//    val df2 = sqlContext.sql("SELECT explode(from_json_to_array(get_json_object(value, '$.seeds'))) as value FROM src")
+//
+//    // 1. read from json string to extracted json row
+////    val readSql = "SELECT value FROM src"
+////    val df = sqlContext.sql(readSql)
+////    val df = sqlContext.table("src")
+////    val rdd = df.map { row =>
+////      row.getAs[String]("value")
+////    }
+////    val df1 = sqlContext.read.json(rdd)
+////    df1.printSchema
+////    df1.show(10)
+////    df1.registerTempTable("df1")
+//    val details = Map[String, Any](("df.name" -> "src"))
+//    val df1 = DataFrameOprs.fromJson(sqlContext, details)
+//    df1.registerTempTable("df1")
+//
+//    // 2. extract json array into lines
+////    val rdd2 = df1.flatMap { row =>
+////      row.getAs[WrappedArray[String]]("seeds")
+////    }
+////    val df2 = sqlContext.read.json(rdd2)
+//    val df2 = sqlContext.sql("select explode(seeds) as value from df1")
+////    val tdf = sqlContext.sql("select name, age, explode(items) as item from df1")
+////    tdf.registerTempTable("tdf")
+////    val df2 = sqlContext.sql("select struct(name, age, item) as ttt from tdf")
 //    df2.printSchema
 //    df2.show(10)
 //    df2.registerTempTable("df2")
-
-
-
-    // 1. read from json string to extracted json row
-//    val readSql = "SELECT value FROM src"
+//    println(df2.count)
+//
+//    val sql1 = "SELECT value FROM df2"
+//    val df22 = sqlContext.sql(sql1)
+//    val rdd22 = df22.map { row =>
+//      row.getAs[String]("value")
+//    }
+//    import org.apache.spark.sql.functions._
+//    val df23 = sqlContext.read.json(rdd22)
+//    df23.registerTempTable("df23")
+////    df23.withColumn("par", monotonicallyIncreasingId)
+//
+//    val df24 = sqlContext.sql("SELECT url, cast(get_json_object(metadata, '$.tracker.crawlRequestCreateTS') as bigint) as ts FROM df23")
+//    df24.printSchema
+//    df24.show(10)
+//    df24.registerTempTable("df24")
+//    println(df24.count)
+//
+////    val df25 = sqlContext.sql("select ")
+//
+////
+////    // 3. extract json string into row
+//////    val df3 = sqlContext.sql("select cast(get_json_object(metadata, '$.tracker.crawlRequestCreateTS') as bigint), url from df2")
+////    val df3 = sqlContext.sql("select cast(get_json_object(get_json_object(value, '$.metadata'), '$.tracker.crawlRequestCreateTS') as bigint), get_json_object(value, '$.url') from df2")
+////    df3.printSchema()
+////    df3.show(10)
+////    println(df3.count)
+//
+//
+//
+////    val df5 = sqlContext.sql("select get_json_object(value, '$.subs') as subs from src")
+////    df5.printSchema()
+////    df5.show(10)
+////    df5.registerTempTable("df5")
+////    val rdd5 = df5.map { row =>
+////      row.getAs[String]("subs")
+////    }
+////    val df6 = sqlContext.read.json(rdd5)
+////    df6.printSchema
+////    df6.show(10)
+//
+//    // 2. extract json string to row
+////    val df2 = sqlContext.sql("select jstr from df1")
+////    val rdd2 = df2.map { row =>
+////      row.getAs[String]("jstr")
+////    }
+////    val df22 = sqlContext.read.json(rdd2)
+////    df22.printSchema
+////    df22.show(100)
+////    df22.registerTempTable("df2")
+////
+////    val df23 = sqlContext.sql("select json_tuple(jstr, 's1', 's2') from df1")
+////    df23.printSchema()
+////    df23.show(100)
+//
+//    // 3. extract json array into lines ??
+//
+//    // 3. flatmap from json row to json row
+////    val df3 = sqlContext.sql("select explode(subs) as sub, items from df1")
+////    df3.printSchema()
+////    df3.show(10)
+////    df3.registerTempTable("df3")
+////
+////    val df4 = sqlContext.sql("select explode(items) as item, sub from df3")
+////    df4.printSchema()
+////    df4.show(10)
+//
+////    sqlContext.udf.register("length", (s: WrappedArray[_]) => s.length)
+//    //
+//    //    val df2 = sqlContext.sql("SELECT inner from df1")
+//    //    df2.registerTempTable("df2")
+//    //    df2.printSchema
+//    //    df2.show(100)
+//
+////    def children(colname: String, df: DataFrame): Array[DataFrame] = {
+////      val parent = df.schema.fields.filter(_.name == colname).head
+////      println(parent)
+////      val fields: Array[StructField] = parent.dataType match {
+////        case x: StructType => x.fields
+////        case _ => Array.empty[StructField]
+////      }
+////      fields.map(x => col(s"$colname.${x.name}"))
+//////      fields.foreach(println)
+////    }
+//////
+////    children("inner", df2)
+////
+////    df2.select(children("bar", df): _*).printSchema
+//
+////    val df3 = sqlContext.sql("select inline(subs) from df1")
+////    df3.printSchema()
+////    df3.show(100)
+//
+////    val rdd2 = df2.flatMap { row =>
+////      row.getAs[GenericRowWithSchema]("inner") :: Nil
+////    }
+////
+////    rdd2.
+//
+////    val funcs = sqlContext.sql("show functions")
+////    funcs.printSchema()
+////    funcs.show(1000)
+////
+////    val desc = sqlContext.sql("describe function inline")
+////    desc.printSchema()
+////    desc.show(100)
+//
+//    //
+//
+//  }
+//
+//  test ("json test 2") {
+//    val rdd0 = sparkContext.textFile("src/test/resources/output.msg").map(Row(_))
+//
+//    val vtp = StructField("value", StringType)
+//    val df0 = sqlContext.createDataFrame(rdd0, StructType(Array(vtp)))
+//    df0.registerTempTable("tgt")
+//
+////    val fromJson2StringArray = (s: String) => {
+////      val seq = JsonUtil.fromJson[Seq[Any]](s)
+////      seq.map(i => JsonUtil.toJson(i))
+////    }
+////    sqlContext.udf.register("from_json_to_string_array", fromJson2StringArray)
+////
+////    val df2 = sqlContext.sql("SELECT from_json_to_string_array(get_json_object(value, '$.groups[0].attrsList')) as value FROM tgt")
+////    df2.printSchema()
+////    df2.show(10)
+////    df2.registerTempTable("df2")
+////
+////    val indexOfStringArray = (sa: String, )
+//
+//
+//    // 1. read from json string to extracted json row
+//    val readSql = "SELECT value FROM tgt"
 //    val df = sqlContext.sql(readSql)
-//    val df = sqlContext.table("src")
 //    val rdd = df.map { row =>
 //      row.getAs[String]("value")
 //    }
@@ -93,346 +251,93 @@ class JsonParseTest extends FunSuite with Matchers with BeforeAndAfter with Logg
 //    df1.printSchema
 //    df1.show(10)
 //    df1.registerTempTable("df1")
-    val details = Map[String, Any](("df.name" -> "src"))
-    val df1 = DataFrameOprs.fromJson(sqlContext, details)
-    df1.registerTempTable("df1")
-
-    // 2. extract json array into lines
-//    val rdd2 = df1.flatMap { row =>
-//      row.getAs[WrappedArray[String]]("seeds")
-//    }
-//    val df2 = sqlContext.read.json(rdd2)
-    val df2 = sqlContext.sql("select explode(seeds) as value from df1")
-//    val tdf = sqlContext.sql("select name, age, explode(items) as item from df1")
-//    tdf.registerTempTable("tdf")
-//    val df2 = sqlContext.sql("select struct(name, age, item) as ttt from tdf")
-    df2.printSchema
-    df2.show(10)
-    df2.registerTempTable("df2")
-    println(df2.count)
-
-    val sql1 = "SELECT value FROM df2"
-    val df22 = sqlContext.sql(sql1)
-    val rdd22 = df22.map { row =>
-      row.getAs[String]("value")
-    }
-    import org.apache.spark.sql.functions._
-    val df23 = sqlContext.read.json(rdd22)
-    df23.registerTempTable("df23")
-//    df23.withColumn("par", monotonicallyIncreasingId)
-
-    val df24 = sqlContext.sql("SELECT url, cast(get_json_object(metadata, '$.tracker.crawlRequestCreateTS') as bigint) as ts FROM df23")
-    df24.printSchema
-    df24.show(10)
-    df24.registerTempTable("df24")
-    println(df24.count)
-
-//    val df25 = sqlContext.sql("select ")
-
-//
-//    // 3. extract json string into row
-////    val df3 = sqlContext.sql("select cast(get_json_object(metadata, '$.tracker.crawlRequestCreateTS') as bigint), url from df2")
-//    val df3 = sqlContext.sql("select cast(get_json_object(get_json_object(value, '$.metadata'), '$.tracker.crawlRequestCreateTS') as bigint), get_json_object(value, '$.url') from df2")
-//    df3.printSchema()
-//    df3.show(10)
-//    println(df3.count)
-
-
-
-//    val df5 = sqlContext.sql("select get_json_object(value, '$.subs') as subs from src")
-//    df5.printSchema()
-//    df5.show(10)
-//    df5.registerTempTable("df5")
-//    val rdd5 = df5.map { row =>
-//      row.getAs[String]("subs")
-//    }
-//    val df6 = sqlContext.read.json(rdd5)
-//    df6.printSchema
-//    df6.show(10)
-
-    // 2. extract json string to row
-//    val df2 = sqlContext.sql("select jstr from df1")
-//    val rdd2 = df2.map { row =>
-//      row.getAs[String]("jstr")
+//
+//
+//    val df2 = sqlContext.sql("select groups[0].attrsList as attrs from df1")
+//    df2.printSchema
+//    df2.show(10)
+//    df2.registerTempTable("df2")
+//    println(df2.count)
+//
+//    val indexOf = (arr: Seq[String], v: String) => {
+//      arr.indexOf(v)
 //    }
-//    val df22 = sqlContext.read.json(rdd2)
-//    df22.printSchema
-//    df22.show(100)
-//    df22.registerTempTable("df2")
-//
-//    val df23 = sqlContext.sql("select json_tuple(jstr, 's1', 's2') from df1")
-//    df23.printSchema()
-//    df23.show(100)
-
-    // 3. extract json array into lines ??
-
-    // 3. flatmap from json row to json row
-//    val df3 = sqlContext.sql("select explode(subs) as sub, items from df1")
+//    sqlContext.udf.register("index_of", indexOf)
+//
+//    val df3 = sqlContext.sql("select attrs.values[index_of(attrs.name, 'URL')][0] as url, cast(get_json_object(attrs.values[index_of(attrs.name, 'CRAWLMETADATA')][0], '$.tracker.crawlRequestCreateTS') as bigint) as ts from df2")
 //    df3.printSchema()
 //    df3.show(10)
 //    df3.registerTempTable("df3")
+//  }
 //
-//    val df4 = sqlContext.sql("select explode(items) as item, sub from df3")
-//    df4.printSchema()
-//    df4.show(10)
-
-//    sqlContext.udf.register("length", (s: WrappedArray[_]) => s.length)
-    //
-    //    val df2 = sqlContext.sql("SELECT inner from df1")
-    //    df2.registerTempTable("df2")
-    //    df2.printSchema
-    //    df2.show(100)
-
-//    def children(colname: String, df: DataFrame): Array[DataFrame] = {
-//      val parent = df.schema.fields.filter(_.name == colname).head
-//      println(parent)
-//      val fields: Array[StructField] = parent.dataType match {
-//        case x: StructType => x.fields
-//        case _ => Array.empty[StructField]
-//      }
-//      fields.map(x => col(s"$colname.${x.name}"))
-////      fields.foreach(println)
-//    }
-////
-//    children("inner", df2)
+//  test ("testing") {
+//    val dt =
+//      """
+//        |{"name": "age", "age": 12, "items": [1, 2, 3],
+//        |"subs": [{"id": 1, "type": "seed"}, {"id": 2, "type": "frog"}],
+//        |"inner": {"a": 1, "b": 2}, "jstr": "{\"s1\": \"aaa\", \"s2\": 123}", "b": true
+//        |}""".stripMargin
+//    val rdd = sparkContext.parallelize(Seq(dt)).map(Row(_))
+//    val vtp = StructField("value", StringType)
+//    val df = sqlContext.createDataFrame(rdd, StructType(Array(vtp)))
+//    df.registerTempTable("df")
 //
-//    df2.select(children("bar", df): _*).printSchema
-
-//    val df3 = sqlContext.sql("select inline(subs) from df1")
-//    df3.printSchema()
-//    df3.show(100)
-
-//    val rdd2 = df2.flatMap { row =>
-//      row.getAs[GenericRowWithSchema]("inner") :: Nil
-//    }
+//    val df1 = sqlContext.read.json(sqlContext.sql("select * from df").map(r => r.getAs[String]("value")))
+//    df1.printSchema()
+//    df1.show(10)
+//    df1.registerTempTable("df1")
 //
-//    rdd2.
-
-//    val funcs = sqlContext.sql("show functions")
-//    funcs.printSchema()
-//    funcs.show(1000)
-//
-//    val desc = sqlContext.sql("describe function inline")
-//    desc.printSchema()
-//    desc.show(100)
-
-    //
-
-  }
-
-  test ("json test 2") {
-    val rdd0 = sparkContext.textFile("src/test/resources/output.msg").map(Row(_))
-
-    val vtp = StructField("value", StringType)
-    val df0 = sqlContext.createDataFrame(rdd0, StructType(Array(vtp)))
-    df0.registerTempTable("tgt")
-
-//    val fromJson2StringArray = (s: String) => {
-//      val seq = JsonUtil.fromJson[Seq[Any]](s)
-//      seq.map(i => JsonUtil.toJson(i))
+//    val test = (s: String) => {
+//      s.toInt
 //    }
-//    sqlContext.udf.register("from_json_to_string_array", fromJson2StringArray)
+//    sqlContext.udf.register("to_int", test)
 //
-//    val df2 = sqlContext.sql("SELECT from_json_to_string_array(get_json_object(value, '$.groups[0].attrsList')) as value FROM tgt")
+//    val df2 = sqlContext.sql("select (b) as aa, inner.a from df1 where age = to_int(\"12\")")
 //    df2.printSchema()
 //    df2.show(10)
+//  }
+//
+//  test ("test input only sql") {
+//    val rdd0 = sparkContext.textFile("src/test/resources/input.msg").map(Row(_))
+//
+//    val vtp = StructField("value", StringType)
+//    val df0 = sqlContext.createDataFrame(rdd0, StructType(Array(vtp)))
+//    df0.registerTempTable("src")
+//    df0.show(10)
+//
+//    // 1. read from json string to extracted json row
+//    val df1 = sqlContext.sql("SELECT get_json_object(value, '$.seeds') as seeds FROM src")
+//    df1.printSchema
+//    df1.show(10)
+//    df1.registerTempTable("df1")
+//
+//    val json2StringArray: (String) => Seq[String] = (s: String) => {
+//      val seq = JsonUtil.fromJson[Seq[String]](s)
+////      seq.map(i => JsonUtil.toJson(i))
+//      seq
+//    }
+//    sqlContext.udf.register("json_to_string_array", json2StringArray)
+//
+//    val df2 = sqlContext.sql("SELECT explode(json_to_string_array(seeds)) as seed FROM df1")
+//    df2.printSchema
+//    df2.show(10)
 //    df2.registerTempTable("df2")
 //
-//    val indexOfStringArray = (sa: String, )
-
-
-    // 1. read from json string to extracted json row
-    val readSql = "SELECT value FROM tgt"
-    val df = sqlContext.sql(readSql)
-    val rdd = df.map { row =>
-      row.getAs[String]("value")
-    }
-    val df1 = sqlContext.read.json(rdd)
-    df1.printSchema
-    df1.show(10)
-    df1.registerTempTable("df1")
-
-
-    val df2 = sqlContext.sql("select groups[0].attrsList as attrs from df1")
-    df2.printSchema
-    df2.show(10)
-    df2.registerTempTable("df2")
-    println(df2.count)
-
-    val indexOf = (arr: Seq[String], v: String) => {
-      arr.indexOf(v)
-    }
-    sqlContext.udf.register("index_of", indexOf)
-
-    val df3 = sqlContext.sql("select attrs.values[index_of(attrs.name, 'URL')][0] as url, cast(get_json_object(attrs.values[index_of(attrs.name, 'CRAWLMETADATA')][0], '$.tracker.crawlRequestCreateTS') as bigint) as ts from df2")
-    df3.printSchema()
-    df3.show(10)
-    df3.registerTempTable("df3")
-  }
-
-  test ("testing") {
-    val dt =
-      """
-        |{"name": "age", "age": 12, "items": [1, 2, 3],
-        |"subs": [{"id": 1, "type": "seed"}, {"id": 2, "type": "frog"}],
-        |"inner": {"a": 1, "b": 2}, "jstr": "{\"s1\": \"aaa\", \"s2\": 123}", "b": true
-        |}""".stripMargin
-    val rdd = sparkContext.parallelize(Seq(dt)).map(Row(_))
-    val vtp = StructField("value", StringType)
-    val df = sqlContext.createDataFrame(rdd, StructType(Array(vtp)))
-    df.registerTempTable("df")
-
-    val df1 = sqlContext.read.json(sqlContext.sql("select * from df").map(r => r.getAs[String]("value")))
-    df1.printSchema()
-    df1.show(10)
-    df1.registerTempTable("df1")
-
-    val test = (s: String) => {
-      s.toInt
-    }
-    sqlContext.udf.register("to_int", test)
-
-    val df2 = sqlContext.sql("select (b) as aa, inner.a from df1 where age = to_int(\"12\")")
-    df2.printSchema()
-    df2.show(10)
-  }
-
-  test ("test input only sql") {
-    val rdd0 = sparkContext.textFile("src/test/resources/input.msg").map(Row(_))
-
-    val vtp = StructField("value", StringType)
-    val df0 = sqlContext.createDataFrame(rdd0, StructType(Array(vtp)))
-    df0.registerTempTable("src")
-    df0.show(10)
-
-    // 1. read from json string to extracted json row
-    val df1 = sqlContext.sql("SELECT get_json_object(value, '$.seeds') as seeds FROM src")
-    df1.printSchema
-    df1.show(10)
-    df1.registerTempTable("df1")
-
-    val json2StringArray: (String) => Seq[String] = (s: String) => {
-      val seq = JsonUtil.fromJson[Seq[String]](s)
-//      seq.map(i => JsonUtil.toJson(i))
-      seq
-    }
-    sqlContext.udf.register("json_to_string_array", json2StringArray)
-
-    val df2 = sqlContext.sql("SELECT explode(json_to_string_array(seeds)) as seed FROM df1")
-    df2.printSchema
-    df2.show(10)
-    df2.registerTempTable("df2")
-
-
-    val df3 = sqlContext.sql("SELECT get_json_object(seed, '$.url') as url, cast(get_json_object(get_json_object(seed, '$.metadata'), '$.tracker.crawlRequestCreateTS') as bigint) as ts FROM df2")
-    df3.printSchema
-    df3.show(10)
-  }
-
-  test ("test output only sql") {
-    val rdd0 = sparkContext.textFile("src/test/resources/output.msg").map(Row(_))
-
-    val vtp = StructField("value", StringType)
-    val df0 = sqlContext.createDataFrame(rdd0, StructType(Array(vtp)))
-    df0.registerTempTable("tgt")
-    df0.printSchema()
-    df0.show(10)
-
-    val json2StringArray: (String) => Seq[String] = (s: String) => {
-      JsonUtil.fromJson[Seq[String]](s)
-    }
-    sqlContext.udf.register("json_to_string_array", json2StringArray)
-
-    val json2StringJsonArray: (String) => Seq[String] = (s: String) => {
-      val seq = JsonUtil.fromJson[Seq[Any]](s)
-      seq.map(i => JsonUtil.toJson(i))
-    }
-    sqlContext.udf.register("json_to_string_json_array", json2StringJsonArray)
-
-    val indexOf = (arr: Seq[String], v: String) => {
-      arr.indexOf(v)
-    }
-    sqlContext.udf.register("index_of", indexOf)
-
-    val indexOfField = (arr: Seq[String], k: String, v: String) => {
-      val seq = arr.flatMap { item =>
-        JsonUtil.fromJson[Map[String, Any]](item).get(k)
-      }
-      seq.indexOf(v)
-    }
-    sqlContext.udf.register("index_of_field", indexOfField)
-
-    // 1. read from json string to extracted json row
-    val df1 = sqlContext.sql("SELECT get_json_object(value, '$.groups[0].attrsList') as attrs FROM tgt")
-    df1.printSchema
-    df1.show(10)
-    df1.registerTempTable("df1")
-
-    val df2 = sqlContext.sql("SELECT json_to_string_json_array(attrs) as attrs FROM df1")
-    df2.printSchema()
-    df2.show(10)
-    df2.registerTempTable("df2")
-
-    val df3 = sqlContext.sql("SELECT attrs[index_of_field(attrs, 'name', 'URL')] as attr1, attrs[index_of_field(attrs, 'name', 'CRAWLMETADATA')] as attr2 FROM df2")
-    df3.printSchema()
-    df3.show(10)
-    df3.registerTempTable("df3")
-
-    val df4 = sqlContext.sql("SELECT json_to_string_array(get_json_object(attr1, '$.values'))[0], cast(get_json_object(json_to_string_array(get_json_object(attr2, '$.values'))[0], '$.tracker.crawlRequestCreateTS') as bigint) FROM df3")
-    df4.printSchema()
-    df4.show(10)
-  }
-
-  test ("test from json") {
-    val fromJson2Map = (str: String) => {
-      val a = JsonUtil.fromJson[Map[String, Any]](str)
-      a.mapValues { v =>
-        v match {
-          case t: String => t
-          case _ => JsonUtil.toJson(v)
-        }
-      }
-    }
-    sqlContext.udf.register("from_json_to_map", fromJson2Map)
-
-    val fromJson2Array = (str: String) => {
-      val a = JsonUtil.fromJson[Seq[Any]](str)
-      a.map { v =>
-        v match {
-          case t: String => t
-          case _ => JsonUtil.toJson(v)
-        }
-      }
-    }
-    sqlContext.udf.register("from_json_to_array", fromJson2Array)
-
-    // ========================
-
-    val srdd = sparkContext.textFile("src/test/resources/input.msg").map(Row(_))
-    val svtp = StructField("value", StringType)
-    val sdf0 = sqlContext.createDataFrame(srdd, StructType(Array(svtp)))
-    sdf0.registerTempTable("sdf0")
-    sdf0.show(10)
-
-    // 1. read from json string to extracted json row
-    val sdf1 = sqlContext.sql("SELECT explode(from_json_to_array(get_json_object(value, '$.seeds'))) as seed FROM sdf0")
-    sdf1.printSchema
-    sdf1.show(10)
-    sdf1.registerTempTable("sdf1")
-
-    val sdf2 = sqlContext.sql("SELECT get_json_object(seed, '$.url') as url, cast(get_json_object(get_json_object(seed, '$.metadata'), '$.tracker.crawlRequestCreateTS') as bigint) as ts FROM sdf1")
-    sdf2.printSchema
-    sdf2.show(10)
-
-    // ---------------------------------------
-
-    val trdd = sparkContext.textFile("src/test/resources/output.msg").map(Row(_))
-    val tvtp = StructField("value", StringType)
-    val tdf0 = sqlContext.createDataFrame(trdd, StructType(Array(tvtp)))
-    tdf0.registerTempTable("tdf0")
-    tdf0.printSchema()
-    tdf0.show(10)
-
+//
+//    val df3 = sqlContext.sql("SELECT get_json_object(seed, '$.url') as url, cast(get_json_object(get_json_object(seed, '$.metadata'), '$.tracker.crawlRequestCreateTS') as bigint) as ts FROM df2")
+//    df3.printSchema
+//    df3.show(10)
+//  }
+//
+//  test ("test output only sql") {
+//    val rdd0 = sparkContext.textFile("src/test/resources/output.msg").map(Row(_))
+//
+//    val vtp = StructField("value", StringType)
+//    val df0 = sqlContext.createDataFrame(rdd0, StructType(Array(vtp)))
+//    df0.registerTempTable("tgt")
+//    df0.printSchema()
+//    df0.show(10)
+//
 //    val json2StringArray: (String) => Seq[String] = (s: String) => {
 //      JsonUtil.fromJson[Seq[String]](s)
 //    }
@@ -449,83 +354,178 @@ class JsonParseTest extends FunSuite with Matchers with BeforeAndAfter with Logg
 //    }
 //    sqlContext.udf.register("index_of", indexOf)
 //
-    val indexOfField = (arr: Seq[String], k: String, v: String) => {
-      val seq = arr.flatMap { item =>
-        JsonUtil.fromJson[Map[String, Any]](item).get(k)
-      }
-      seq.indexOf(v)
-    }
-    sqlContext.udf.register("index_of_field", indexOfField)
-
-    // 1. read from json string to extracted json row
-//    val df1 = sqlContext.sql("SELECT get_json_object(value, '$.groups[0].attrsList') as attrs FROM tdf0")
-    val tdf1 = sqlContext.sql("SELECT from_json_to_array(get_json_object(value, '$.groups[0].attrsList')) as attrs FROM tdf0")
-    tdf1.printSchema
-    tdf1.show(10)
-    tdf1.registerTempTable("tdf1")
-
-//    val tdf2 = sqlContext.sql("SELECT attrs[index_of_field(attrs, 'name', 'URL')] as attr1, attrs[index_of_field(attrs, 'name', 'CRAWLMETADATA')] as attr2 FROM tdf1")
-//    tdf2.printSchema()
-//    tdf2.show(10)
-//    tdf2.registerTempTable("tdf2")
-
-    val tdf3 = sqlContext.sql("SELECT from_json_to_array(get_json_object(attrs[index_of_field(attrs, 'name', 'URL')], '$.values'))[0] as url, cast(get_json_object(from_json_to_array(get_json_object(attrs[index_of_field(attrs, 'name', 'CRAWLMETADATA')], '$.values'))[0], '$.tracker.crawlRequestCreateTS') as bigint) as ts FROM tdf1")
-    tdf3.printSchema()
-    tdf3.show(10)
-  }
-
-  test ("sql functions") {
-    val functions = sqlContext.sql("show functions")
-    functions.printSchema()
-    functions.show(10)
-
-    val functionNames = functions.map(_.getString(0)).collect
-    functionNames.foreach(println)
-  }
-
-  test ("test text file read") {
-    val partitionPaths = Seq[String](
-      "hdfs://localhost/griffin/streaming/dump/source/418010/25080625/1504837518000",
-      "hdfs://localhost/griffin/streaming/dump/target/418010/25080625/1504837518000")
-    val df = sqlContext.read.json(partitionPaths: _*)
-    df.printSchema()
-    df.show(10)
-  }
-
-  test ("list paths") {
-    val filePath = "hdfs://localhost/griffin/streaming/dump/source"
-    val partitionRanges = List[(Long, Long)]((0, 0), (-2, 0))
-    val partitionPaths = listPathsBetweenRanges(filePath :: Nil, partitionRanges)
-    println(partitionPaths)
-  }
-
-  private def listPathsBetweenRanges(paths: List[String],
-                                     partitionRanges: List[(Long, Long)]
-                                    ): List[String] = {
-    partitionRanges match {
-      case Nil => paths
-      case head :: tail => {
-        val (lb, ub) = head
-        val curPaths = paths.flatMap { path =>
-          val names = HdfsUtil.listSubPathsByType(path, "dir").toList
-          println(names)
-          names.filter { name =>
-            str2Long(name) match {
-              case Some(t) => (t >= lb) && (t <= ub)
-              case _ => false
-            }
-          }.map(HdfsUtil.getHdfsFilePath(path, _))
-        }
-        listPathsBetweenRanges(curPaths, tail)
-      }
-    }
-  }
-
-  private def str2Long(str: String): Option[Long] = {
-    try {
-      Some(str.toLong)
-    } catch {
-      case e: Throwable => None
-    }
-  }
-}
\ No newline at end of file
+//    val indexOfField = (arr: Seq[String], k: String, v: String) => {
+//      val seq = arr.flatMap { item =>
+//        JsonUtil.fromJson[Map[String, Any]](item).get(k)
+//      }
+//      seq.indexOf(v)
+//    }
+//    sqlContext.udf.register("index_of_field", indexOfField)
+//
+//    // 1. read from json string to extracted json row
+//    val df1 = sqlContext.sql("SELECT get_json_object(value, '$.groups[0].attrsList') as attrs FROM tgt")
+//    df1.printSchema
+//    df1.show(10)
+//    df1.registerTempTable("df1")
+//
+//    val df2 = sqlContext.sql("SELECT json_to_string_json_array(attrs) as attrs FROM df1")
+//    df2.printSchema()
+//    df2.show(10)
+//    df2.registerTempTable("df2")
+//
+//    val df3 = sqlContext.sql("SELECT attrs[index_of_field(attrs, 'name', 'URL')] as attr1, attrs[index_of_field(attrs, 'name', 'CRAWLMETADATA')] as attr2 FROM df2")
+//    df3.printSchema()
+//    df3.show(10)
+//    df3.registerTempTable("df3")
+//
+//    val df4 = sqlContext.sql("SELECT json_to_string_array(get_json_object(attr1, '$.values'))[0], cast(get_json_object(json_to_string_array(get_json_object(attr2, '$.values'))[0], '$.tracker.crawlRequestCreateTS') as bigint) FROM df3")
+//    df4.printSchema()
+//    df4.show(10)
+//  }
+//
+//  test ("test from json") {
+//    val fromJson2Map = (str: String) => {
+//      val a = JsonUtil.fromJson[Map[String, Any]](str)
+//      a.mapValues { v =>
+//        v match {
+//          case t: String => t
+//          case _ => JsonUtil.toJson(v)
+//        }
+//      }
+//    }
+//    sqlContext.udf.register("from_json_to_map", fromJson2Map)
+//
+//    val fromJson2Array = (str: String) => {
+//      val a = JsonUtil.fromJson[Seq[Any]](str)
+//      a.map { v =>
+//        v match {
+//          case t: String => t
+//          case _ => JsonUtil.toJson(v)
+//        }
+//      }
+//    }
+//    sqlContext.udf.register("from_json_to_array", fromJson2Array)
+//
+//    // ========================
+//
+//    val srdd = sparkContext.textFile("src/test/resources/input.msg").map(Row(_))
+//    val svtp = StructField("value", StringType)
+//    val sdf0 = sqlContext.createDataFrame(srdd, StructType(Array(svtp)))
+//    sdf0.registerTempTable("sdf0")
+//    sdf0.show(10)
+//
+//    // 1. read from json string to extracted json row
+//    val sdf1 = sqlContext.sql("SELECT explode(from_json_to_array(get_json_object(value, '$.seeds'))) as seed FROM sdf0")
+//    sdf1.printSchema
+//    sdf1.show(10)
+//    sdf1.registerTempTable("sdf1")
+//
+//    val sdf2 = sqlContext.sql("SELECT get_json_object(seed, '$.url') as url, cast(get_json_object(get_json_object(seed, '$.metadata'), '$.tracker.crawlRequestCreateTS') as bigint) as ts FROM sdf1")
+//    sdf2.printSchema
+//    sdf2.show(10)
+//
+//    // ---------------------------------------
+//
+//    val trdd = sparkContext.textFile("src/test/resources/output.msg").map(Row(_))
+//    val tvtp = StructField("value", StringType)
+//    val tdf0 = sqlContext.createDataFrame(trdd, StructType(Array(tvtp)))
+//    tdf0.registerTempTable("tdf0")
+//    tdf0.printSchema()
+//    tdf0.show(10)
+//
+////    val json2StringArray: (String) => Seq[String] = (s: String) => {
+////      JsonUtil.fromJson[Seq[String]](s)
+////    }
+////    sqlContext.udf.register("json_to_string_array", json2StringArray)
+////
+////    val json2StringJsonArray: (String) => Seq[String] = (s: String) => {
+////      val seq = JsonUtil.fromJson[Seq[Any]](s)
+////      seq.map(i => JsonUtil.toJson(i))
+////    }
+////    sqlContext.udf.register("json_to_string_json_array", json2StringJsonArray)
+////
+////    val indexOf = (arr: Seq[String], v: String) => {
+////      arr.indexOf(v)
+////    }
+////    sqlContext.udf.register("index_of", indexOf)
+////
+//    val indexOfField = (arr: Seq[String], k: String, v: String) => {
+//      val seq = arr.flatMap { item =>
+//        JsonUtil.fromJson[Map[String, Any]](item).get(k)
+//      }
+//      seq.indexOf(v)
+//    }
+//    sqlContext.udf.register("index_of_field", indexOfField)
+//
+//    // 1. read from json string to extracted json row
+////    val df1 = sqlContext.sql("SELECT get_json_object(value, '$.groups[0].attrsList') as attrs FROM tdf0")
+//    val tdf1 = sqlContext.sql("SELECT from_json_to_array(get_json_object(value, '$.groups[0].attrsList')) as attrs FROM tdf0")
+//    tdf1.printSchema
+//    tdf1.show(10)
+//    tdf1.registerTempTable("tdf1")
+//
+////    val tdf2 = sqlContext.sql("SELECT attrs[index_of_field(attrs, 'name', 'URL')] as attr1, attrs[index_of_field(attrs, 'name', 'CRAWLMETADATA')] as attr2 FROM tdf1")
+////    tdf2.printSchema()
+////    tdf2.show(10)
+////    tdf2.registerTempTable("tdf2")
+//
+//    val tdf3 = sqlContext.sql("SELECT from_json_to_array(get_json_object(attrs[index_of_field(attrs, 'name', 'URL')], '$.values'))[0] as url, cast(get_json_object(from_json_to_array(get_json_object(attrs[index_of_field(attrs, 'name', 'CRAWLMETADATA')], '$.values'))[0], '$.tracker.crawlRequestCreateTS') as bigint) as ts FROM tdf1")
+//    tdf3.printSchema()
+//    tdf3.show(10)
+//  }
+//
+//  test ("sql functions") {
+//    val functions = sqlContext.sql("show functions")
+//    functions.printSchema()
+//    functions.show(10)
+//
+//    val functionNames = functions.map(_.getString(0)).collect
+//    functionNames.foreach(println)
+//  }
+//
+//  test ("test text file read") {
+//    val partitionPaths = Seq[String](
+//      "hdfs://localhost/griffin/streaming/dump/source/418010/25080625/1504837518000",
+//      "hdfs://localhost/griffin/streaming/dump/target/418010/25080625/1504837518000")
+//    val df = sqlContext.read.json(partitionPaths: _*)
+//    df.printSchema()
+//    df.show(10)
+//  }
+//
+//  test ("list paths") {
+//    val filePath = "hdfs://localhost/griffin/streaming/dump/source"
+//    val partitionRanges = List[(Long, Long)]((0, 0), (-2, 0))
+//    val partitionPaths = listPathsBetweenRanges(filePath :: Nil, partitionRanges)
+//    println(partitionPaths)
+//  }
+//
+//  private def listPathsBetweenRanges(paths: List[String],
+//                                     partitionRanges: List[(Long, Long)]
+//                                    ): List[String] = {
+//    partitionRanges match {
+//      case Nil => paths
+//      case head :: tail => {
+//        val (lb, ub) = head
+//        val curPaths = paths.flatMap { path =>
+//          val names = HdfsUtil.listSubPathsByType(path, "dir").toList
+//          println(names)
+//          names.filter { name =>
+//            str2Long(name) match {
+//              case Some(t) => (t >= lb) && (t <= ub)
+//              case _ => false
+//            }
+//          }.map(HdfsUtil.getHdfsFilePath(path, _))
+//        }
+//        listPathsBetweenRanges(curPaths, tail)
+//      }
+//    }
+//  }
+//
+//  private def str2Long(str: String): Option[Long] = {
+//    try {
+//      Some(str.toLong)
+//    } catch {
+//      case e: Throwable => None
+//    }
+//  }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/test/scala/org/apache/griffin/measure/process/StreamingProcessTest.scala
----------------------------------------------------------------------
diff --git a/measure/src/test/scala/org/apache/griffin/measure/process/StreamingProcessTest.scala b/measure/src/test/scala/org/apache/griffin/measure/process/StreamingProcessTest.scala
index 07b7c5e..caecc9c 100644
--- a/measure/src/test/scala/org/apache/griffin/measure/process/StreamingProcessTest.scala
+++ b/measure/src/test/scala/org/apache/griffin/measure/process/StreamingProcessTest.scala
@@ -1,147 +1,147 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
-*/
-package org.apache.griffin.measure.process
-
-import org.apache.griffin.measure.config.params._
-import org.apache.griffin.measure.config.params.env._
-import org.apache.griffin.measure.config.params.user._
-import org.apache.griffin.measure.config.reader.ParamReaderFactory
-import org.apache.griffin.measure.config.validator.AllParamValidator
-import org.apache.griffin.measure.log.Loggable
-import org.apache.griffin.measure.persist.PersistThreadPool
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-import org.scalatest.{BeforeAndAfter, FunSuite, Matchers}
-
-import scala.util.{Failure, Success, Try}
-
-@RunWith(classOf[JUnitRunner])
-class StreamingProcessTest extends FunSuite with Matchers with BeforeAndAfter with Loggable {
-
-  val envFile = "src/test/resources/env-streaming.json"
-//  val confFile = "src/test/resources/config-test-accuracy-streaming-multids.json"
-  val confFile = "src/test/resources/config-test-accuracy-streaming.json"
-//  val confFile = "src/test/resources/config-test-profiling-streaming.json"
-
-  val envFsType = "local"
-  val userFsType = "local"
-
-  val args = Array(envFile, confFile)
-
-  var allParam: AllParam = _
-
-  before {
-    // read param files
-    val envParam = readParamFile[EnvParam](envFile, envFsType) match {
-      case Success(p) => p
-      case Failure(ex) => {
-        error(ex.getMessage)
-        sys.exit(-2)
-      }
-    }
-    val userParam = readParamFile[UserParam](confFile, userFsType) match {
-      case Success(p) => p
-      case Failure(ex) => {
-        error(ex.getMessage)
-        sys.exit(-2)
-      }
-    }
-    allParam = AllParam(envParam, userParam)
-
-    // validate param files
-    validateParams(allParam) match {
-      case Failure(ex) => {
-        error(ex.getMessage)
-        sys.exit(-3)
-      }
-      case _ => {
-        info("params validation pass")
-      }
-    }
-  }
-
-  test ("streaming process") {
-    val procType = ProcessType(allParam.userParam.procType)
-    val proc: DqProcess = procType match {
-      case BatchProcessType => BatchDqProcess(allParam)
-      case StreamingProcessType => StreamingDqProcess(allParam)
-      case _ => {
-        error(s"${procType} is unsupported process type!")
-        sys.exit(-4)
-      }
-    }
-
-    // process init
-    proc.init match {
-      case Success(_) => {
-        info("process init success")
-      }
-      case Failure(ex) => {
-        error(s"process init error: ${ex.getMessage}")
-        shutdown
-        sys.exit(-5)
-      }
-    }
-
-    // process run
-    proc.run match {
-      case Success(_) => {
-        info("process run success")
-      }
-      case Failure(ex) => {
-        error(s"process run error: ${ex.getMessage}")
-
-        if (proc.retriable) {
-          throw ex
-        } else {
-          shutdown
-          sys.exit(-5)
-        }
-      }
-    }
-
-    // process end
-    proc.end match {
-      case Success(_) => {
-        info("process end success")
-      }
-      case Failure(ex) => {
-        error(s"process end error: ${ex.getMessage}")
-        shutdown
-        sys.exit(-5)
-      }
-    }
-
-    shutdown
-  }
-
-  private def readParamFile[T <: Param](file: String, fsType: String)(implicit m : Manifest[T]): Try[T] = {
-    val paramReader = ParamReaderFactory.getParamReader(file, fsType)
-    paramReader.readConfig[T]
-  }
-
-  private def validateParams(allParam: AllParam): Try[Boolean] = {
-    val allParamValidator = AllParamValidator()
-    allParamValidator.validate(allParam)
-  }
-
-  private def shutdown(): Unit = {
-    PersistThreadPool.shutdown
-  }
-}
+///*
+//Licensed to the Apache Software Foundation (ASF) under one
+//or more contributor license agreements.  See the NOTICE file
+//distributed with this work for additional information
+//regarding copyright ownership.  The ASF licenses this file
+//to you 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.
+//*/
+//package org.apache.griffin.measure.process
+//
+//import org.apache.griffin.measure.config.params._
+//import org.apache.griffin.measure.config.params.env._
+//import org.apache.griffin.measure.config.params.user._
+//import org.apache.griffin.measure.config.reader.ParamReaderFactory
+//import org.apache.griffin.measure.config.validator.AllParamValidator
+//import org.apache.griffin.measure.log.Loggable
+//import org.apache.griffin.measure.persist.PersistThreadPool
+//import org.junit.runner.RunWith
+//import org.scalatest.junit.JUnitRunner
+//import org.scalatest.{BeforeAndAfter, FunSuite, Matchers}
+//
+//import scala.util.{Failure, Success, Try}
+//
+//@RunWith(classOf[JUnitRunner])
+//class StreamingProcessTest extends FunSuite with Matchers with BeforeAndAfter with Loggable {
+//
+//  val envFile = "src/test/resources/env-streaming.json"
+////  val confFile = "src/test/resources/config-test-accuracy-streaming-multids.json"
+//  val confFile = "src/test/resources/config-test-accuracy-streaming.json"
+////  val confFile = "src/test/resources/config-test-profiling-streaming.json"
+//
+//  val envFsType = "local"
+//  val userFsType = "local"
+//
+//  val args = Array(envFile, confFile)
+//
+//  var allParam: AllParam = _
+//
+//  before {
+//    // read param files
+//    val envParam = readParamFile[EnvParam](envFile, envFsType) match {
+//      case Success(p) => p
+//      case Failure(ex) => {
+//        error(ex.getMessage)
+//        sys.exit(-2)
+//      }
+//    }
+//    val userParam = readParamFile[UserParam](confFile, userFsType) match {
+//      case Success(p) => p
+//      case Failure(ex) => {
+//        error(ex.getMessage)
+//        sys.exit(-2)
+//      }
+//    }
+//    allParam = AllParam(envParam, userParam)
+//
+//    // validate param files
+//    validateParams(allParam) match {
+//      case Failure(ex) => {
+//        error(ex.getMessage)
+//        sys.exit(-3)
+//      }
+//      case _ => {
+//        info("params validation pass")
+//      }
+//    }
+//  }
+//
+//  test ("streaming process") {
+//    val procType = ProcessType(allParam.userParam.procType)
+//    val proc: DqProcess = procType match {
+//      case BatchProcessType => BatchDqProcess(allParam)
+//      case StreamingProcessType => StreamingDqProcess(allParam)
+//      case _ => {
+//        error(s"${procType} is unsupported process type!")
+//        sys.exit(-4)
+//      }
+//    }
+//
+//    // process init
+//    proc.init match {
+//      case Success(_) => {
+//        info("process init success")
+//      }
+//      case Failure(ex) => {
+//        error(s"process init error: ${ex.getMessage}")
+//        shutdown
+//        sys.exit(-5)
+//      }
+//    }
+//
+//    // process run
+//    proc.run match {
+//      case Success(_) => {
+//        info("process run success")
+//      }
+//      case Failure(ex) => {
+//        error(s"process run error: ${ex.getMessage}")
+//
+//        if (proc.retriable) {
+//          throw ex
+//        } else {
+//          shutdown
+//          sys.exit(-5)
+//        }
+//      }
+//    }
+//
+//    // process end
+//    proc.end match {
+//      case Success(_) => {
+//        info("process end success")
+//      }
+//      case Failure(ex) => {
+//        error(s"process end error: ${ex.getMessage}")
+//        shutdown
+//        sys.exit(-5)
+//      }
+//    }
+//
+//    shutdown
+//  }
+//
+//  private def readParamFile[T <: Param](file: String, fsType: String)(implicit m : Manifest[T]): Try[T] = {
+//    val paramReader = ParamReaderFactory.getParamReader(file, fsType)
+//    paramReader.readConfig[T]
+//  }
+//
+//  private def validateParams(allParam: AllParam): Try[Boolean] = {
+//    val allParamValidator = AllParamValidator()
+//    allParamValidator.validate(allParam)
+//  }
+//
+//  private def shutdown(): Unit = {
+//    PersistThreadPool.shutdown
+//  }
+//}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/test/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParserTest.scala
----------------------------------------------------------------------
diff --git a/measure/src/test/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParserTest.scala b/measure/src/test/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParserTest.scala
index d8c9531..823554d 100644
--- a/measure/src/test/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParserTest.scala
+++ b/measure/src/test/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParserTest.scala
@@ -202,4 +202,18 @@ class BasicParserTest extends FunSuite with Matchers with BeforeAndAfter {
     println(result.get.desc)
   }
 
+  test ("select clause") {
+    val rule = "select source.user_id, item, source.func()"
+    val result = parser.parseAll(parser.selectClause, rule)
+    result.successful should be (true)
+    println(result.get.desc)
+  }
+
+  test ("from clause") {
+    val rule = "from source"
+    val result = parser.parseAll(parser.fromClause, rule)
+    result.successful should be (true)
+    println(result.get.desc)
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/test/scala/org/apache/griffin/measure/utils/HdfsUtilTest.scala
----------------------------------------------------------------------
diff --git a/measure/src/test/scala/org/apache/griffin/measure/utils/HdfsUtilTest.scala b/measure/src/test/scala/org/apache/griffin/measure/utils/HdfsUtilTest.scala
index 90db32a..6a672d5 100644
--- a/measure/src/test/scala/org/apache/griffin/measure/utils/HdfsUtilTest.scala
+++ b/measure/src/test/scala/org/apache/griffin/measure/utils/HdfsUtilTest.scala
@@ -44,10 +44,10 @@ class HdfsUtilTest extends FunSuite with Matchers with BeforeAndAfter {
   conf2.addResource(new Path("file:///Users/lliu13/test/hadoop/hdfs-site.xml"))
   private val dfs2 = FileSystem.get(conf2)
 
-  val conf = new SparkConf().setAppName("test_hdfs").setMaster("local[*]")
-  val sparkContext = new SparkContext(conf)
-  sparkContext.setLogLevel("WARN")
-  val sqlContext = new HiveContext(sparkContext)
+//  val conf = new SparkConf().setAppName("test_hdfs").setMaster("local[*]")
+//  val sparkContext = new SparkContext(conf)
+//  sparkContext.setLogLevel("WARN")
+//  val sqlContext = new HiveContext(sparkContext)
 
   def listSubPaths(dfs: FileSystem, dirPath: String, subType: String, fullPath: Boolean = false): Iterable[String] = {
     val path = new Path(dirPath)
@@ -75,58 +75,58 @@ class HdfsUtilTest extends FunSuite with Matchers with BeforeAndAfter {
     if (parentPath.endsWith(seprator)) parentPath + fileName else parentPath + seprator + fileName
   }
 
-  test ("test multiple hdfs") {
-    val list1 = listSubPaths(dfs1, "/", "dir", false)
-    println(list1)
-
-    val list2 = listSubPaths(dfs2, "/", "dir", false)
-    println(list2)
-
-    val path1 = "/depth/discovery_file_sample.txt"
-    val istream1 = dfs1.open(new Path(path1))
-    val reader1 = new BufferedReader(new InputStreamReader(istream1))
-    val seq1 = scala.collection.mutable.MutableList[String]()
-    try {
-      var line = reader1.readLine()
-      while (line != null) {
-        val arr = line.split("\u0007")
-        seq1 ++= arr
-        line = reader1.readLine()
-      }
-    } finally {
-      reader1.close()
-      istream1.close()
-    }
-
-//    val scanner = new java.util.Scanner(istream1,"UTF-8").useDelimiter("\u0007")
-//    val theString = if (scanner.hasNext()) scanner.next() else ""
-//    println(theString)
-//    scanner.close()
-
-    println(seq1.size)
-    println(seq1.take(10))
-    seq1.take(10).foreach(println)
-
-//    val path2 = "/griffin/json/env.json"
-//    val istream2 = dfs2.open(new Path(path2))
-//    val reader2 = new BufferedReader(new InputStreamReader(istream2))
-//    val seq2 = scala.collection.mutable.MutableList[String]()
+//  test ("test multiple hdfs") {
+//    val list1 = listSubPaths(dfs1, "/", "dir", false)
+//    println(list1)
+//
+//    val list2 = listSubPaths(dfs2, "/", "dir", false)
+//    println(list2)
+//
+//    val path1 = "/depth/discovery_file_sample.txt"
+//    val istream1 = dfs1.open(new Path(path1))
+//    val reader1 = new BufferedReader(new InputStreamReader(istream1))
+//    val seq1 = scala.collection.mutable.MutableList[String]()
 //    try {
-//      var line = reader2.readLine()
+//      var line = reader1.readLine()
 //      while (line != null) {
-//        line = reader2.readLine()
-//        seq2 += line
-//      }
-//    } catch {
-//      case e: Throwable => {
-//        println("error in reading")
+//        val arr = line.split("\u0007")
+//        seq1 ++= arr
+//        line = reader1.readLine()
 //      }
 //    } finally {
-//      reader2.close()
-//      istream2.close()
+//      reader1.close()
+//      istream1.close()
 //    }
-//    println(seq2.size)
-//    println(seq2.take(10))
-  }
+//
+////    val scanner = new java.util.Scanner(istream1,"UTF-8").useDelimiter("\u0007")
+////    val theString = if (scanner.hasNext()) scanner.next() else ""
+////    println(theString)
+////    scanner.close()
+//
+//    println(seq1.size)
+//    println(seq1.take(10))
+//    seq1.take(10).foreach(println)
+//
+////    val path2 = "/griffin/json/env.json"
+////    val istream2 = dfs2.open(new Path(path2))
+////    val reader2 = new BufferedReader(new InputStreamReader(istream2))
+////    val seq2 = scala.collection.mutable.MutableList[String]()
+////    try {
+////      var line = reader2.readLine()
+////      while (line != null) {
+////        line = reader2.readLine()
+////        seq2 += line
+////      }
+////    } catch {
+////      case e: Throwable => {
+////        println("error in reading")
+////      }
+////    } finally {
+////      reader2.close()
+////      istream2.close()
+////    }
+////    println(seq2.size)
+////    println(seq2.take(10))
+//  }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/service/src/main/java/org/apache/griffin/core/measure/repo/DataSourceRepo.java
----------------------------------------------------------------------
diff --git a/service/src/main/java/org/apache/griffin/core/measure/repo/DataSourceRepo.java b/service/src/main/java/org/apache/griffin/core/measure/repo/DataSourceRepo.java
deleted file mode 100644
index 5cc897c..0000000
--- a/service/src/main/java/org/apache/griffin/core/measure/repo/DataSourceRepo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
-*/
-
-package org.apache.griffin.core.measure.repo;
-
-import org.apache.griffin.core.measure.entity.DataSource;
-import org.springframework.data.repository.CrudRepository;
-
-public interface DataSourceRepo extends CrudRepository<DataSource,Long> {
-}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/service/src/main/java/org/apache/griffin/core/measure/repo/RuleRepo.java
----------------------------------------------------------------------
diff --git a/service/src/main/java/org/apache/griffin/core/measure/repo/RuleRepo.java b/service/src/main/java/org/apache/griffin/core/measure/repo/RuleRepo.java
deleted file mode 100644
index 75adce5..0000000
--- a/service/src/main/java/org/apache/griffin/core/measure/repo/RuleRepo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you 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.
-*/
-
-package org.apache.griffin.core.measure.repo;
-
-import org.apache.griffin.core.measure.entity.Rule;
-import org.springframework.data.repository.CrudRepository;
-
-public interface RuleRepo extends CrudRepository<Rule,Long> {
-}


[4/4] incubator-griffin git commit: Update dsl modification

Posted by gu...@apache.org.
Update dsl modification

supporting select and from clause in griffin dsl

Author: Lionel Liu <bh...@163.com>

Closes #128 from bhlx3lyx7/dsl-modify.


Project: http://git-wip-us.apache.org/repos/asf/incubator-griffin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-griffin/commit/417c931f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-griffin/tree/417c931f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-griffin/diff/417c931f

Branch: refs/heads/master
Commit: 417c931f22e7faceda86fd7813fdf5a8c30bdc6e
Parents: 43f9dbf
Author: Lionel Liu <bh...@163.com>
Authored: Tue Oct 10 14:44:48 2017 +0800
Committer: Lionel Liu <bh...@163.com>
Committed: Tue Oct 10 14:44:48 2017 +0800

----------------------------------------------------------------------
 .gitignore                                      |   3 +
 griffin-doc/dsl-guide.md                        |  22 +-
 measure/derby.log                               |  13 -
 .../rule/adaptor/GriffinDslAdaptor.scala        |  20 +-
 .../rule/dsl/expr/ClauseExpression.scala        |  46 +-
 .../measure/rule/dsl/parser/BasicParser.scala   |  21 +-
 .../rule/dsl/parser/GriffinDslParser.scala      |   8 +-
 .../test/resources/config-test-profiling.json   |   3 +-
 measure/src/test/resources/input.msg            |   1 -
 measure/src/test/resources/output.msg           |   1 -
 .../measure/process/BatchProcessTest.scala      | 292 +++---
 .../griffin/measure/process/JsonParseTest.scala | 980 +++++++++----------
 .../measure/process/StreamingProcessTest.scala  | 294 +++---
 .../rule/dsl/parser/BasicParserTest.scala       |  14 +
 .../griffin/measure/utils/HdfsUtilTest.scala    | 104 +-
 .../core/measure/repo/DataSourceRepo.java       |  26 -
 .../griffin/core/measure/repo/RuleRepo.java     |  26 -
 17 files changed, 943 insertions(+), 931 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 3764dc9..ad52fe5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,6 @@ ui/bower_components/*
 ui/node_modules/*
 ui/debug.log
 ui/package-lock.json
+
+derby.log
+metastore_db

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/griffin-doc/dsl-guide.md
----------------------------------------------------------------------
diff --git a/griffin-doc/dsl-guide.md b/griffin-doc/dsl-guide.md
index 6a7b3f8..40a37a4 100644
--- a/griffin-doc/dsl-guide.md
+++ b/griffin-doc/dsl-guide.md
@@ -79,5 +79,25 @@ Griffin DSL is SQL-like, case insensitive, and easy to learn.
 	e.g. `source.age between 3 and 30, source.age between (3, 30)`
 - **like**: like clause like sql.  
 	e.g. `source.name like "%abc%"`
-- **logical factor**: 
+- **is null**: is null operator like sql.  
+	e.g. `source.desc is not null`
+- **is nan**: check if the value is not a number, the syntax like `is null`  
+	e.g. `source.age is not nan`
+- **logical factor**: math expression or logical expressions above or other logical expressions with brackets.  
+	e.g. `(source.user_id = target.user_id AND source.age > target.age)`
+- **unary logical expression**: unary logical operator with factor.  
+	e.g. `NOT source.has_data`
+- **binary logical expression**: logical factors with binary logical operators, including `and`, `or` and comparison operators.  
+	e.g. `source.age = target.age OR source.ticket = target.tck`
 
+
+### Expression
+- **expression**: logical expression and math expression.
+
+### Function
+- **argument**: expression.
+- **function**: function name with arguments between brackets.  
+	e.g. `max(source.age, target.age), count(*)`
+
+### Clause
+- **select clause**: 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/derby.log
----------------------------------------------------------------------
diff --git a/measure/derby.log b/measure/derby.log
deleted file mode 100644
index 4b93055..0000000
--- a/measure/derby.log
+++ /dev/null
@@ -1,13 +0,0 @@
-----------------------------------------------------------------
-Fri Sep 29 15:53:18 CST 2017:
-Booting Derby version The Apache Software Foundation - Apache Derby - 10.10.2.0 - (1582446): instance a816c00e-015e-cca0-1a8b-00000f890648 
-on database directory /private/var/folders/p0/462y3wrn4lv1fptxx5bwy7b839572r/T/spark-890ab6e2-ee56-4d73-8c6a-0dcce204322e/metastore with class loader sun.misc.Launcher$AppClassLoader@18b4aac2 
-Loaded from file:/Users/lliu13/.m2/repository/org/apache/derby/derby/10.10.2.0/derby-10.10.2.0.jar
-java.vendor=Oracle Corporation
-java.runtime.version=1.8.0_101-b13
-user.dir=/Users/lliu13/git/incubator-griffin/measure
-os.name=Mac OS X
-os.arch=x86_64
-os.version=10.12.6
-derby.system.home=null
-Database Class Loader started - derby.database.classpath=''

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/main/scala/org/apache/griffin/measure/rule/adaptor/GriffinDslAdaptor.scala
----------------------------------------------------------------------
diff --git a/measure/src/main/scala/org/apache/griffin/measure/rule/adaptor/GriffinDslAdaptor.scala b/measure/src/main/scala/org/apache/griffin/measure/rule/adaptor/GriffinDslAdaptor.scala
index 2a189d4..8199d80 100644
--- a/measure/src/main/scala/org/apache/griffin/measure/rule/adaptor/GriffinDslAdaptor.scala
+++ b/measure/src/main/scala/org/apache/griffin/measure/rule/adaptor/GriffinDslAdaptor.scala
@@ -261,13 +261,19 @@ case class GriffinDslAdaptor(dataSourceNames: Seq[String],
         }
       }
       case ProfilingType => {
-        val sourceName = getNameOpt(details, ProfilingInfo._Source) match {
-          case Some(name) => name
-          case _ => dataSourceNames.head
+        val profilingClause = expr.asInstanceOf[ProfilingClause]
+        val sourceName = profilingClause.fromClauseOpt match {
+          case Some(fc) => fc.dataSource
+          case _ => {
+            getNameOpt(details, ProfilingInfo._Source) match {
+              case Some(name) => name
+              case _ => dataSourceNames.head
+            }
+          }
         }
-        val analyzer = ProfilingAnalyzer(expr.asInstanceOf[ProfilingClause], sourceName)
+        val analyzer = ProfilingAnalyzer(profilingClause, sourceName)
 
-        analyzer.selectionExprs.foreach(println)
+//        analyzer.selectionExprs.foreach(println)
 
         val selExprDescs = analyzer.selectionExprs.map { sel =>
           val alias = sel match {
@@ -284,6 +290,8 @@ case class GriffinDslAdaptor(dataSourceNames: Seq[String],
           (s"`${GroupByColumn.tmst}`" +: selExprDescs).mkString(", ")
         }
 
+        val fromClause = profilingClause.fromClauseOpt.getOrElse(FromClause(sourceName)).desc
+
 //        val tailClause = analyzer.tailsExprs.map(_.desc).mkString(" ")
         val tmstGroupbyClause = GroupbyClause(LiteralStringExpr(s"`${GroupByColumn.tmst}`") :: Nil, None)
         val mergedGroubbyClause = tmstGroupbyClause.merge(analyzer.groupbyExprOpt match {
@@ -300,7 +308,7 @@ case class GriffinDslAdaptor(dataSourceNames: Seq[String],
           // 1. select statement
           val profilingSql = {
 //            s"SELECT `${GroupByColumn.tmst}`, ${selClause} FROM ${sourceName} ${tailClause} GROUP BY `${GroupByColumn.tmst}`"
-            s"SELECT ${selClause} FROM ${sourceName} ${preGroupbyClause} ${groupbyClause} ${postGroupbyClause}"
+            s"SELECT ${selClause} ${fromClause} ${preGroupbyClause} ${groupbyClause} ${postGroupbyClause}"
           }
           val profilingMetricName = resultName(details, ProfilingInfo._Profiling)
           val profilingStep = SparkSqlStep(

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/expr/ClauseExpression.scala
----------------------------------------------------------------------
diff --git a/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/expr/ClauseExpression.scala b/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/expr/ClauseExpression.scala
index 26882b4..c0986e1 100644
--- a/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/expr/ClauseExpression.scala
+++ b/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/expr/ClauseExpression.scala
@@ -26,7 +26,14 @@ case class SelectClause(exprs: Seq[Expr]) extends ClauseExpression {
   addChildren(exprs)
 
   def desc: String = s"${exprs.map(_.desc).mkString(", ")}"
-  def coalesceDesc: String = s"${exprs.map(_.desc).mkString(", ")}"
+  def coalesceDesc: String = desc
+
+}
+
+case class FromClause(dataSource: String) extends ClauseExpression {
+
+  def desc: String = s"FROM `${dataSource}`"
+  def coalesceDesc: String = desc
 
 }
 
@@ -107,44 +114,61 @@ case class LimitClause(expr: Expr) extends ClauseExpression {
   def coalesceDesc: String = s"LIMIT ${expr.coalesceDesc}"
 }
 
-case class CombinedClause(selectClause: SelectClause, tails: Seq[ClauseExpression]
+case class CombinedClause(selectClause: SelectClause, fromClauseOpt: Option[FromClause],
+                          tails: Seq[ClauseExpression]
                          ) extends ClauseExpression {
 
-  addChildren(selectClause +: tails)
+  addChildren({
+    val headClauses: Seq[ClauseExpression] = selectClause +: (fromClauseOpt.toSeq)
+    headClauses ++ tails
+  })
 
   def desc: String = {
-    tails.foldLeft(selectClause.desc) { (head, tail) =>
+    val selectDesc = s"SELECT ${selectClause.desc}"
+    val fromDesc = fromClauseOpt.map(_.desc).mkString(" ")
+    val headDesc = s"${selectDesc} ${fromDesc}"
+    tails.foldLeft(headDesc) { (head, tail) =>
       s"${head} ${tail.desc}"
     }
   }
   def coalesceDesc: String = {
-    tails.foldLeft(selectClause.coalesceDesc) { (head, tail) =>
+    val selectDesc = s"SELECT ${selectClause.coalesceDesc}"
+    val fromDesc = fromClauseOpt.map(_.coalesceDesc).mkString(" ")
+    val headDesc = s"${selectDesc} ${fromDesc}"
+    tails.foldLeft(headDesc) { (head, tail) =>
       s"${head} ${tail.coalesceDesc}"
     }
   }
 }
 
-case class ProfilingClause(selectClause: SelectClause, groupbyClauseOpt: Option[GroupbyClause],
+case class ProfilingClause(selectClause: SelectClause,
+                           fromClauseOpt: Option[FromClause],
+                           groupbyClauseOpt: Option[GroupbyClause],
                            preGroupbyClauses: Seq[ClauseExpression],
                            postGroupbyClauses: Seq[ClauseExpression]
                           ) extends ClauseExpression {
-  addChildren(groupbyClauseOpt match {
-    case Some(gc) => (selectClause +: preGroupbyClauses) ++ (gc +: postGroupbyClauses)
-    case _ => (selectClause +: preGroupbyClauses) ++ postGroupbyClauses
+  addChildren({
+    val headClauses: Seq[ClauseExpression] = selectClause +: (fromClauseOpt.toSeq)
+    groupbyClauseOpt match {
+      case Some(gc) => (headClauses ++ preGroupbyClauses) ++ (gc +: postGroupbyClauses)
+      case _ => (headClauses ++ preGroupbyClauses) ++ postGroupbyClauses
+    }
   })
 
   def desc: String = {
     val selectDesc = selectClause.desc
+    val fromDesc = fromClauseOpt.map(_.desc).mkString(" ")
     val groupbyDesc = groupbyClauseOpt.map(_.desc).mkString(" ")
     val preDesc = preGroupbyClauses.map(_.desc).mkString(" ")
     val postDesc = postGroupbyClauses.map(_.desc).mkString(" ")
-    s"${selectDesc} ${preDesc} ${groupbyDesc} ${postDesc}"
+    s"${selectDesc} ${fromDesc} ${preDesc} ${groupbyDesc} ${postDesc}"
   }
   def coalesceDesc: String = {
     val selectDesc = selectClause.coalesceDesc
+    val fromDesc = fromClauseOpt.map(_.coalesceDesc).mkString(" ")
     val groupbyDesc = groupbyClauseOpt.map(_.coalesceDesc).mkString(" ")
     val preDesc = preGroupbyClauses.map(_.coalesceDesc).mkString(" ")
     val postDesc = postGroupbyClauses.map(_.coalesceDesc).mkString(" ")
-    s"${selectDesc} ${preDesc} ${groupbyDesc} ${postDesc}"
+    s"${selectDesc} ${fromDesc} ${preDesc} ${groupbyDesc} ${postDesc}"
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParser.scala
----------------------------------------------------------------------
diff --git a/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParser.scala b/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParser.scala
index 0431354..f55b1f8 100644
--- a/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParser.scala
+++ b/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/BasicParser.scala
@@ -27,6 +27,14 @@ trait BasicParser extends JavaTokenParsers with Serializable {
   val dataSourceNames: Seq[String]
   val functionNames: Seq[String]
 
+  private def trim(str: String): String = {
+    val regex = """`(.*)`""".r
+    str match {
+      case regex(s) => s
+      case _ => str
+    }
+  }
+
   /**
     * BNF for basic parser
     *
@@ -118,6 +126,8 @@ trait BasicParser extends JavaTokenParsers with Serializable {
     val UQUOTE: Parser[String] = "`"
     val COMMA: Parser[String] = ","
 
+    val SELECT: Parser[String] = """(?i)select\s""".r
+    val FROM: Parser[String] = """(?i)from\s""".r
     val AS: Parser[String] = """(?i)as\s""".r
     val WHERE: Parser[String] = """(?i)where\s""".r
     val GROUP: Parser[String] = """(?i)group\s""".r
@@ -307,7 +317,8 @@ trait BasicParser extends JavaTokenParsers with Serializable {
     * <limit-clause> = <limit> <expr>
     */
 
-  def selectClause: Parser[SelectClause] = rep1sep(expression, COMMA) ^^ { SelectClause(_) }
+  def selectClause: Parser[SelectClause] = opt(SELECT) ~> rep1sep(expression, COMMA) ^^ { SelectClause(_) }
+  def fromClause: Parser[FromClause] = FROM ~> TableFieldName ^^ { ds => FromClause(trim(ds)) }
   def whereClause: Parser[WhereClause] = WHERE ~> expression ^^ { WhereClause(_) }
   def havingClause: Parser[Expr] = HAVING ~> expression
   def groupbyClause: Parser[GroupbyClause] = GROUP ~ BY ~ rep1sep(expression, COMMA) ~ opt(havingClause) ^^ {
@@ -323,14 +334,14 @@ trait BasicParser extends JavaTokenParsers with Serializable {
 
   /**
     * -- combined clauses --
-    * <combined-clauses> = <select-clause> [ <where-clause> ]+ [ <groupby-clause> ]+ [ <orderby-clause> ]+ [ <limit-clause> ]+
+    * <combined-clauses> = <select-clause> [ <from-clause> ]+ [ <where-clause> ]+ [ <groupby-clause> ]+ [ <orderby-clause> ]+ [ <limit-clause> ]+
     */
 
-  def combinedClause: Parser[CombinedClause] = selectClause ~ opt(whereClause) ~
+  def combinedClause: Parser[CombinedClause] = selectClause ~ opt(fromClause) ~ opt(whereClause) ~
     opt(groupbyClause) ~ opt(orderbyClause) ~ opt(limitClause) ^^ {
-    case sel ~ whereOpt ~ groupbyOpt ~ orderbyOpt ~ limitOpt => {
+    case sel ~ fromOpt ~ whereOpt ~ groupbyOpt ~ orderbyOpt ~ limitOpt => {
       val tails = Seq(whereOpt, groupbyOpt, orderbyOpt, limitOpt).flatMap(opt => opt)
-      CombinedClause(sel, tails)
+      CombinedClause(sel, fromOpt, tails)
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/GriffinDslParser.scala
----------------------------------------------------------------------
diff --git a/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/GriffinDslParser.scala b/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/GriffinDslParser.scala
index 637decb..0800f45 100644
--- a/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/GriffinDslParser.scala
+++ b/measure/src/main/scala/org/apache/griffin/measure/rule/dsl/parser/GriffinDslParser.scala
@@ -26,15 +26,15 @@ case class GriffinDslParser(dataSourceNames: Seq[String], functionNames: Seq[Str
 
   /**
     * -- profiling clauses --
-    * <profiling-clauses> = <select-clause> [ <where-clause> ]+ [ <groupby-clause> ]+ [ <orderby-clause> ]+ [ <limit-clause> ]+
+    * <profiling-clauses> = <select-clause> [ <from-clause> ]+ [ <where-clause> ]+ [ <groupby-clause> ]+ [ <orderby-clause> ]+ [ <limit-clause> ]+
     */
 
-  def profilingClause: Parser[ProfilingClause] = selectClause ~ opt(whereClause) ~
+  def profilingClause: Parser[ProfilingClause] = selectClause ~ opt(fromClause) ~ opt(whereClause) ~
     opt(groupbyClause) ~ opt(orderbyClause) ~ opt(limitClause) ^^ {
-    case sel ~ whereOpt ~ groupbyOpt ~ orderbyOpt ~ limitOpt => {
+    case sel ~ fromOpt ~ whereOpt ~ groupbyOpt ~ orderbyOpt ~ limitOpt => {
       val preClauses = Seq(whereOpt).flatMap(opt => opt)
       val postClauses = Seq(orderbyOpt, limitOpt).flatMap(opt => opt)
-      ProfilingClause(sel, groupbyOpt, preClauses, postClauses)
+      ProfilingClause(sel, fromOpt, groupbyOpt, preClauses, postClauses)
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/test/resources/config-test-profiling.json
----------------------------------------------------------------------
diff --git a/measure/src/test/resources/config-test-profiling.json b/measure/src/test/resources/config-test-profiling.json
index 187e88a..7c16f24 100644
--- a/measure/src/test/resources/config-test-profiling.json
+++ b/measure/src/test/resources/config-test-profiling.json
@@ -23,9 +23,8 @@
       {
         "dsl.type": "griffin-dsl",
         "dq.type": "profiling",
-        "rule": "user_id as id, user_id.approx_count_distinct() as cnt group by user_id order by cnt desc, id desc limit 3",
+        "rule": "select user_id as id, user_id.count() as cnt from source group by user_id order by cnt desc, id desc limit 3",
         "details": {
-          "source": "source",
           "profiling": {
             "name": "count",
             "persist.type": "metric"


[2/4] incubator-griffin git commit: Update dsl modification

Posted by gu...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/test/resources/output.msg
----------------------------------------------------------------------
diff --git a/measure/src/test/resources/output.msg b/measure/src/test/resources/output.msg
deleted file mode 100644
index 4ec9288..0000000
--- a/measure/src/test/resources/output.msg
+++ /dev/null
@@ -1 +0,0 @@
-{"groups":[{"_name":"DefaultGroup","groupType":"FULLSITE","storeType":"CATALOG","attrsList":[{"name":"CENTERCOL","dataType":"STRING","values":["\u003cdiv id\u003d\"centerCol\" class\u003d\"centerColumn\"\u003e  \u003cdiv id\u003d\"booksTitle\" class\u003d\"feature\" data-feature-name\u003d\"booksTitle\"\u003e   \u003cdiv class\u003d\"a-section a-spacing-none\"\u003e    \u003ch1 id\u003d\"title\" class\u003d\"a-size-large a-spacing-none\"\u003e \u003cspan id\u003d\"productTitle\" class\u003d\"a-size-large\"\u003eBefore the First Day\u003c/span\u003e \u003cspan class\u003d\"a-size-medium a-color-secondary a-text-normal\"\u003ePaperback\u003c/span\u003e     \u003c!--  use pre formatted date that complies with legal requirement from media matrix --\u003e \u003cspan class\u003d\"a-size-medium a-color-secondary a-text-normal\"\u003e– July 22, 2013\u003c/span\u003e \u003c/h1\u003e   \u003c/div\u003e   \u003cdiv id\u003d\"byline\" class\u003d\"a-section a-spacing-micro bylineHidden featur
 e\"\u003e    by    \u003cspan class\u003d\"author notFaded\" data-width\u003d\"\"\u003e \u003ca class\u003d\"a-link-normal\" href\u003d\"/s/ref\u003ddp_byline_sr_book_1?ie\u003dUTF8\u0026amp;text\u003dStephen+M.+Hale\u0026amp;search-alias\u003dbooks\u0026amp;field-author\u003dStephen+M.+Hale\u0026amp;sort\u003drelevancerank\"\u003eStephen M. Hale\u003c/a\u003e \u003cspan class\u003d\"contribution\" spacing\u003d\"none\"\u003e \u003cspan class\u003d\"a-color-secondary\"\u003e(Author)\u003c/span\u003e \u003c/span\u003e \u003c/span\u003e   \u003c/div\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"averageCustomerReviews_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"averageCustomerReviews\"\u003e   \u003cstyle type\u003d\"text/css\"\u003e    /*     * Fix for UDP-1061. Average customer reviews has a small extra line on hover     * https://omni-grok.amazon.com/xref/src/appgroup/websiteTemplates/retail/SoftlinesDetailPageAssets/udp-intl-lock/src/legacy.css?indexName\u003dWebsi
 teTemplates#40    */    .noUnderline a:hover {         text-decoration: none;     }\u003c/style\u003e   \u003cdiv id\u003d\"averageCustomerReviews\" class\u003d\"a-spacing-none\" data-asin\u003d\"1628391340\" data-ref\u003d\"dpx_acr_pop_\"\u003e    \u003cspan class\u003d\"a-declarative\" data-action\u003d\"acrStarsLink-click-metrics\" data-acrstarslink-click-metrics\u003d\"{}\"\u003e \u003cspan id\u003d\"acrPopover\" class\u003d\"reviewCountTextLinkedHistogram noUnderline\" title\u003d\"5.0 out of 5 stars\"\u003e \u003cspan class\u003d\"a-declarative\" data-action\u003d\"a-popover\" data-a-popover\u003d\"{\u0026quot;max-width\u0026quot;:\u0026quot;700\u0026quot;,\u0026quot;closeButton\u0026quot;:\u0026quot;false\u0026quot;,\u0026quot;position\u0026quot;:\u0026quot;triggerBottom\u0026quot;,\u0026quot;url\u0026quot;:\u0026quot;/gp/customer-reviews/widgets/average-customer-review/popover/ref\u003ddpx_acr_pop_?contextId\u003ddpx\u0026amp;asin\u003d1628391340\u0026quot;}\"\u003e \u003ca 
 href\u003d\"javascript:void(0)\" class\u003d\"a-popover-trigger a-declarative\"\u003e \u003ci class\u003d\"a-icon a-icon-star a-star-5\"\u003e\u003cspan class\u003d\"a-icon-alt\"\u003e5.0 out of 5 stars\u003c/span\u003e\u003c/i\u003e \u003ci class\u003d\"a-icon a-icon-popover\"\u003e\u003c/i\u003e\u003c/a\u003e \u003c/span\u003e \u003cspan class\u003d\"a-letter-space\"\u003e\u003c/span\u003e \u003c/span\u003e \u003c/span\u003e    \u003cspan class\u003d\"a-letter-space\"\u003e\u003c/span\u003e    \u003cspan class\u003d\"a-declarative\" data-action\u003d\"acrLink-click-metrics\" data-acrlink-click-metrics\u003d\"{}\"\u003e \u003ca id\u003d\"acrCustomerReviewLink\" class\u003d\"a-link-normal\" href\u003d\"#customerReviews\"\u003e \u003cspan id\u003d\"acrCustomerReviewText\" class\u003d\"a-size-base\"\u003e1 customer review\u003c/span\u003e \u003c/a\u003e \u003c/span\u003e    \u003cscript type\u003d\"text/javascript\"\u003e                    P.when(\u0027A\u0027, \u0027ready\u0027).exe
 cute(function(A) {                        A.declarative(\u0027acrLink-click-metrics\u0027, \u0027click\u0027, { \"allowLinkDefault\" : true }, function(event){                            if(window.ue) {                                ue.count(\"acrLinkClickCount\", (ue.count(\"acrLinkClickCount\") || 0) + 1);                            }                        });                    });                \u003c/script\u003e    \u003cscript type\u003d\"text/javascript\"\u003e            P.when(\u0027A\u0027, \u0027cf\u0027).execute(function(A) {                A.declarative(\u0027acrStarsLink-click-metrics\u0027, \u0027click\u0027, { \"allowLinkDefault\" : true },  function(event){                    if(window.ue) {                        ue.count(\"acrStarsLinkWithPopoverClickCount\", (ue.count(\"acrStarsLinkWithPopoverClickCount\") || 0) + 1);                    }                });            });        \u003c/script\u003e   \u003c/div\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"ser
 iesTitle_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"seriesTitle\"\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"zeitgeistBadge_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"zeitgeistBadge\"\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"socialFabric_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"socialFabric\"\u003e  \u003c/div\u003e  \u003chr /\u003e  \u003cdiv id\u003d\"adoptedData\" class\u003d\"feature\" data-feature-name\u003d\"adoptedData\"\u003e   \u003cstyle\u003e    #adoptedDataContainer .campusLogo {        height:20px;        width:20px;        margin-right:1px;    }    #adoptedDataContainer .campusName {        line-height:20px;    }    #adoptedDataContainer.paddingMicro {        padding:4px !important;    }    #adoptedDataContainer .paddingLeftMicro {        padding-left:4px !important;    }    #adoptedDataContainer .paddingLeftSmall {        padding-left:10px !important;    }    #adoptedDataContainer .paddingRightSmall {  
       padding-right:10px !important;    }    #adoptedDataContainer .courseListExpanderContainer a:focus {        outline:none;    }    #adoptedDataContainer .courseColumn {        width:50%;        float:left;    }    #adoptedDataContainer .textRow {        display:inline-block;        width:100%;    }\u003c/style\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"MediaMatrix\" class\u003d\"feature\" data-feature-name\u003d\"MediaMatrix\"\u003e   \u003cdiv id\u003d\"formats\" class\u003d\"a-section a-spacing-large responsive\"\u003e   \u003ca class\u003d\"a-link-expander a-spacing-top-micro a-spacing-small a-size-small\"\u003e \u003ci id\u003d\"formatsIcon\" class\u003d\"a-icon a-icon-expand\"\u003e\u003c/i\u003e \u003cspan id\u003d\"showMoreFormatsPrompt\" class\u003d\"tmmShowPrompt\"\u003eSee all 3 formats and editions\u003c/span\u003e \u003cspan id\u003d\"hideMoreFormatsPrompt\" class\u003d\"tmmHidePrompt\"\u003eHide other formats and editions\u003c/span\u003e \u003c/a\u003e    \u003cd
 iv id\u003d\"twister\" class\u003d\"a-section a-spacing-base a-spacing-top-small a-size-mini\"\u003e     \u003c!--     This file is just a replica of table-aiv present in mediaMatrixtemplate package.    This has just been picked up and moved and there has not been addition/modification/removal    of any logic here . --\u003e     \u003ctable class\u003d\"a-normal a-spacing-none title\"\u003e      \u003ctbody\u003e      \u003ctr\u003e        \u003ctd class\u003d\"dp-title-col\"\u003e \u003c/td\u003e        \u003ctd class\u003d\"a-color-secondary a-text-right dp-price-col\"\u003e         \u003cdiv class\u003d\"a-fixed-right-grid\"\u003e         \u003cdiv class\u003d\"a-fixed-right-grid-inner\" style\u003d\"padding-right:50px\"\u003e           \u003cdiv class\u003d\"a-fixed-right-grid-col a-col-left\" style\u003d\"padding-right:2.5%;*width:97.1%;float:left;\"\u003e            Price           \u003c/div\u003e           \u003cdiv class\u003d\"a-fixed-right-grid-col a-col-right\" style\u00
 3d\"width:50px;margin-right:-50px;float:left;\"\u003e\u003c/div\u003e          \u003c/div\u003e        \u003c/div\u003e \u003c/td\u003e        \u003ctd class\u003d\"a-color-secondary a-text-right dp-new-col\"\u003e New from \u003c/td\u003e        \u003ctd class\u003d\"a-color-secondary a-text-right dp-used-col\"\u003e Used from \u003c/td\u003e       \u003c/tr\u003e      \u003c/tbody\u003e    \u003c/table\u003e     \u003cdiv class\u003d\"hr unselected-row\"\u003e\u003c/div\u003e     \u003cdiv class\u003d\"top-level unselected-row\"\u003e      \u003cspan class\u003d\"a-declarative\" data-action\u003d\"tmm-see-more-editions-click\" data-tmm-see-more-editions-click\u003d\"{\u0026quot;metabindingPlaceHolder\u0026quot;:1,\u0026quot;metabindingPlaceHolderState\u0026quot;:\u0026quot;0\u0026quot;,\u0026quot;metabindingUrl\u0026quot;:\u0026quot;/Before-First-Day-Stephen-Hale-ebook/dp/B00E4WYJT8/ref\u003dtmm_kin_title_0?_encoding\u003dUTF8\u0026amp;amp;qid\u003d\u0026amp;amp;sr\u003d\u0026quot
 ;}\" id\u003d\"declarative_1\"\u003e       \u003ctable class\u003d\"a-normal a-spacing-none\"\u003e        \u003ctbody\u003e        \u003ctr\u003e          \u003ctd class\u003d\"dp-title-col\"\u003e           \u003c!-- Do not show expander when DVD_redesign weblab is in treatment --\u003e \u003ca class\u003d\"empty-expander title-expander\" style\u003d\"vertical-align:middle;\"\u003e \u003cspan class\u003d\"metabinding-expander\"\u003e\u003c/span\u003e \u003c/a\u003e \u003ca href\u003d\"/Before-First-Day-Stephen-Hale-ebook/dp/B00E4WYJT8/ref\u003dtmm_kin_title_0?_encoding\u003dUTF8\u0026amp;qid\u003d\u0026amp;sr\u003d\" class\u003d\"title-text\"\u003e \u003cspan class\u003d\"a-size-small a-color-base\"\u003eKindle\u003c/span\u003e \u003cspan id\u003d\"tmmSpinnerDiv_1\" style\u003d\"display: none\" class\u003d\"tmmAjaxLoading\"\u003e\u003c/span\u003e \u003c/a\u003e \u003cspan id\u003d\"tmmErrorDiv_1\" class\u003d\"tmmErrorClass displayNone\"\u003e            \u003cdiv class\u003d\"a-b
 ox a-alert-inline a-alert-inline-error\"\u003e            \u003cdiv class\u003d\"a-box-inner a-alert-container\"\u003e             \u003ci class\u003d\"a-icon a-icon-alert\"\u003e\u003c/i\u003e             \u003cdiv class\u003d\"a-alert-content\"\u003e               \u003cspan\u003e\u0026quot;Please retry\u0026quot;\u003c/span\u003e              \u003c/div\u003e            \u003c/div\u003e           \u003c/div\u003e \u003c/span\u003e \u003c/td\u003e          \u003ctd class\u003d\"a-text-right dp-price-col\"\u003e           \u003cdiv class\u003d\"a-fixed-right-grid\"\u003e           \u003cdiv class\u003d\"a-fixed-right-grid-inner\" style\u003d\"padding-right:50px\"\u003e             \u003cdiv class\u003d\"a-fixed-right-grid-col a-col-left\" style\u003d\"padding-right:2.5%;*width:97.1%;float:left;\"\u003e              \u003ca class\u003d\"a-link-normal\" href\u003d\"/Before-First-Day-Stephen-Hale-ebook/dp/B00E4WYJT8/ref\u003dtmm_kin_title_0?_encoding\u003dUTF8\u0026amp;qid\u003d\u0026
 amp;sr\u003d\"\u003e \u003cspan class\u003d\"a-size-small a-color-price\"\u003e$7.99\u003c/span\u003e \u003c/a\u003e             \u003c/div\u003e             \u003cdiv class\u003d\"a-fixed-right-grid-col a-col-right\" style\u003d\"width:50px;margin-right:-50px;float:left;\"\u003e             \u003c/div\u003e            \u003c/div\u003e          \u003c/div\u003e \u003c/td\u003e          \u003ctd class\u003d\"a-color-tertiary a-text-right dp-new-col\"\u003e — \u003c/td\u003e          \u003ctd class\u003d\"a-color-tertiary a-text-right dp-used-col\"\u003e — \u003c/td\u003e         \u003c/tr\u003e        \u003c/tbody\u003e      \u003c/table\u003e \u003c/span\u003e     \u003c/div\u003e     \u003cdiv id\u003d\"metabinding_row_top_1\" class\u003d\"second-level\"\u003e\u003c/div\u003e     \u003cdiv id\u003d\"metabinding_row_bottom_1\" class\u003d\"second-level\"\u003e\u003c/div\u003e     \u003cdiv class\u003d\"hr selected-row\"\u003e\u003c/div\u003e     \u003cdiv class\u003d\"top-level 
 selected-row\"\u003e      \u003cspan class\u003d\"a-declarative\" data-action\u003d\"tmm-see-more-editions-click\" data-tmm-see-more-editions-click\u003d\"{\u0026quot;metabindingPlaceHolder\u0026quot;:2,\u0026quot;metabindingPlaceHolderState\u0026quot;:\u0026quot;0\u0026quot;,\u0026quot;metabindingUrl\u0026quot;:\u0026quot;#\u0026quot;}\" id\u003d\"declarative_2\"\u003e       \u003ctable class\u003d\"a-normal a-spacing-none\"\u003e        \u003ctbody\u003e        \u003ctr\u003e          \u003ctd class\u003d\"dp-title-col\"\u003e           \u003c!-- Do not show expander when DVD_redesign weblab is in treatment --\u003e \u003ca class\u003d\"a-link-expander title-expander\" style\u003d\"vertical-align:middle; padding-left:16px\"\u003e \u003cspan class\u003d\"a-link-expander metabinding-expander\"\u003e \u003ci id\u003d\"editionsIcon_2\" class\u003d\"a-icon a-icon-expand tmm-row-icon\"\u003e\u003c/i\u003e \u003c/span\u003e \u003c/a\u003e \u003cspan class\u003d\"title-text\"\u003e \u003c
 span class\u003d\"a-size-small a-color-base\"\u003ePaperback\u003c/span\u003e \u003cspan id\u003d\"tmmSpinnerDiv_2\" style\u003d\"display: none\" class\u003d\"tmmAjaxLoading\"\u003e\u003c/span\u003e \u003c/span\u003e \u003cspan id\u003d\"tmmErrorDiv_2\" class\u003d\"tmmErrorClass displayNone\"\u003e            \u003cdiv class\u003d\"a-box a-alert-inline a-alert-inline-error\"\u003e            \u003cdiv class\u003d\"a-box-inner a-alert-container\"\u003e             \u003ci class\u003d\"a-icon a-icon-alert\"\u003e\u003c/i\u003e             \u003cdiv class\u003d\"a-alert-content\"\u003e               \u003cspan\u003e\u0026quot;Please retry\u0026quot;\u003c/span\u003e              \u003c/div\u003e            \u003c/div\u003e           \u003c/div\u003e \u003c/span\u003e \u003c/td\u003e          \u003ctd class\u003d\"a-text-right dp-price-col\"\u003e           \u003cdiv class\u003d\"a-fixed-right-grid\"\u003e           \u003cdiv class\u003d\"a-fixed-right-grid-inner\" style\u003d\"padding
 -right:50px\"\u003e             \u003cdiv class\u003d\"a-fixed-right-grid-col a-col-left\" style\u003d\"padding-right:2.5%;*width:97.1%;float:left;\"\u003e              \u003cspan class\u003d\"a-size-small a-color-price\"\u003e$15.49\u003c/span\u003e             \u003c/div\u003e             \u003cdiv class\u003d\"a-fixed-right-grid-col a-col-right\" style\u003d\"width:50px;margin-right:-50px;float:left;\"\u003e             \u003c/div\u003e            \u003c/div\u003e          \u003c/div\u003e \u003c/td\u003e          \u003ctd class\u003d\"a-text-right dp-new-col\"\u003e \u003ca class\u003d\"a-link-normal\" href\u003d\"/gp/offer-listing/1628391340/ref\u003dtmm_pap_new_olp_sr?ie\u003dUTF8\u0026amp;condition\u003dnew\u0026amp;qid\u003d\u0026amp;sr\u003d\"\u003e \u003cspan\u003e$9.44\u003c/span\u003e \u003c/a\u003e \u003c/td\u003e          \u003ctd class\u003d\"a-text-right dp-used-col\"\u003e \u003ca class\u003d\"a-link-normal\" href\u003d\"/gp/offer-listing/1628391340/ref\u003dtmm_pap
 _used_olp_sr?ie\u003dUTF8\u0026amp;condition\u003dused\u0026amp;qid\u003d\u0026amp;sr\u003d\"\u003e \u003cspan\u003e$12.17\u003c/span\u003e \u003c/a\u003e \u003c/td\u003e         \u003c/tr\u003e        \u003c/tbody\u003e      \u003c/table\u003e \u003c/span\u003e     \u003c/div\u003e     \u003cdiv id\u003d\"metabinding_row_top_2\" class\u003d\"second-level\"\u003e\u003c/div\u003e     \u003cdiv id\u003d\"metabinding_row_bottom_2\" class\u003d\"second-level\"\u003e\u003c/div\u003e     \u003cscript type\u003d\"a-state\" data-a-state\u003d\"{\u0026quot;key\u0026quot;:\u0026quot;mediamatrix-state\u0026quot;}\"\u003e{\"url_2\":\"/gp/media-matrix/fetch-DPX-expansion-data.html/ref\u003dtmm_pap_metabinding_expansion_sr?ie\u003dUTF8\u0026amp;tagActionCode\u003d\u0026amp;bindingCount\u003d2\u0026amp;websiteDisplayGroup\u003dbook_display_on_website\u0026amp;cor\u003dUS\u0026amp;storeID\u003d\u0026amp;qid\u003d\u0026amp;productTypeDefinition\u003dABIS_BOOK\u0026amp;viewID\u003dglance\u0026amp;lan
 dingAsin\u003d1628391340\u0026amp;customerID\u003d\u0026amp;tasParentAsin\u003dB00E5D53IM\u0026amp;asin\u003d1628391340\u0026amp;metabinding\u003dpaperback_meta_binding\u0026amp;metabindingIndex\u003d2\u0026amp;isPrime\u003d0\u0026amp;nodeID\u003d\u0026amp;sr\u003d\",\"isAjaxInProgress_1\":\"0\",\"url_1\":\"/gp/media-matrix/fetch-DPX-expansion-data.html/ref\u003dtmm_kin_metabinding_expansion_0?ie\u003dUTF8\u0026amp;tagActionCode\u003d\u0026amp;bindingCount\u003d1\u0026amp;websiteDisplayGroup\u003dbook_display_on_website\u0026amp;cor\u003dUS\u0026amp;storeID\u003d\u0026amp;qid\u003d\u0026amp;productTypeDefinition\u003dABIS_BOOK\u0026amp;viewID\u003dglance\u0026amp;landingAsin\u003d1628391340\u0026amp;customerID\u003d\u0026amp;tasParentAsin\u003dB00E5D53IM\u0026amp;asin\u003dB00E4WYJT8\u0026amp;metabinding\u003dkindle_meta_binding\u0026amp;metabindingIndex\u003d1\u0026amp;isPrime\u003d0\u0026amp;nodeID\u003d\u0026amp;sr\u003d\",\"isAjaxInProgress_2\":\"0\",\"isAjaxComplete_1\":\"0\",\
 "isAjaxComplete_2\":\"0\"}\u003c/script\u003e    \u003c/div\u003e    \u003cdiv id\u003d\"tmmSwatches\" class\u003d\"a-row nonJSFormats\"\u003e     \u003cul class\u003d\"a-nostyle a-button-list a-horizontal\"\u003e      \u003cli class\u003d\"swatchElement unselected\"\u003e\u003cspan class\u003d\"a-list-item\"\u003e \u003cspan class\u003d\"a-button a-spacing-mini a-button-toggle format\"\u003e\u003cspan class\u003d\"a-button-inner\"\u003e\u003ca href\u003d\"/Before-First-Day-Stephen-Hale-ebook/dp/B00E4WYJT8/ref\u003dtmm_kin_swatch_0?_encoding\u003dUTF8\u0026amp;qid\u003d\u0026amp;sr\u003d\" class\u003d\"a-button-text\" role\u003d\"button\"\u003e \u003cspan\u003eKindle\u003c/span\u003e \u003cbr /\u003e \u003cspan class\u003d\"a-color-secondary\"\u003e \u003cspan\u003e $7.99 \u003c/span\u003e \u003c/span\u003e \u003c/a\u003e\u003c/span\u003e\u003c/span\u003e \u003cspan class\u003d\"tmm-olp-links\"\u003e \u003c/span\u003e \u003cspan class\u003d\"a-size-mini a-color-secondary tmm-olp-lin
 ks\"\u003e \u003ca id\u003d\"kcpAppsPopOver\" class\u003d\"a-size-mini a-link-normal kcpAppsPopOver\" href\u003d\"javascript:void(0);\"\u003e \u003cspan class\u003d\"kcpAppBaseBox_\"\u003e \u003cspan class\u003d\"kcpAppsPopOver\"\u003e Read with Our \u003cspan class\u003d\"a-color-price a-text-bold\"\u003e Free App \u003c/span\u003e \u003c/span\u003e \u003c/span\u003e \u003c/a\u003e \u003c/span\u003e \u003cspan class\u003d\"tmm-olp-links\"\u003e \u003c/span\u003e \u003c/span\u003e\u003c/li\u003e      \u003cli class\u003d\"swatchElement selected\"\u003e\u003cspan class\u003d\"a-list-item\"\u003e \u003cspan class\u003d\"a-button a-button-selected a-spacing-mini a-button-toggle format\"\u003e\u003cspan class\u003d\"a-button-inner\"\u003e\u003ca href\u003d\"javascript:void(0)\" class\u003d\"a-button-text\" role\u003d\"button\"\u003e \u003cspan\u003ePaperback\u003c/span\u003e \u003cbr /\u003e \u003cspan class\u003d\"a-color-base\"\u003e \u003cspan class\u003d\"a-color-price\"\u003e $15.4
 9 \u003c/span\u003e \u003c/span\u003e \u003c/a\u003e\u003c/span\u003e\u003c/span\u003e \u003cspan class\u003d\"tmm-olp-links\"\u003e \u003c/span\u003e \u003cspan class\u003d\"tmm-olp-links\"\u003e \u003cspan class\u003d\"olp-used olp-link\"\u003e \u003ca class\u003d\"a-size-mini a-link-normal\" href\u003d\"/gp/offer-listing/1628391340/ref\u003dtmm_pap_used_olp_sr?ie\u003dUTF8\u0026amp;condition\u003dused\u0026amp;qid\u003d\u0026amp;sr\u003d\"\u003e 2 Used \u003cspan class\u003d\"olp-from\"\u003efrom\u003c/span\u003e $12.17 \u003c/a\u003e \u003c/span\u003e \u003cspan class\u003d\"olp-new olp-link\"\u003e \u003ca class\u003d\"a-size-mini a-link-normal\" href\u003d\"/gp/offer-listing/1628391340/ref\u003dtmm_pap_new_olp_sr?ie\u003dUTF8\u0026amp;condition\u003dnew\u0026amp;qid\u003d\u0026amp;sr\u003d\"\u003e 13 New \u003cspan class\u003d\"olp-from\"\u003efrom\u003c/span\u003e $9.44 \u003c/a\u003e \u003c/span\u003e \u003c/span\u003e \u003c/span\u003e\u003c/li\u003e     \u003c/ul\u003e    
 \u003c/div\u003e  \u003c/div\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"applicablePromotionList_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"applicablePromotionList\"\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"holidayDeliveryMessage_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"holidayDeliveryMessage\"\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"campusInfo\" class\u003d\"feature\" data-feature-name\u003d\"campusInfo\"\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"extraProductInfoFeatureGroup\" class\u003d\"feature\" data-feature-name\u003d\"extraProductInfoFeatureGroup\"\u003e   \u003cdiv id\u003d\"newerVersion_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"newerVersion\"\u003e   \u003c/div\u003e   \u003cdiv id\u003d\"productAlert_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"productAlert\"\u003e   \u003c/div\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"dynamicIframe_feature_div\" class\u003d\"feature\" data-feature
 -name\u003d\"dynamicIframe\"\u003e   \u003cscript id\u003d\"dynamic_iframe_CSS\" type\u003d\"text/undefined\"\u003ehtml {    font-size: 100%;}a:focus {    outline: thin dotted #333333;    outline-offset: -2px;}a:hover, a:active {    outline: 0 none;}body {     background-color: #FFFFFF;    margin:0;        /* from AUI */    color: #333333;    font-family: Arial,sans-serif;    font-size: 13px;    line-height: 19px;}h1, h2, h3, h4, h5, h6 {    margin: 0;    padding: 0;}h1, h2, h3, h4 {    font-family: Arial,sans-serif;    text-rendering: optimizelegibility;    padding-bottom: 4px;}h1:last-child, h2:last-child, h3:last-child, h4:last-child {    padding-bottom: 0;}h1 {    font-size: 28px;    font-weight: normal;    line-height: 1.2;}h2 {    font-size: 21px;    font-weight: normal;    line-height: 1.3;}h3 {    font-size: 17px;    font-weight: normal;    line-height: 1.24;}p {  margin: 0 0 14px;  padding: 0;}p:last-child {    margin-bottom: 0;}p + p {    margin-top: -4px;}b, strong {    f
 ont-weight: bold;}i, em {    font-style: italic;}blockquote {    margin: 13px;}small {    font-size: 12px;}img {    border: 0 none;    max-width: 100%;    vertical-align: top;}td {    float: none;    margin-right: 0;}td, th {    padding: 3px;    vertical-align: top;}td:first-child, th:first-child {    padding-left: 0;}td:last-child, th:last-child {    padding-right: 0;}th {    text-align: left;}tr:last-child td, tr:last-child th {    padding-bottom: 0;}tr:first-child td, tr:first-child th {    padding-top: 0;}a, a:visited, a:active, a:link {    color: #007EB9;    text-decoration: none;}a:hover {    color: #E47911;    cursor: pointer;    text-decoration: underline;}p a {    text-decoration: underline;}ul {    /*color: #AAAAAA; Overriding this style as the color is out of sync with the rest of book description*/    list-style-type: disc;}ol {    color: #888888;}ul, ol {    margin: 0 0 18px 22px;    padding: 0;}ul li, ol li {    margin: 0;    word-wrap: break-word;}ul:last-child, ol:la
 st-child {    margin-bottom: 0 !important;}#iframeContent {overflow: hidden;}h2.productDescriptionHeader {    margin-bottom: 0em;}.emptyClear {    clear:left;    height:0px;    font-size:0px;}div.productDescriptionWrapper {    margin: 0 0 1em 0;}h3.productDescriptionSource {    font-weight:normal;    color:#333333;    font-size:1.23em;    margin: .75em 0 .375em 0;    clear:left;}.seeAll {      margin-top: 1.25em;      margin-left: -15px;}#technicalProductFeatures ul {  list-style-type: disc;  margin: 1.12em 0;  margin-left: 20px;}#iframeContent ul {  list-style-type: disc;  margin-left: 20px;}ul li {  margin: 0 0 0 20px;}ul li ul {  list-style-type: disc;  margin-left: 20px;}ul li ul li {  margin: 0 0 0 20px;}.aplus h4, .aplus h5 {    margin: 0 0 .75em 0;    font-size: 1em;}.aplus h4 {    color: #CC6600;}.aplus p {    margin: 0 0 1em 0;}.aplus .break {    clear:both;    height:0px;    font-size:0px;}.aplus .spacer {    margin-bottom: 13px;}.aplus img {    border:none;}.aplus .leftIm
 age, .aplus .rightImage, .aplus .centerImage {    margin-bottom: 1em;    margin-top: 0;    text-align:center;    vertical-align:top;}.aplus .leftImage {    margin-right: 15px;    float:left;    clear:left;}.aplus .rightImage {    margin-left: 15px;    float:right;    clear:right;}.aplus .imageCaption {    clear:both;    padding: .5em .5em 0 .5em;    font-size: .846em;    display: block;}.aplus table.data {      border-collapse: collapse;      margin-bottom: 1.25em;}.aplus table.data th {      font-weight: bold;      background: #F7F7F7;      border-style:solid;      border-color: #CCCCCC;      border-width:0 0 1px 1px;}.aplus table.data td {      border-left: 1px solid #CCC;      border-bottom: 1px dotted #CCC}.aplus table.data th, .aplus table.data td{      padding:3px 10px;      text-align:left}.aplus table.data tfoot {      font-style: italic;}.aplus table.data caption {      background: #eee;      font-size: .8125em;}.aplus table.data tr td:first-child, .aplus table.data tr th:f
 irst-child {      border-left-width:0px;}.aplus ul {      margin:0 0 1em 0;}.aplus .center {      text-align: center;}.aplus .right {      text-align: right;}.aplus  .sixth-col,.aplus .fourth-col,.aplus .third-col,.aplus .half-col,.aplus .two-third-col,.aplus .three-fourth-col,.aplus .one-col {    float:left;    margin-right: 1.6760%;    overflow: hidden;}.aplus .last {    margin-right:0px;}.aplus .sixth-col {    width: 15.080%;}.aplus .fourth-col {    width: 23.4637%;}.aplus .third-col {    width: 31.8436%;}.aplus .half-col {    width: 48.6034%;}.aplus .two-third-col {    width: 65.3631%;}.aplus .three-fourth-col {    width: 73.7430%;}.aplus .one-col {    width: 98.8827%;    margin-right:0;}.aplus .last {    margin-right:0;}.aplus {    width: 100%;    min-width: 895px;}\u003c/script\u003e   \u003cscript type\u003d\"text/javascript\"\u003eP.register(\"DynamicIframe\", function(){function DynamicIframe(options) {    var nTries \u003d 0,      MAX_TRIES \u003d 20,      iframeId \u003d 
 options.iframeId,      encodedIframeContent \u003d options.encodedIframeContent,      iframeWrapperId \u003d options.iframeWrapperId,      initialResizeCallback \u003d options.initialResizeCallback,      iframeCSSId \u003d \"dynamic_iframe_CSS\";      iframeOverriddenCSSId \u003d options.overriddenCSSId;      this.createIframe \u003d function() {    var iframe \u003d document.createElement(\u0027iframe\u0027);    iframe.id \u003d iframeId;    iframe.className \u003d \"ap_never_hide\";    iframe.width \u003d \"100%\";    iframe.scrolling \u003d \"no\";    iframe.frameBorder \u003d \"0\";    onloadFn \u003d this.iframeload;        if ( iframe.addEventListener )      iframe.addEventListener(\"load\", onloadFn, false);    else if ( iframe.attachEvent )      iframe.attachEvent(\"onload\", onloadFn);    else iframe.onload \u003d onloadFn;        var wrapper \u003d document.getElementById(iframeWrapperId);    wrapper.innerHTML \u003d \u0027\u0027;    iframe \u003d wrapper.appendChild(ifram
 e);        var overriddenCSS \u003d \"\";    if (document.getElementById(iframeOverriddenCSSId)) {    \toverriddenCSS \u003d document.getElementById(iframeOverriddenCSSId).innerHTML;    }        var doc \u003d ((iframe.contentWindow \u0026\u0026 iframe.contentWindow.document) || iframe.contentDocument);    if (doc \u0026\u0026 doc.open) {      doc.open();      doc.writeln(\u0027\u003chtml\u003e\u003chead\u003e\u003cbase target\u003d\"_top\" /\u003e\u003c/\u0027 + \u0027head\u003e\u003cbody\u003e\u003cstyle class\u003d\"text/css\"\u003e\u0027 + document.getElementById(iframeCSSId).innerHTML + overriddenCSS + \u0027\u003c/style\u003e\u003cdiv id\u003d\"iframeContent\"\u003e\u0027 +               \u0027\u0027 + decodeURIComponent(encodedIframeContent) + \u0027\u003c/\u0027+\u0027div\u003e\u0027+\u0027\u003c/\u0027+\u0027body\u003e\u003c/html\u003e\u0027);      doc.close();    }  }    this.iframeload \u003d function () {    var iframe \u003d document.getElementById(iframeId);    iframe.
 style.display \u003d \u0027\u0027;    setTimeout(function () {      setIframeHeight(initialResizeCallback);    }, 20);   }    function getDocHeight(doc) {    var contentDiv \u003d doc.getElementById(\"iframeContent\");    var docHeight \u003d 0;    if(contentDiv){      docHeight \u003d Math.max(        contentDiv.scrollHeight,        contentDiv.offsetHeight,        contentDiv.clientHeight      );    }    return docHeight;  }    function setIframeHeight(resizeCallback) {    var iframeDoc, iframe \u003d document.getElementById(iframeId);    iframeDoc \u003d ((iframe.contentWindow \u0026\u0026 iframe.contentWindow.document) || iframe.contentDocument);    if (iframeDoc) {      var h \u003d getDocHeight(iframeDoc);      if (h \u0026\u0026 h !\u003d 0) {        iframe.style.height \u003d parseInt(h) + \u0027px\u0027;        if(typeof resizeCallback \u003d\u003d \"function\") {          resizeCallback(iframeId);\t        }      } else if (nTries \u003c MAX_TRIES) {        nTries++;        
 setTimeout(function () {            setIframeHeight(resizeCallback);        }, 50);      }    }  }    this.resizeIframe \u003d function(resizeCallback) {    nTries \u003d 0;\tsetIframeHeight(resizeCallback);  }}return DynamicIframe;});\u003c/script\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"bookDescription_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"bookDescription\"\u003e   \u003cscript id\u003d\"bookDesc_override_CSS\" type\u003d\"text/undefined\"\u003ebody {     font-size: 14px;    line-height: 1.6em;}.aplus {\tmin-width: inherit;}\u003c/script\u003e   \u003cnoscript\u003e    \u003cdiv\u003e     This is book one of a fantasy series for youths through adults. It is about Narn, a young man in a village of people that is still recent after the Creation. The Maker has Given him the special ability to sense people\u0027s feelings and has Called him to help people when their feelings would turn them from the Maker\u0027s Teachings. Unbeknownst to him, Narn is being 
 pursued by the Blackness, a force from the unMaker trying to undo all that the Maker has Made and that killed Narn\u0027s Father, who also shared Narn\u0027s special sensitivity. Narn discovers that he must choose between the Lessons his Family learned from the Maker and those of the Hunters, seeded from the unMaker. After his best friend, a Hunter, is killed while on a Hunt, Narn\u0027s own emotions blind him, and he ignores his Lessons to avenge his friend\u0027s death. He then finds that he must choose between life and death, not only for the once-revered beast that killed his friend, but also for himself-because his heart has Writings upon it that conflict with what he has seen take place before him. Which is more real? To which will he yield? This book sets the stage for the following series about Narn, which gradually deepens in the question of \u0026quot;choosing whom you will follow,\u0026quot; and gives the reader insight into the Writings on his/her own heart so he/she may
  be better prepared to make that choice. I have a master\u0027s degree in counseling psychology with special emphasis in personal and family challenges. I began to see that the underlying causes of most people\u0027s problems stemmed from a departure from Standards in their lives, consciously or unconsciously. This realization influenced me very strongly and I found myself writing about it in story form.   \u003c/div\u003e    \u003cem\u003e\u003c/em\u003e   \u003c/noscript\u003e   \u003cdiv id\u003d\"outer_postBodyPS\" style\u003d\"overflow: hidden; z-index: 1; height: 0px; display: block;\"\u003e    \u003cdiv id\u003d\"postBodyPS\" style\u003d\"overflow: hidden;\"\u003e     \u003cdiv id\u003d\"bookDesc_iframe_wrapper\" class\u003d\"maxReadableWidth\"\u003e\u003c/div\u003e    \u003c/div\u003e   \u003c/div\u003e   \u003cdiv id\u003d\"psPlaceHolder\" style\u003d\"height: 20px; display: none;\"\u003e    \u003cdiv style\u003d\"z-index: 3;\"\u003e     \u003ca class\u003d\"a-link-expander
  h2-expander\"\u003e \u003ci id\u003d\"bdExpanderIcon\" class\u003d\"a-icon a-icon-expand\"\u003e\u003c/i\u003e \u003cspan id\u003d\"bdSeeAllPrompt\"\u003eRead more\u003c/span\u003e \u003cspan id\u003d\"bdSeeLessPrompt\" style\u003d\"display: none;\"\u003eRead less\u003c/span\u003e \u003c/a\u003e    \u003c/div\u003e   \u003c/div\u003e   \u003cscript type\u003d\"text/javascript\"\u003e P.when(\u0027DynamicIframe\u0027).execute(function(DynamicIframe){\tvar BookDescriptionIframe \u003d null,\t    bookDescEncodedData \u003d \"This%20is%20book%20one%20of%20a%20fantasy%20series%20for%20youths%20through%20adults.%20It%20is%20about%20Narn%2C%20a%20young%20man%20in%20a%20village%20of%20people%20that%20is%20still%20recent%20after%20the%20Creation.%20The%20Maker%20has%20Given%20him%20the%20special%20ability%20to%20sense%20people%27s%20feelings%20and%20has%20Called%20him%20to%20help%20people%20when%20their%20feelings%20would%20turn%20them%20from%20the%20Maker%27s%20Teachings.%20Unbeknownst%20t
 o%20him%2C%20Narn%20is%20being%20pursued%20by%20the%20Blackness%2C%20a%20force%20from%20the%20unMaker%20trying%20to%20undo%20all%20that%20the%20Maker%20has%20Made%20and%20that%20killed%20Narn%27s%20Father%2C%20who%20also%20shared%20Narn%27s%20special%20sensitivity.%20Narn%20discovers%20that%20he%20must%20choose%20between%20the%20Lessons%20his%20Family%20learned%20from%20the%20Maker%20and%20those%20of%20the%20Hunters%2C%20seeded%20from%20the%20unMaker.%20After%20his%20best%20friend%2C%20a%20Hunter%2C%20is%20killed%20while%20on%20a%20Hunt%2C%20Narn%27s%20own%20emotions%20blind%20him%2C%20and%20he%20ignores%20his%20Lessons%20to%20avenge%20his%20friend%27s%20death.%20He%20then%20finds%20that%20he%20must%20choose%20between%20life%20and%20death%2C%20not%20only%20for%20the%20once-revered%20beast%20that%20killed%20his%20friend%2C%20but%20also%20for%20himself-because%20his%20heart%20has%20Writings%20upon%20it%20that%20conflict%20with%20what%20he%20has%20seen%20take%20place%20before%20him.%20
 Which%20is%20more%20real%3F%20To%20which%20will%20he%20yield%3F%20This%20book%20sets%20the%20stage%20for%20the%20following%20series%20about%20Narn%2C%20which%20gradually%20deepens%20in%20the%20question%20of%20%22choosing%20whom%20you%20will%20follow%2C%22%20and%20gives%20the%20reader%20insight%20into%20the%20Writings%20on%20his%2Fher%20own%20heart%20so%20he%2Fshe%20may%20be%20better%20prepared%20to%20make%20that%20choice.%20I%20have%20a%20master%27s%20degree%20in%20counseling%20psychology%20with%20special%20emphasis%20in%20personal%20and%20family%20challenges.%20I%20began%20to%20see%20that%20the%20underlying%20causes%20of%20most%20people%27s%20problems%20stemmed%20from%20a%20departure%20from%20Standards%20in%20their%20lives%2C%20consciously%20or%20unconsciously.%20This%20realization%20influenced%20me%20very%20strongly%20and%20I%20found%20myself%20writing%20about%20it%20in%20story%20form.\",\t    bookDescriptionAvailableHeight,\t    minBookDescriptionInitialHeight \u003d 112,\t    op
 tions \u003d {},\t    iframeId \u003d \"bookDesc_iframe\";     function resizeCallback() {        P.guardFatal(\"bookDescription\", function() {            // Get the line-height of the iframe            var iframe \u003d document.getElementById(iframeId);            var iframeDocument \u003d iframe.contentDocument;            if (false \u0026\u0026 iframeDocument \u0026\u0026 iframeDocument.defaultView) {                // Set the height to the number of lines specified                var numLines \u003d parseInt(0, 10);                 // Get the line-height of the iframe                var iframeContent \u003d iframeDocument.getElementById(\"iframeContent\");                 // Compute the line height                var lineHeight \u003d iframeDocument.defaultView.getComputedStyle(iframeContent, null).getPropertyValue(\"line-height\");                // Parse the line height                lineHeight \u003d parseFloat(lineHeight);                bookDescriptionAvailableHeight \u0
 03d Math.round(lineHeight * numLines);            } else {                var bdOffsetTop \u003d document.getElementById(\"bookDescription_feature_div\").offsetTop;                var imageBlockOffsetTop \u003d document.getElementById(\"booksImageBlock_feature_div\").offsetTop;                var imageBlockHeight \u003d document.getElementById(\"booksImageBlock_feature_div\").offsetHeight;                bookDescriptionAvailableHeight \u003d imageBlockOffsetTop + imageBlockHeight -bdOffsetTop - 30;                if(bookDescriptionAvailableHeight \u003c minBookDescriptionInitialHeight) {                    bookDescriptionAvailableHeight \u003d minBookDescriptionInitialHeight;                }            }    \t\t            var psTotalHeight \u003d document.getElementById(\"postBodyPS\").offsetHeight;             if(psTotalHeight \u003e bookDescriptionAvailableHeight + 30){                if(document.getElementById(\"bdSeeLessPrompt\").style.display \u003d\u003d \"none\"){          
           document.getElementById(\"outer_postBodyPS\").style.height \u003d bookDescriptionAvailableHeight + \u0027px\u0027;                    document.getElementById(\"psPlaceHolder\").style.display \u003d\"block\";                    document.getElementById(\"bdSeeAllPrompt\").style.display \u003d\"block\";                }                else{                    document.getElementById(\"outer_postBodyPS\").style.height \u003d psTotalHeight + \u0027px\u0027;                }            }            else{                document.getElementById(\"outer_postBodyPS\").style.height \u003d psTotalHeight + \u0027px\u0027;                document.getElementById(\"psPlaceHolder\").style.display \u003d\"none\";                document.getElementById(\"bdSeeAllPrompt\").style.display \u003d\"block\";                document.getElementById(\"bdSeeLessPrompt\").style.display \u003d\"none\";                document.getElementById(\"bdExpanderIcon\").className \u003d document.getElementById(\"
 bdExpanderIcon\").className.replace(\"rotate\",\"\");            }        })();    }    options.iframeId \u003d iframeId;    options.iframeWrapperId \u003d \"bookDesc_iframe_wrapper\";\toptions.overriddenCSSId \u003d \"bookDesc_override_CSS\";\toptions.encodedIframeContent \u003d bookDescEncodedData;\toptions.initialResizeCallback \u003d resizeCallback;\t\tBookDescriptionIframe \u003d new DynamicIframe(options);\tP.guardFatal(\"bookDescription\", function() {\t    BookDescriptionIframe.createIframe();\t}) ();\t    \tif ((typeof BookDescriptionIframe !\u003d \u0027undefined\u0027) \u0026\u0026 (BookDescriptionIframe instanceof DynamicIframe)) {\t  P.when(\u0027jQuery\u0027).execute(function($) {\t    $(window).resize(function() {\t        P.guardFatal(\"bookDescription\", function() {\t            BookDescriptionIframe.resizeIframe(resizeCallback);\t        }) ();\t    });\t    $(window).bind(\u0027imageResize\u0027, function() {\t        P.guardFatal(\"bookDescription\", function() 
 {\t            BookDescriptionIframe.resizeIframe(resizeCallback);\t        }) ();\t    });\t  });\t}});\u003c/script\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"edpIngress_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"edpIngress\"\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"heroQuickPromoBooksAtf_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"heroQuickPromoBooksAtf\"\u003e   \u003cdiv id\u003d\"hero-quick-promo\" class\u003d\"a-row a-spacing-medium\"\u003e    \u003chr class\u003d\"a-spacing-medium a-divider-normal\" /\u003e    \u003c!--wlhqp--\u003e    \u003cdiv class\u003d\"qpImage\"\u003e     \u003ca href\u003d\"/gp/redirect.html/ref\u003damb_link_475358582_1/154-5469300-3928621?ie\u003dUTF8\u0026amp;location\u003dhttp%3A%2F%2Fwww.omnivoracious.com%2F\u0026amp;source\u003dstandards\u0026amp;token\u003dDEF1D0758E667C928314D8D6645CBCC4A8DBCD89\u0026amp;pf_rd_m\u003dATVPDKIKX0DER\u0026amp;pf_rd_s\u003dhero-quick-promo-books-atf\u0026amp;pf_rd_r\u003d
 W7WQP2BDJ090798P990F\u0026amp;pf_rd_t\u003d201\u0026amp;pf_rd_p\u003d2546723202\u0026amp;pf_rd_i\u003d1628391340\"\u003e\u003cimg src\u003d\"https://images-na.ssl-images-amazon.com/images/G/01/img15/books/other/17002_books_ABR-hqp_75x75._SL75_CB330842061_.jpg\" width\u003d\"75\" align\u003d\"left\" alt\u003d\"The Amazon Book Review\" height\u003d\"75\" border\u003d\"0\" /\u003e\u003c/a\u003e   \u003c/div\u003e    \u003cspan class\u003d\"qpHeadline\"\u003eThe Amazon Book Review\u003c/span\u003e   \u003cbr /\u003e Author interviews, book reviews, editors picks, and more.    \u003ca href\u003d\"/gp/redirect.html/ref\u003damb_link_475358582_3/154-5469300-3928621?ie\u003dUTF8\u0026amp;location\u003dhttp%3A%2F%2Fwww.omnivoracious.com%2F\u0026amp;source\u003dstandards\u0026amp;token\u003dDEF1D0758E667C928314D8D6645CBCC4A8DBCD89\u0026amp;pf_rd_m\u003dATVPDKIKX0DER\u0026amp;pf_rd_s\u003dhero-quick-promo-books-atf\u0026amp;pf_rd_r\u003dW7WQP2BDJ090798P990F\u0026amp;pf_rd_t\u003d201\u0026amp;p
 f_rd_p\u003d2546723202\u0026amp;pf_rd_i\u003d1628391340\"\u003eRead it now\u003c/a\u003e   \u003c/div\u003e   \u003cdiv style\u003d\"clear:left; margin-bottom:5px\"\u003e\u003c/div\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"promotionalBundle_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"promotionalBundle\"\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"andonCord_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"andonCord\"\u003e  \u003c/div\u003e  \u003cdiv id\u003d\"OosRecommendation_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"OosRecommendation\"\u003e  \u003c/div\u003e \u003c/div\u003e"],"defaultValue":"","isMetaAttribute":false,"extractedValuesCount":1},{"name":"IMAGE","dataType":"STRING","values":[""],"defaultValue":"","isMetaAttribute":false,"extractedValuesCount":0},{"name":"SELLER_INFO","dataType":"STRING","values":[""],"defaultValue":"","isMetaAttribute":false,"extractedValuesCount":0},{"name":"PRODUCT_DETAILS","dataType":"STRING
 ","values":["\u003cdiv id\u003d\"detail-bullets\"\u003e  \u003ca name\u003d\"productDetails\" id\u003d\"productDetails\"\u003e\u003c/a\u003e  \u003chr noshade\u003d\"noshade\" size\u003d\"1\" class\u003d\"bucketDivider\" /\u003e  \u003ctable cellpadding\u003d\"0\" cellspacing\u003d\"0\" border\u003d\"0\" id\u003d\"productDetailsTable\"\u003e   \u003ctbody\u003e   \u003ctr\u003e     \u003ctd class\u003d\"bucket\"\u003e \u003ch2\u003eProduct Details\u003c/h2\u003e      \u003cdiv class\u003d\"content\"\u003e       \u003cul\u003e        \u003cli\u003e\u003cb\u003ePaperback:\u003c/b\u003e 200 pages\u003c/li\u003e        \u003cli\u003e\u003cb\u003ePublisher:\u003c/b\u003e Xulon Press (July 22, 2013)\u003c/li\u003e        \u003cli\u003e\u003cb\u003eLanguage:\u003c/b\u003e English\u003c/li\u003e        \u003cli\u003e\u003cb\u003eISBN-10:\u003c/b\u003e 1628391340\u003c/li\u003e        \u003cli\u003e\u003cb\u003eISBN-13:\u003c/b\u003e 978-1628391343\u003c/li\u003e        \u003cli\u003e\u003cb
 \u003e Product Dimensions: \u003c/b\u003e 6.1 x 0.4 x 9.2 inches \u003c/li\u003e        \u003cli\u003e\u003cb\u003eShipping Weight:\u003c/b\u003e 10.2 ounces (\u003ca href\u003d\"/gp/help/seller/shipping.html/ref\u003ddp_pd_shipping/154-5469300-3928621?ie\u003dUTF8\u0026amp;asin\u003d1628391340\u0026amp;seller\u003dATVPDKIKX0DER\"\u003eView shipping rates and policies\u003c/a\u003e)\u003c/li\u003e        \u003cli\u003e\u003cb\u003eAverage Customer Review:\u003c/b\u003e \u003cscript type\u003d\"text/javascript\"\u003efunction acrPopoverHover(e, h)  {    if(h) window.acrAsinHover \u003d e;    else if(window.acrAsinHover \u003d\u003d e) window.acrAsinHover \u003d null;}function popoverReady(jQuery) {        if((typeof jQuery \u003d\u003d\u003d \"undefined\") || (typeof jQuery.fn \u003d\u003d\u003d \"undefined\")) {            return;        } else if(jQuery.fn.acrPopover) {            return;        }        var popoverConfig \u003d {            showOnHover:true,            showCloseBu
 tton: true,            width: null,            location:\u0027bottom\u0027,            locationAlign:\u0027left\u0027,            locationOffset:[-20,0],            paddingLeft: 15,            paddingBottom: 5,            paddingRight: 15,            group: \u0027reviewsPopover\u0027,            clone:false,            hoverHideDelay:300        };        jQuery.fn.acrPopover \u003d function() {            return this.each(function() {                var $this \u003d jQuery(this);                if(!$this.data(\u0027init\u0027) \u0026\u0026 typeof $this.amazonPopoverTrigger \u003d\u003d\u003d \u0027function\u0027) {                    $this.data(\u0027init\u0027, 1);                    var getargs \u003d $this.attr(\u0027getargs\u0027);                    var ajaxURL \u003d \u0027/gp/customer-reviews/common/du/displayHistoPopAjax.html?\u0027 +                             \u0027\u0026ASIN\u003d\u0027 + $this.attr(\u0027name\u0027) +                             \u0027\u0026link\u003d1\
 u0027 +                             \u0027\u0026seeall\u003d1\u0027 +                             \u0027\u0026ref\u003d\u0027 + $this.attr(\u0027ref\u0027) +                             ((typeof getargs !\u003d \u0027undefined\u0027) ? (\u0027\u0026getargs\u003d\u0027 + getargs) : \u0027\u0027);                    var myConfig \u003d jQuery.extend(true, { destination: ajaxURL }, popoverConfig);                    $this.amazonPopoverTrigger(myConfig);                    var w \u003d window.acrAsinHover;                    if(w \u0026\u0026 jQuery(w).parents(\u0027.asinReviewsSummary\u0027).get(0) \u003d\u003d this) {                        $this.trigger(\u0027mouseover.amzPopover\u0027);                        window.acrAsinHover \u003d null;                    }                }            });        };        window.reviewHistPopoverConfig \u003d popoverConfig;        var jqInit \u003d window.jQueryInitHistoPopovers \u003d function(asin) {            if (typeof jQuery(\u0027.acr-po
 pover[name\u003d\u0027 + asin + \u0027]\u0027).acrPopover \u003d\u003d\u003d \u0027function\u0027) {                jQuery(\u0027.acr-popover[name\u003d\u0027 + asin + \u0027]\u0027).acrPopover();            }        };        window.doInit_average_customer_reviews \u003d jqInit;        window.onAjaxUpdate_average_customer_reviews \u003d jqInit;        window.onCacheUpdate_average_customer_reviews \u003d jqInit;        window.onCacheUpdateReselect_average_customer_reviews \u003d jqInit;        if (typeof P !\u003d\u003d \u0027undefined\u0027) {            P.when(\u0027amznJQ.criticalFeature\u0027).execute(\"amznJQ.criticalFeatureComplete\", function() {                setTimeout(function() { P.register(\u0027acrPopover\u0027, function () {                    return window.arcPopover;                }); }, 10);            });        } else if (typeof amznJQ !\u003d\u003d \u0027undefined\u0027) {            amznJQ.onCompletion(\u0027amznJQ.criticalFeature\u0027, function() {          
       setTimeout(function() { amznJQ.declareAvailable(\u0027acrPopover\u0027); }, 10);            });        }};function acrPopoverReady(jQuery) {    jQuery(\u0027.acr-popover,#searchTemplate .asinReviewsSummary\u0027).each(function() {        if (typeof jQuery(this).acrPopover \u003d\u003d\u003d \u0027function\u0027) {            jQuery(this).acrPopover();        }    });};if (typeof P !\u003d\u003d \u0027undefined\u0027) {    var jq \u003d null;    if (typeof $ !\u003d\u003d \u0027undefined\u0027) {        jq \u003d $;    } else if (typeof jQuery !\u003d\u003d \u0027undefined\u0027) {        jq \u003d jQuery;    }    if (jq) {        P.when(\u0027popover\u0027, \u0027ready\u0027).execute(popoverReady(jq));        P.when(\u0027acrPopover\u0027, \u0027ready\u0027).execute(acrPopoverReady(jq));    }} else if ((typeof amznJQ !\u003d\u003d \u0027undefined\u0027) \u0026\u0026 (typeof jQuery !\u003d\u003d \u0027undefined\u0027)) {    amznJQ.onReady(\u0027popover\u0027, popoverReady, jQue
 ry);    amznJQ.onReady(\u0027acrPopover\u0027, acrPopoverReady, jQuery);};\u003c/script\u003e \u003cspan class\u003d\"crAvgStars\" style\u003d\"white-space:no-wrap;\"\u003e\u003cspan class\u003d\"asinReviewsSummary acr-popover\" name\u003d\"1628391340\" ref\u003d\"dp_db_cm_cr_acr_pop_\"\u003e \u003ca style\u003d\"cursor:pointer;text-decoration:none\" href\u003d\"https://www.amazon.com/Before-First-Day-Stephen-Hale/product-reviews/1628391340/ref\u003ddp_db_cm_cr_acr_img/154-5469300-3928621?ie\u003dUTF8\u0026amp;showViewpoints\u003d1\" name\u003d\"reviewHistoPop_1628391340__star__\" onmouseover\u003d\"return acrPopoverHover(this,1);\" onmouseout\u003d\"return acrPopoverHover(this,0);\"\u003e\u003cspan class\u003d\"swSprite s_star_5_0 \" title\u003d\"5.0 out of 5 stars\"\u003e\u003cspan\u003e5.0 out of 5 stars\u003c/span\u003e\u003c/span\u003e\u0026nbsp;\u003c/a\u003e\u0026nbsp;\u003cspan class\u003d\"histogramButton\" style\u003d\"margin-left:-3px\"\u003e\u003ca style\u003d\"cursor:po
 inter\" href\u003d\"https://www.amazon.com/Before-First-Day-Stephen-Hale/product-reviews/1628391340/ref\u003ddp_db_cm_cr_acr_img/154-5469300-3928621?ie\u003dUTF8\u0026amp;showViewpoints\u003d1\" name\u003d\"reviewHistoPop_1628391340__button__\" onmouseover\u003d\"return acrPopoverHover(this,1);\" onmouseout\u003d\"return acrPopoverHover(this,0);\"\u003e\u003cspan class\u003d\"swSprite s_chevron \"\u003e\u003cspan\u003eSee all reviews\u003c/span\u003e\u003c/span\u003e\u0026nbsp;\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e(\u003ca href\u003d\"https://www.amazon.com/Before-First-Day-Stephen-Hale/product-reviews/1628391340/ref\u003ddp_db_cm_cr_acr_txt/154-5469300-3928621?ie\u003dUTF8\u0026amp;showViewpoints\u003d1\"\u003e1 customer review\u003c/a\u003e)\u003c/span\u003e\u003c/li\u003e        \u003cli id\u003d\"SalesRank\"\u003e \u003cb\u003eAmazon Best Sellers Rank:\u003c/b\u003e #9,398,863 in Books (\u003ca href\u003d\"https://www.amazon.com/best-sellers-books-Amazon/zgbs/books/ref
 \u003dpd_dp_ts_b_1/154-5469300-3928621\"\u003eSee Top 100 in Books\u003c/a\u003e) \u003cstyle type\u003d\"text/css\"\u003e.zg_hrsr { margin: 0; padding: 0; list-style-type: none; }.zg_hrsr_item { margin: 0 0 0 10px; }.zg_hrsr_rank { display: inline-block; width: 80px; text-align: right; }\u003c/style\u003e         \u003cul class\u003d\"zg_hrsr\"\u003e          \u003cli class\u003d\"zg_hrsr_item\"\u003e \u003cspan class\u003d\"zg_hrsr_rank\"\u003e#6112\u003c/span\u003e \u003cspan class\u003d\"zg_hrsr_ladder\"\u003ein\u0026nbsp;\u003ca href\u003d\"https://www.amazon.com/best-sellers-books-Amazon/zgbs/books/ref\u003dpd_zg_hrsr_b_1_1/154-5469300-3928621\"\u003eBooks\u003c/a\u003e \u0026gt; \u003ca href\u003d\"https://www.amazon.com/gp/bestsellers/books/12290/ref\u003dpd_zg_hrsr_b_1_2/154-5469300-3928621\"\u003eChristian Books \u0026amp; Bibles\u003c/a\u003e \u0026gt; \u003ca href\u003d\"https://www.amazon.com/gp/bestsellers/books/172806/ref\u003dpd_zg_hrsr_b_1_3/154-5469300-3928621\"\u0
 03eLiterature \u0026amp; Fiction\u003c/a\u003e \u0026gt; \u003cb\u003e\u003ca href\u003d\"https://www.amazon.com/gp/bestsellers/books/7259433011/ref\u003dpd_zg_hrsr_b_1_4_last/154-5469300-3928621\"\u003eFantasy\u003c/a\u003e\u003c/b\u003e\u003c/span\u003e \u003c/li\u003e          \u003cli class\u003d\"zg_hrsr_item\"\u003e \u003cspan class\u003d\"zg_hrsr_rank\"\u003e#105141\u003c/span\u003e \u003cspan class\u003d\"zg_hrsr_ladder\"\u003ein\u0026nbsp;\u003ca href\u003d\"https://www.amazon.com/best-sellers-books-Amazon/zgbs/books/ref\u003dpd_zg_hrsr_b_2_1/154-5469300-3928621\"\u003eBooks\u003c/a\u003e \u0026gt; \u003ca href\u003d\"https://www.amazon.com/gp/bestsellers/books/17/ref\u003dpd_zg_hrsr_b_2_2/154-5469300-3928621\"\u003eLiterature \u0026amp; Fiction\u003c/a\u003e \u0026gt; \u003ca href\u003d\"https://www.amazon.com/gp/bestsellers/books/10134/ref\u003dpd_zg_hrsr_b_2_3/154-5469300-3928621\"\u003eGenre Fiction\u003c/a\u003e \u0026gt; \u003cb\u003e\u003ca href\u003d\"https://www.am
 azon.com/gp/bestsellers/books/12489/ref\u003dpd_zg_hrsr_b_2_4_last/154-5469300-3928621\"\u003eReligious \u0026amp; Inspirational\u003c/a\u003e\u003c/b\u003e\u003c/span\u003e \u003c/li\u003e          \u003cli class\u003d\"zg_hrsr_item\"\u003e \u003cspan class\u003d\"zg_hrsr_rank\"\u003e#1162374\u003c/span\u003e \u003cspan class\u003d\"zg_hrsr_ladder\"\u003ein\u0026nbsp;\u003ca href\u003d\"https://www.amazon.com/best-sellers-books-Amazon/zgbs/books/ref\u003dpd_zg_hrsr_b_3_1/154-5469300-3928621\"\u003eBooks\u003c/a\u003e \u0026gt; \u003cb\u003e\u003ca href\u003d\"https://www.amazon.com/gp/bestsellers/books/22/ref\u003dpd_zg_hrsr_b_3_2_last/154-5469300-3928621\"\u003eReligion \u0026amp; Spirituality\u003c/a\u003e\u003c/b\u003e\u003c/span\u003e \u003c/li\u003e         \u003c/ul\u003e \u003c/li\u003e       \u003c/ul\u003e       \u003cspan class\u003d\"tiny\"\u003e        \u003cul class\u003d\"noteBullets\"\u003e        \u003c/ul\u003e \u003c/span\u003e      \u003c/div\u003e \u003c/td\u003
 e    \u003c/tr\u003e   \u003c/tbody\u003e \u003c/table\u003e \u003c/div\u003e"],"defaultValue":"","isMetaAttribute":false,"extractedValuesCount":1},{"name":"TECH_DETAILS","dataType":"STRING","values":[""],"defaultValue":"","isMetaAttribute":false,"extractedValuesCount":0},{"name":"CAPTCHA","dataType":"STRING","values":[""],"defaultValue":"","isMetaAttribute":false,"extractedValuesCount":0},{"name":"PRODUCT_IDENTIFIER","dataType":"STRING","values":[""],"defaultValue":"","isMetaAttribute":false,"extractedValuesCount":0},{"name":"BUYBOX","dataType":"STRING","values":["\u003cdiv id\u003d\"unifiedBuyBox_feature_div\" class\u003d\"feature\" data-feature-name\u003d\"unifiedBuyBox\"\u003e  \u003cdiv id\u003d\"combinedBuyBox\" class\u003d\"a-section a-spacing-medium\"\u003e   \u003cform method\u003d\"post\" id\u003d\"addToCart\" action\u003d\"/gp/product/handle-buy-box/ref\u003ddp_start-bbf_1_glance\" class\u003d\"a-content\"\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"session-id\" n
 ame\u003d\"session-id\" value\u003d\"154-5469300-3928621\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"ASIN\" name\u003d\"ASIN\" value\u003d\"1628391340\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"offerListingID\" name\u003d\"offerListingID\" value\u003d\"P0YRnR9szBbdW1hK5VhfhfwyIoQrnhuEd%2BPy%2BBgCbCzNct9GAa8y5i0LbWFzbHdQ3KzbWuQMLfVSXokLOyYlLfXo60wCnhwcYD%2BQpFk1lcQBrvHvvzu1mw%3D%3D\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"isMerchantExclusive\" name\u003d\"isMerchantExclusive\" value\u003d\"0\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"merchantID\" name\u003d\"merchantID\" value\u003d\"ATVPDKIKX0DER\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"isAddon\" name\u003d\"isAddon\" value\u003d\"0\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"nodeID\" name\u003d\"nodeID\" value\u003d\"283155\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"sellingCustomerID\" name\u003d\"sellingCustomerID\" value\u003d\"A2R2RITDJN
 W1Q6\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"qid\" name\u003d\"qid\" value\u003d\"\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"sr\" name\u003d\"sr\" value\u003d\"\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"storeID\" name\u003d\"storeID\" value\u003d\"books\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"tagActionCode\" name\u003d\"tagActionCode\" value\u003d\"283155\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"viewID\" name\u003d\"viewID\" value\u003d\"glance\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"rsid\" name\u003d\"rsid\" value\u003d\"154-5469300-3928621\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"sourceCustomerOrgListID\" name\u003d\"sourceCustomerOrgListID\" value\u003d\"\" /\u003e    \u003cinput type\u003d\"hidden\" id\u003d\"sourceCustomerOrgListItemID\" name\u003d\"sourceCustomerOrgListItemID\" value\u003d\"\" /\u003e    \u003cinput type\u003d\"hidden\" name\u003d\"wlPopCommand\" value\u00
 3d\"\" /\u003e    \u003cdiv id\u003d\"buybox\" class\u003d\"a-row a-spacing-medium\"\u003e     \u003cdiv id\u003d\"rbbContainer\" class\u003d\"a-box-group dp-accordion\"\u003e      \u003cdiv class\u003d\"a-box rbbSection selected dp-accordion-active\"\u003e      \u003cdiv class\u003d\"a-box-inner\"\u003e        \u003cdiv class\u003d\"a-section a-spacing-none a-padding-none\"\u003e         \u003cdiv id\u003d\"buyNewSection\" class\u003d\"rbbHeader dp-accordion-row\"\u003e          \u003ci class\u003d\"a-icon a-icon-radio-active\"\u003e\u003c/i\u003e          \u003ca class\u003d\"a-link-normal rbbHeaderLink\" href\u003d\"/gp/product/1628391340?selectObb\u003dnew\"\u003e \u003ch5\u003e            \u003cdiv class\u003d\"a-row\"\u003e             \u003cdiv class\u003d\"a-column a-span4 a-text-left a-nowrap\"\u003e              \u003cspan class\u003d\"a-text-bold\"\u003eBuy New\u003c/span\u003e             \u003c/div\u003e             \u003cdiv class\u003d\"a-column a-span8 a-text-right a
 -span-last\"\u003e              \u003cdiv class\u003d\"inlineBlock-display\"\u003e               \u003cspan class\u003d\"a-letter-space\"\u003e\u003c/span\u003e               \u003cspan class\u003d\"a-size-medium a-color-price offer-price a-text-normal\"\u003e$15.49\u003c/span\u003e              \u003c/div\u003e             \u003c/div\u003e            \u003c/div\u003e \u003c/h5\u003e \u003c/a\u003e         \u003c/div\u003e         \u003cdiv id\u003d\"buyNewInner\" class\u003d\"rbbContent dp-accordion-inner\"\u003e          \u003cdiv id\u003d\"buyBoxInner\" class\u003d\"a-section a-spacing-none\"\u003e           \u003cdiv class\u003d\"a-row\"\u003e            \u003cdiv class\u003d\"a-column a-span5\"\u003e             \u003cdiv id\u003d\"selectQuantity\" class\u003d\"a-section a-spacing-none a-padding-none\"\u003e              \u003cspan class\u003d\"a-declarative\" data-action\u003d\"quantity-dropdown\" data-quantity-dropdown\u003d\"{}\"\u003e \u003cspan class\u003d\"a-dropdown-cont
 ainer\"\u003e\u003clabel for\u003d\"quantity\" class\u003d\"a-native-dropdown\"\u003eQty:\u003c/label\u003e\u003cselect name\u003d\"quantity\" autocomplete\u003d\"off\" id\u003d\"quantity\" tabindex\u003d\"-1\" class\u003d\"a-native-dropdown\"\u003e \u003coption value\u003d\"1\" selected\u003d\"\"\u003e1 \u003c/option\u003e \u003coption value\u003d\"2\"\u003e2 \u003c/option\u003e \u003coption value\u003d\"3\"\u003e3 \u003c/option\u003e \u003coption value\u003d\"4\"\u003e4 \u003c/option\u003e \u003coption value\u003d\"5\"\u003e5 \u003c/option\u003e \u003coption value\u003d\"6\"\u003e6 \u003c/option\u003e \u003coption value\u003d\"7\"\u003e7 \u003c/option\u003e \u003coption value\u003d\"8\"\u003e8 \u003c/option\u003e \u003coption value\u003d\"9\"\u003e9 \u003c/option\u003e \u003coption value\u003d\"10\"\u003e10 \u003c/option\u003e \u003coption value\u003d\"11\"\u003e11 \u003c/option\u003e \u003coption value\u003d\"12\"\u003e12 \u003c/option\u003e \u003coption value\u003d\"13\"\u003e13
  \u003c/option\u003e \u003coption value\u003d\"14\"\u003e14 \u003c/option\u003e \u003coption value\u003d\"15\"\u003e15 \u003c/option\u003e \u003coption value\u003d\"16\"\u003e16 \u003c/option\u003e \u003coption value\u003d\"17\"\u003e17 \u003c/option\u003e \u003coption value\u003d\"18\"\u003e18 \u003c/option\u003e \u003coption value\u003d\"19\"\u003e19 \u003c/option\u003e \u003coption value\u003d\"20\"\u003e20 \u003c/option\u003e \u003coption value\u003d\"21\"\u003e21 \u003c/option\u003e \u003coption value\u003d\"22\"\u003e22 \u003c/option\u003e \u003coption value\u003d\"23\"\u003e23 \u003c/option\u003e \u003coption value\u003d\"24\"\u003e24 \u003c/option\u003e \u003coption value\u003d\"25\"\u003e25 \u003c/option\u003e \u003coption value\u003d\"26\"\u003e26 \u003c/option\u003e \u003coption value\u003d\"27\"\u003e27 \u003c/option\u003e \u003coption value\u003d\"28\"\u003e28 \u003c/option\u003e \u003coption value\u003d\"29\"\u003e29 \u003c/option\u003e \u003coption value\u003d\"30\"\u
 003e30 \u003c/option\u003e \u003c/select\u003e\u003cspan tabindex\u003d\"-1\" class\u003d\"a-button a-button-dropdown a-button-small\"\u003e\u003cspan class\u003d\"a-button-inner\"\u003e\u003cspan class\u003d\"a-button-text a-declarative\" data-action\u003d\"a-dropdown-button\" role\u003d\"button\" tabindex\u003d\"0\" aria-hidden\u003d\"true\"\u003e\u003cspan class\u003d\"a-dropdown-label\"\u003eQty:\u003c/span\u003e\u003cspan class\u003d\"a-dropdown-prompt\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003ci class\u003d\"a-icon a-icon-dropdown\"\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e \u003c/span\u003e             \u003c/div\u003e            \u003c/div\u003e            \u003cdiv class\u003d\"a-column a-span7 a-text-right a-span-last\"\u003e             \u003cul class\u003d\"a-nostyle a-vertical\"\u003e             \u003c/ul\u003e            \u003c/div\u003e           \u003c/div\u003e          \u003c/div\u003e          \u003cdiv class\u003d\"a-section a-s
 pacing-small a-spacing-top-micro\"\u003e           \u003cdiv class\u003d\"a-row\"\u003e            \u003cspan class\u003d\"a-color-base buyboxShippingLabel\"\u003e             \u003c!-- MsgId:cfs_free_shipping_eligible_no_popover_link:web --\u003e \u003ca href\u003d\"/gp/help/customer/display.html/ref\u003dmk_sss_dp_1?ie\u003dUTF8\u0026amp;pop-up\u003d1\u0026amp;nodeId\u003d527692\" target\u003d\"AmazonHelp\" onclick\u003d\"return amz_js_PopWin(this.href,\u0027AmazonHelp\u0027,\u0027width\u003d550,height\u003d550,resizable\u003d1,scrollbars\u003d1,toolbar\u003d0,status\u003d0\u0027);\"\u003eFREE Shipping\u003c/a\u003e on orders with at least $25 of books.\u003c/span\u003e           \u003c/div\u003e          \u003c/div\u003e          \u003cdiv class\u003d\"a-section a-spacing-none\"\u003e          \u003c/div\u003e          \u003cdiv class\u003d\"a-section a-spacing-small\"\u003e           \u003cdiv id\u003d\"availability\" class\u003d\"a-section a-spacing-none\"\u003e            \u00
 3cspan class\u003d\"a-size-medium a-color-success\"\u003e May take an extra 1-2 days to ship. \u003c/span\u003e           \u003c/div\u003e           \u003cdiv class\u003d\"a-section a-spacing-none\"\u003e           \u003c/div\u003e           \u003cdiv id\u003d\"merchant-info\" class\u003d\"a-section a-spacing-mini\"\u003e            Ships from and sold by Amazon.com.            \u003cspan class\u003d\"\"\u003e Gift-wrap available. \u003c/span\u003e           \u003c/div\u003e          \u003c/div\u003e          \u003cdiv id\u003d\"bbopAndCartBox\" class\u003d\"a-box\"\u003e          \u003cdiv class\u003d\"a-box-inner\"\u003e            \u003cstyle type\u003d\"text/css\"\u003e#bbop-sbbop-container {  margin-bottom: 0px;}\u003c/style\u003e            \u003cdiv id\u003d\"bbop-sbbop-container\" class\u003d\"a-section\"\u003e             \u003cdiv id\u003d\"sbbop-popover-header\" class\u003d\"a-section a-hidden\"\u003e              \u003cdiv class\u003d\"a-box a-alert-inline a-alert-inline
 -success\"\u003e               \u003cdiv class\u003d\"a-box-inner a-alert-container\"\u003e                \u003ci class\u003d\"a-icon a-icon-alert\"\u003e\u003c/i\u003e                \u003cdiv class\u003d\"a-color-base\"\u003e                 Before the First Day has been added to your Cart                \u003c/div\u003e               \u003c/div\u003e              \u003c/div\u003e             \u003c/div\u003e            \u003c/div\u003e            \u003cscript type\u003d\"text/javascript\"\u003eif( window.P ){    P.when(\"A\").execute(function(A) {                if (window.sbbopLoaded \u003d\u003d\u003d undefined) {            window.sbbopLoaded \u003d false;        }                function getQueryParameterByName(name) {            name \u003d name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");            var regex \u003d new RegExp(\"[\\\\?\u0026]\" + name + \"\u003d([^\u0026#]*)\"),                results \u003d regex.exec(location.search);            return result
 s \u003d\u003d null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));        }                var hidden, visibilityChange;        if (typeof document.hidden !\u003d\u003d \"undefined\") {             hidden \u003d \"hidden\";            visibilityChange \u003d \"visibilitychange\";        } else if (typeof document.mozHidden !\u003d\u003d \"undefined\") {            hidden \u003d \"mozHidden\";            visibilityChange \u003d \"mozvisibilitychange\";        } else if (typeof document.msHidden !\u003d\u003d \"undefined\") {            hidden \u003d \"msHidden\";            visibilityChange \u003d \"msvisibilitychange\";        } else if (typeof document.webkitHidden !\u003d\u003d \"undefined\") {            hidden \u003d \"webkitHidden\";            visibilityChange \u003d \"webkitvisibilitychange\";        }                var loadFeatures \u003d function() {                                    var $ \u003d A.$,                $container \u003d $(\"#bbop-sbbop-conta
 iner\");            var data \u003d {                \"ASIN\" : \"1628391340\",                \"merchantID\" : \"ATVPDKIKX0DER\",                \"bbopruleID\" : \"Acquisition_AddToCart_PrimeBasicFreeTrialUpsellEligible\",                \"sbbopruleID\" : \"Acquisition_AddToCart_PrimeBasicFreeTrialUpsellEligible\",                \"deliveryOptions\" : \"[next,std-n-us,sss-us,second]\",                \"preorder\" : \"false\",                \"releaseDateDeliveryEligible\" : \"false\"            };            var scope \u003d \"bbopAjaxCall\";                        if(typeof uet \u003d\u003d\u003d \u0027function\u0027) {                uet(\u0027bb\u0027, scope, {wb: 1});            }                        $.get(\"/gp/product/du/bbop-ms3-ajax-endpoint.html\", data, function(result) {                                                                                $container.append(result);                                                    if(typeof uet \u003d\u003d\u003d \u0027func
 tion\u0027 \u0026\u0026 typeof uex \u003d\u003d\u003d \u0027function\u0027) {                                        uet( \"cf\", scope, {wb: 1} );                    uex( \"ld\", scope, {wb: 1} );                }                                                                if (getQueryParameterByName(\"checkBBOP\") \u003d\u003d\u003d \"true\") {                    P.when(\"a-modal\", \"ready\").execute(function(modal) {                      $(\u0027#bbop-check-box\u0027).click();                    });                }                                loadSBBOP();                            });                        var loadSBBOP \u003d function(){                P.when(\"a-modal\", \"ready\").execute(function(modal) {                    if(!window.sbbopLoaded){                        var sbbop_modal \u003d createModal(modal);                        if (sbbop_modal !\u003d\u003d undefined) {                            $(document.body).delegate(\u0027#add-to-cart-button\u0027,\u00
 27click.sbbop\u0027, function(event){                                $(document.body).undelegate(\u0027#add-to-cart-button\u0027,\u0027click.sbbop\u0027);                                var $sbbop \u003d $(\"#sbbop-container\"),                                    $sbbopContent \u003d $sbbop.find(\"#sbbop-popover-content\"),                                    $sbbopHeader \u003d $container.find(\"#sbbop-popover-header\"),                                    $sbbopFooter \u003d $sbbop.find(\"#sbbop-popover-footer\"),                                    isAsinizationCase \u003d $sbbop.find(\".is-sbbop-asinization-usecase\").length \u003e 0,                                    $bbopCheckbox \u003d $(\u0027#bbop-check-box\u0027),                                    $atcButton \u003d $(\u0027#add-to-cart-button\u0027),                                    atcName \u003d $atcButton.attr(\"name\"),                                    hasSingleYesButton \u003d ($(\u0027#sbbop-yes-button\u0027).leng
 th \u003d\u003d\u003d 1),                                    hasSingleNoButton  \u003d ($(\u0027#sbbop-no-button\u0027).length \u003d\u003d\u003d 1),                                    validAtcButton \u003d ($atcButton.length \u003d\u003d\u003d 1 \u0026\u0026 atcName !\u003d \"submit.add-to-cart-prime-buy-box.x\"),                                    validSbbopContent \u003d ($sbbopContent.length \u003d\u003d\u003d 1 \u0026\u0026 $sbbopHeader.length \u003d\u003d\u003d 1 \u0026\u0026 $sbbopFooter.length \u003d\u003d\u003d 1),                                    validSbbopButtons \u003d (hasSingleYesButton \u0026\u0026 hasSingleNoButton),                                    bbopIsNotChecked \u003d !$bbopCheckbox.is(\":checked\");                                if (validAtcButton \u0026\u0026 validSbbopContent \u0026\u0026 validSbbopButtons \u0026\u0026 bbopIsNotChecked) {                                    $atcButton.bind(\u0027click.sbbop\u0027, function(){return false;});              
                         $(document.body).delegate(\"#sbbop-yes-button\", \"click\", function(event){                                        if(isAsinizationCase){                                            $bbopCheckbox.prop(\"checked\",true);                                            logMetric(\"CSM_prime_surprise_BBOP_yes_button_HO\");                                        }                                        else {                                            $atcButton.attr(\"name\", \"submit.add-to-cart-prime-buy-box.x\");                                            logMetric(\"CSM_prime_surprise_BBOP_yes_button\");                                        }                                        safeATCClick();                                    });                                    $(document.body).delegate(\"#sbbop-no-button\", \"click\", function(event){                                        if(isAsinizationCase) {                                            logMetric(\"C
 SM_prime_surprise_BBOP_no_button_HO\");                                        }                                        else {                                            logMetric(\"CSM_prime_surprise_BBOP_no_button\");                                        }                                        safeATCClick();                                    });                                                                        $(document.body).delegate(\".a-popover\", \"keydown\", function(event){                                        if(event.keyCode \u003d\u003d \"27\"){                                            event.preventDefault();                                        }                                    });                                    A.on(\"a:popover:ajaxFail:sbbop_modal\", safeATCClick);                                    A.on(\"a:popover:hide:sbbop_modal\", function(){                                        if(isAsinizationCase) {                                     
        logMetric(\"CSM_prime_surprise_BBOP_close_button_HO\");                                        }                                        else {                                            logMetric(\"CSM_prime_surprise_BBOP_close_button\");                                        }                                        safeATCClick();                                    });                                    A.on(\"a:popover:beforeShow:sbbop_modal\", function(){                                            setEventEmbu();                                    });                                    sbbop_modal.show();                                    if(isAsinizationCase) {                                        logMetric(\"CSM_prime_surprise_BBOP_presentation_HO\");                                    }                                    else {                                        logMetric(\"CSM_prime_surprise_BBOP_presentation\");                                    }            
                         return false;                                }                             });                        }                        window.sbbopLoaded \u003d true;                    }                });            };            var createModal \u003d function(modal) {                var $sbbop \u003d $(\"#sbbop-container\"),                    $sbbopContent \u003d $sbbop.find(\"#sbbop-popover-content\"),                    $sbbopHeader \u003d $container.find(\"#sbbop-popover-header\"),                    $sbbopFooter \u003d $sbbop.find(\"#sbbop-popover-footer\");                if($sbbopContent.length \u003d\u003d\u003d 1 \u0026\u0026 $sbbopHeader.length \u003d\u003d\u003d 1 \u0026\u0026 $sbbopFooter.length \u003d\u003d\u003d 1){                     sbbopWidth \u003d parseInt(($sbbop.find(\"#sbbop-popover\")).attr(\"popover-width\"), 10);                    return modal.create($sbbop, {                        \"inlineContent\": $sbbopContent.html(),              
           \"header\": $sbbopHeader.html(),                        \"footer\": $sbbopFooter.html(),                        \"width\": sbbopWidth,                        \"activate\": \"onclick\",                        \"name\": \"sbbop_modal\"                    });                }                return undefined;            }            var logMetric \u003d function(customTag){                if(window.ue \u0026\u0026 ue.tag) {                    ue.tag(customTag, \"surpriseBBOP\")                }            };            var postBackMetrics \u003d function(){                if (window.ue){                    uex(\"ld\", \"surpriseBBOP\");                }            };            var setEventEmbu \u003d function(){                var eventData \u003d { \"eventCode\" : \"106\" };                $.get(\"/gp/prime/utility/record-embu-event.html\", eventData);            };            var safeATCClick \u003d function() {                postBackMetrics();                             
                     $(\u0027#add-to-cart-button\u0027).unbind(\u0027click.sbbop\u0027)                         .click()                                                           .bind(\u0027click.sbbop\u0027,function(){return false});             };                                }                var handleVisibilityChange \u003d function() {            if (!document[hidden]) {                                document.removeEventListener(visibilityChange, handleVisibilityChange);                loadFeatures();            }        }        if (typeof document.addEventListener \u003d\u003d\u003d \"undefined\" ||            typeof document[hidden] \u003d\u003d\u003d \"undefined\" || !document[hidden]) {                        loadFeatures();        } else {                        document.addEventListener(visibilityChange, handleVisibilityChange);        }    });}\u003c/script\u003e            \u003cdiv class\u003d\"a-button-stack\"\u003e             \u003cspan id\u003d\"submit.add-to-c
 art\" class\u003d\"a-button a-spacing-small a-button-primary a-button-icon\"\u003e\u003cspan class\u003d\"a-button-inner\"\u003e\u003ci class\u003d\"a-icon a-icon-cart\"\u003e\u003c/i\u003e\u003cinput id\u003d\"add-to-cart-button\" name\u003d\"submit.add-to-cart\" title\u003d\"Add to Shopping Cart\" data-hover\u003d\"Select \u0026lt;b\u0026gt;__dims__\u0026lt;/b\u0026gt; from the left\u0026lt;br\u0026gt; to add to Shopping Cart\" class\u003d\"a-button-input\" type\u003d\"submit\" value\u003d\"Add to Cart\" aria-labelledby\u003d\"submit.add-to-cart-announce\" /\u003e\u003cspan id\u003d\"submit.add-to-cart-announce\" class\u003d\"a-button-text\" aria-hidden\u003d\"true\"\u003eAdd to Cart\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e            \u003c/div\u003e           \u003c/div\u003e         \u003c/div\u003e          \u003cdiv class\u003d\"a-row a-spacing-none\"\u003e           \u003cdiv id\u003d\"oneClickSignIn\" class\u003d\"a-section a-spacing-none\"\u003e            \u003c
 div class\u003d\"a-divider a-divider-break a-spacing-micro\"\u003e            \u003ch5\u003e\u003ca href\u003d\"/gp/product/utility/edit-one-click-pref.html?ie\u003dUTF8\u0026amp;query\u003dselectObb%3dnew\u0026amp;returnPath\u003d%2fgp%2fproduct%2f1628391340\"\u003e\u003cspan class\u003d\"a-size-mini\"\u003eTurn on 1-Click ordering for this browser\u003c/span\u003e\u003c/a\u003e\u003c/h5\u003e           \u003c/div\u003e           \u003c/div\u003e          \u003c/div\u003e          \u003cdiv class\u003d\"a-row\"\u003e           \u003cdiv id\u003d\"dpFastTrack_feature_div\" data-feature-name\u003d\"dpFastTrack\" data-template-name\u003d\"dpFastTrack\" class\u003d\"a-section a-spacing-none a-spacing-top-small feature\"\u003e            \u003c!-- We only want padding, if the weblab is on--\u003e            \u003cdiv id\u003d\"fast-track\" class\u003d\"a-section a-spacing-none\"\u003e             \u003cinput type\u003d\"hidden\" id\u003d\"ftSelectAsin\" value\u003d\"1628391340\" /\u003e
              \u003cinput type\u003d\"hidden\" id\u003d\"ftSelectMerchant\" value\u003d\"ATVPDKIKX0DER\" /\u003e             \u003cdiv id\u003d\"fast-track-message\" class\u003d\"a-section a-spacing-none\"\u003e             \u003c/div\u003e             \u003cscript type\u003d\"text/javascript\"\u003e    P.when(\"A\", \"jQuery\").execute(function(A, $) {        $(\"#quantity\").live(\"change\", function (event) {            if (event.updateFTOnQuantityChange) {                return;            }            event.updateFTOnQuantityChange \u003d 1;            var quantity \u003d $(this).val();            var asin \u003d $(\"#ftSelectAsin\").val();            var merchantId \u003d $(\"#ftSelectMerchant\").val();            if (!asin || !merchantId) {                return;            }            var params \u003d [];            params.push(\"asin\u003d\" + asin);            params.push(\"quantity\u003d\" + quantity);            params.push(\"merchantId\u003d\" + merchantId);           
  $.ajax({                type: \"POST\",                url: \"/gp/product/features/dp-fast-track/udp-ajax-handler/get-quantity-update-message.html?ie\u003dUTF8\",                contentType: \u0027application/x-www-form-urlencoded;charset\u003dutf-8\u0027,                data: params.join(\u0027\u0026\u0027),                dataType: \"html\",                success: function(objResponse) {                    if (objResponse !\u003d null \u0026\u0026 objResponse !\u003d \"\") {                        $(\"#fast-track-message\").replaceWith(objResponse);                    }                }            });            return;        });    });\u003c/script\u003e            \u003c/div\u003e           \u003c/div\u003e          \u003c/div\u003e          \u003cdiv id\u003d\"unifiedLocation_feature_div\" data-feature-name\u003d\"unifiedLocation\" data-template-name\u003d\"unifiedLocation\" class\u003d\"a-section feature unifiedLocationMarginBottomClass\"\u003e           \u003cscript type\u
 003d\"text/javascript\"\u003e            P.now(\"LOCUX_DETALPAGE_51079_T1\").execute(function(LOCUX_DETALPAGE_51079_T1) {                if (!LOCUX_DETALPAGE_51079_T1) {                    P.declare(\"LOCUX_DETALPAGE_51079_T1\", {});                }            });        \u003c/script\u003e           \u003cdiv class\u003d\"a-section a-spacing-none\"\u003e            \u003chr class\u003d\"a-divider-normal\" /\u003e            \u003cdiv class\u003d\"a-section a-spacing-mini\"\u003e             \u003cspan class\u003d\"a-text-bold\"\u003e Ship to: \u003c/span\u003e            \u003c/div\u003e            \u003cdiv class\u003d\"a-section a-spacing-none\"\u003e             \u003cspan class\u003d\"a-declarative\" data-action\u003d\"a-popover\" data-a-popover\u003d\"{\u0026quot;closeButton\u0026quot;:\u0026quot;false\u0026quot;,\u0026quot;name\u0026quot;:\u0026quot;LUXAddressSelector\u0026quot;,\u0026quot;activate\u0026quot;:\u0026quot;onclick\u0026quot;}\"\u003e \u003ca href\u003d\"javascr
 ipt:void(0)\" class\u003d\"a-popover-trigger a-declarative\"\u003e \u003cspan class\u003d\"a-color-base lux-location-label\"\u003e DALLAS, TX 75201 \u003c/span\u003e \u003ci class\u003d\"a-icon a-icon-popover\"\u003e\u003c/i\u003e\u003c/a\u003e \u003c/span\u003e            \u003c/div\u003e            \u003cdiv class\u003d\"a-popover-preload\" id\u003d\"a-popover-LUXAddressSelector\"\u003e             \u003c!-- Section to show to unrecognized customers (instead of address selector) --\u003e             \u003cdiv id\u003d\"unifiedLocationTitleNoAddress\" class\u003d\"a-section a-spacing-small a-spacing-top-small a-text-center\"\u003e              \u003cspan class\u003d\"a-text-bold\"\u003e To see addresses, please \u003c/span\u003e              \u003cbr /\u003e              \u003cspan id\u003d\"unifiedLocationSignIn\" class\u003d\"a-button a-spacing-top-base a-button-primary\"\u003e\u003cspan class\u003d\"a-button-inner\"\u003e\u003cinput class\u003d\"a-button-input\" type\u003d\"subm
 it\" aria-labelledby\u003d\"unifiedLocationSignIn-announce\" /\u003e\u003cspan id\u003d\"unifiedLocationSignIn-announce\" class\u003d\"a-button-text\" aria-hidden\u003d\"true\"\u003e Sign in \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e             \u003c/div\u003e             \u003c!-- Place holder for anchoring the address selector --\u003e             \u003cdiv id\u003d\"lux-address-selector-anchor\" class\u003d\"a-section a-spacing-none\"\u003e\u003c/div\u003e             \u003cdiv class\u003d\"a-section a-spacing-none lux-address-selector-divider\"\u003e             \u003c/div\u003e             \u003cdiv id\u003d\"unifiedLocationAddrInputDiv\" class\u003d\"a-section a-spacing-none\"\u003e              \u003cdiv class\u003d\"a-divider a-divider-break lux-zip-selector-divider\"\u003e              \u003ch5\u003eor\u003c/h5\u003e             \u003c/div\u003e              \u003clabel class\u003d\"a-text-bold\"\u003e Use this location: \u003c/label\u003e              \u003cdiv 
 class\u003d\"a-row a-spacing-top-micro\" role\u003d\"form\"\u003e               \u003cdiv class\u003d\"a-column a-span8\" role\u003d\"form\"\u003e                \u003cinput type\u003d\"text\" maxlength\u003d\"5\" id\u003d\"unifiedLocationAddrInput\" placeholder\u003d\"Enter US zip\" class\u003d\"a-input-text a-span12\" /\u003e               \u003c/div\u003e               \u003cdiv class\u003d\"a-column a-span4 a-span-last\" role\u003d\"button\"\u003e                \u003cspan id\u003d\"unifiedLocationAddrUpdate\" class\u003d\"a-button a-button-span12\"\u003e\u003cspan class\u003d\"a-button-inner\"\u003e\u003cinput class\u003d\"a-button-input\" type\u003d\"submit\" aria-labelledby\u003d\"unifiedLocationAddrUpdate-announce\" /\u003e\u003cspan id\u003d\"unifiedLocationAddrUpdate-announce\" class\u003d\"a-button-text\" aria-hidden\u003d\"true\"\u003e Update \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e               \u003c/div\u003e              \u003c/div\u003e              \u00
 3cdiv id\u003d\"unifiedLocationInvalidInputAlert\" class\u003d\"a-row a-spacing-top-small aok-hidden\"\u003e               \u003cspan class\u003d\"a-color-error\"\u003e Please enter a valid US zip code. \u003c/span\u003e              \u003c/div\u003e              \u003cdiv id\u003d\"LUXInvalidZipCodeAlert\" class\u003d\"a-row a-spacing-top-small aok-hidden\" role\u003d\"alert\"\u003e               \u003cdiv class\u003d\"a-box a-alert-inline a-alert-inline-error a-spacing-none\"\u003e               \u003cdiv class\u003d\"a-box-inner a-alert-container\"\u003e                \u003ci class\u003d\"a-icon a-icon-alert\"\u003e\u003c/i\u003e                \u003cdiv class\u003d\"a-alert-content\"\u003e                  Please enter a valid US zip code.                 \u003c/div\u003e               \u003c/div\u003e              \u003c/div\u003e              \u003c/div\u003e              \u003cdiv id\u003d\"LUXMilitaryZipCodeAlert\" class\u003d\"a-row a-spacing-top-small aok-hidden\" role\u0
 03d\"alert\"\u003e               \u003cdiv class\u003d\"a-box a-alert-inline a-alert-inline-info a-spacing-none\"\u003e               \u003cdiv class\u003d\"a-box-inner a-alert-container\"\u003e                \u003ci class\u003d\"a-icon a-icon-alert\"\u003e\u003c/i\u003e                \u003cdiv class\u003d\"a-alert-content\"\u003e                  Shipping to a APO/FPO/DPO? Please add the address to your address book. Make sure you include the unit and box numbers (if assigned).                 \u003c/div\u003e               \u003c/div\u003e              \u003c/div\u003e              \u003c/div\u003e             \u003c/div\u003e             \u003cdiv class\u003d\"a-divider a-divider-break a-spacing-base a-spacing-top-base lux-country-selector-divider\"\u003e             \u003ch5\u003eor\u003c/h5\u003e            \u003c/div\u003e             \u003cdiv id\u003d\"unifiedLocationCountrySelectionDiv\" class\u003d\"a-row a-spacing-none a-spacing-top-small\"\u003e             \u003c/div\
 u003e            \u003c/div\u003e            \u003cscript type\u003d\"text/javascript\"\u003e            var shouldPopulateCountrySelector \u003d true;            P.now(\"LOCUX_DETAILPAGE_68144_T1\").execute(function(LOCUX_DETAILPAGE_68144_T1) {                if(LOCUX_DETAILPAGE_68144_T1) {                    shouldPopulateCountrySelector \u003d true;                }            });            var fullPageRefresh \u003d false;            P.now(\"LOCUX_FULLPAGE_REFRESH\").execute(function(LOCUX_FULLPAGE_REFRESH) {                if(LOCUX_FULLPAGE_REFRESH) {                    fullPageRefresh \u003d true;                }            });            P.now(\"LUXContext\").execute(function(LUXContext) {                if (!LUXContext) {                    P.declare(\"LUXContext\", {                        isRecognizedCustomer: false,                        deviceType: \"web\",                        isOneClick: false,                        clientPage: \"DPX\",                        sho
 uldPopulateCountrySelector: shouldPopulateCountrySelector,                        fullPageRefresh: fullPageRefresh                    });                }            });            P.when(\"LUXController\").execute(function(LUXController) {                LUXController.init({                    addressLabel : \"\",                    addressId    : \"\",                    obfuscatedId : \"\",                    countryCode  : \"US\",                    zipCode      : \"75201\",                    state        : \"TX\",                    city         : \"DALLAS\",                    district     : \"\",                    locationType : \"IP2LOCATION\"                });            });        \u003c/script\u003e           \u003c/div\u003e           \u003cinput type\u003d\"hidden\" name\u003d\"dropdown-selection\" value\u003d\"add-new\" id\u003d\"unifiedLocationAddress\" data-addnewaddress\u003d\"add-new\" /\u003e           \u003cscript type\u003d\"text/javascript\"\u003e    P.now(\
 "LUXDPOnly\").execute(function(DP) {        DP || P.declare(\"LUXDPOnly\", {});    });    P.when(\"LUXDPRefreshController\").execute(function(Controller) {        Controller.init({            asin : \"1628391340\",            merchantId : \"ATVPDKIKX0DER\",            deviceType : \"web\",            smid : \"\",            exMerchId : \"\",            wdg: \"book_display_on_website\",            oneClick : false,            addressId : \"\",            obfuscatedId : \"\",            city : \"DALLAS\",            state : \"TX\",            countryCode : \"US\",            zipCode : \"75201\",            district : \"\",            useTwisterRefresh : \"C\",            updateAddressForNon1Click : \"T1\",            relatedRequestId : \"W7WQP2BDJ090798P990F\"        });    });    \u003c/script\u003e          \u003c/div\u003e          \u003cdiv class\u003d\"a-row\"\u003e           \u003cdiv id\u003d\"holidayAvailabilityMessage_feature_div\" data-feature-name\u003d\"holidayAvailability
 Message\" data-template-name\u003d\"holidayAvailabilityMessage\" class\u003d\"a-section a-spacing-top-small feature\"\u003e           \u003c/div\u003e          \u003c/div\u003e         \u003c/div\u003e        \u003c/div\u003e       \u003c/div\u003e     \u003c/div\u003e      \u003cdiv class\u003d\"a-box rbbSection unselected\"\u003e      \u003cdiv class\u003d\"a-box-inner\"\u003e        \u003cdiv class\u003d\"a-section a-spacing-none a-padding-none\"\u003e         \u003cdiv id\u003d\"usedBuySection\" class\u003d\"rbbHeader dp-accordion-row\"\u003e          \u003ci class\u003d\"a-icon a-icon-radio-inactive\"\u003e\u003c/i\u003e          \u003ca class\u003d\"a-link-normal rbbHeaderLink\" href\u003d\"/gp/product/1628391340?selectObb\u003dused\"\u003e \u003ch5\u003e            \u003cdiv class\u003d\"a-row\"\u003e             \u003cdiv class\u003d\"a-column a-span4 a-text-left a-nowrap\"\u003e              \u003cspan class\u003d\"a-text-bold\"\u003eBuy Used\u003c/span\u003e             \u
 003c/div\u003e             \u003cdiv class\u003d\"a-column a-span8 a-text-right a-span-last\"\u003e              \u003cdiv class\u003d\"inlineBlock-display\"\u003e               \u003cspan class\u003d\"a-letter-space\"\u003e\u003c/span\u003e               \u003cspan class\u003d\"a-color-base offer-price a-text-normal\"\u003e$12.94\u003c/span\u003e              \u003c

<TRUNCATED>


[3/4] incubator-griffin git commit: Update dsl modification

Posted by gu...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/417c931f/measure/src/test/resources/input.msg
----------------------------------------------------------------------
diff --git a/measure/src/test/resources/input.msg b/measure/src/test/resources/input.msg
deleted file mode 100644
index edb4619..0000000
--- a/measure/src/test/resources/input.msg
+++ /dev/null
@@ -1 +0,0 @@
-{"confId":28,"seeds":["{\"url\":\"https://www.amazon.com/bridge-across-time-myths-history/dp/0855000449/ref\\u003dsr_1_1/186-6687480-5099813?ie\\u003dUTF8\\u0026keywords\\u003d0855000449\\u0026qid\\u003d1434663708\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0855000449\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/8479538562/ref\\u003dsr_1_9?ie\\u003dUTF8\\u0026qid\\u003d47073302\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"8479538562\\\",\\\"referencePrice\\\":0.0,\\\"refe
 renceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1619619172/ref\\u003ds9_simh_gw_p63_d3_i3?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d80956L21ZP4Y9DRF74Z5\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d988263899\\u0026pf_rd_i\\u003d891862\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1619619172\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1857751507/ref\\u003ds9_simh_gw_p74_d2_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d81TU9DQLRW1TQM56LWW3\\u0026pf_rd_t\\
 u003d101\\u0026pf_rd_p\\u003d156743226\\u0026pf_rd_i\\u003d729862\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1857751507\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1481714317/ref\\u003ds9_simh_gw_p107_d0_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dKB37RY3JE5HKQ5G4630T\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d331346081\\u0026pf_rd_i\\u003d575468\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1481714317\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"trac
 ker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1403775141/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1403775141\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Letters-Amelia-Diana-Turner-Forte/dp/0533157684/ref\\u003dsr_1_1/184-7208233-4184259?ie\\u003dUTF8\\u0026keywords\\u003d9780533157686\\u0026qid\\u003d1434675492\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0533157684\\\",\\\"referencePrice\\\":0
 .0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1591022320/ref\\u003ds9_simh_gw_p63_d3_i5?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dWVP9OE92HD77NSJXQZIL\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d556903239\\u0026pf_rd_i\\u003d594333\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1591022320\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Medieval-Early-Modern-Times-Janet/dp/9994609912/ref\\u003dsr_1_1/191-6299628-5905209?ie\\u003dUTF8\\u0026keywords\\u003d9789994609918\\u0026qid\\u0
 03d1434432677\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"9994609912\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1493574175/ref\\u003ds9_simh_gw_p74_d2_i6?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d1OZ6A0RNM4S8JJ01245S\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d124388178\\u0026pf_rd_i\\u003d596200\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1493574175\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\
 \\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1598598635/ref\\u003ds9_ri_gw_g201_i7?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d7O715KMM6Y744QTQ4LIU\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d673955261\\u0026pf_rd_i\\u003d649226\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1598598635\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Escape-Tibet-Nick-Gray/dp/095715190X/ref\\u003dsr_1_1/175-7416659-0137139?ie\\u003dUTF8\\u0026keywords\\u003d9780957151901\\u0026qid\\u003d1434508924\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\
 \\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"095715190X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Man-About-House-Definitive-Companion-ebook/dp/B005AKCFXA\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B005AKCFXA\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/112067641X/ref\\u003ds9_ri_gw_g201_i5?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d0SIZV93I9RQ1669EES6L\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d504839570
 \\u0026pf_rd_i\\u003d161781\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"112067641X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Unnatural-Death-Pedigree-Dorothy-Sayers/dp/B005TCM1X8/ref\\u003dsr_1_1/188-6111852-5942804?ie\\u003dUTF8\\u0026keywords\\u003d9780450020988\\u0026qid\\u003d1434450513\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B005TCM1X8\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extr
 Feilds\":[]}","{\"url\":\"https://www.amazon.com/James-Castle-Common-Place-0970425716/dp/B002J813MA/ref\\u003dsr_1_2/176-6368479-5598662?ie\\u003dUTF8\\u0026keywords\\u003d0970425716\\u0026qid\\u003d1434422520\\u0026sr\\u003d8-2\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B002J813MA\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1940516099/ref\\u003ds9_ri_gw_g201_i2?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dR8JQ4JMW6P3SOJL36M9M\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d535308337\\u0026pf_rd_i\\u003d184331\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlM
 etadata\\\":{\\\"retailerProductId\\\":\\\"1940516099\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1240463456/ref\\u003ds9_ri_gw_g201_i3?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dBL66W75USY907YG001QF\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d720488364\\u0026pf_rd_i\\u003d676890\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1240463456\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/CARSON-DELLOSA-BRIDGE-ORANGE-4-5/dp/1932210652/ref\\u003dsr_1_1/186-9
 625969-7817661?ie\\u003dUTF8\\u0026keywords\\u003d1932210652\\u0026qid\\u003d1434486504\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1932210652\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/B00898M8X2/ref\\u003ds9_simh_gw_p74_d2_i6?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d6RTM9ED4621X306QR2Y3\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d205846301\\u0026pf_rd_i\\u003d110484\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B00898M8X2\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPric
 e\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1597549045/ref\\u003ds9_simh_gw_p63_d3_i10?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dOLWI416TK382276FRI8S\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d971991139\\u0026pf_rd_i\\u003d747799\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1597549045\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Betrayal-Empty-Coffin-Novel/dp/1469216868/ref\\u003dsr_1_1/175-7820384-1782744?ie\\u003dUTF8\\u0026keywords\\u003d1469216868\\u0026qid\\u003d1434594698\\u0026sr\\u003d8-1\",\
 "metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1469216868\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/American-Police-Systems-Raymond-Fosdick/dp/B001KUVGPW/ref\\u003dsr_1_1/176-3370848-7400366?ie\\u003dUTF8\\u0026keywords\\u003d0875859097\\u0026qid\\u003d1434597754\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B001KUVGPW\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://
 www.amazon.com/gp/product/B00KDV1514/ref\\u003dsr_1_1?ie\\u003dUTF8\\u0026qid\\u003d68571520\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B00KDV1514\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1599928825/ref\\u003ds9_ri_gw_g201_i7?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d4TLP90H57YN3J9USNZS0\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d206214160\\u0026pf_rd_i\\u003d410077\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1599928825\\\",\\\"referencePrice\\\":0.
 0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Obeah-Bible-L-W-Laurence/dp/1456472992/184-5031071-1689052?ie\\u003dUTF8\\u0026ref_\\u003ds9_simh_gw_p107_d0_i9\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1456472992\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/B00XJOGUL2/ref\\u003ds9_simh_gw_p63_d3_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d6K4IS5NT23VSY8RK09SM\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d971785392\\u0026pf_rd_i\\u003d254059\",\"metadata\":\"{\\\"crawlType\\\":
 \\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"metaCategId\\\":625,\\\"leafCategId\\\":43479,\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B00XJOGUL2\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/0735841594/ref\\u003ds9_simh_gw_p74_d2_i2?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d4S47E7MUXUTX2OAS03M7\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d858738605\\u0026pf_rd_i\\u003d329711\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0735841594\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}
 \",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1401246125/ref\\u003ds9_ri_gw_g201_i1?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dD5ZSN8FGJFRE1P6P06FN\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d986128032\\u0026pf_rd_i\\u003d431901\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1401246125\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/0531233545/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0531233545\\\",\\\"referencePrice\\\":0.0,\\
 \"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Magpies-Psychological-Thriller-Mark-Edwards/dp/1483911896/ref\\u003dsr_1_1/186-3277371-2912266?ie\\u003dUTF8\\u0026keywords\\u003d9781483911892\\u0026qid\\u003d1434440841\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1483911896\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/149936816X/ref\\u003ds9_ri_gw_g201_i9?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dA2G0NAMUI8Y2SLIOG6K1\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d206
 377910\\u0026pf_rd_i\\u003d192380\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"149936816X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/0321993306/ref\\u003ds9_simh_gw_p74_d2_i9?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dP49OLGZR6428DSLYD41K\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d464469450\\u0026pf_rd_i\\u003d713302\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0321993306\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS
 \\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Arcana-Archives-Catalogo-Febbraio-9-Settembre/dp/8860604222/ref\\u003dsr_1_1/191-2294536-5098349?ie\\u003dUTF8\\u0026keywords\\u003d9788860604224\\u0026qid\\u003d1434516786\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"8860604222\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1287198279/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1287198279\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice
 \\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/B005AW9VPI/ref\\u003ds9_simh_gw_p79_d17_i9?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dSH241RMHIXZ0P4OG3QO7\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d946293479\\u0026pf_rd_i\\u003d418397\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B005AW9VPI\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1844651258/ref\\u003dsr_1_2?ie\\u003dUTF8\\u0026qid\\u003d70179092\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",
 \\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1844651258\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1484105176/ref\\u003dsr_1_4?ie\\u003dUTF8\\u0026qid\\u003d40145443\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1484105176\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Monday-Morning-Leadership-Valerie-Sokolosky/dp/097464031X/ref\\u003dsr_1_1/192-6857494-6582456?ie\\u00
 3dUTF8\\u0026keywords\\u003d9780974640310\\u0026qid\\u003d1434634974\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"097464031X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1288670427/ref\\u003ds9_simh_gw_p79_d17_i5?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dEF7S9AY28SM61TL6P5XR\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d377137900\\u0026pf_rd_i\\u003d382960\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1288670427\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\
 ":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/B00K8UNGGW/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B00K8UNGGW\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Watcher-Another-World-J-Wilson/dp/187167672X/ref\\u003dsr_1_1/179-3023112-0477816?ie\\u003dUTF8\\u0026keywords\\u003d9781871676723\\u0026qid\\u003d1434542107\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"187167672X\\\",\\\"referencePrice\\\
 ":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Mad-Black-Lady-Wanda-Coleman/dp/0876854129/ref\\u003dsr_1_1/182-7097983-9105503?ie\\u003dUTF8\\u0026keywords\\u003d0876854129\\u0026qid\\u003d1434701480\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0876854129\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Every-Word-Fist-Amelia-Garcia/dp/146620818X\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerPro
 ductId\\\":\\\"146620818X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/B00873B0CO/ref\\u003ds9_simh_gw_p74_d2_i5?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d0XY59A109S39P6ID1N23\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d295494213\\u0026pf_rd_i\\u003d478561\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B00873B0CO\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Springboard-Discovery-Mary-Lou-Lacy/dp/0804235953\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRO
 DUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0804235953\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Aventures-extraordinaires-dAdÃ%C2%83Â%C2%83Â%C2%83Ã%C2%83Â%C2%82Â%C2%83Ã%C2%83Â%C2%82Â%C2%83Ã%C2%83Â%C2%83Â%C2%83Ã%C2%83Â%C2%82Â%C2%82Ã%C2%83Â%C2%82Â%C2%83Ã%C2%83Â%C2%83Â%C2%83Ã%C2%83Â%C2%82Â%C2%83Ã%C2%83Â%C2%82Â%C2%85Ã%C2%83Â%C2%83Â%C2%83Ã%C2%83Â%C2%82Â%C2%82Ã%C2%83Â%C2%83Â%C2%82Ã%C2%83Â%C2%82Ã%C2%82¡le-Blanc-Sec/dp/229032096X\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\"
 :\\\"229032096X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1480512796/ref\\u003ds9_ri_gw_g201_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dK4N7A64LBYP7TXSR9W49\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d681535512\\u0026pf_rd_i\\u003d230294\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1480512796\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/crise-conscience-europeenne-1680-1715-French/dp/221300613X/ref\\u003dsr_1_1/189-4114609-4176061?ie\\u003dUT
 F8\\u0026keywords\\u003d9782213006130\\u0026qid\\u003d1434473448\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"221300613X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1743170246/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1743170246\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1249925037/ref\\u003ds9_simh_gw_p
 63_d3_i2?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d1ZX7BOB71HEJOS512320\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d213504420\\u0026pf_rd_i\\u003d514621\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1249925037\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Lifetime-Volunteer-Frates-Joan-Gilmore/dp/1885596499/ref\\u003dsr_1_1/184-6208647-5211900?ie\\u003dUTF8\\u0026keywords\\u003d1885596499\\u0026qid\\u003d1434664139\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1885596499\\\",\\\"referencePrice\\\
 ":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1507597142/ref\\u003ds9_simh_gw_p107_d0_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dG88Q8FMLD0RS001F6STG\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d192898073\\u0026pf_rd_i\\u003d725640\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1507597142\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/0691614385/ref\\u003dsr_1_7?ie\\u003dUTF8\\u0026qid\\u003d11874892\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\
 \"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0691614385\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/150531089X/ref\\u003dsr_1_8?ie\\u003dUTF8\\u0026qid\\u003d93416624\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"150531089X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1591859581/ref\\u003ds9_simh_gw_p74_d2_i7?pf_rd_m\\
 u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dD89JO942AP0BGI8VHY6Z\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d259933109\\u0026pf_rd_i\\u003d594179\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1591859581\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/B0077D8O60/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B0077D8O60\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"
 \",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/0957401515/ref\\u003ds9_simh_gw_p63_d3_i2?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dP68SFUUGN08H8EL54714\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d948202552\\u0026pf_rd_i\\u003d899110\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0957401515\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/3849554147/ref\\u003ds9_simh_gw_p79_d17_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d1QMUT47S5N1OP87AM79G\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d664853631\\u0026pf_rd_i\\u003d825108\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerNa
 me\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"3849554147\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Regulating-Pesticides-Commission-Natural-Resources/dp/0309029465/ref\\u003dsr_1_1/186-2886194-1044035?ie\\u003dUTF8\\u0026keywords\\u003d0309029465\\u0026qid\\u003d1434700978\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0309029465\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/AutoCAD-2006-Tutorial-First-Fundament
 als/dp/1585032301\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1585032301\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1493162667/ref\\u003ds9_simh_gw_p63_d3_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d5B1N58OK9DGNSXAYO648\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d490117977\\u0026pf_rd_i\\u003d302914\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1493162667\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":14868996020
 00}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1482532700/ref\\u003ds9_simh_gw_p79_d17_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d2A85UB174G4QB67Q6W4E\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d469121724\\u0026pf_rd_i\\u003d652299\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1482532700\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1289164118/ref\\u003dsr_1_2?ie\\u003dUTF8\\u0026qid\\u003d18547913\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\
 \\":{\\\"retailerProductId\\\":\\\"1289164118\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1275841597/ref\\u003dsr_1_6?ie\\u003dUTF8\\u0026qid\\u003d83157364\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1275841597\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/How-Maximize-Your-Profit-maximize/dp/1505906075\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\
 ":{\\\"retailerProductId\\\":\\\"1505906075\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1436679060/ref\\u003ds9_simh_gw_p79_d17_i1?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dJ9SOI248X12J3TS2DL0V\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d526717715\\u0026pf_rd_i\\u003d369502\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1436679060\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Plant-Molecular-Biology-Essential-Techniques/dp/0471972681/ref\\u003dsr_1_1/190-92
 97182-6303650?ie\\u003dUTF8\\u0026keywords\\u003d9780471972686\\u0026qid\\u003d1434705995\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0471972681\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Europe-Exporters-Handbook-Jenner/dp/0871965658/ref\\u003dsr_1_1/189-3435491-9141552?ie\\u003dUTF8\\u0026keywords\\u003d9780871965653\\u0026qid\\u003d1434701852\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0871965658\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\
 \"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1288527004/ref\\u003ds9_simh_gw_p79_d17_i2?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dL676IU8SE79EB28460T4\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d839567868\\u0026pf_rd_i\\u003d952718\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1288527004\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Groups-Practice-Marianne-Schneider-Hardcover/dp/0534367453/ref\\u003dsr_1_1/186-0267917-7112209?ie\\u003dUTF8\\u0026keywords\\u003d0534367453\\u0026qid\\u003d1434879089\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\
 \\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0534367453\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/161034958X/ref\\u003ds9_simh_gw_p79_d17_i3?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dLDIXFU564R4V24ZK6SN2\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d473453365\\u0026pf_rd_i\\u003d771807\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"161034958X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"
 url\":\"https://www.amazon.com/dp/product/B00049QL5U/ref\\u003ds9_simh_gw_p107_d0_i2?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dY564P8EU9SRSEXNYP77G\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d561884715\\u0026pf_rd_i\\u003d312289\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B00049QL5U\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1618852183/ref\\u003ds9_simh_gw_p107_d0_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dKM0Q6544JP28U5676KZF\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d974311606\\u0026pf_rd_i\\u003d652689\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_
 us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1618852183\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Models-Dermatology-Vol/dp/3805547617\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"3805547617\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/0684859726/ref\\u003ds9_simh_gw_p79_d17_i7?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d727ES4S50NPD7M8F4XLO\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d475467204\\u0026
 pf_rd_i\\u003d897737\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0684859726\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1449788386/ref\\u003dsr_1_3?ie\\u003dUTF8\\u0026qid\\u003d34593636\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1449788386\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1622125290/ref\\u0
 03ds9_simh_gw_p107_d0_i7?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d46Q876OOMM3D6XSDG7VM\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d954847296\\u0026pf_rd_i\\u003d374067\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1622125290\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1494559447/ref\\u003ds9_simh_gw_p79_d17_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dW5LSQ3KS109584JUY4A0\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d694179817\\u0026pf_rd_i\\u003d134867\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":
 {\\\"retailerProductId\\\":\\\"1494559447\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Proceedings-1-2-Classical-Association-Wales/dp/1236636929/ref\\u003dsr_1_1/184-1359550-5736018?ie\\u003dUTF8\\u0026keywords\\u003d9781236636928\\u0026qid\\u003d1434649299\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1236636929\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1287003001/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerNa
 me\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1287003001\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1249180309/ref\\u003dsr_1_10?ie\\u003dUTF8\\u0026qid\\u003d32633819\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1249180309\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Michelin-Red-Guide-Spain-Portugal/dp/2060063779/ref\\u003dsr_1_1/179-4403527-2002065?ie\\u003dUTF8\\u0026ke
 ywords\\u003d9782060063775\\u0026qid\\u003d1434621406\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"2060063779\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Homicidal-Aliens-Other-Disappointments-Invasion/dp/1480518522/ref\\u003dsr_1_1/186-9648743-6858653?ie\\u003dUTF8\\u0026keywords\\u003d1480518522\\u0026qid\\u003d1434660937\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1480518522\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\
 \":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/0984635742/ref\\u003ds9_simh_gw_p79_d17_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d21YWJSFV761872B02I7H\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d175584267\\u0026pf_rd_i\\u003d665215\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0984635742\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1583335331/ref\\u003ds9_simh_gw_p74_d2_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dPLKAEVA1UJH99O85N5K2\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d919768077\\u0026pf_rd_i\\u003d142182\",\"metadata\":\"{\\\"cra
 wlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1583335331\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1305256662/ref\\u003ds9_ri_gw_g201_i6?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d8V35F53XPBW54M0TO89S\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d736378767\\u0026pf_rd_i\\u003d803718\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1305256662\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"u
 rl\":\"https://www.amazon.com/Biological-Rhythm-Research-Sollberger/dp/0444405496/ref\\u003dsr_1_1/184-0842412-0577011?ie\\u003dUTF8\\u0026keywords\\u003d0444405496\\u0026qid\\u003d1434660594\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0444405496\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/0826520235/ref\\u003ds9_simh_gw_p79_d17_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d17N0U1085ISNRS396YHI\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d909993468\\u0026pf_rd_i\\u003d167394\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetada
 ta\\\":{\\\"retailerProductId\\\":\\\"0826520235\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1452089175/ref\\u003ds9_simh_gw_p63_d3_i7?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d9S13UGLB1J3M03X087L7\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d683610611\\u0026pf_rd_i\\u003d897880\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1452089175\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1286720451/ref\\u003ds9_simh_gw_p79_d17_i2?pf_rd_m\\u003dATVPDKIKX0
 DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dE82MQGB807FFVWB3Q44R\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d104104751\\u0026pf_rd_i\\u003d243022\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1286720451\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1499041055/ref\\u003ds9_ri_gw_g201_i9?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dB5S17N4WLLSPDD34YDY8\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d872947608\\u0026pf_rd_i\\u003d644957\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1499041055\\\",\\\"refe
 rencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1288769598/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1288769598\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Encyclopaedia-United-States-Spacecraft-Bison/dp/0600500519/ref\\u003dsr_1_1/189-9370660-2213859?ie\\u003dUTF8\\u0026keywords\\u003d9780600500513\\u0026qid\\u003d1434620291\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productC
 rawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0600500519\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/ANTONIO-VIVALDI-Garland-reference-humanities/dp/0824083865\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0824083865\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1465417117/ref\\u003dsr_1_4?ie\\u003dUTF8\\u0026qid\\u003d16061560\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US
 \\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1465417117\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/0813224535/ref\\u003ds9_simh_gw_p74_d2_i6?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dSHQ8F60N372GY56JWF09\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d412949045\\u0026pf_rd_i\\u003d425983\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0813224535\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1495421996/ref\\u003ds9_ri_gw_g2
 01_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dX9D65SVNFOVU7N8SWF3O\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d165045927\\u0026pf_rd_i\\u003d372797\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1495421996\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/3640223098/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"3640223098\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"lin
 kSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Soldier-Official-Guide-Accompany-ITV/dp/B0041CQMJG\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B0041CQMJG\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1480031003/ref\\u003ds9_simh_gw_p63_d3_i10?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d0RSF4Y1580S2V22H2JSG\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d328419621\\u0026pf_rd_i\\u003d991785\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1480031003\\\",\\\"referencePrice\\\":0.0,\\\"referenceSh
 ippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/My-Harvest-Home-Celebration-Customs/dp/0937203688/ref\\u003dsr_1_1/185-2501167-9365558?ie\\u003dUTF8\\u0026keywords\\u003d9780937203682\\u0026qid\\u003d1434501536\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0937203688\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Halfway-Decent-Ernie-Hudson/dp/B001A4YO20\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\
 \"B001A4YO20\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1288916906/ref\\u003ds9_simh_gw_p74_d2_i6?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dONRG59HTI83U545RG01Y\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d669707968\\u0026pf_rd_i\\u003d353895\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1288916906\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1288725108/ref\\u003dsr_1_5?ie\\u003dUTF8\\u0026qid\\u003d97736076\\u0026sr\\u003d8-1\\u0026keywords\\u
 003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1288725108\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1462067514/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1462067514\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1290713707/ref\\u003ds9_simh_gw_p107_d0_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\
 \u0026pf_rd_r\\u003dR9AF8E0I0OVS17OZWIL0\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d819156518\\u0026pf_rd_i\\u003d124919\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1290713707\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Het-historische-gedicht-geschiedenis-Vlaanderen/dp/9057592851/ref\\u003dsr_1_1/176-4708134-2081319?ie\\u003dUTF8\\u0026keywords\\u003d9789057592850\\u0026qid\\u003d1434457720\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"9057592851\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors
 \\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1289300151/ref\\u003ds9_simh_gw_p63_d3_i3?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dDW5AQM8981BG14F3OR4U\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d353942470\\u0026pf_rd_i\\u003d642212\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1289300151\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Christines-Picture-Book-Christian-Andersen/dp/0862720893/ref\\u003dsr_1_1/179-3046203-1921448?ie\\u003dUTF8\\u0026keywords\\u003d9780862720896\\u0026qid\\u003d1434426244\\u0026sr\\u003d8-1\",\"metad
 ata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0862720893\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1249461162/ref\\u003ds9_simh_gw_p79_d17_i3?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d57YUBLM3S5JH10JY6SO4\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d826066547\\u0026pf_rd_i\\u003d907699\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1249461162\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\
 "\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1246822881/ref\\u003dsr_1_10?ie\\u003dUTF8\\u0026qid\\u003d18489479\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1246822881\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1497903920/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1497903920\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors
 \":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1105315800/ref\\u003ds9_simh_gw_p74_d2_i2?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dISLI9GZS5J520O513PK6\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d191025471\\u0026pf_rd_i\\u003d563906\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1105315800\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1249420024/ref\\u003ds9_simh_gw_p63_d3_i6?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dBG6V7MK62E7322D5VS4K\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d335458808\\u0026pf_rd_i\\u003d388332\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\
 \"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1249420024\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1287198848/ref\\u003ds9_simh_gw_p107_d0_i10?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dUATP2780PEBSP3MZ85J9\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d724971579\\u0026pf_rd_i\\u003d737723\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1287198848\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://
 www.amazon.com/dp/product/1599152088/ref\\u003ds9_simh_gw_p74_d2_i1?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d1R9QZBS3LHGN2QKTW84D\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d285986720\\u0026pf_rd_i\\u003d167207\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1599152088\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1287183700/ref\\u003ds9_simh_gw_p79_d17_i7?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d4W49A4JP56S6IELDOF3S\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d604578060\\u0026pf_rd_i\\u003d666380\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\
 \":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1287183700\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1470817403/ref\\u003ds9_simh_gw_p63_d3_i10?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d72AXH8EE5ZQTRY727NNV\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d213474611\\u0026pf_rd_i\\u003d351283\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1470817403\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Sonnets-Facing-Conviction-Christo
 pher-Presfield/dp/1891812203\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1891812203\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Dead-Ringer-Jasmine-Cresswell/dp/B0010BSZ5U/ref\\u003dsr_1_1/190-6876153-5019461?ie\\u003dUTF8\\u0026keywords\\u003d1551667126\\u0026qid\\u003d1434458583\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B0010BSZ5U\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}
 ","{\"url\":\"https://www.amazon.com/dp/1933660996/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1933660996\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Sherington-Fiefs-Fields-Buckinghamshire-Village/dp/0521046378/ref\\u003dsr_1_1/182-5625910-7791542?ie\\u003dUTF8\\u0026keywords\\u003d9780521046374\\u0026qid\\u003d1434591978\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0521046378\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlReque
 stCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/0452297060/ref\\u003ds9_ri_gw_g201_i6?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d9WQLGU3K20TZ97OLNE9N\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d817830578\\u0026pf_rd_i\\u003d592054\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0452297060\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Believers-Pocket-Companion-Needful-Sinners/dp/1889058092/ref\\u003dsr_1_1/181-8057383-5400821?ie\\u003dUTF8\\u0026keywords\\u003d1889058092\\u0026qid\\u003d1434591575\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"
 retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1889058092\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1288686684/ref\\u003ds9_simh_gw_p107_d0_i5?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d6G636UL89WPEJRNWM864\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d863114753\\u0026pf_rd_i\\u003d127597\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1288686684\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www
 .amazon.com/dp/product/1441968091/ref\\u003ds9_simh_gw_p107_d0_i7?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003dVD3N8XQHIN218881396G\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d591946161\\u0026pf_rd_i\\u003d784879\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1441968091\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Illustrated-Skating-Dictionary-Young-People/dp/013451260X/ref\\u003dsr_1_1/187-7738327-4220041?ie\\u003dUTF8\\u0026keywords\\u003d9780134512600\\u0026qid\\u003d1434671356\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\
 \\"retailerProductId\\\":\\\"013451260X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1286427355/ref\\u003ds9_simh_gw_p63_d3_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dG08BDQF87W390SN0VKSY\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d609639660\\u0026pf_rd_i\\u003d873910\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1286427355\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1592999107/ref\\u003ds9_simh_gw_p63_d3_i10?pf_rd_m\\u003dATVPDKIKX0DER\\u002
 6pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d0GZEX2Z031943Y98PS2O\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d207358316\\u0026pf_rd_i\\u003d646461\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1592999107\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/0971487421/ref\\u003ds9_simh_gw_p79_d17_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dVP2GYS4S48L27YR91NGX\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d288057837\\u0026pf_rd_i\\u003d811217\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0971487421\\\",\\\"referenc
 ePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Dakine-Traction-12-25-Inch-Black-Smoke/dp/B009HYI5U2/ref\\u003dsr_1_1/190-3075409-4147065?ie\\u003dUTF8\\u0026keywords\\u003d0610934775921\\u0026qid\\u003d1434572027\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"B009HYI5U2\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1505465214/ref\\u003ds9_simh_gw_p79_d17_i10?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dS88VYH0JSN0WV58N763S\\u0026pf_rd_t\\u003d101\\u002
 6pf_rd_p\\u003d469060850\\u0026pf_rd_i\\u003d923112\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1505465214\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1249477794/ref\\u003ds9_ri_gw_g201_i3?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003d1YEA01A3X8LEV2A1XUYL\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d163201523\\u0026pf_rd_i\\u003d432311\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1249477794\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlR
 equestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1439101515/ref\\u003dsr_1_10?ie\\u003dUTF8\\u0026qid\\u003d41353122\\u0026sr\\u003d8-1\\u0026keywords\\u003dnull\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1439101515\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/0871522748/ref\\u003ds9_simh_gw_p63_d3_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dM2XLTA5E84OZ9WW38KL1\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d173836115\\u0026pf_rd_i\\u003d585725\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US
 \\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0871522748\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Guide-Florida-legal-research-Stupski/dp/0327155868/ref\\u003dsr_1_1/178-6731625-0968554?ie\\u003dUTF8\\u0026keywords\\u003d0327155868\\u0026qid\\u003d1434593715\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0327155868\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/0735341257/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PR
 ODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0735341257\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1287251641/ref\\u003ds9_simh_gw_p63_d3_i1?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-1\\u0026pf_rd_r\\u003d1KEUJ6L7GYD56MD665L5\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d508856645\\u0026pf_rd_i\\u003d515955\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1287251641\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https:
 //www.amazon.com/Points-2012-2013-Handbook-Brigade-Midshipmen/dp/161251149X/ref\\u003dsr_1_1/191-7390079-6376012?ie\\u003dUTF8\\u0026keywords\\u003d9781612511498\\u0026qid\\u003d1434621407\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"161251149X\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/9050634788/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"9050634788\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":
 1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1406829730/ref\\u003ds9_simh_gw_p63_d3_i8?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d86Y0VR3VTP14529B9TK2\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d516175225\\u0026pf_rd_i\\u003d152667\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1406829730\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1120716756/ref\\u003dcm_cr_pr_product_top\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1120716756\\\",\\\"refere
 ncePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1449781837/ref\\u003ds9_ri_gw_g201_i9?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dQI0MOKJ0782RNRSXO3EJ\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d853693070\\u0026pf_rd_i\\u003d466575\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1449781837\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Omnibus-Pusher-Kings-Ransom-Money/dp/1407221035/ref\\u003dsr_1_1/187-4173899-5264528?ie\\u003dUTF8\\u0026keywords\\u003d9781407221038\\u0
 026qid\\u003d1434673964\\u0026sr\\u003d8-1\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1407221035\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/gp/product/1500892181/ref\\u003ds9_simh_gw_p107_d0_i1?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003d3S5TF02AB6MRAFME7AKJ\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d572077303\\u0026pf_rd_i\\u003d484731\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1500892181\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlReque
 stCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/product/1847975313/ref\\u003ds9_ri_gw_g201_i9?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-3\\u0026pf_rd_r\\u003dAJO40FSP5P875338JO26\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d321291056\\u0026pf_rd_i\\u003d704134\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1847975313\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/dp/1249000106/ref\\u003ds9_simh_gw_p74_d2_i4?pf_rd_m\\u003dATVPDKIKX0DER\\u0026pf_rd_s\\u003dcenter-2\\u0026pf_rd_r\\u003dIY3AAVY7WEF77SSKDY0S\\u0026pf_rd_t\\u003d101\\u0026pf_rd_p\\u003d124726089\\u0026pf_rd_i\\u003d902185\",\"metadata\":\"{
 \\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1249000106\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Golden-Dawn-Journal-Book-Llewellyns/dp/1567188516\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us\\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"1567188516\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Wee-Pals-Knowledge-Morrie-Turner/dp/0451058003\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"retailerName\\\":\\\"amazon_us
 \\\",\\\"site\\\":\\\"US\\\",\\\"productCrawlMetadata\\\":{\\\"retailerProductId\\\":\\\"0451058003\\\",\\\"referencePrice\\\":0.0,\\\"referenceShippingPrice\\\":0.0,\\\"selectors\\\":[]},\\\"tracker\\\":{\\\"crawlRequestCreateTS\\\":1486899602000}}\",\"linkSelectors\":\"\",\"extrFeilds\":[]}","{\"url\":\"https://www.amazon.com/Sourcebook-Public-Record-Providers-Investigative/dp/1879792060\",\"metadata\":\"{\\\"crawlType\\\":\\\"PRODUCT\\\",\\\"

<TRUNCATED>