diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..91078ac
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/env
diff --git a/README.md b/README.md
index c613c0d..2bd328a 100644
--- a/README.md
+++ b/README.md
@@ -4,10 +4,17 @@ Cubes Examples
Cubes is Lightweight Python Online Analytical Processing (OLAP) framework. This
package contains example uses of cubes including data.
+This repository is a fork of DataBrewery cubes-examples, but this one contains the
+Cubes examples used by CubesViewer.
+
Contents
--------
-* *procurements* - Public Procurements of Slovakia
* *webshop* - Sample model and data of an imaginary online shop
+ (see `webshop/README.md` file for more information).
+
+A tutorial for Cubes and CubesViewer using this example is available at
+http://github.com/jjmontesl/cubesviewer/tree/master/doc/guide/cubesviewer-quickstart.md .
+You can see the webshop example online at http://jjmontesl.github.io/cubesviewer/ .
diff --git a/procurements/README.md b/procurements/README.md
deleted file mode 100644
index d82e3d9..0000000
--- a/procurements/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-Public Procurements of Slovakia
-===============================
-
-Example includes:
-
-* star schema
-* mappings
-* default dimension naming with prefixes
-* default cube fact table naming (with explicit prefix)
-* Flask (web microframework) example browser
-* cross-table (see cross.py)
-
-Slicer Use
-----------
-
-Execute:
-
- $ slicer serve slicer.ini
-
-Documentation: http://packages.python.org/cubes/server.html
-
-Cross table
------------
-
- $ python cross.py
-
-Result output is in table.html.
-
-Flask Use
----------
-
- cd procurements
- python flask_app.py
-
-Navigate browser to http://localhost:5000/
-
-Source Data
------------
-
-http://tendre.sme.sk
diff --git a/procurements/cross.py b/procurements/cross.py
deleted file mode 100644
index bf6839d..0000000
--- a/procurements/cross.py
+++ /dev/null
@@ -1,46 +0,0 @@
-import sqlalchemy
-import cubes
-import cubes.tutorial.sql as tutorial
-
-def print_cross_table(onrows, oncolumns, table):
- # Print column header:
- out = "
"
-
- out += " " * len(onrows) + "".join(["%s " % c for c in table.columns])
-
- measure = "amount_sum"
-
- for row_hdr, row in zip(table.rows, table.data):
- row_label = "".join(["%s " % h for h in tuple(row_hdr)])
- values_str = "".join(["%s " % (value[0] if value else 0) for value in row])
- row_string = "%s%s " % (row_label, values_str)
- out += row_string + "\n"
-
- out += "
"
-
- with open("table.html", "w") as f:
- f.write(out)
-
-########################################################################
-# Create browsing context
-
-model = cubes.load_model("vvo_model.json")
-cube = model.cube("contracts")
-workspace = cubes.create_workspace("sql", model, url="sqlite:///vvo_data.sqlite",
- dimension_prefix="dm_",
- fact_prefix="ft_")
-browser = workspace.browser(cube)
-cell = cubes.Cell(cube)
-
-########################################################################
-# Create cross-table (written to table.html in current directory)
-
-result = browser.aggregate(cell, drilldown=["process_type", "date"])
-
-rows=["process_type.description"]
-columns=["date.year"]
-
-table = result.cross_table(rows, columns, ["contract_amount_sum"])
-print_cross_table(rows, columns, table)
-
-print "Created file: table.html"
diff --git a/procurements/drilldown_tree.py b/procurements/drilldown_tree.py
deleted file mode 100644
index f214607..0000000
--- a/procurements/drilldown_tree.py
+++ /dev/null
@@ -1,52 +0,0 @@
-import cubes
-
-model = cubes.load_model("vvo_model.json")
-cube = model.cube("contracts")
-workspace = cubes.create_workspace("sql", model, url="sqlite:///vvo_data.sqlite",
- dimension_prefix="dm_",
- fact_prefix="ft_")
-
-# workspace = cubes.create_workspace("sql", model, url="postgres://localhost/ep2012",
-# schema="vvo",
-# dimension_prefix="dm_",
-# fact_prefix="ft_",
-# denormalized_view_schema="views",
-# use_denormalization=False,
-# denormalized_view_prefix="mft_")
-
-def drilldown(cell, dimension):
- """Drill-down and aggregate recursively through als levels of `dimension`.
-
- This function is like recursively traversing directories on a file system
- and aggregating the file sizes, for example.
-
- * `cell` - cube cell to drill-down
- * `dimension` - dimension to be traversed through all levels
- """
-
- if cell.is_base(dimension):
- return
-
- result = browser.aggregate(cell, drilldown=[dimension])
-
- # for row in cubes.drilldown_rows(cell, result, dimension):
- for row in result.table_rows(dimension):
- indent = " " * (len(row.path) - 1)
- print "%s%s: %d" % (indent, row.label, row.record["contract_amount_sum"])
-
- new_cell = cell.drilldown(dimension, row.key)
- drilldown(new_cell, dimension)
-
-# Drill down through all levels of item hierarchy
-browser = workspace.browser(cube)
-
-# Get whole cube
-cell = cubes.Cell(cube)
-
-print "Drill down through date hierarchy:"
-drilldown(cell, cube.dimension("date"))
-
-# print "Drill down through CPV hierarchy in 2011:"
-# cell = cell.slice(cubes.PointCut("date", [2010,5]))
-# drilldown(cell, cube.dimension("cpv"))
-
diff --git a/procurements/flask_app.py b/procurements/flask_app.py
deleted file mode 100644
index 8d396e2..0000000
--- a/procurements/flask_app.py
+++ /dev/null
@@ -1,120 +0,0 @@
-from flask import Flask, render_template, request, g
-import cubes
-import os.path
-import sqlalchemy
-
-import logging
-
-logger = cubes.get_logger()
-logger.setLevel(logging.DEBUG)
-
-app = Flask(__name__)
-
-#
-# Data we aregoing to browse and logical model of the data
-#
-
-APP_ROOT = os.path.dirname(os.path.abspath(__file__))
-
-MODEL_PATH = os.path.join(APP_ROOT, "vvo_model.json")
-DB_PATH = os.path.join(APP_ROOT, "vvo_data.sqlite")
-DB_URL = "sqlite:///" + DB_PATH
-
-CUBE_NAME = "contracts"
-
-# Some global variables. We do not have to care about Flask provided thread
-# safety here, as they are non-mutable.
-
-workspace = None
-model = None
-
-@app.route("/")
-@app.route("/")
-def report(dim_name=None):
- cube = workspace.cube("contracts")
- browser = workspace.browser(cube)
- result = browser.aggregate()
- print 'keys: ', result.levels
-
- if not dim_name:
- return render_template('report.html', dimensions=cube.dimensions)
-
- # First we need to get the hierarchy to know the order of levels. Cubes
- # supports multiple hierarchies internally.
-
- dimension = cube.dimension(dim_name)
- hierarchy = dimension.hierarchy()
-
- # Parse the`cut` request parameter and convert it to a list of
- # actual cube cuts. Think of this as of multi-dimensional path, even that
- # for this simple example, we are goint to use only one dimension for
- # browsing.
-
- cutstr = request.args.get("cut")
- cell = cubes.Cell(browser.cube, cubes.cuts_from_string(cube,cutstr))
-
- # Get the cut of actually browsed dimension, so we know "where we are" -
- # the current dimension path
- cut = cell.cut_for_dimension(dimension)
-
- if cut:
- path = cut.path
- else:
- path = []
-
- #
- # Do the work, do the aggregation.
- #
- print "AGGREGATE %s DD: %s" % (cell, dim_name)
- result = browser.aggregate(cell, drilldown=[dim_name])
-
- # If we have no path, then there is no cut for the dimension, # therefore
- # there is no corresponding detail.
- if path:
- details = browser.cell_details(cell, dimension)[0]
- else:
- details = []
-
- # Find what level we are on and what is going to be the drill-down level
- # in the hierarchy
-
- levels = hierarchy.levels_for_path(path)
- if levels:
- next_level = hierarchy.next_level(levels[-1])
- else:
- next_level = hierarchy.next_level(None)
-
- # Are we at the very detailed level?
-
- is_last = hierarchy.is_last(next_level)
- # Finally, we render it
-
- return render_template('report.html',
- dimensions=cube.dimensions,
- dimension=dimension,
- levels=levels,
- next_level=next_level,
- result=result,
- cell=cell,
- is_last=is_last,
- details=details)
-
-@app.before_first_request
-def initialize_model():
- global model
- global workspace
- #model = cubes.load_model(MODEL_PATH)
- # workspace = cubes.create_workspace("sql",url=DB_URL,
- # fact_prefix="ft_",
- # dimension_prefix="dm_")
- # engine = sqlalchemy.create_engine(DB_URL)
- # connection = engine.connect()
-
- workspace = cubes.Workspace(config='slicer.ini')
- #workspace.register_default_store("sql",url=DB_URL)
- print MODEL_PATH
- print DB_URL
- #workspace.import_model(MODEL_PATH)
-if __name__ == "__main__":
- app.debug = True
- app.run()
diff --git a/procurements/postgres/README.md b/procurements/postgres/README.md
deleted file mode 100644
index 845b0b6..0000000
--- a/procurements/postgres/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-PostgreSQL database dump
-========================
-
-Dump of example data (same as in the SQLite database) for Postgres database.
-
-Files:
-
-* pg_dump.sql - schema and full data dump
-* pg_dump-schema.sql - dump of schema pnly
-
-Load the data into database, edit slicer-pg.ini (change database name).
-
-Use:
-
- $ slicer serve slicer-pg.ini
-
-Denormalisation
----------------
-
-1. uncomment three denormalisation lines in the slicer-pg.ini
-2. either create schema `views` or change `denormalized_view_schema`
-3. execute:
-
- $ slicer denormalize slicer-pg.ini
-
-Try also with: --force, --materialize and --index arguments.
-
-For more information read http://packages.python.org/cubes/slicer.html#denormalize
-
-
diff --git a/procurements/postgres/pg_dump-schema.sql b/procurements/postgres/pg_dump-schema.sql
deleted file mode 100644
index 36f0d22..0000000
--- a/procurements/postgres/pg_dump-schema.sql
+++ /dev/null
@@ -1,260 +0,0 @@
---
--- PostgreSQL database dump
---
-
-SET statement_timeout = 0;
-SET client_encoding = 'UTF8';
-SET standard_conforming_strings = off;
-SET check_function_bodies = false;
-SET client_min_messages = warning;
-SET escape_string_warning = off;
-
---
--- Name: vvo; Type: SCHEMA; Schema: -; Owner: postgres
---
-
-CREATE SCHEMA vvo;
-
-
-ALTER SCHEMA vvo OWNER TO postgres;
-
-SET search_path = vvo, pg_catalog;
-
-SET default_tablespace = '';
-
-SET default_with_oids = false;
-
---
--- Name: dm_cpv; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_cpv (
- id integer,
- code text,
- code_src text,
- code_wcheck text,
- level integer,
- division text,
- "group" text,
- class text,
- category text,
- detail text,
- division_compet numeric,
- group_compet numeric,
- class_compet numeric,
- category_compet numeric,
- detail_compet numeric,
- division_label_en text,
- group_label_en text,
- class_label_en text,
- category_label_en text,
- detail_label_en text,
- division_label_sk text,
- group_label_sk text,
- class_label_sk text,
- category_label_sk text,
- detail_label_sk text
-);
-
-
-ALTER TABLE vvo.dm_cpv OWNER TO stefan;
-
---
--- Name: dm_criteria; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_criteria (
- id integer,
- code character varying,
- description_sk character varying,
- sdesc_sk character varying,
- description_en character varying,
- sdesc_en character varying
-);
-
-
-ALTER TABLE vvo.dm_criteria OWNER TO stefan;
-
---
--- Name: dm_date; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_date (
- id integer,
- year integer,
- month integer,
- month_name_sk character varying,
- month_sname_sk character varying,
- month_name_en character varying,
- month_sname_en character varying,
- day integer,
- week_day integer,
- week_day_name_sk character varying,
- week_day_sname_sk character varying,
- week_day_name_en character varying,
- week_day_sname_en character varying
-);
-
-
-ALTER TABLE vvo.dm_date OWNER TO stefan;
-
---
--- Name: dm_geography; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_geography (
- id integer,
- okres character varying,
- okres_code character varying,
- okres_regis character varying,
- kraj character varying,
- kraj_code character varying
-);
-
-
-ALTER TABLE vvo.dm_geography OWNER TO stefan;
-
---
--- Name: dm_process_type; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_process_type (
- id integer,
- code character varying,
- description_sk character varying,
- sdesc_sk character varying,
- description_en character varying,
- sdesc_en character varying
-);
-
-
-ALTER TABLE vvo.dm_process_type OWNER TO stefan;
-
---
--- Name: dm_procurer; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_procurer (
- id integer,
- ico character varying,
- name character varying,
- address text,
- region character varying,
- country character varying,
- date_start date,
- date_end date,
- legal_form character varying,
- legal_form_code integer,
- account_sector character varying,
- account_sector_code integer,
- ownership character varying,
- ownership_code integer,
- source character varying,
- date_created date,
- offer_count_avg numeric,
- competitiveness numeric
-);
-
-
-ALTER TABLE vvo.dm_procurer OWNER TO stefan;
-
---
--- Name: dm_supplier; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_supplier (
- id integer,
- ico character varying,
- name character varying,
- address text,
- region character varying,
- country character varying,
- date_start date,
- date_end date,
- legal_form character varying,
- legal_form_code integer,
- account_sector character varying,
- account_sector_code integer,
- ownership character varying,
- ownership_code integer,
- source character varying,
- date_created date,
- offer_count_avg numeric,
- competitiveness numeric
-);
-
-
-ALTER TABLE vvo.dm_supplier OWNER TO stefan;
-
---
--- Name: ft_contracts; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE ft_contracts (
- id integer,
- document_id integer,
- document_code character varying,
- contract_key character varying,
- document_type_code character varying,
- vz_flag integer,
- bulletin_number character varying,
- announcement_number character varying,
- source_url character varying,
- bulletin_date_id integer,
- bulletin_date date,
- contract_name text,
- process_type_id integer,
- contract_type_id integer,
- criteria_id integer,
- elektronicka_aukcia_flag integer,
- zakazka_eurofondy_flag integer,
- cpv_id integer,
- cpv_code character varying,
- procurer_id integer,
- supplier_id integer,
- geography_id integer,
- predpoklad_subdodavok character varying,
- pocet_ponuk integer,
- pocet_zmluv integer,
- procurement_amount numeric,
- procurement_currency character varying,
- contract_amount numeric,
- contract_currency character varying
-);
-
-
-ALTER TABLE vvo.ft_contracts OWNER TO stefan;
-
---
--- Name: dm_account_sector; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_account_sector (
- id integer,
- sektor character varying,
- sektor_code integer,
- sektor_desc character varying,
- sektor_sdesc character varying
-);
-
-
-ALTER TABLE vvo.dm_account_sector OWNER TO stefan;
-
---
--- Name: dm_contract_type; Type: TABLE; Schema: vvo; Owner: stefan; Tablespace:
---
-
-CREATE TABLE dm_contract_type (
- id integer,
- code character varying,
- description character varying,
- sdesc character varying
-);
-
-
-ALTER TABLE vvo.dm_contract_type OWNER TO stefan;
-
---
--- PostgreSQL database dump complete
---
-
diff --git a/procurements/postgres/pg_dump.sql.gz b/procurements/postgres/pg_dump.sql.gz
deleted file mode 100644
index 5baefc4..0000000
Binary files a/procurements/postgres/pg_dump.sql.gz and /dev/null differ
diff --git a/procurements/postgres/slicer-pg.ini b/procurements/postgres/slicer-pg.ini
deleted file mode 100644
index 81bc0b5..0000000
--- a/procurements/postgres/slicer-pg.ini
+++ /dev/null
@@ -1,33 +0,0 @@
-# Slicer OLAP server configuration
-#
-# replace VVO_ROOT with absolute path to VVO files
-#
-
-[model]
-path: ../vvo_model.json
-cube: contracts
-locales: en,sk
-
-[server]
-# Set writeable path for logging slicer info
-log_level: info
-prettyprint: true
-backend: sql
-reload: true
-
-[workspace]
-# EDIT: change the database
-url: postgres://localhost/ep2012
-schema: vvo
-fact_prefix: ft_
-dimension_prefix: dm_
-debug: true
-
-# Denormalisation demo (see README.md)
-#
-# denormalized_view_prefix = mft_
-# denormalized_view_schema = views
-# use_denormalization = yes
-
-[translations]
-sk: ../vvo_model-sk.json
diff --git a/procurements/procurements.cubesmodel/cube_contracts.json b/procurements/procurements.cubesmodel/cube_contracts.json
deleted file mode 100644
index e869f1e..0000000
--- a/procurements/procurements.cubesmodel/cube_contracts.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "dimensions": [
- "date",
- "cpv",
- "procurer",
- "supplier",
- "process_type",
- "criteria",
- "geography"
- ],
- "measures": [
- {
- "name": "contract_amount"
- }
- ],
- "name": "contracts",
- "details": [
- {
- "name": "contract_name",
- "label": "Contract name"
- },
- {
- "name": "bulletin_number",
- "label": "Bulletin number"
- },
- {
- "name": "source_url",
- "label": "Source URL"
- }
- ],
- "joins": [
- {
- "master": "bulletin_date_id",
- "detail": "dm_date.id",
- "method": "detail"
- },
- {
- "master": "cpv_id",
- "detail": "dm_cpv.id"
- },
- {
- "master": "procurer_id",
- "detail": "dm_procurer.id"
- },
- {
- "master": "supplier_id",
- "detail": "dm_supplier.id"
- },
- {
- "master": "process_type_id",
- "detail": "dm_process_type.id"
- },
- {
- "master": "criteria_id",
- "detail": "dm_criteria.id"
- },
- {
- "master": "geography_id",
- "detail": "dm_geography.id"
- }
- ],
- "mappings": {
- "fact.date_id": "bulletin_date_id",
- "zmluva_hodnota": "zmluva_hodnota"
- }
-}
diff --git a/procurements/procurements.cubesmodel/dim_cpv.json b/procurements/procurements.cubesmodel/dim_cpv.json
deleted file mode 100644
index c59fcb5..0000000
--- a/procurements/procurements.cubesmodel/dim_cpv.json
+++ /dev/null
@@ -1,146 +0,0 @@
-{
- "hierarchies": [
- {
- "levels": [
- "division",
- "group",
- "class",
- "category",
- "detail"
- ],
- "name": "default"
- }
- ],
- "levels": [
- {
- "name": "division",
- "label": "division",
- "key": "division",
- "attributes": [
- {
- "name": "division"
- },
- {
- "name": "division_label",
- "locales": [
- "en",
- "sk"
- ]
- },
- {
- "name": "division_compet",
- "label": "competitiveness in division"
- }
- ],
- "order_attribute": "division",
- "label_attribute": "division_label"
- },
- {
- "name": "group",
- "label": "group",
- "key": "group",
- "attributes": [
- {
- "name": "group",
- "label": "Group code"
- },
- {
- "name": "group_label",
- "locales": [
- "en",
- "sk"
- ],
- "label": "Group"
- },
- {
- "name": "group_compet",
- "label": "competitiveness in grouop"
- }
- ],
- "order_attribute": "group",
- "label_attribute": "group_label"
- },
- {
- "name": "class",
- "label": "class",
- "key": "class",
- "attributes": [
- {
- "name": "class"
- },
- {
- "name": "class_label",
- "locales": [
- "en",
- "sk"
- ]
- },
- {
- "name": "class_compet",
- "label": "competitiveness in class"
- }
- ],
- "order_attribute": "class",
- "label_attribute": "class_label"
- },
- {
- "name": "category",
- "label": "category",
- "key": "category",
- "attributes": [
- {
- "name": "category",
- "label": "category code"
- },
- {
- "name": "category_label",
- "locales": [
- "en",
- "sk"
- ],
- "label": "category"
- },
- {
- "name": "category_compet",
- "label": "competitiveness in category"
- }
- ],
- "order_attribute": "category",
- "label_attribute": "category_label"
- },
- {
- "name": "detail",
- "label": "detail",
- "key": "id",
- "attributes": [
- {
- "name": "id"
- },
- {
- "name": "detail",
- "label": "detail code"
- },
- {
- "name": "detail_label",
- "locales": [
- "en",
- "sk"
- ],
- "label": "detail"
- },
- {
- "name": "code",
- "label": "CPV Code"
- },
- {
- "name": "detail_compet",
- "label": "competitiveness"
- }
- ],
- "order_attribute": "id",
- "label_attribute": "detail_label"
- }
- ],
- "name": "cpv",
- "label": "Common Procurement Vocabulary"
-}
\ No newline at end of file
diff --git a/procurements/procurements.cubesmodel/dim_criteria.json b/procurements/procurements.cubesmodel/dim_criteria.json
deleted file mode 100644
index 71143a3..0000000
--- a/procurements/procurements.cubesmodel/dim_criteria.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "hierarchies": [
- {
- "levels": [
- "criteria"
- ],
- "name": "default"
- }
- ],
- "levels": [
- {
- "attributes": [
- {
- "name": "code"
- },
- {
- "name": "description",
- "locales": [
- "en",
- "sk"
- ]
- },
- {
- "name": "sdesc",
- "locales": [
- "en",
- "sk"
- ]
- },
- {
- "name": "id"
- }
- ],
- "order_attribute": "code",
- "label_attribute": "description",
- "name": "criteria",
- "key": "code"
- }
- ],
- "name": "criteria",
- "label": "Evalutaion criteria"
-}
\ No newline at end of file
diff --git a/procurements/procurements.cubesmodel/dim_date.json b/procurements/procurements.cubesmodel/dim_date.json
deleted file mode 100644
index 3874b02..0000000
--- a/procurements/procurements.cubesmodel/dim_date.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "info": {
- "cv-datefilter": true
- },
- "role": "time",
- "hierarchies": [
- {
- "levels": [
- "year",
- "month",
- "day"
- ],
- "name": "default"
- }
- ],
- "levels": [
- {
- "info": {
- "cv-datefilter-field": "year"
- },
- "name": "year",
- "label": "Year",
- "key": "year",
- "attributes": [
- {
- "name": "year"
- }
- ],
- "order_attribute": "year",
- "label_attribute": "year"
- },
- {
- "info": {
- "cv-datefilter-field": "month"
- },
- "name": "month",
- "label": "Month",
- "key": "month",
- "attributes": [
- {
- "name": "month"
- },
- {
- "name": "month_name",
- "locales": [
- "en",
- "sk"
- ]
- },
- {
- "name": "month_sname",
- "locales": [
- "en",
- "sk"
- ]
- }
- ],
- "order_attribute": "month",
- "label_attribute": "month_name"
- },
- {
- "info": {
- "cv-datefilter-field": "day"
- },
- "name": "day",
- "label": "Day",
- "key": "day",
- "attributes": [
- {
- "name": "id"
- },
- {
- "name": "day"
- }
- ],
- "order_attribute": "id",
- "label_attribute": "day"
- }
- ],
- "name": "date",
- "label": "Date"
-}
diff --git a/procurements/procurements.cubesmodel/dim_geography.json b/procurements/procurements.cubesmodel/dim_geography.json
deleted file mode 100644
index aaf8db3..0000000
--- a/procurements/procurements.cubesmodel/dim_geography.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "hierarchies": [
- {
- "levels": [
- "kraj",
- "okres"
- ],
- "name": "default"
- }
- ],
- "levels": [
- {
- "attributes": [
- {
- "name": "okres_code",
- "label": "county code"
- },
- {
- "name": "okres",
- "label": "county"
- }
- ],
- "order_attribute": "okres_code",
- "label_attribute": "okres",
- "name": "okres",
- "key": "okres_code"
- },
- {
- "attributes": [
- {
- "name": "kraj_code",
- "label": "region code"
- },
- {
- "name": "kraj",
- "label": "region"
- }
- ],
- "order_attribute": "kraj_code",
- "label_attribute": "kraj",
- "name": "kraj",
- "key": "kraj_code"
- }
- ],
- "name": "geography",
- "label": "Region"
-}
\ No newline at end of file
diff --git a/procurements/procurements.cubesmodel/dim_process_type.json b/procurements/procurements.cubesmodel/dim_process_type.json
deleted file mode 100644
index ff2c384..0000000
--- a/procurements/procurements.cubesmodel/dim_process_type.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "hierarchies": [
- {
- "levels": [
- "process_type"
- ],
- "name": "default"
- }
- ],
- "levels": [
- {
- "attributes": [
- {
- "name": "id"
- },
- {
- "name": "code"
- },
- {
- "name": "description",
- "locales": [
- "en",
- "sk"
- ]
- },
- {
- "name": "sdesc",
- "locales": [
- "en",
- "sk"
- ]
- }
- ],
- "order_attribute": "id",
- "label_attribute": "description",
- "name": "process_type",
- "key": "id"
- }
- ],
- "name": "process_type",
- "label": "Procurement type"
-}
\ No newline at end of file
diff --git a/procurements/procurements.cubesmodel/dim_procurer.json b/procurements/procurements.cubesmodel/dim_procurer.json
deleted file mode 100644
index 2e03fb6..0000000
--- a/procurements/procurements.cubesmodel/dim_procurer.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "hierarchies": [
- {
- "levels": [
- "sector",
- "procurer"
- ],
- "name": "default"
- }
- ],
- "levels": [
- {
- "attributes": [
- {
- "name": "account_sector_code",
- "label": "account sector code"
- },
- {
- "name": "account_sector",
- "label": "account sector"
- }
- ],
- "order_attribute": "account_sector_code",
- "label_attribute": "account_sector",
- "name": "sector",
- "key": "account_sector_code"
- },
- {
- "attributes": [
- {
- "name": "id",
- "label": "id"
- },
- {
- "name": "ico",
- "label": "organisation ID"
- },
- {
- "name": "name",
- "label": "name"
- },
- {
- "name": "region",
- "label": "region"
- },
- {
- "name": "address",
- "label": "address"
- },
- {
- "name": "legal_form",
- "label": "legal form"
- },
- {
- "name": "offer_count_avg",
- "label": "average number of offers"
- },
- {
- "name": "competitiveness",
- "label": "competitiveness"
- }
- ],
- "order_attribute": "id",
- "label_attribute": "name",
- "name": "procurer",
- "key": "id"
- }
- ],
- "name": "procurer",
- "label": "Procurer"
-}
\ No newline at end of file
diff --git a/procurements/procurements.cubesmodel/dim_supplier.json b/procurements/procurements.cubesmodel/dim_supplier.json
deleted file mode 100644
index 287ede5..0000000
--- a/procurements/procurements.cubesmodel/dim_supplier.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "hierarchies": [
- {
- "levels": [
- "supplier"
- ],
- "name": "default"
- }
- ],
- "levels": [
- {
- "attributes": [
- {
- "name": "id"
- },
- {
- "name": "ico",
- "label": "company ID"
- },
- {
- "name": "name",
- "label": "name"
- },
- {
- "name": "address",
- "label": "address"
- },
- {
- "name": "country",
- "label": "country"
- },
- {
- "name": "date_start",
- "label": "operating since"
- },
- {
- "name": "date_end",
- "label": "company closed date"
- },
- {
- "name": "legal_form",
- "label": "legal form"
- },
- {
- "name": "ownership",
- "label": "ownership"
- },
- {
- "name": "offer_count_avg",
- "label": "average number of offers"
- },
- {
- "name": "competitiveness",
- "label": "competitiveness"
- }
- ],
- "order_attribute": "id",
- "label_attribute": "name",
- "name": "supplier",
- "key": "id"
- }
- ],
- "name": "supplier",
- "label": "Supplier"
-}
\ No newline at end of file
diff --git a/procurements/procurements.cubesmodel/model.json b/procurements/procurements.cubesmodel/model.json
deleted file mode 100644
index 7f9e4d9..0000000
--- a/procurements/procurements.cubesmodel/model.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "name": "vvo"
-}
\ No newline at end of file
diff --git a/procurements/slicer.ini b/procurements/slicer.ini
deleted file mode 100644
index 9631b32..0000000
--- a/procurements/slicer.ini
+++ /dev/null
@@ -1,32 +0,0 @@
-# Slicer OLAP server configuration
-#
-# replace VVO_ROOT with absolute path to VVO files
-#
-
-[workspace]
-log_level: debug
-
-[server]
-# Set writeable path for logging slicer info
-prettyprint: true
-allow_cors_origin: *
-reload: true
-
-[store]
-type: sql
-url: sqlite:///vvo_data.sqlite
-fact_prefix: ft_
-dimension_prefix: dm_
-debug: true
-
-[models]
-main: procurements.cubesmodel
-
-[translation-sk]
-main: vvo_model-sk.json
-
-[translations]
-main: vvo_model-sk.json
-
-[translation-main]
-sk: vvo_model-sk.json
diff --git a/procurements/static/bootstrap-responsive.min.css b/procurements/static/bootstrap-responsive.min.css
deleted file mode 100644
index bc3f2ab..0000000
--- a/procurements/static/bootstrap-responsive.min.css
+++ /dev/null
@@ -1,3 +0,0 @@
-
-.hidden{display:none;visibility:hidden;}
-@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}}
diff --git a/procurements/static/bootstrap.min.css b/procurements/static/bootstrap.min.css
deleted file mode 100644
index b01f92e..0000000
--- a/procurements/static/bootstrap.min.css
+++ /dev/null
@@ -1,610 +0,0 @@
-article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
-audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
-audio:not([controls]){display:none;}
-html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
-a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-a:hover,a:active{outline:0;}
-sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
-sup{top:-0.5em;}
-sub{bottom:-0.25em;}
-img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;}
-button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
-button,input{*overflow:visible;line-height:normal;}
-button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
-button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
-input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
-input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
-textarea{overflow:auto;vertical-align:top;}
-body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
-a{color:#0088cc;text-decoration:none;}
-a:hover{color:#005580;text-decoration:underline;}
-.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
-.row:after{clear:both;}
-[class*="span"]{float:left;margin-left:20px;}
-.span1{width:60px;}
-.span2{width:140px;}
-.span3{width:220px;}
-.span4{width:300px;}
-.span5{width:380px;}
-.span6{width:460px;}
-.span7{width:540px;}
-.span8{width:620px;}
-.span9{width:700px;}
-.span10{width:780px;}
-.span11{width:860px;}
-.span12,.container{width:940px;}
-.offset1{margin-left:100px;}
-.offset2{margin-left:180px;}
-.offset3{margin-left:260px;}
-.offset4{margin-left:340px;}
-.offset5{margin-left:420px;}
-.offset6{margin-left:500px;}
-.offset7{margin-left:580px;}
-.offset8{margin-left:660px;}
-.offset9{margin-left:740px;}
-.offset10{margin-left:820px;}
-.offset11{margin-left:900px;}
-.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
-.row-fluid:after{clear:both;}
-.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}
-.row-fluid>[class*="span"]:first-child{margin-left:0;}
-.row-fluid .span1{width:6.382978723%;}
-.row-fluid .span2{width:14.89361702%;}
-.row-fluid .span3{width:23.404255317%;}
-.row-fluid .span4{width:31.914893614%;}
-.row-fluid .span5{width:40.425531911%;}
-.row-fluid .span6{width:48.93617020799999%;}
-.row-fluid .span7{width:57.446808505%;}
-.row-fluid .span8{width:65.95744680199999%;}
-.row-fluid .span9{width:74.468085099%;}
-.row-fluid .span10{width:82.97872339599999%;}
-.row-fluid .span11{width:91.489361693%;}
-.row-fluid .span12{width:99.99999998999999%;}
-.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
-.container:after{clear:both;}
-.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
-.container-fluid:after{clear:both;}
-p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}
-.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
-h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
-h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
-h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
-h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}
-h4,h5,h6{line-height:18px;}
-h4{font-size:14px;}h4 small{font-size:12px;}
-h5{font-size:12px;}
-h6{font-size:11px;color:#999999;text-transform:uppercase;}
-.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
-.page-header h1{line-height:1;}
-ul,ol{padding:0;margin:0 0 9px 25px;}
-ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
-ul{list-style:disc;}
-ol{list-style:decimal;}
-li{line-height:18px;}
-ul.unstyled{margin-left:0;list-style:none;}
-dl{margin-bottom:18px;}
-dt,dd{line-height:18px;}
-dt{font-weight:bold;}
-dd{margin-left:9px;}
-hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;}
-strong{font-weight:bold;}
-em{font-style:italic;}
-.muted{color:#999999;}
-abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;}
-blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
-blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
-blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
-q:before,q:after,blockquote:before,blockquote:after{content:"";}
-address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}
-small{font-size:100%;}
-cite{font-style:normal;}
-code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
-pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;}
-pre code{padding:0;background-color:transparent;}
-form{margin:0 0 18px;}
-fieldset{padding:0;margin:0;border:0;}
-legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}
-label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;}
-label{display:block;margin-bottom:5px;color:#333333;}
-input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-.uneditable-textarea{width:auto;height:auto;}
-label input,label textarea,label select{display:block;}
-input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
-input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}
-select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
-select{width:220px;background-color:#ffffff;}
-select[multiple],select[size]{height:auto;}
-input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
-textarea{height:auto;}
-input[type="hidden"]{display:none;}
-.radio,.checkbox{padding-left:18px;}
-.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
-.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
-.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;}
-.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
-.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;}
-input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}
-input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;}
-input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-.input-mini{width:60px;}
-.input-small{width:90px;}
-.input-medium{width:150px;}
-.input-large{width:210px;}
-.input-xlarge{width:270px;}
-.input-xxlarge{width:530px;}
-input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}
-input.span1,textarea.span1,.uneditable-input.span1{width:50px;}
-input.span2,textarea.span2,.uneditable-input.span2{width:130px;}
-input.span3,textarea.span3,.uneditable-input.span3{width:210px;}
-input.span4,textarea.span4,.uneditable-input.span4{width:290px;}
-input.span5,textarea.span5,.uneditable-input.span5{width:370px;}
-input.span6,textarea.span6,.uneditable-input.span6{width:450px;}
-input.span7,textarea.span7,.uneditable-input.span7{width:530px;}
-input.span8,textarea.span8,.uneditable-input.span8{width:610px;}
-input.span9,textarea.span9,.uneditable-input.span9{width:690px;}
-input.span10,textarea.span10,.uneditable-input.span10{width:770px;}
-input.span11,textarea.span11,.uneditable-input.span11{width:850px;}
-input.span12,textarea.span12,.uneditable-input.span12{width:930px;}
-input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
-.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
-.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
-.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
-.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
-.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
-.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
-.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
-.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
-.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
-input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
-.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;}
-.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
-:-moz-placeholder{color:#999999;}
-::-webkit-input-placeholder{color:#999999;}
-.help-block{margin-top:5px;margin-bottom:0;color:#999999;}
-.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;}
-.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";}
-.input-prepend:after,.input-append:after{clear:both;}
-.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}
-.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
-.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
-.input-prepend .add-on{*margin-top:1px;}
-.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.input-append .uneditable-input{border-right-color:#ccc;}
-.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
-.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;}
-.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
-.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;}
-.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;}
-.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;}
-.control-group{margin-bottom:9px;}
-.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
-.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
-.form-horizontal .control-group:after{clear:both;}
-.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;}
-.form-horizontal .controls{margin-left:160px;}
-.form-horizontal .form-actions{padding-left:160px;}
-table{max-width:100%;border-collapse:collapse;border-spacing:0;}
-.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;}
-.table th{font-weight:bold;vertical-align:bottom;}
-.table td{vertical-align:top;}
-.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;}
-.table tbody+tbody{border-top:2px solid #ddd;}
-.table-condensed th,.table-condensed td{padding:4px 5px;}
-.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;}
-.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
-.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
-.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
-.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
-.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
-.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
-table .span1{float:none;width:44px;margin-left:0;}
-table .span2{float:none;width:124px;margin-left:0;}
-table .span3{float:none;width:204px;margin-left:0;}
-table .span4{float:none;width:284px;margin-left:0;}
-table .span5{float:none;width:364px;margin-left:0;}
-table .span6{float:none;width:444px;margin-left:0;}
-table .span7{float:none;width:524px;margin-left:0;}
-table .span8{float:none;width:604px;margin-left:0;}
-table .span9{float:none;width:684px;margin-left:0;}
-table .span10{float:none;width:764px;margin-left:0;}
-table .span11{float:none;width:844px;margin-left:0;}
-table .span12{float:none;width:924px;margin-left:0;}
-[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;}
-.icon-white{background-image:url(../img/glyphicons-halflings-white.png);}
-.icon-glass{background-position:0 0;}
-.icon-music{background-position:-24px 0;}
-.icon-search{background-position:-48px 0;}
-.icon-envelope{background-position:-72px 0;}
-.icon-heart{background-position:-96px 0;}
-.icon-star{background-position:-120px 0;}
-.icon-star-empty{background-position:-144px 0;}
-.icon-user{background-position:-168px 0;}
-.icon-film{background-position:-192px 0;}
-.icon-th-large{background-position:-216px 0;}
-.icon-th{background-position:-240px 0;}
-.icon-th-list{background-position:-264px 0;}
-.icon-ok{background-position:-288px 0;}
-.icon-remove{background-position:-312px 0;}
-.icon-zoom-in{background-position:-336px 0;}
-.icon-zoom-out{background-position:-360px 0;}
-.icon-off{background-position:-384px 0;}
-.icon-signal{background-position:-408px 0;}
-.icon-cog{background-position:-432px 0;}
-.icon-trash{background-position:-456px 0;}
-.icon-home{background-position:0 -24px;}
-.icon-file{background-position:-24px -24px;}
-.icon-time{background-position:-48px -24px;}
-.icon-road{background-position:-72px -24px;}
-.icon-download-alt{background-position:-96px -24px;}
-.icon-download{background-position:-120px -24px;}
-.icon-upload{background-position:-144px -24px;}
-.icon-inbox{background-position:-168px -24px;}
-.icon-play-circle{background-position:-192px -24px;}
-.icon-repeat{background-position:-216px -24px;}
-.icon-refresh{background-position:-240px -24px;}
-.icon-list-alt{background-position:-264px -24px;}
-.icon-lock{background-position:-287px -24px;}
-.icon-flag{background-position:-312px -24px;}
-.icon-headphones{background-position:-336px -24px;}
-.icon-volume-off{background-position:-360px -24px;}
-.icon-volume-down{background-position:-384px -24px;}
-.icon-volume-up{background-position:-408px -24px;}
-.icon-qrcode{background-position:-432px -24px;}
-.icon-barcode{background-position:-456px -24px;}
-.icon-tag{background-position:0 -48px;}
-.icon-tags{background-position:-25px -48px;}
-.icon-book{background-position:-48px -48px;}
-.icon-bookmark{background-position:-72px -48px;}
-.icon-print{background-position:-96px -48px;}
-.icon-camera{background-position:-120px -48px;}
-.icon-font{background-position:-144px -48px;}
-.icon-bold{background-position:-167px -48px;}
-.icon-italic{background-position:-192px -48px;}
-.icon-text-height{background-position:-216px -48px;}
-.icon-text-width{background-position:-240px -48px;}
-.icon-align-left{background-position:-264px -48px;}
-.icon-align-center{background-position:-288px -48px;}
-.icon-align-right{background-position:-312px -48px;}
-.icon-align-justify{background-position:-336px -48px;}
-.icon-list{background-position:-360px -48px;}
-.icon-indent-left{background-position:-384px -48px;}
-.icon-indent-right{background-position:-408px -48px;}
-.icon-facetime-video{background-position:-432px -48px;}
-.icon-picture{background-position:-456px -48px;}
-.icon-pencil{background-position:0 -72px;}
-.icon-map-marker{background-position:-24px -72px;}
-.icon-adjust{background-position:-48px -72px;}
-.icon-tint{background-position:-72px -72px;}
-.icon-edit{background-position:-96px -72px;}
-.icon-share{background-position:-120px -72px;}
-.icon-check{background-position:-144px -72px;}
-.icon-move{background-position:-168px -72px;}
-.icon-step-backward{background-position:-192px -72px;}
-.icon-fast-backward{background-position:-216px -72px;}
-.icon-backward{background-position:-240px -72px;}
-.icon-play{background-position:-264px -72px;}
-.icon-pause{background-position:-288px -72px;}
-.icon-stop{background-position:-312px -72px;}
-.icon-forward{background-position:-336px -72px;}
-.icon-fast-forward{background-position:-360px -72px;}
-.icon-step-forward{background-position:-384px -72px;}
-.icon-eject{background-position:-408px -72px;}
-.icon-chevron-left{background-position:-432px -72px;}
-.icon-chevron-right{background-position:-456px -72px;}
-.icon-plus-sign{background-position:0 -96px;}
-.icon-minus-sign{background-position:-24px -96px;}
-.icon-remove-sign{background-position:-48px -96px;}
-.icon-ok-sign{background-position:-72px -96px;}
-.icon-question-sign{background-position:-96px -96px;}
-.icon-info-sign{background-position:-120px -96px;}
-.icon-screenshot{background-position:-144px -96px;}
-.icon-remove-circle{background-position:-168px -96px;}
-.icon-ok-circle{background-position:-192px -96px;}
-.icon-ban-circle{background-position:-216px -96px;}
-.icon-arrow-left{background-position:-240px -96px;}
-.icon-arrow-right{background-position:-264px -96px;}
-.icon-arrow-up{background-position:-289px -96px;}
-.icon-arrow-down{background-position:-312px -96px;}
-.icon-share-alt{background-position:-336px -96px;}
-.icon-resize-full{background-position:-360px -96px;}
-.icon-resize-small{background-position:-384px -96px;}
-.icon-plus{background-position:-408px -96px;}
-.icon-minus{background-position:-433px -96px;}
-.icon-asterisk{background-position:-456px -96px;}
-.icon-exclamation-sign{background-position:0 -120px;}
-.icon-gift{background-position:-24px -120px;}
-.icon-leaf{background-position:-48px -120px;}
-.icon-fire{background-position:-72px -120px;}
-.icon-eye-open{background-position:-96px -120px;}
-.icon-eye-close{background-position:-120px -120px;}
-.icon-warning-sign{background-position:-144px -120px;}
-.icon-plane{background-position:-168px -120px;}
-.icon-calendar{background-position:-192px -120px;}
-.icon-random{background-position:-216px -120px;}
-.icon-comment{background-position:-240px -120px;}
-.icon-magnet{background-position:-264px -120px;}
-.icon-chevron-up{background-position:-288px -120px;}
-.icon-chevron-down{background-position:-313px -119px;}
-.icon-retweet{background-position:-336px -120px;}
-.icon-shopping-cart{background-position:-360px -120px;}
-.icon-folder-close{background-position:-384px -120px;}
-.icon-folder-open{background-position:-408px -120px;}
-.icon-resize-vertical{background-position:-432px -119px;}
-.icon-resize-horizontal{background-position:-456px -118px;}
-.dropdown{position:relative;}
-.dropdown-toggle{*margin-bottom:-3px;}
-.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
-.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";}
-.dropdown .caret{margin-top:8px;margin-left:2px;}
-.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);}
-.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;}
-.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}
-.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;}
-.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;}
-.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
-.dropdown.open .dropdown-menu{display:block;}
-.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
-.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
-.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;}
-.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;}
-.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;}
-.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
-.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;}
-.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
-.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
-.btn-large .icon{margin-top:1px;}
-.btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
-.btn-small .icon{margin-top:-1px;}
-.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;}
-.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);}
-.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;}
-.btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
-.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;}
-.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
-.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;}
-.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
-.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;}
-.btn-success:active,.btn-success.active{background-color:#408140 \9;}
-.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;}
-.btn-info:active,.btn-info.active{background-color:#24748c \9;}
-button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
-button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;}
-button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;}
-.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}
-.btn-group:after{clear:both;}
-.btn-group:first-child{*margin-left:0;}
-.btn-group+.btn-group{margin-left:5px;}
-.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
-.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
-.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
-.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
-.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
-.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;}
-.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
-.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;}
-.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
-.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);}
-.btn .caret{margin-top:7px;margin-left:0;}
-.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}
-.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}
-.btn-small .caret{margin-top:4px;}
-.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.alert,.alert-heading{color:#c09853;}
-.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;}
-.alert-success{background-color:#dff0d8;border-color:#d6e9c6;}
-.alert-success,.alert-success .alert-heading{color:#468847;}
-.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;}
-.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;}
-.alert-info{background-color:#d9edf7;border-color:#bce8f1;}
-.alert-info,.alert-info .alert-heading{color:#3a87ad;}
-.alert-block{padding-top:14px;padding-bottom:14px;}
-.alert-block>p,.alert-block>ul{margin-bottom:0;}
-.alert-block p+p{margin-top:5px;}
-.nav{margin-left:0;margin-bottom:18px;list-style:none;}
-.nav>li>a{display:block;}
-.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
-.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;}
-.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
-.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;}
-.nav-list>li+.nav-header{margin-top:9px;}
-.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
-.nav-list [class^="icon-"]{margin-right:2px;}
-.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";}
-.nav-tabs:after,.nav-pills:after{clear:both;}
-.nav-tabs>li,.nav-pills>li{float:left;}
-.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
-.nav-tabs{border-bottom:1px solid #ddd;}
-.nav-tabs>li{margin-bottom:-1px;}
-.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
-.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
-.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
-.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;}
-.nav-stacked>li{float:none;}
-.nav-stacked>li>a{margin-right:0;}
-.nav-tabs.nav-stacked{border-bottom:0;}
-.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
-.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
-.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
-.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
-.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
-.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;}
-.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;}
-.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;}
-.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;}
-.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;}
-.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
-.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
-.tabs-stacked .open>a:hover{border-color:#999999;}
-.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";}
-.tabbable:after{clear:both;}
-.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;}
-.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
-.tab-content>.active,.pill-content>.active{display:block;}
-.tabs-below .nav-tabs{border-top:1px solid #ddd;}
-.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;}
-.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
-.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;}
-.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;}
-.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
-.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
-.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
-.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
-.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
-.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
-.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
-.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
-.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
-.navbar{overflow:visible;margin-bottom:18px;}
-.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
-.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;}
-.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;}
-.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
-.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
-.nav-collapse.collapse{height:auto;}
-.navbar .brand:hover{text-decoration:none;}
-.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;}
-.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;}
-.navbar .btn,.navbar .btn-group{margin-top:5px;}
-.navbar .btn-group .btn{margin-top:0;}
-.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}
-.navbar-form:after{clear:both;}
-.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;}
-.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
-.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
-.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;}
-.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;}
-.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);}
-.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
-.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;}
-.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
-.navbar .nav.pull-right{float:right;}
-.navbar .nav>li{display:block;float:left;}
-.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
-.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}
-.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);}
-.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;}
-.navbar .nav.pull-right{margin-left:10px;margin-right:0;}
-.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
-.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
-.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;}
-.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);}
-.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;}
-.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;}
-.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;}
-.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;}
-.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;}
-.breadcrumb .divider{padding:0 5px;color:#999999;}
-.breadcrumb .active a{color:#333333;}
-.pagination{height:36px;margin:18px 0;}
-.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
-.pagination li{display:inline;}
-.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;}
-.pagination a:hover,.pagination .active a{background-color:#f5f5f5;}
-.pagination .active a{color:#999999;cursor:default;}
-.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
-.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
-.pagination-centered{text-align:center;}
-.pagination-right{text-align:right;}
-.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";}
-.pager:after{clear:both;}
-.pager li{display:inline;}
-.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
-.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
-.pager .next a{float:right;}
-.pager .previous a{float:left;}
-.modal-open .dropdown-menu{z-index:2050;}
-.modal-open .dropdown.open{*z-index:2050;}
-.modal-open .popover{z-index:2060;}
-.modal-open .tooltip{z-index:2070;}
-.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
-.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
-.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
-.modal.fade.in{top:50%;}
-.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
-.modal-body{padding:15px;}
-.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";}
-.modal-footer:after{clear:both;}
-.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;}
-.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
-.tooltip.top{margin-top:-2px;}
-.tooltip.right{margin-left:2px;}
-.tooltip.bottom{margin-top:2px;}
-.tooltip.left{margin-left:-2px;}
-.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
-.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
-.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
-.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
-.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.tooltip-arrow{position:absolute;width:0;height:0;}
-.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;}
-.popover.right{margin-left:5px;}
-.popover.bottom{margin-top:5px;}
-.popover.left{margin-left:-5px;}
-.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
-.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
-.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
-.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
-.popover .arrow{position:absolute;width:0;height:0;}
-.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
-.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}
-.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
-.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";}
-.thumbnails:after{clear:both;}
-.thumbnails>li{float:left;margin:0 0 18px 20px;}
-.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}
-a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
-.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
-.thumbnail .caption{padding:9px;}
-.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-.label-important{background-color:#b94a48;}
-.label-warning{background-color:#f89406;}
-.label-success{background-color:#468847;}
-.label-info{background-color:#3a87ad;}
-@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
-.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
-.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
-.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);}
-.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
-.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);}
-.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
-.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);}
-.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
-.accordion{margin-bottom:18px;}
-.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.accordion-heading{border-bottom:0;}
-.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
-.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
-.carousel{position:relative;margin-bottom:18px;line-height:1;}
-.carousel-inner{overflow:hidden;width:100%;position:relative;}
-.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
-.carousel .item>img{display:block;line-height:1;}
-.carousel .active,.carousel .next,.carousel .prev{display:block;}
-.carousel .active{left:0;}
-.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
-.carousel .next{left:100%;}
-.carousel .prev{left:-100%;}
-.carousel .next.left,.carousel .prev.right{left:0;}
-.carousel .active.left{left:-100%;}
-.carousel .active.right{left:100%;}
-.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
-.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
-.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);}
-.carousel-caption h4,.carousel-caption p{color:#ffffff;}
-.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
-.hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
-.pull-right{float:right;}
-.pull-left{float:left;}
-.hide{display:none;}
-.show{display:block;}
-.invisible{visibility:hidden;}
diff --git a/procurements/table.html b/procurements/table.html
deleted file mode 100644
index 2e5d4dc..0000000
--- a/procurements/table.html
+++ /dev/null
@@ -1,6 +0,0 @@
-2005 2006 2007 2008 2009 2010 2011 2012 unknown 1249382766.2152333260 2150850991.2765297890 2055838577.6049449444 3680086936.3983817101 379798253.0516998768 248214732.9509002864 163108850.0458998084 99238100.8806000054
-negotiated procedure without publishing 0 0 0 0 1701276158.1771662235 1218175597.3571820259 438649852.1232998967 115417465.9816000313
-restricted procedure 0 0 0 0 1598584314.6390001774 1612402458.9437992573 534089119.1710001230 162257717.4900000095
-competitive dialogue 0 0 0 0 3465707.0000000000 4219722242.1999998093 328000.0000000000 0
-open procedure 0 0 0 0 4737217156.0390415192 1347635941.8781921864 1597818962.6989026070 533230497.5934982300
-
\ No newline at end of file
diff --git a/procurements/templates/report.html b/procurements/templates/report.html
deleted file mode 100644
index e7b06c4..0000000
--- a/procurements/templates/report.html
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
- Cubes
-
-
-
-
-
-
-
-
Browse Dimensions
-
-
-
-
-
-{% if dimension %}
-
Dimension: {{dimension.label or dimension.name}}
-
-
-
-
-
-
-
- {{next_level.label or next_level.name}} Count Amount
-
-
- {% for row in result.table_rows(dimension) %}
-
-
- {% if is_last %}
- {{row.label}}
- {% else %}
- {{row.label}}
- {% endif %}
-
- {{row.record.record_count}}
- {{row.record.contract_amount_sum}}
-
- {% endfor %}
- Total
- {{result.summary.record_count}}
- {{result.summary.amount_sum}}
-
-
-
-
-{% endif %}
-
-
\ No newline at end of file
diff --git a/procurements/vvo_data.sqlite b/procurements/vvo_data.sqlite
deleted file mode 100644
index 6100058..0000000
Binary files a/procurements/vvo_data.sqlite and /dev/null differ
diff --git a/procurements/vvo_model-sk.json b/procurements/vvo_model-sk.json
deleted file mode 100644
index 009fa26..0000000
--- a/procurements/vvo_model-sk.json
+++ /dev/null
@@ -1,164 +0,0 @@
-{
- "locale": "sk",
- "dimensions" : {
- "cpv" : {
- "attributes" : {
- "detail" : {"label": "detail"},
- "id" : {},
- "detail_label" : {"label": "detail"},
- "code" : {"label": "CPV kod"},
- "detail_compet": {"label": "Koeficient súťaživosti"},
- "group" : {"label": "skupina"},
- "group_label" : {"label": "skupina"},
- "group_compet": {"label": "Koeficient súťaživosti skupiny"},
- "division" : {"label": "oddiel"},
- "division_label" : {"label": "oddiel"},
- "division_compet": {"label": "Koeficient súťaživosti oddielu"},
- "class_label" : {"label": "trieda"},
- "class" : {"label": "trieda"},
- "class_compet": {"label": "Koeficient súťaživosti triedy"},
- "category" : {"label": "kategória"},
- "category_label" : {"label": "kategória"},
- "category_compet": {"label": "Koeficient súťaživosti kategorie"}
- },
-
- "levels" : {
- "detail" : {
- "label" : "detail"
- },
- "group" : {
- "label" : "skupina"
- },
- "division" : {
- "label" : "oddiel"
- },
- "class" : {
- "label" : "trieda"
- },
- "category" : {
- "label" : "kategória"
- }
- },
- "label" : "Common Procurement Vocabulary",
- "hierarchies" : {
- "default" : {}
- }
- },
- "procurer" : {
- "levels" : {
- "sector": {
- "account_sector" : {"label": "sektor"},
- "account_sector_code" : {"label": "sektor (kód)"}
- },
- "procurer" : {
- "attributes" : {
- "ico" : {"label": "IČO"},
- "region" : {"label": "región"},
- "name" : {"label": "názov"},
- "legal_form" : {"label": "právna forma"},
- "address" : {"label": "adresa"},
- "id" : {"label": "id"},
- "offer_count_avg": { "label": "priemerný počet ponúk na zmluvu"},
- "competitiveness": { "label": "koeficient súťaživosti"}
- }
- }
- },
- "label" : "Obstarávateľ",
- "hierarchies" : {}
- },
- "geography" : {
- "attributes" : {
- "okres" : {"label": "okres"},
- "okres_code" : {"label": "kód okresu"},
- "kraj_code" : {"label": "kód kraja"},
- "kraj" : {"label": "kraj"}
- },
- "levels" : {
- "okres" : { },
- "kraj" : { }
- },
- "label" : "Región",
- "hierarchies" : { "default" : {} }
- },
- "date" : {
- "attributes" : {
- "month_sname" : {"label": "mesiac"},
- "month_name" : {"label": "mesiac"},
- "month" : {},
- "day" : {"label": "deň"},
- "id" : {},
- "year" : {"label": "rok"}
- },
- "levels" : {
- "month" : { "label" : "Mesiac" },
- "day" : { "label" : "Deň" },
- "year" : { "label" : "Rok" }
- },
- "label" : "dátum",
- "hierarchies" : {
- "default" : {}
- }
- },
- "supplier" : {
- "attributes" : {
- "country" : {"label": "krajina"},
- "date_end" : {"label": "dátum ukončenia činnosti"},
- "ico" : {"label": "IČO"},
- "name" : {"label": "názov"},
- "legal_form" : {"label": "právna forma"},
- "date_start" : {"label": "dátum začatia činnosti"},
- "address" : {"label": "adresa"},
- "id" : {"label": "id"},
- "ownership" : {"label": "druh vlastníctva"},
- "offer_count_avg": { "label": "priemerný počet ponúk na zmluvu"},
- "competitiveness": { "label": "koeficient súťaživosti"}
- },
- "levels" : {
- "supplier" : {
- }
- },
- "label" : "Dodávateľ",
- "hierarchies" : {}
- },
- "criteria" : {
- "attributes" : {
- "sdesc" : {"label": "kritéria vyhodnotenia"},
- "id" : {},
- "description" : {"label": "kritéria vyhodnotenia"},
- "code" : {"label": "kritéria vyhodnotenia (kód)"}
- },
- "levels" : {
- "criteria" : {
- }
- },
- "label" : "Kriteria vyhodnotenia",
- "hierarchies" : {}
- },
- "process_type" : {
- "attributes" : {
- "sdesc" : {"label": "druh postupu"},
- "id" : {},
- "description" : {"label": "druh postupu"},
- "code" : {"label": "druh postupu (kód)"}
- },
- "levels" : {
- "process_type" : {
- }
- },
- "label" : "Druh postupu",
- "hierarchies" : {}
- }
- },
- "cubes" : {
- "contracts" : {
- "measures" : {
- "contract_amount" : {"label": "hodnota zmluvy"}
- },
- "details" : {
- "zakazka_nazov" : {"label": "Názov zákazky"},
- "vestnik_cislo" : {"label": "Číslo vestníka"},
- "source_url" : {"label": "Odkaz na pôvodný dokument"}
- }
- }
- }
-}
diff --git a/procurements/vvo_model.json b/procurements/vvo_model.json
deleted file mode 100644
index aa7210f..0000000
--- a/procurements/vvo_model.json
+++ /dev/null
@@ -1,271 +0,0 @@
-{
- "name" : "vvo",
- "locale":"en",
- "cubes": [
- {
- "name": "contracts",
- "name": "contracts",
- "measures": {
- "contract_amount": {"label": "Contract amount"}
- },
- "details": [
- {
- "name": "contract_name",
- "label": "Contract name"
- },
- {
- "name": "bulletin_number",
- "label": "Bulletin number"
- },
- {
- "name": "source_url",
- "label": "Source URL"
- }
- ],
- "dimensions": [
- "date",
- "cpv",
- "procurer",
- "supplier",
- "process_type",
- "criteria",
- "geography"
- ],
- "joins": [
- {
- "master": "bulletin_date_id",
- "detail": "dm_date.id"
- },
- {
- "master": "cpv_id",
- "detail": "dm_cpv.id"
- },
- {
- "master": "procurer_id",
- "detail": "dm_procurer.id"
- },
- {
- "master": "supplier_id",
- "detail": "dm_supplier.id"
- },
- {
- "master": "process_type_id",
- "detail": "dm_process_type.id"
- },
- {
- "master": "criteria_id",
- "detail": "dm_criteria.id"
- },
- {
- "master": "geography_id",
- "detail": "dm_geography.id"
- }
- ],
- "mappings":
- {
- "zmluva_hodnota":"zmluva_hodnota",
- "fact.date_id":"bulletin_date_id"
- }
- }
- ],
-
- "dimensions": {
- "cpv" : {
- "name": "cpv",
- "label": "Common Procurement Vocabulary",
- "key": "cpv_id",
- "levels": [
- {
- "name": "division",
- "label": "division",
- "label_attribute": "division_label",
- "attributes": [
- {"name":"division"},
- {"name": "division_label", "locales": ["en", "sk"]},
- {"name":"division_compet", "label": "competitiveness in division"}
- ]
- },
- {
- "name": "group",
- "label": "group",
- "label_attribute": "group_label",
- "attributes": [
- {"name":"group", "label": "Group code"},
- {"name":"group_label", "label": "Group", "locales": ["en", "sk"]},
- {"name":"group_compet", "label": "competitiveness in grouop"}
- ]
- },
- {
- "name": "class",
- "label": "class",
- "label_attribute": "class_label",
- "attributes": [
- {"name":"class"},
- {"name":"class_label", "locales": ["en", "sk"]},
- {"name":"class_compet", "label": "competitiveness in class"}
- ]
- },
- {
- "name":"category",
- "label": "category",
- "label_attribute": "category_label",
- "attributes": [
- {"name":"category", "label":"category code"},
- {"name":"category_label", "label": "category", "locales": ["en", "sk"]},
- {"name":"category_compet", "label": "competitiveness in category"}
- ]
- },
- {
- "name": "detail",
- "label": "detail",
- "label_attribute": "detail_label",
- "attributes": [
- {"name":"id"},
- {"name":"detail", "label": "detail code"},
- {"name":"detail_label", "label": "detail", "locales": ["en", "sk"]},
- {"name":"code", "label": "CPV Code"},
- {"name":"detail_compet", "label": "competitiveness"}
- ]
- }
- ],
- "hierarchy": ["division", "group", "class", "category", "detail"]
- },
- "date" : {
- "label" : "Date",
- "info": {
- "cv-datefilter": true
- },
- "levels" : [
- {
- "name": "year",
- "name": "year",
- "label": "Year",
- "attributes": [
- {"name":"year"}
- ],
- "info": { "cv-datefilter-field": "year" }
- },
- {
- "name": "month",
- "name": "month",
- "label" : "Month",
- "attributes": [
- {"name":"month"},
- {"name":"month_name", "locales": ["en", "sk"]},
- {"name":"month_sname", "locales": ["en", "sk"]}
- ],
- "info": { "cv-datefilter-field": "month" }
- },
- {
- "name": "day",
- "name": "day",
- "label" : "Day",
- "attributes": [
- {"name":"id"},
- {"name":"day"}],
- "info": { "cv-datefilter-field": "day" }
- }
- ],
- "hierarchy" : ["year", "month", "day"]
- },
- "procurer" : {
- "label": "Procurer",
- "levels" : [
- {
- "name": "sector",
- "attributes":[
- {"name":"account_sector_code", "label": "account sector code"},
- {"name":"account_sector", "label": "account sector"}
- ]
- },
- {
- "name": "procurer",
- "label_attribute": "name",
- "attributes": [
- {"name":"id", "label": "id"},
- {"name":"ico", "label": "organisation ID"},
- {"name":"name", "label": "name"},
- {"name":"region", "label": "region"},
- {"name":"address", "label": "address"},
- {"name":"legal_form", "label": "legal form"},
- {"name":"offer_count_avg", "label": "average number of offers"},
- {"name":"competitiveness", "label": "competitiveness"}
- ]
- }
- ],
- "hierarchy": ["sector", "procurer"]
- },
- "supplier" : {
- "label": "Supplier",
- "levels" : [
- {
- "name":"supplier",
- "key": "id",
- "label_attribute": "name",
- "attributes": [
- {"name":"id"},
- {"name":"ico", "label": "company ID"},
- {"name":"name", "label": "name"},
- {"name":"address", "label": "address"},
- {"name":"country", "label": "country"},
- {"name":"date_start", "label": "operating since"},
- {"name":"date_end", "label": "company closed date"},
- {"name":"legal_form", "label": "legal form"},
- {"name":"ownership", "label": "ownership"},
- {"name":"offer_count_avg", "label": "average number of offers"},
- {"name":"competitiveness", "label": "competitiveness"}
- ]
- }
- ]
- },
- "process_type" : {
- "label": "Procurement type",
- "levels": [
- {
- "name": "process_type",
- "label_attribute": "description",
- "attributes" : [
- {"name":"id"},
- {"name":"code"},
- {"name":"description", "locales": ["en", "sk"]},
- {"name":"sdesc", "locales": ["en", "sk"]}]
- }
- ]
- },
- "criteria" : {
- "label": "Evalutaion criteria",
- "levels": [
- {
- "name":"criteria",
- "label_attribute": "description",
- "attributes" : [
- {"name":"code"},
- {"name":"description", "locales": ["en", "sk"]},
- {"name":"sdesc", "locales": ["en", "sk"]},
- {"name":"id"}]
- }
- ]
- },
- "geography": {
- "label": "Region",
- "levels": [
- {
- "name":"okres",
- "attributes": [
- {"name":"okres_code", "label": "county code"},
- {"name":"okres", "label": "county"}
- ]
- },
- {
- "name":"kraj",
- "attributes": [
- {"name":"kraj_code", "label": "region code"},
- {"name":"kraj", "label": "region"}
- ]
- }
- ],
- "hierarchy": ["kraj", "okres"]
-
- }
- }
-}
diff --git a/requirements.pip b/requirements.pip
deleted file mode 100644
index 0456274..0000000
--- a/requirements.pip
+++ /dev/null
@@ -1,6 +0,0 @@
-Flask==0.9
-Jinja2==2.6
-SQLAlchemy==0.7.9
-Werkzeug==0.8.3
-cubes==0.10
-wsgiref==0.1.2
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..9abddab
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+cubes==1.0.1
+Flask==0.10.1
+SQLAlchemy==1.0.13
diff --git a/webshop/README.md b/webshop/README.md
index 10a6d48..0fb94b2 100644
--- a/webshop/README.md
+++ b/webshop/README.md
@@ -3,15 +3,21 @@ Webshop (Online shop example)
Example includes:
-* data sql
-* SQLite database
-* model
-* some sample screenshots using cubesviewer
+* Model (model.json)
+* Cubes server config (slicer.ini)
+* Loaded SQLite database (webshop.sqlite)
+
+
+Version
+-------
+
+This sample is tested with cubes-1.0.1.
+
Description
-----------
-This sample includes a simple model and sample data about a fictional
+This sample includes a simple model and sample data from a fictional
online shop.
It contains a fact table "sales" with information about product sales,
@@ -20,8 +26,12 @@ customer country, product and product category, and invoice amount.
It also contains a fact table "webvisits" with information about
fictional web visits (country of visitor, page views, browser...).
-Slicer Use
-----------
+
+Slicer Usage
+------------
+
+Make sure you've installed Cubes 1.0.x and that the `slicer` command
+is available (either globally or within a *virtualenv*).
Execute:
@@ -29,6 +39,9 @@ Execute:
Documentation: http://packages.python.org/cubes/server.html
+If you are on Windows you may need to remove the `processes: 6` line
+from the `slicer.ini` file.
+
CubesViewer
-----------
@@ -39,4 +52,22 @@ Live example: http://jjmontesl.github.io/cubesviewer/
Documentation: https://github.com/jjmontesl/cubesviewer/
+You can find a tutorial for CubesViewer and Cubes using this
+data at https://github.com/jjmontesl/cubesviewer/blob/master/doc/guide/cubesviewer-quickstart.md .
+
+
+Generating the data
+-------------------
+
+This sample data was generated using an (experimental) tool called
+CubETL, which is able to insert data into OLAP schemas and
+generates Cubes model automatically.
+
+If you are interested in the topic, check it out and get in touch:
+
+CubETL: https://github.com/jjmontesl/cubetl
+WebShop ETL Source: https://github.com/jjmontesl/cubetl/blob/master/examples/webshop.yaml
+
+(Note you are in the wild, there is little to no documentation, but there are
+a bunch of examples and I'm happy to provide assistance and fix bugs).
diff --git a/webshop/cubes-wsgi.py b/webshop/cubes-wsgi.py
new file mode 100644
index 0000000..aeb4c28
--- /dev/null
+++ b/webshop/cubes-wsgi.py
@@ -0,0 +1,28 @@
+# Sample file to deploy Cubes slicer as a WSGI application,
+# using a virtual environment.
+
+import sys
+import os
+import site
+
+# Add the site-packages of the chosen virtualenv to work with
+site.addsitedir('/srv/cubes/env/lib/python3.4/site-packages')
+
+# Add the app's directory to the PYTHONPATH
+sys.path.append('/srv/cubes')
+
+# Activate virtual env
+activate_env=os.path.expanduser("/srv/cubes/env/bin/activate_this.py")
+execfile(activate_env, dict(__file__=activate_env))
+
+os.chdir('/srv/cubes-examples/webshop')
+
+CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
+CONFIG_PATH = os.path.join(CURRENT_DIR, "slicer.ini")
+
+from cubes.server.base import create_server
+application = create_server(CONFIG_PATH)
+
+
+
+
diff --git a/webshop/import_webshop.py b/webshop/import_webshop.py
deleted file mode 100644
index f29c0c8..0000000
--- a/webshop/import_webshop.py
+++ /dev/null
@@ -1,195 +0,0 @@
-#
-#
-
-import sys
-from sqlalchemy.engine import create_engine
-import re
-import datetime
-import csv
-import random
-
-cache = {}
-connection = None
-
-def main():
-
- global connection
-
- # Open source
- engine = create_engine("sqlite:///webshop.sqlite")
- connection = engine.connect()
-
- # Cleanup
- connection.execute("DELETE FROM dates");
- connection.execute("DELETE FROM customers");
- connection.execute("DELETE FROM countries");
- connection.execute("DELETE FROM products");
- connection.execute("DELETE FROM sales");
- connection.execute("DELETE FROM webvisits")
-
- # Import facts and dimension data
- import_sales()
- # Generate all dates
- generate_dates()
- # Generate site visits
- generate_webvisits()
-
- # Add extra dimensions for left joins
- insert_product ("Books", "200 ways of slicing a cube")
-
-def save_object(table, row):
-
- if (table in cache):
- if (row["id"] in cache[table]):
- return row["id"]
- else:
- cache[table] = {}
-
- keys = row.keys();
- sql = "INSERT INTO " + table + " ("
- sql = sql + ", ".join(keys)
- sql = sql + ") VALUES ("
- sql = sql + ", ".join([ ("'" + str(row[key]) + "'") for key in keys])
- sql = sql + ")"
-
- print "Inserting - Table: %-14s Id: %s" % (table, row["id"])
- #print sql
-
- connection.execute(sql);
- cache[table][row["id"]] = row
-
- return row["id"]
-
-def sanitize(value):
-
- if (value == ""):
- value = "(BLANK)"
- elif (value == None):
- value = "(NULL)"
- else:
- value = re.sub('[^\w]', "_", value.strip())
- return value
-
-def insert_country (continent, country):
-
- row = {
- "id": sanitize (continent + "/" + country),
- "continent_id": sanitize(continent),
- "continent_label": continent,
- "country_id": sanitize(country),
- "country_label": country,
- }
- return save_object ("countries", row)
-
-def insert_product (category, product):
-
- row = {
- "id": sanitize (category + "/" + product),
- "category_id": sanitize(category),
- "category_label": category,
- "product_id": sanitize(product),
- "product_label": product,
- }
- return save_object ("products", row)
-
-def insert_customer (customer_name):
-
- row = {
- "id": sanitize(customer_name),
- "name": customer_name
- }
- return save_object ("customers", row)
-
-def insert_date (year, month, day):
-
- row = { }
- prefix = "date"
-
- date = datetime.date(int(year), int(month), int(day));
-
- if date != None:
- row["id"] = sanitize(datetime.datetime.strftime(date, "%d/%b/%Y"))
- row[prefix + "_year"] = date.year
- row[prefix + "_quarter"] = ((date.month - 1) / 3) + 1
- row[prefix + "_month"] = date.month
- row[prefix + "_day"] = date.day
- row[prefix + "_week"] = date.isocalendar()[1]
-
- if row[prefix + "_month"] == 12 and row[prefix + "_week"] <= 1:
- row[prefix + "_week"] = 52
- if row[prefix + "_month"] == 1 and row[prefix + "_week"] >= 52:
- row[prefix + "_week"] = 1
-
- return save_object ("dates", row)
-
-def insert_sale(fact):
- return save_object ("sales", fact)
-
-def insert_webvisit(fact):
- return save_object ("webvisits", fact)
-
-def generate_dates():
-
- start_date = datetime.datetime.strptime("2012-01-01", "%Y-%m-%d")
- end_date = datetime.datetime.strptime("2013-12-31", "%Y-%m-%d")
-
- cur_date = start_date
- while (cur_date <= end_date):
- insert_date (cur_date.year, cur_date.month, cur_date.day)
- cur_date = cur_date + datetime.timedelta(days = +1)
-
-def import_sales():
-
- count = 0
- header = None
- with open('webshop-facts.csv', 'rb') as f:
- reader = csv.reader(f)
- for row in reader:
-
- count = count + 1
- fact = { "id" : count }
-
- if (header == None):
- header = row
- continue
-
- arow = {}
- for header_index in range (0, len(header)):
- arow[(header[header_index])] = row[header_index]
-
- # Process row
- fact["date_id"] = insert_date(arow["date_created.year"], arow["date_created.month"], arow["date_created.day"])
- fact["country_id"] = insert_country(arow["country.region"], arow["country.country"])
- fact["customer_id"] = insert_customer(arow["customer.name"])
- fact["product_id"] = insert_product(arow["product.category"], arow["product.name"])
-
- # Import figures (quick hack for localization issues):
- fact["quantity"] = float(str(arow["quantity"]).replace(",", "."))
- fact["price_total"] = float(str(arow["price_total"]).replace(",", "."))
-
- insert_sale(fact)
-
- print "Imported %d facts " % (count)
-
-def generate_webvisits():
-
- for i in range (1, 1079):
-
- fact = { "id" : i }
-
- fact["country_id"] = random.choice (cache["countries"].keys())
- fact["date_id"] = random.choice (cache["dates"].keys())
-
- fact["browser"] = random.choice (["Lynx", "Firefox", "Firefox", "Chrome", "Chrome", "Chrome"])
- fact["newsletter"] = random.choice(["Yes", "No", "No", "No"])
-
- fact["source_label"] = random.choice(["Web search", "Web search", "Direct link", "Unknown"])
- fact["source_id"] = sanitize(fact["source_label"])
-
- fact["pageviews"] = abs(int (random.gauss (7, 6))) + 1
-
- insert_webvisit(fact)
-
-if __name__ == "__main__":
- main()
-
diff --git a/webshop/model.json b/webshop/model.json
index da1042e..ef3f287 100644
--- a/webshop/model.json
+++ b/webshop/model.json
@@ -1,225 +1,549 @@
{
- "dimensions": [
-
+ "cubes": [
{
- "comment": "This is used as a template for other date dimensions.",
-
- "name": "date_base",
- "label": "Date Base",
- "info": {
- "cv-datefilter": true,
- "cv-datefilter-hierarchy": "weekly"
- },
- "levels": [
+ "_comment": "Generated by CubETL",
+ "aggregates": [
+ {
+ "function": "sum",
+ "label": "Quantity Sum",
+ "measure": "quantity",
+ "name": "quantity_sum"
+ },
+ {
+ "function": "avg",
+ "label": "Quantity Avg",
+ "measure": "quantity",
+ "name": "quantity_avg"
+ },
+ {
+ "function": "max",
+ "label": "Quantity Max",
+ "measure": "quantity",
+ "name": "quantity_max"
+ },
+ {
+ "function": "min",
+ "label": "Quantity Min",
+ "measure": "quantity",
+ "name": "quantity_min"
+ },
+ {
+ "function": "sum",
+ "label": "Price Total Sum",
+ "measure": "price_total",
+ "name": "price_total_sum"
+ },
+ {
+ "function": "avg",
+ "label": "Price Total Avg",
+ "measure": "price_total",
+ "name": "price_total_avg"
+ },
+ {
+ "function": "max",
+ "label": "Price Total Max",
+ "measure": "price_total",
+ "name": "price_total_max"
+ },
+ {
+ "function": "min",
+ "label": "Price Total Min",
+ "measure": "price_total",
+ "name": "price_total_min"
+ },
+ {
+ "function": "sum",
+ "label": "Delivery Days Sum",
+ "measure": "delivery_days",
+ "name": "delivery_days_sum"
+ },
{
- "name":"year",
- "label":"Year",
- "info": { "cv-datefilter-field": "year" }
- },
+ "function": "avg",
+ "label": "Delivery Days Avg",
+ "measure": "delivery_days",
+ "name": "delivery_days_avg"
+ },
{
- "name":"quarter",
- "label":"Quarter"
- },
+ "function": "max",
+ "label": "Delivery Days Max",
+ "measure": "delivery_days",
+ "name": "delivery_days_max"
+ },
{
- "name":"month",
- "label":"Month"
- },
+ "function": "min",
+ "label": "Delivery Days Min",
+ "measure": "delivery_days",
+ "name": "delivery_days_min"
+ },
{
- "name":"week",
- "label":"Week",
- "info": { "cv-datefilter-field": "week" }
+ "function": "count",
+ "label": "Record Count",
+ "name": "record_count"
}
- ],
- "hierarchies": [
+ ],
+ "details": [],
+ "dimensions": [
+ "date_sale",
+ "customer",
+ "product",
+ "country"
+ ],
+ "joins": [
+ {
+ "alias": "country",
+ "detail": "country.country_code",
+ "master": "webshop_sales.country_id"
+ },
{
- "name": "weekly",
- "label": "Weekly",
- "levels": [ "year", "week"]
- },
+ "alias": "product",
+ "detail": "product.id",
+ "master": "webshop_sales.product_id"
+ },
{
- "name": "monthly",
- "label": "Monthly",
- "levels": [ "year", "quarter", "month"]
+ "alias": "customer",
+ "detail": "customer.id",
+ "master": "webshop_sales.customer_id"
+ },
+ {
+ "alias": "date_sale",
+ "detail": "dates.id",
+ "master": "webshop_sales.date_sale_id"
}
- ]
- },
-
- {
- "name": "date_sale",
- "label": "Sale Date",
- "template": "date_base"
- },
-
- {
- "name": "date_visit",
- "label": "View Date",
- "template": "date_base"
- },
-
+ ],
+ "key": "id",
+ "label": "Webshop / Sales",
+ "mappings": {
+ "country.continent_code": "country.continent_code",
+ "country.continent_name": "country.continent_name",
+ "country.country_code": "country.country_code",
+ "country.country_name": "country.country_name",
+ "customer.id": "customer.id",
+ "customer.name": "customer.name",
+ "date_sale.day": "date_sale.day",
+ "date_sale.dow": "date_sale.dow",
+ "date_sale.id": "date_sale.id",
+ "date_sale.month": "date_sale.month",
+ "date_sale.quarter": "date_sale.quarter",
+ "date_sale.week": "date_sale.week",
+ "date_sale.year": "date_sale.year",
+ "product.category_label": "product.category_label",
+ "product.id": "product.id",
+ "product.product_label": "product.product_label"
+ },
+ "measures": [
+ {
+ "label": "Quantity",
+ "name": "quantity"
+ },
+ {
+ "label": "Price Total",
+ "name": "price_total"
+ },
+ {
+ "label": "Delivery Days",
+ "name": "delivery_days"
+ }
+ ],
+ "name": "webshop_sales"
+ },
{
- "name": "customer",
- "label": "Customer" ,
- "levels": [ {
- "name": "customer",
- "label": "Customer",
- "attributes": [ "id", "name" ],
- "label_attribute": "name"
- } ]
- },
-
+ "_comment": "Generated by CubETL",
+ "aggregates": [
+ {
+ "function": "sum",
+ "label": "Page Views Sum",
+ "measure": "pageviews",
+ "name": "pageviews_sum"
+ },
+ {
+ "function": "avg",
+ "label": "Page Views Avg",
+ "measure": "pageviews",
+ "name": "pageviews_avg"
+ },
+ {
+ "function": "max",
+ "label": "Page Views Max",
+ "measure": "pageviews",
+ "name": "pageviews_max"
+ },
+ {
+ "function": "min",
+ "label": "Page Views Min",
+ "measure": "pageviews",
+ "name": "pageviews_min"
+ },
+ {
+ "function": "sum",
+ "label": "Session Time Sum",
+ "measure": "time",
+ "name": "time_sum"
+ },
+ {
+ "function": "avg",
+ "label": "Session Time Avg",
+ "measure": "time",
+ "name": "time_avg"
+ },
+ {
+ "function": "max",
+ "label": "Session Time Max",
+ "measure": "time",
+ "name": "time_max"
+ },
+ {
+ "function": "min",
+ "label": "Session Time Min",
+ "measure": "time",
+ "name": "time_min"
+ },
+ {
+ "function": "count",
+ "label": "Record Count",
+ "name": "record_count"
+ }
+ ],
+ "details": [],
+ "dimensions": [
+ "date_visit",
+ "country",
+ "browser",
+ "newsletter"
+ ],
+ "joins": [
+ {
+ "alias": "browser",
+ "detail": "browser.id",
+ "master": "webshop_visits.browser_id"
+ },
+ {
+ "alias": "country",
+ "detail": "country.country_code",
+ "master": "webshop_visits.country_id"
+ },
+ {
+ "alias": "date_visit",
+ "detail": "dates.id",
+ "master": "webshop_visits.date_visit_id"
+ }
+ ],
+ "key": "visit_id",
+ "label": "Webshop / Visits",
+ "mappings": {
+ "browser.id": "browser.id",
+ "browser.name": "browser.name",
+ "country.continent_code": "country.continent_code",
+ "country.continent_name": "country.continent_name",
+ "country.country_code": "country.country_code",
+ "country.country_name": "country.country_name",
+ "date_visit.day": "date_visit.day",
+ "date_visit.dow": "date_visit.dow",
+ "date_visit.id": "date_visit.id",
+ "date_visit.month": "date_visit.month",
+ "date_visit.quarter": "date_visit.quarter",
+ "date_visit.week": "date_visit.week",
+ "date_visit.year": "date_visit.year",
+ "newsletter.newsletter": "webshop_visits.newsletter"
+ },
+ "measures": [
+ {
+ "label": "Page Views",
+ "name": "pageviews"
+ },
+ {
+ "label": "Session Time",
+ "name": "time"
+ }
+ ],
+ "name": "webshop_visits"
+ }
+ ],
+ "dimensions": [
{
- "name": "product",
- "label": "Product",
+ "_comment": "Generated by CubETL",
+ "hierarchies": [
+ {
+ "label": "Daily",
+ "levels": [
+ "year",
+ "quarter",
+ "month",
+ "day"
+ ],
+ "name": "daily"
+ },
+ {
+ "label": "Weekly",
+ "levels": [
+ "year",
+ "week"
+ ],
+ "name": "weekly"
+ }
+ ],
+ "info": {
+ "cv-datefilter": true,
+ "cv-datefilter-hierarchy": "daily"
+ },
+ "label": "Sale Date",
"levels": [
{
- "name":"category",
- "label":"Category",
- "attributes": [ "category_id", "category_label" ],
- "key": "category_id",
- "label_attribute": "category_label"
- },
- {
- "name":"product",
- "label":"Product",
- "attributes": [ "product_id", "product_label" ],
- "key": "product_id",
- "label_attribute": "product_label"
- }
- ]
- },
-
+ "attributes": [
+ "year"
+ ],
+ "key": "year",
+ "label": "Year",
+ "label_attribute": "year",
+ "name": "year",
+ "role": "year"
+ },
+ {
+ "attributes": [
+ "quarter"
+ ],
+ "key": "quarter",
+ "label": "Quarter",
+ "label_attribute": "quarter",
+ "name": "quarter",
+ "role": "quarter"
+ },
+ {
+ "attributes": [
+ "month"
+ ],
+ "key": "month",
+ "label": "Month",
+ "label_attribute": "month",
+ "name": "month",
+ "role": "month"
+ },
+ {
+ "attributes": [
+ "week"
+ ],
+ "key": "week",
+ "label": "Week",
+ "label_attribute": "week",
+ "name": "week",
+ "role": "week"
+ },
+ {
+ "attributes": [
+ "day"
+ ],
+ "key": "day",
+ "label": "Day",
+ "label_attribute": "day",
+ "name": "day",
+ "role": "day"
+ }
+ ],
+ "name": "date_sale",
+ "role": "time"
+ },
{
- "name": "country",
- "label": "Country",
+ "_comment": "Generated by CubETL",
+ "label": "Customer",
"levels": [
{
- "name":"region",
- "label":"Region",
- "attributes": [ "region_id", "region_label" ],
- "key": "region_id",
- "label_attribute": "region_label"
- },
- {
- "name":"country",
- "label":"Country",
- "attributes": [ "country_id", "country_label" ],
- "key": "country_id",
- "label_attribute": "country_label"
- }
- ]
- },
-
+ "attributes": [
+ "id",
+ "name"
+ ],
+ "key": "id",
+ "label": "Customer",
+ "label_attribute": "name",
+ "name": "customer"
+ }
+ ],
+ "name": "customer"
+ },
{
- "name": "source",
- "label": "Source",
- "levels": [ {
- "name": "source",
- "label": "Source",
- "attributes": [ "source_id", "source_label" ],
- "label_attribute": "source_label"
- } ]
- },
-
+ "_comment": "Generated by CubETL",
+ "hierarchies": [
+ {
+ "label": "Product",
+ "levels": [
+ "product_category",
+ "product_product"
+ ],
+ "name": "product"
+ }
+ ],
+ "label": "Product",
+ "levels": [
+ {
+ "attributes": [
+ "category_label"
+ ],
+ "key": "category_label",
+ "label": "Product Category",
+ "label_attribute": "category_label",
+ "name": "product_category"
+ },
+ {
+ "attributes": [
+ "product_label"
+ ],
+ "key": "product_label",
+ "label": "Product",
+ "label_attribute": "product_label",
+ "name": "product_product"
+ }
+ ],
+ "name": "product"
+ },
{
- "name": "browser",
- "label": "Browser"
- },
-
+ "_comment": "Generated by CubETL",
+ "hierarchies": [
+ {
+ "label": "Country",
+ "levels": [
+ "continent",
+ "country"
+ ],
+ "name": "contcountry"
+ }
+ ],
+ "label": "Country",
+ "levels": [
+ {
+ "attributes": [
+ "continent_code",
+ "continent_name"
+ ],
+ "key": "continent_code",
+ "label": "Continent",
+ "label_attribute": "continent_name",
+ "name": "continent"
+ },
+ {
+ "attributes": [
+ "country_code",
+ "country_name"
+ ],
+ "key": "country_code",
+ "label": "Country",
+ "label_attribute": "country_name",
+ "name": "country"
+ }
+ ],
+ "name": "country"
+ },
{
- "name": "newsletter",
- "label": "Newsletter"
- }
-
- ],
-
- "cubes": [
-
+ "_comment": "Generated by CubETL",
+ "hierarchies": [
+ {
+ "label": "Daily",
+ "levels": [
+ "year",
+ "quarter",
+ "month",
+ "day"
+ ],
+ "name": "daily"
+ },
+ {
+ "label": "Weekly",
+ "levels": [
+ "year",
+ "week"
+ ],
+ "name": "weekly"
+ }
+ ],
+ "info": {
+ "cv-datefilter": true,
+ "cv-datefilter-hierarchy": "daily"
+ },
+ "label": "Visit Date",
+ "levels": [
+ {
+ "attributes": [
+ "year"
+ ],
+ "key": "year",
+ "label": "Year",
+ "label_attribute": "year",
+ "name": "year",
+ "role": "year"
+ },
+ {
+ "attributes": [
+ "quarter"
+ ],
+ "key": "quarter",
+ "label": "Quarter",
+ "label_attribute": "quarter",
+ "name": "quarter",
+ "role": "quarter"
+ },
+ {
+ "attributes": [
+ "month"
+ ],
+ "key": "month",
+ "label": "Month",
+ "label_attribute": "month",
+ "name": "month",
+ "role": "month"
+ },
+ {
+ "attributes": [
+ "week"
+ ],
+ "key": "week",
+ "label": "Week",
+ "label_attribute": "week",
+ "name": "week",
+ "role": "week"
+ },
+ {
+ "attributes": [
+ "day"
+ ],
+ "key": "day",
+ "label": "Day",
+ "label_attribute": "day",
+ "name": "day",
+ "role": "day"
+ }
+ ],
+ "name": "date_visit",
+ "role": "time"
+ },
{
- "name": "sales",
- "label": "Webshop / Sales",
- "dimensions": ["date_sale", "customer", "product", "country" ],
- "measures": [
- {"name": "quantity", "aggregations": ["sum", "avg", "max"] },
- {"name": "price_total", "aggregations": ["sum", "avg", "max", "min"] }
- ],
-
- "joins": [
- {
- "master": "sales.date_id",
- "detail": "dates.id"
- },
- {
- "master": "sales.customer_id",
- "detail": "customers.id"
- },
- {
- "master": "sales.product_id",
- "detail": "products.id"
- },
- {
- "master": "sales.country_id",
- "detail": "countries.id"
- }
- ],
-
- "mappings": {
- "date_sale.year": "dates.date_year",
- "date_sale.quarter": "dates.date_quarter",
- "date_sale.month": "dates.date_month",
- "date_sale.week": "dates.date_week",
-
- "customer.id": "customers.id",
- "customer.name": "customers.name",
-
- "product.category_id": "products.category_id",
- "product.category_label": "products.category_label",
- "product.product_id": "products.product_id",
- "product.product_label": "products.product_label",
-
- "country.region_id": "countries.continent_id",
- "country.region_label": "countries.continent_label",
- "country.country_id": "countries.country_id",
- "country.country_label": "countries.country_label"
- }
- },
-
+ "_comment": "Generated by CubETL",
+ "label": "Browser",
+ "levels": [
+ {
+ "attributes": [
+ "id",
+ "name"
+ ],
+ "key": "id",
+ "label": "Browser",
+ "label_attribute": "name",
+ "name": "browser"
+ }
+ ],
+ "name": "browser"
+ },
{
- "name": "webvisits",
- "label": "Website / Visits",
- "dimensions": ["date_visit", "country", "source", "newsletter", "browser" ],
- "measures": [
- {"name": "pageviews", "aggregations": ["sum", "avg", "max"] }
- ],
-
- "joins": [
- {
- "master": "webvisits.date_id",
- "detail": "dates.id"
- },
- {
- "master": "webvisits.country_id",
- "detail": "countries.id"
- }
- ],
-
- "mappings": {
- "date_visit.year": "dates.date_year",
- "date_visit.quarter": "dates.date_quarter",
- "date_visit.month": "dates.date_month",
- "date_visit.week": "dates.date_week",
-
- "country.region_id": "countries.continent_id",
- "country.region_label": "countries.continent_label",
- "country.country_id": "countries.country_id",
- "country.country_label": "countries.country_label",
-
- "source.source_id": "webvisits.source_id",
- "source.source_label": "webvisits.source_label",
-
- "browser.browser": "browser.browser",
- "newsletter.newsletter": "newsletter.newsletter"
- }
+ "_comment": "Generated by CubETL",
+ "label": "Newsletter",
+ "levels": [
+ {
+ "attributes": [
+ "newsletter"
+ ],
+ "key": "newsletter",
+ "label": "Newsletter",
+ "label_attribute": "newsletter",
+ "name": "newsletter"
+ }
+ ],
+ "name": "newsletter"
}
-
]
}
diff --git a/webshop/slicer.ini b/webshop/slicer.ini
index 38d6f4c..64557cc 100644
--- a/webshop/slicer.ini
+++ b/webshop/slicer.ini
@@ -1,5 +1,9 @@
# Slicer OLAP server configuration
+
+[workspace]
+log_level: debug
+
[server]
host: localhost
port: 5000
@@ -7,11 +11,13 @@ reload: yes
prettyprint: yes
json_record_limit: 5000
allow_cors_origin: *
+processes: 6
[store]
type: sql
url: sqlite:///webshop.sqlite
-[workspace]
-model: model.json
-log_level: info
+[models]
+main: model.json
+
+
diff --git a/webshop/webshop-facts.csv b/webshop/webshop-facts.csv
deleted file mode 100644
index e0c09f7..0000000
--- a/webshop/webshop-facts.csv
+++ /dev/null
@@ -1,176 +0,0 @@
-"price_total","quantity","date_created.year","date_created.month","date_created.day","customer.name","country.region","country.country","product.category","product.name"
-"190,05",3,2012,7,13,"Wayne Enterprises","Europe","Spain","Sports","Tent for extreme weather"
-"261,9",1,2013,5,24,"Flowers By Irene","Europe","Denmark","Sports","Snowboard table"
-"257,75",1,2013,12,18,"Mammoth Pictures","South America","Ecuador","Sports","Mountain Bike"
-"242,1",1,2013,2,14,"Transworld Consortium","North America","United States of America","Sports","Mountain Bike"
-"241,5",2,2012,2,5,"Demo Company","South America","Uruguay","Sports","Snowboard table"
-"236,5",1,2012,3,23,"Powell Motors","Europe","Spain","Sports","Mountain Bike"
-"236,5",1,2012,9,27,"Industrial Automation","Europe","Spain","Sports","Mountain Bike"
-"242,5",1,2012,6,20,"Wentworth Industries","Europe","Ireland","Various","Various"
-"217",1,2013,1,15,"Acme, inc.","Europe","Spain","Sports","Mountain Bike"
-"197,29",1,2012,5,16,"Ankh-Sto Associates","Europe","Spain","Sports","Mountain Bike"
-"168,38",1,2013,6,16,"ABC Telecom","South America","Guatemala","Sports","Snowboard boots"
-"167,24",1,2013,7,17,"ZiffCorp","North America","United States of America","Sports","Snowboard boots"
-"209,45",1,2013,12,12,"Omni Consimer Products","Europe","Germany","Sports","Mountain Bike"
-"209,45",1,2012,2,16,"Keedsler Motors","Europe","Netherlands","Sports","Mountain Bike"
-"157,8",1,2013,9,8,"Strickland Propane","South America","Brazil","Videos","Repair your own cross bike (2011)"
-"162,71",1,2012,9,4,"Transworld Consortium","North America","United States of America","Sports","Mountain Bike"
-"52,5",1,2012,12,30,"Acme, inc.","Europe","Spain","Sports","Snowboard boots"
-"105,75",1,2013,8,17,"Incom Corporation","Europe","Spain","Sports","Snowboard table"
-"50,5325",1,2012,4,16,"Allied Biscuit","North America","United States of America","Books","Bicycle Wheel"
-"50,2403",1,2013,7,28,"Corellian Engineering Corporation","Europe","Spain","Books","Build your own bicycle"
-"50,2396",1,2013,10,14,"Leeding Engines Ltd.","Europe","Spain","Books","Build your own bicycle"
-"193,609",1,2013,3,8,"Industrial Automation","Europe","Spain","Sports","Climbing equipment"
-"193,421",1,2013,2,16,"Gringotts","South America","Ecuador","Sports","Climbing equipment"
-"49,95",1,2012,9,1,"Smith and Co.","Europe","Spain","Books","Build your own bicycle"
-"49,95",1,2013,2,14,"Allied Biscuit","North America","United States of America","Books","Bicycle Wheel"
-"49,95",1,2013,3,14,"Ankh-Sto Associates","Europe","Spain","Books","Build your own bicycle"
-"49,95",1,2013,7,5,"Mr. Sparkle","Europe","United Kingdom of Great Britain & Northern Ireland","Books","Bicycle Wheel"
-"49,95",1,2013,8,5,"Globex Corporation","Europe","Slovakia (Slovak Republic)","Books","Bicycle Wheel"
-"49,95",1,2013,6,27,"Flowers By Irene","Europe","Denmark","Books","Bicycle Wheel"
-"49,95",1,2012,8,5,"Osato Chemicals","North America","United States of America","Books","Bicycle Wheel"
-"49,95",1,2013,3,23,"Demo Company","South America","Uruguay","Books","Bicycle Wheel"
-"49,95",1,2012,2,8,"Ankh-Sto Associates","Europe","Spain","Books","Build your own bicycle"
-"49,95",1,2012,4,15,"Galaxy Corp","Africa","South Africa","Books","Bicycle Wheel"
-"49,95",1,2012,5,16,"Globo-Chem","North America","Canada","Books","Bicycle Wheel"
-"49,95",1,2013,3,20,"Gringotts","South America","Ecuador","Books","Build your own bicycle"
-"49,95",1,2013,4,5,"United Fried Chicken","South America","Brazil","Books","Bicycle Wheel"
-"49,95",1,2013,1,4,"Keedsler Motors","Europe","Netherlands","Books","Build your own bicycle"
-"49,95",1,2012,9,15,"Sample Company","Europe","Switzerland","Books","Bicycle Wheel"
-"49,95",1,2012,6,11,"Globex Corporation","Europe","Slovakia (Slovak Republic)","Books","Bicycle Wheel"
-"49,95",1,2013,5,5,"ZiffCorp","North America","United States of America","Books","Bicycle Wheel"
-"49,95",1,2012,4,8,"Kumatsu Motors","South America","Brazil","Books","Build your own bicycle"
-"49,95",1,2013,7,23,"Incom Corporation","Europe","Spain","Books","Bicycle Wheel"
-"49,95",1,2013,8,18,"General Products","Europe","Spain","Books","Bicycle Wheel"
-"49,5",1,2012,9,19,"QWERTY Logistics","Europe","Portugal","Sports","Trial Bike"
-"49,5",1,2012,11,27,"Tessier-Ashpool","Europe","Portugal","Sports","Trial Bike"
-"49,5",1,2013,7,16,"Fake Brothers","North America","United States of America","Sports","Trial Bike"
-"49,5",1,2012,1,10,"123 Warehousing","North America","United States of America","Sports","Trial Bike"
-"49,3507",1,2013,6,5,"Globo-Chem","North America","Canada","Books","Bicycle Wheel"
-"47,9592",1,2012,4,1,"Demo Company","South America","Uruguay","Books","Build your own bicycle"
-"155,4",1,2012,2,18,"Sample, inc","Europe","Switzerland","Sports","Snowboard table"
-"45,99",1,2013,12,14,"Widget Corp","Europe","United Kingdom of Great Britain & Northern Ireland","Sports","Trial Bike"
-"45,83",1,2012,3,12,"Extensive Enterprise","South America","Brazil","Sports","Trial Bike"
-"45,75",1,2012,5,12,"Keedsler Motors","Europe","Netherlands","Sports","Trial Bike"
-"45,52",1,2012,4,14,"Flowers By Irene","Europe","Denmark","Sports","Trial Bike"
-"45,37",1,2013,12,4,"Sombra Corporation","Europe","France","Sports","Trial Bike"
-"45,3",1,2013,5,18,"Foo Bars","South America","Brazil","Sports","Trial Bike"
-"45,27",1,2013,8,9,"LuthorCorp","Europe","Hungary","Sports","Trial Bike"
-"45,2676",1,2013,7,9,"LexCorp","South America","Brazil","Sports","Trial Bike"
-"149,57",1,2013,9,4,"LexCorp","South America","Brazil","Sports","Snowboard table"
-"145,5",1,2012,5,8,"Sto Plains Holdings","Europe","France","Sports","Tent for extreme weather"
-"44,8709",1,2013,5,5,"Virtucon","South America","Brazil","Sports","Trial Bike"
-"44,87",1,2013,12,5,"Kumatsu Motors","South America","Brazil","Sports","Trial Bike"
-"44,08",1,2012,12,26,"Fake Brothers","North America","United States of America","Sports","Trial Bike"
-"44,03",1,2013,3,10,"123 Warehousing","North America","United States of America","Sports","Trial Bike"
-"44,0279",1,2013,2,10,"Widget Corp","Europe","United Kingdom of Great Britain & Northern Ireland","Sports","Trial Bike"
-"120,75",1,2012,11,20,"U.S. Robotics and Mechanical Men","South America","Brazil","Sports","Snowboard table"
-"120,75",1,2013,1,18,"Mammoth Pictures","South America","Ecuador","Sports","Snowboard table"
-"120,75",1,2013,5,12,"Three Waters","South America","Ecuador","Sports","Snowboard table"
-"42,07",1,2012,12,12,"Virtucon","South America","Brazil","Sports","Trial Bike"
-"115,8",1,2013,8,13,"QWERTY Logistics","Europe","Portugal","Sports","Tent for extreme weather"
-"41,32",1,2013,11,8,"North Central Positronics","Europe","Spain","Various","Various"
-"41,32",1,2012,1,15,"Praxis Corporation","Europe","Spain","Various","Various"
-"41,32",1,2012,12,27,"Wayne Enterprises","Europe","Spain","Various","Various"
-"171,25",1,2013,9,25,"ZiffCorp","North America","United States of America","Sports","Mountain Bike"
-"171,25",1,2012,3,5,"Smith and Co.","Europe","Spain","Sports","Tent for extreme weather"
-"160,77",1,2013,5,10,"Galaxy Corp","Africa","South Africa","Sports","Snowboard table"
-"155,8",1,2013,10,5,"Thatherton Fuels","South America","Ecuador","Sports","Rafting Boat"
-"155,8",1,2013,12,6,"Water and Power","South America","Ecuador","Sports","Rafting Boat"
-"155,8",1,2013,9,8,"Western Gas & Electric","South America","Ecuador","Sports","Rafting Boat"
-"155,8",1,2013,10,12,"Mammoth Pictures","South America","Ecuador","Sports","Rafting Boat"
-"155,8",1,2013,11,15,"Mooby Corp","South America","Ecuador","Sports","Rafting Boat"
-"155,8",1,2013,12,16,"Gringotts","South America","Ecuador","Sports","Rafting Boat"
-"155,8",1,2013,5,23,"Thrift Bank","South America","Ecuador","Sports","Rafting Boat"
-"146,5",1,2012,10,27,"Sirius Cybernetics Corporation","Europe","Spain","Sports","Snowboard table"
-"146,5",1,2012,5,10,"The Legitimate Businessmens Club","South America","Brazil","Sports","Snowboard table"
-"34,65",1,2013,3,10,"Universal Export","South America","Brazil","Sports","Trial Bike"
-"94,52",1,2013,8,8,"Bluth Company","South America","Brazil","Sports","Snowboard table"
-"91,67",1,2013,1,27,"Widget Corp","Europe","United Kingdom of Great Britain & Northern Ireland","Sports","Snowboard table"
-"80,01",3,2013,8,27,"Wentworth Industries","Europe","Ireland","Sports","Termic Jacket "
-"73,687",1,2013,12,4,"Acme Corp","Europe","Netherlands","Sports","Snowboard table"
-"26,95",2,2013,2,4,"Bluth Company","South America","Brazil","Videos","Communicate your skills (2009)"
-"152,45",1,2013,3,5,"Wayne Enterprises","Europe","Spain","Sports","Snowboard table"
-"140,1",1,2012,3,18,"Acme Corp","Europe","Netherlands","Videos","Climb higher, faster, better (2010)"
-"108,25",1,2013,4,8,"Thatherton Fuels","South America","Ecuador","Videos","Climb higher, faster, better (2010)"
-"108,25",1,2012,6,5,"Osato Chemicals","North America","United States of America","Videos","Climb higher, faster, better (2010)"
-"155,3",1,2013,6,14,"The Legitimate Businessmens Club","South America","Brazil","Sports","Mountain Bike"
-"92,233",1,2013,1,6,"Allied Biscuit","North America","United States of America","Videos","Climb higher, faster, better (2010)"
-"137,751",1,2013,4,12,"Sirius Cybernetics Corporation","Europe","Spain","Sports","Climbing boots"
-"137,699",1,2013,1,16,"Mooby Corp","South America","Ecuador","Sports","Climbing boots"
-"155,51",1,2013,6,28,"Colonial Movers","Europe","Spain","Sports","Mountain Bike"
-"115,54",1,2013,11,14,"Acme, inc.","Europe","Spain","Sports","Snowboard boots"
-"115,24",1,2012,3,14,"Galaxy Corp","Africa","South Africa","Sports","Snowboard boots"
-"144,1",1,2013,5,15,"U.S. Robotics and Mechanical Men","South America","Brazil","Sports","Mountain Bike"
-"114,18",1,2013,4,18,"Smith and Co.","Europe","Spain","Sports","Snowboard boots"
-"110,37",1,2012,11,19,"ABC Telecom","South America","Guatemala","Sports","Snowboard boots"
-"110,37",1,2012,10,19,"Demo, inc.","South America","Brazil","Sports","Snowboard boots"
-"75,5",1,2013,2,25,"123 Warehousing","North America","United States of America","Sports","Mountain Bike"
-"39,96",1,2013,9,24,"General Products","Europe","Spain","Sports","Mountain Bike"
-"101,58",1,2012,1,15,"Kumatsu Motors","South America","Brazil","Sports","Snowboard boots"
-50,1,2013,7,14,"Osato Chemicals","North America","United States of America","Various","Various"
-270,1,2013,11,7,"Praxis Corporation","Europe","Spain","Various","Various"
-195,1,2013,12,17,"Sample, inc","Europe","Switzerland","Sports","Mountain Bike"
-195,1,2013,4,5,"Wentworth Industries","Europe","Ireland","Sports","Mountain Bike"
-90,2,2012,5,4,"ABC Telecom","South America","Guatemala","Sports","Tent for extreme weather"
-80,5,2013,11,17,"Sample Company","Europe","Switzerland","Videos","Living on a windsurf table (2010)"
-71,1,2012,2,14,"Extensive Enterprise","South America","Brazil","Sports","Mountain Bike"
-59,1,2013,11,4,"Three Waters","South America","Ecuador","Sports","Mountain Bike"
-49,1,2012,10,21,"Foo Bars","South America","Brazil","Sports","Snowboard table"
-49,1,2013,1,24,"Acme Corp","Europe","Netherlands","Sports","Snowboard table"
-49,1,2013,10,13,"Sample Company","Europe","Switzerland","Sports","Tent for extreme weather"
-49,1,2013,11,20,"Strickland Propane","South America","Brazil","Sports","Snowboard table"
-49,1,2013,2,13,"Mooby Corp","South America","Ecuador","Sports","Snowboard table"
-49,1,2013,2,6,"Powell Motors","Europe","Spain","Sports","Tent for extreme weather"
-49,1,2012,7,8,"QWERTY Logistics","Europe","Portugal","Sports","Tent for extreme weather"
-49,1,2013,9,7,"North Central Positronics","Europe","Spain","Sports","Tent for extreme weather"
-49,1,2013,2,10,"Tessier-Ashpool","Europe","Portugal","Sports","Tent for extreme weather"
-49,1,2013,10,15,"Water and Power","South America","Ecuador","Sports","Climbing equipment"
-49,1,2012,2,4,"United Fried Chicken","South America","Brazil","Sports","Tent for extreme weather"
-49,1,2012,1,15,"Powell Motors","Europe","Spain","Sports","Snowboard table"
-49,1,2012,2,18,"Industrial Automation","Europe","Spain","Sports","Mountain Bike"
-49,5,2013,6,14,"Corellian Engineering Corporation","Europe","Spain","Videos","Extreme mountain bike sessions (2012)"
-47,1,2012,4,14,"Globo-Chem","North America","Canada","Sports","Mountain Bike"
-47,1,2012,5,14,"Mr. Sparkle","Europe","United Kingdom of Great Britain & Northern Ireland","Sports","Mountain Bike"
-36,3,2013,4,17,"Thrift Bank","South America","Ecuador","Sports","Paddle Tennis Set"
-28,2,2012,6,6,"Fake Brothers","North America","United States of America","Sports","Termic Jacket "
-25,1,2012,8,8,"Corellian Engineering Corporation","Europe","Spain","Sports","Trial Bike"
-25,1,2012,9,8,"Incom Corporation","Europe","Spain","Sports","Trial Bike"
-22,11,2013,3,6,"Strickland Propane","South America","Brazil","Videos","Best windsurf Videos of the year (2013)"
-14,1,2013,9,13,"Demo, inc.","South America","Brazil","Sports","Termic Jacket "
-14,1,2013,11,5,"Sample, inc","Europe","Switzerland","Sports","Termic Jacket "
-14,1,2013,12,20,"Thatherton Fuels","South America","Ecuador","Sports","Termic Jacket "
-14,1,2012,4,5,"Foo Bars","South America","Brazil","Sports","Termic Jacket "
-14,1,2012,8,12,"Demo, inc.","South America","Brazil","Sports","Termic Jacket "
-14,1,2013,10,7,"Omni Consimer Products","Europe","Germany","Sports","Termic Jacket "
-14,1,2013,1,14,"Sto Plains Holdings","Europe","France","Sports","Termic Jacket "
-14,1,2013,11,18,"Western Gas & Electric","South America","Ecuador","Sports","Climbing boots"
-14,1,2012,3,6,"Virtucon","South America","Brazil","Sports","Termic Jacket "
-14,1,2013,3,18,"Sirius Cybernetics Corporation","Europe","Spain","Sports","Mountain Bike"
-14,1,2013,4,16,"U.S. Robotics and Mechanical Men","South America","Brazil","Sports","Mountain Bike"
-14,1,2013,5,16,"Colonial Movers","Europe","Spain","Sports","Mountain Bike"
-126,1,2012,6,8,"Tessier-Ashpool","Europe","Portugal","Sports","Termic Jacket "
-70,1,2012,12,17,"Colonial Movers","Europe","Spain","Sports","Snowboard boots"
-70,1,2012,10,30,"General Products","Europe","Spain","Sports","Snowboard boots"
-68,1,2013,10,6,"LuthorCorp","Europe","Hungary","Videos","Living on a windsurf table (2010)"
-60,7,2013,4,14,"Chasers","South America","Brazil","Videos","Extreme mountain bike sessions (2012)"
-60,7,2013,7,27,"Gizmonic Institute","South America","Brazil","Videos","Extreme mountain bike sessions (2012)"
-42,1,2012,11,30,"Initrode","Europe","Spain","Sports","Snowboard boots"
-29,1,2012,7,5,"Taggart Transcontinental","North America","United States of America","Sports","Trial Bike"
-29,1,2012,8,5,"Atlantic Northern","South America","Brazil","Sports","Trial Bike"
-20,1,2012,9,16,"Niagular","Europe","France","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,10,23,"Plow King","Europe","France","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,6,23,"Big Kahuna Burger","Europe","United Kingdom of Great Britain & Northern Ireland","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,7,27,"Big T Burgers and Fries","Europe","Slovakia (Slovak Republic)","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,8,27,"Chez Quis","South America","Brazil","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,9,20,"Chotchkies","Europe","Hungary","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,10,17,"The Frying Dutchman","Europe","Spain","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,11,8,"Klimpys","South America","Brazil","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,2,8,"The Krusty Krab","Europe","Hungary","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,3,27,"Monks Diner","Europe","Spain","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,4,27,"Milliways","Europe","Germany","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,5,20,"Minuteman Cafe","Europe","Spain","Videos","Best windsurf Videos of the year (2013)"
-20,1,2012,4,17,"Taco Grande","Europe","France","Videos","Best windsurf Videos of the year (2013)"
-10,1,2012,10,6,"Tip Top Cafe","South America","Brazil","Sports","Snowboard boots"
-10,1,2012,11,8,"Moes Tavern","South America","Brazil","Sports","Snowboard boots"
-10,1,2013,3,14,"Central Perk","South America","Ecuador","Sports","Snowboard boots"
diff --git a/webshop/webshop-structure.sql b/webshop/webshop-structure.sql
deleted file mode 100644
index 4949f83..0000000
--- a/webshop/webshop-structure.sql
+++ /dev/null
@@ -1,62 +0,0 @@
-
-drop table if exists dates;
-create table dates (
- id varchar(128) unique,
- date_year integer,
- date_quarter integer,
- date_month integer,
- date_day integer,
- date_week integer
-);
-
-drop table if exists customers;
-create table customers (
- id varchar(200) unique,
- name varchar(200)
-);
-
-drop table if exists products;
-create table products (
- id varchar(200) unique,
- category_id varchar(200),
- category_label varchar(200),
- product_id varchar(200),
- product_label varchar(200)
-);
-
-drop table if exists countries;
-create table countries (
- id varchar(200) unique,
- continent_id varchar(200),
- continent_label varchar(200),
- country_id varchar(200),
- country_label varchar(200)
-);
-
-drop table if exists sales;
-create table sales (
- id varchar(128) unique,
-
- date_id integer,
- customer_id integer,
- product_id integer,
- country_id integer,
-
- quantity real,
- price_total real
-);
-
-drop table if exists webvisits;
-create table webvisits (
- id varchar(128) unique,
-
- date_id integer,
- country_id integer,
-
- browser varchar(200),
- newsletter varchar(200),
- source_id varchar(200),
- source_label varchar(200),
-
- pageviews integer
-);
diff --git a/webshop/webshop.sqlite b/webshop/webshop.sqlite
index 9177226..70965bf 100644
Binary files a/webshop/webshop.sqlite and b/webshop/webshop.sqlite differ